diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 000000000..7857a8889 --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,33 @@ +name: Java CI + +on: [push] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Set up JDK 8 + uses: actions/setup-java@v2 + with: + java-version: '8' + distribution: 'adopt' + + # Step that does that actual cache save and restore + - uses: actions/cache@v2 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven- + + - name: Build & Test with Maven + id: build + run: mvn clean package + + # - name: Run integration tests + # if: steps.build.outputs.exit_code == 0 + # run: mvn -Pintegration-tests clean verify \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 08f4ab560..86cdb1a13 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,7 +38,7 @@ script: # Build # use travis_wait so it does not time_out after 10 minutes without output (unfortunately that seems to not work) # use -q so there's not too much output for travis (4Mb max) - - travis_wait mvn clean install -Pintegration-tests -q + - travis_wait 60 mvn clean install -Pintegration-tests -q # build assembly (there is currently missing jars in assembly when using mvn clean install...) - mvn clean package -DskipTests -q # Integrations tests diff --git a/README.rst b/README.rst index f6033f537..3fe1efe7e 100755 --- a/README.rst +++ b/README.rst @@ -36,6 +36,9 @@ Online documentation -------------------- You can find the latest Logisland documentation, including a programming guide, on the `project web page. `_ + +Or on this `site web as well. `_ + This README file only contains basic setup instructions. Browse the `Java API documentation `_ for more information. @@ -55,7 +58,7 @@ to build from the source just clone source and package with maven (logisland req cd logisland mvn clean package -the final package is available at `logisland-assembly/target/logisland-1.3.0-bin.tar.gz` +the final package is available at `logisland-assembly/target/logisland-1.4.0-full-bin.tar.gz` You can also download the `latest release build `_ @@ -93,9 +96,9 @@ But you should choose the Spark version that is compatible with your environment curl -s http://d3kbcqa49mib13.cloudfront.net/spark--bin-hadoop.tgz | tar -xz -C /usr/local/ export SPARK_HOME=/usr/local/spark--bin-hadoop - # install Logisland 1.3.0 + # install Logisland 1.4.0 curl -s https://github.com/Hurence/logisland/releases/download/v1.0.0-RC2/logisland-1.0.0-RC2-bin.tar.gz | tar -xz -C /usr/local/ - cd /usr/local/logisland-1.3.0 + cd /usr/local/logisland-1.4.0 # launch a logisland job bin/logisland.sh --conf conf/index-apache-logs.yml @@ -124,9 +127,9 @@ Launching logisland streaming apps is just easy as unarchiving logisland distrib .. code-block:: sh - # install Logisland 1.3.0 - curl -s https://github.com/Hurence/logisland/releases/download/v0.10.0/logisland-1.3.0-bin-hdp2.5.tar.gz | tar -xz -C /usr/local/ - cd /usr/local/logisland-1.3.0 + # install Logisland 1.4.0 + curl -s https://github.com/Hurence/logisland/releases/download/v0.10.0/logisland-1.4.0-bin-hdp2.5.tar.gz | tar -xz -C /usr/local/ + cd /usr/local/logisland-1.4.0 bin/logisland.sh --conf conf/index-apache-logs.yml @@ -147,7 +150,7 @@ The first part is the `ProcessingEngine` configuration (here a Spark streaming e .. code-block:: yaml - version: 1.3.0 + version: 1.4.0 documentation: LogIsland job config file engine: component: com.hurence.logisland.engine.spark.KafkaStreamProcessingEngine @@ -261,3 +264,8 @@ Contributing ------------ Please review the `Contribution to Logisland guide `_ for information on how to get started contributing to the project. + + + +Start a stream processing job +----------------------------- \ No newline at end of file diff --git a/RELEASING.rst b/RELEASING.rst index b739d0bba..7a7d8ee3a 100644 --- a/RELEASING.rst +++ b/RELEASING.rst @@ -3,26 +3,79 @@ Releasing guide This guide will help you to perform the full release process for Logisland framework. +Logisland sources follow the `GitFlow `_ process. +So be sure that any changes from the latest available release have been back-ported to the master and develop branch. - git hf release start v1.3.0 +The develop branch must also include all of your new features that you want to release compared to the current existing release. - # update the version (you should run a dry run first) - # you should double escapte dots so it is correctly parsed, otherwise it will be considered as the any character - ./update-version.sh -o 0\\.14\\.0 -n 1.3.0 -d - ./update-version.sh -o 0\\.14\\.0 -n 1.3.0 +Start a new branch and bump the version +--------------------------------------- -Build the code and run the tests --------------------------------- +Be sure `HubFlow git extension `_ is installed on your system. Then: + +.. code-block:: sh + + git hf release start v1.4.0 + +Update the version with the bump_version.sh script. Usage: bump_version.sh . You should double escape dots (in the old version only) so it is correctly parsed, otherwise it will be considered as the any character + +.. code-block:: sh + + bump_version.sh 1\.2\.0 1.4.0 + +Build the code, run the unit tests as well as integration tests +--------------------------------------------------------------- + +The following commands must be run from the top-level directory: +.. code-block:: sh + + mvn -Pintegration-tests clean verify + +.. note:: + When doing a new release, all available unit tests and integration tests should be run and pass. + If you know what your are doing, you can however use those additional information: -The following commands must be run from the top-level directory. +To only build and run unit tests without integration tests: .. code-block:: sh mvn clean package -If you wish to skip the unit tests you can do this by adding `-DskipTests` to the command line. +If you wish to skip the unit tests in any of those commands, you can do this by adding `-DskipTests` to the command line. + +Build logisland docker image +---------------------------- + +WARNING: you must build the logisland archive with the following command at the root directory of the workspace: +.. code-block:: sh + + mvn -DskipTests clean package + +You must not build it with the integration tests run command, as the final packaging will not be spring compliant and +you will have some errors like this one once you run the docker based quickstarts: + +.. code-block:: sh + + Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/boot/loader/archive/Archive + +Once the workspace is built, you must locally create with it the docker image that you will test. +To do that, follow instructions in logisland-docker/full-container/README.rst, in the 'Build your own' section. + +Run manual sanity checking using the QuickStarts +------------------------------------------------ + +Run some of the `QuickStarts `_. +Those tests use the logisland docker image. + +You must at least successfully run the `Getting Started Guide `_ +and the `Datastore Elasticsearch Guide `_ + +Update the release notes +------------------------ + +When all the automatic and manual tests are ok, update the release notes with what's new in the new version in logisland-documentation/changes.rst. Release to maven repositories ----------------------------- @@ -34,21 +87,16 @@ to release artifacts (if you're allowed to), follow this guide `release to OSS S mvn -DperformRelease=true clean deploy mvn versions:commit - -follow the staging procedure in `oss.sonatype.org `_ or read `Sonatype book `_ +Follow the staging procedure in `oss.sonatype.org `_ or read `Sonatype book `_ go to `oss.sonatype.org `_ to release manually the artifact - - Publish release assets to github -------------------------------- please refer to `https://developer.github.com/v3/repos/releases `_ -curl -XPOST https://uploads.github.com/repos/Hurence/logisland/releases/v1.3.0/assets?name=logisland-1.1.2-bin-hdp2.5.tar.gz -v --data-binary @logisland-assembly/target/logisland-0.10.3-bin-hdp2.5.tar.gz --user oalam -H 'Content-Type: application/gzip' - - +curl -XPOST https://uploads.github.com/repos/Hurence/logisland/releases/v1.4.0/assets?name=logisland-full-bin.tar.gz -v --data-binary @logisland-assembly/target/logisland-full-bin.tar.gz --user oalam -H 'Content-Type: application/gzip' Publish Docker image -------------------- @@ -62,7 +110,6 @@ Building the image # verify image build docker images - then login and push the latest image .. code-block:: sh @@ -70,8 +117,16 @@ then login and push the latest image docker login docker push hurence/logisland - Publish artifact to github -------------------------- Tag the release + upload latest tgz + +Merge back changes from the release into master and close release branch +------------------------------------------------------------------------ + +.. code-block:: sh + + git hf release finish v1.4.0 + +TBD: does this also generate the release tag? \ No newline at end of file diff --git a/bump_version.sh b/bump_version.sh index 2acf8f5e1..7a7452c2f 100755 --- a/bump_version.sh +++ b/bump_version.sh @@ -18,7 +18,7 @@ function bump_files() { for i in `find . -name "*.yml"` ; do bump $i "version: $current_version" "version: $new_version" done - for i in `find . -name "*.rst"` ; do + for i in `find . -name "*.rst"|grep -v changes.rst|grep -v RELEASING.rst` ; do bump $i "$current_version" "$new_version" done } @@ -27,7 +27,7 @@ function bump() { echo -n "Updating $1..." tmp_file=$(mktemp) rm -f "$tmp_file" - sed -i '' "s/$2/$3/1w $tmp_file" $1 + sed -i "s/$2/$3/1w $tmp_file" $1 if [ -s "$tmp_file" ]; then echo "Done" else diff --git a/logisland-assembly/README.md b/logisland-assembly/README.md index 05059cb22..aa1e0339b 100644 --- a/logisland-assembly/README.md +++ b/logisland-assembly/README.md @@ -19,62 +19,6 @@ With this command core library dependencies are not included... mvn clean install -Pintegration-tests -the lib/core folder should contains (currently): - -``` -./lib/cores/asm-4.0.jar -./lib/cores/avro-1.8.2.jar -./lib/cores/cglib-nodep-3.2.10.jar -./lib/cores/commons-cli-1.2.jar -./lib/cores/commons-codec-1.10.jar -./lib/cores/commons-collections-3.2.1.jar -./lib/cores/commons-compress-1.8.1.jar -./lib/cores/commons-compress-1.14.jar -./lib/cores/commons-io-2.4.jar -./lib/cores/commons-lang3-3.8.1.jar -./lib/cores/hamcrest-core-1.3.jar -./lib/cores/ivy-2.2.0.jar -./lib/cores/jackson-annotations-2.4.4.jar -./lib/cores/jackson-core-2.4.4.jar -./lib/cores/jackson-core-asl-1.9.13.jar -./lib/cores/jackson-databind-2.4.4.jar -./lib/cores/jackson-dataformat-yaml-2.4.4.jar -./lib/cores/jackson-mapper-asl-1.9.13.jar -./lib/cores/jackson-module-jsonSchema-2.4.4.jar -./lib/cores/jline-0.9.94.jar -./lib/cores/joda-time-2.8.2.jar -./lib/cores/json-20090211.jar -./lib/cores/json-simple-1.1.jar -./lib/cores/junit-4.12.jar -./lib/cores/kryo-2.21.jar -./lib/cores/log4j-api-2.10.0.jar -./lib/cores/log4j-to-slf4j-2.10.0.jar -./lib/cores/logisland-api-1.1.2.jar -./lib/cores/logisland-bootstrap-1.1.2.jar -./lib/cores/logisland-plugin-support-1.1.2.jar -./lib/cores/logisland-scripting-base-1.1.2.jar -./lib/cores/logisland-scripting-mvel-1.1.2.jar -./lib/cores/logisland-utils-1.1.2.jar -./lib/cores/minlog-1.2.jar -./lib/cores/mvel2-2.3.1.Final.jar -./lib/cores/netty-3.7.0.Final.jar -./lib/cores/objenesis-1.2.jar -./lib/cores/objenesis-2.6.jar -./lib/cores/paranamer-2.7.jar -./lib/cores/protobuf-java-2.5.0.jar -./lib/cores/reflectasm-1.07-shaded.jar -./lib/cores/slf4j-api-1.7.16.jar -./lib/cores/snakeyaml-1.12.jar -./lib/cores/snappy-java-1.1.1.3.jar -./lib/cores/spring-boot-loader-2.0.0.RELEASE.jar -./lib/cores/spring-boot-loader-tools-2.0.0.RELEASE.jar -./lib/cores/spring-core-5.0.4.RELEASE.jar -./lib/cores/spring-jcl-5.0.4.RELEASE.jar -./lib/cores/xz-1.5.jar -./lib/cores/zkclient-0.8.jar -./lib/cores/zookeeper-3.4.6.jar -``` - Different Type of assemblies ---------------------------- @@ -114,3 +58,315 @@ This is built as : This contain all built-in dependencies. With this packaging every logisland services and processors are already installed. You can install third party components with bin/component.sh script if necessary. + + +Explanation of our assembly +--------------------------- + +It is composed of three type of jar. +The one in lib/core/*, they are jars shared by all logisland processes. +The one in lib/engine/*, they are different engine available deding on where you are running logisland. +The one in lib/plugins/*, It contains all logisland plugins. They are fat jars that will be run in different independant ClassLaoder. + +The fat jar are the target of a special repackaging, that's why they are suffixed with "-repackaged". + + +Current Architecture of the assembly +------------------------------------ + +Here the result of current "find ./target/logisland-*-full-bin" : + +``` +./target/logisland-1.4.0-full-bin +./target/logisland-1.4.0-full-bin/logisland-1.4.0 +./target/logisland-1.4.0-full-bin/logisland-1.4.0/NOTICE +./target/logisland-1.4.0-full-bin/logisland-1.4.0/bin +./target/logisland-1.4.0-full-bin/logisland-1.4.0/bin/logisland.sh +./target/logisland-1.4.0-full-bin/logisland-1.4.0/bin/components.sh +./target/logisland-1.4.0-full-bin/logisland-1.4.0/monitoring +./target/logisland-1.4.0-full-bin/logisland-1.4.0/monitoring/jmx_prometheus_javaagent-0.10.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/monitoring/metrics.properties +./target/logisland-1.4.0-full-bin/logisland-1.4.0/monitoring/spark-prometheus.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/README.md +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/Financial Sample.xlsx +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/docker-compose-index-apache-logs-es.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/docker-compose-index-apache-logs-solr.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/enrich-apache-logs.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/es-template.json +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/ivy.xml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/logisland.properties +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/index-bro-events.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/docker-compose.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/outlier-detection.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/match-queries.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/index-blockchain-transactions.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/save-to-hdfs.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/future-factory-indexer.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/connect-avro-standalone.properties +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/index-timeseries-solr.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/job-sample.json +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/index-network-packets.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/index-apache-logs-solr.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/opc-iiot.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/mqtt-to-historian.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/store-to-redis.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/retrieve-data-from-elasticsearch.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/index-apache-logs-plainjava.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/index-excel-spreadsheet.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/send-apache-logs-to-hbase.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/configuration-template.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/connect-avro-distributed.properties +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/python-processing.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/log4j-debug.properties +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/aggregate-events.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/threshold-alerting.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/bootstrap.conf +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/docker-compose-index-apache-logs-mongo.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/index-apache-logs-es.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/index-apache-logs-mongo.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/logback.xml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/timeseries-lookup.csv +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/index-jms-messages.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/log4j.properties +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/index-netflow-events.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/topic-sample.json +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/timeseries-parsing.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/logisland-kafka-connect.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/conf/docker-compose-opc-iiot.yml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-connector-opc-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-processor-xml-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-processor-web-analytics-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-service-solr_8-client-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-service-hbase_1_1_2-client-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-service-elasticsearch_7_x-client-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-service-ip-to-geo-maxmind-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-service-redis-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-service-solr_6_6_2-client-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-service-cassandra-client-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-processor-hbase-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-processor-excel-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-processor-scripting-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-service-solr_chronix_8-client-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-service-rest-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-service-elasticsearch_6_6_2-client-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-processor-cyber-security-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-processor-outlier-detection-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-processor-useragent-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-processor-rest-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-service-influxdb-client-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-processor-elasticsearch-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-service-elasticsearch_2_4_0-client-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-connector-spooldir-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-service-elasticsearch_5_4_0-client-1.2.0.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-processor-enrichment-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-service-mongodb-client-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-service-inmemory-cache-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-processor-common-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/plugins/logisland-processor-querymatcher-1.4.0-repackaged.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/logisland-scripting-mvel-1.4.0.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/slf4j-api-1.7.16.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/commons-cli-1.2.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/joda-time-2.8.2.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/json-20090211.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/json-simple-1.1.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/cglib-nodep-3.2.10.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/spring-boot-loader-2.0.0.RELEASE.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/commons-collections-3.2.1.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/asm-4.0.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/objenesis-2.6.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/jackson-module-jsonSchema-2.10.3.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/minlog-1.2.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/junit-platform-commons-1.5.2.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/jackson-core-2.10.3.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/logisland-plugin-support-1.4.0.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/commons-digester-1.8.1.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/spring-core-5.0.4.RELEASE.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/commons-io-2.4.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/validation-api-1.1.0.Final.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/log4j-to-slf4j-2.10.0.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/ivy-2.2.0.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/jackson-annotations-2.10.3.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/log4j-api-2.10.0.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/opentest4j-1.2.0.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/commons-logging-1.2.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/mvel2-2.3.1.Final.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/hamcrest-core-1.3.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/logisland-api-1.4.0.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/avro-1.9.2.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/protobuf-java-2.5.0.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/logisland-bootstrap-1.4.0.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/spring-jcl-5.0.4.RELEASE.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/objenesis-1.2.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/apiguardian-api-1.1.0.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/jline-0.9.94.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/netty-3.7.0.Final.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/zookeeper-3.4.6.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/commons-codec-1.10.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/commons-compress-1.19.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/snakeyaml-1.24.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/spring-boot-loader-tools-2.0.0.RELEASE.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/junit-4.12.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/commons-validator-1.6.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/junit-vintage-engine-5.5.2.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/logisland-scripting-base-1.4.0.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/junit-platform-engine-1.5.2.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/commons-beanutils-1.9.2.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/commons-compress-1.14.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/kryo-2.21.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/reflectasm-1.07-shaded.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/jackson-databind-2.10.3.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/scala-logging-api_2.10-2.1.2.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/scala-logging-slf4j_2.10-2.1.2.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/logisland-utils-1.4.0.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/zkclient-0.8.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/jackson-dataformat-yaml-2.10.3.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/cores/commons-lang3-3.8.1.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/engines +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/engines/logisland-engine-spark_1_6-1.4.0.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/engines/logisland-engine-spark_2_4-1.4.0.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/engines/logisland-engine-spark_2_1-1.4.0.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/engines/logisland-engine-vanilla-1.4.0.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/lib/engines/logisland-engine-spark_2_3-1.4.0.jar +./target/logisland-1.4.0-full-bin/logisland-1.4.0/LICENSE +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/architecture.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/intro.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/components.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/user +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/user/dynamic-properties.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/user/expression-language.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/user/index.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/user/components +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/user/components/other-processors.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/user/components/engines +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/user/components/engines/index.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/user/components/engines/engine-spark.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/user/components/engines/engine-vanilla.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/user/components/services.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/user/components/index.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/user/components/common-processors.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/rest-api.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/concepts.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/monitoring.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/plugins.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/api.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/faq.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/kibana-blacklisted-host.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/data-driven-computing.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/nifi-drag-template.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/lambda-logicalArchi.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/solr-query.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/kibana-configure-index-netflow.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/solr-dashboard.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/spark-rdd.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/nifi-template-dialog.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/chronix-record.jpeg +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/kibana-logisland-metrics.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/kibana-logisland-import-dashboard.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/apple-touch-icon-144-precomposed.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/kibana-blockchain-dashboard.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/kafka-design.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/nifi-flow.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/lambda-logCentric.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/spark-architecture.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/kibana-logisland-metrics-packet-stream-pycapa.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/kibana-excel-logs.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/kibana-configure-index-packet.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/kibana-logisland-aggregates-events.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/data-pyramid-mccandless.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/kibana-save-search.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/api.yaml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/sparkcontext-broadcast-executors.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/kibana-explore.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/kibana-connection-alerts.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/hurence-logo.jpeg +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/kibana-logisland-dashboard.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/kibana-configure-index.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/kibana-match-queries.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/logisland_api_flows.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/activemq-create-queue.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/features.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/nifi_netflow.xml +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/traces.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/favicon.ico +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/spark-job-monitoring.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/netflow_dashboard.json +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/kibana-apache-logs.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/logIsland-architecture.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/logIsland-opc.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/kibana-threshold-alerts.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/logcentric.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/kafka-mgr.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/kibana-logisland-metrics-netflow.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/activemq-send-message.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/data-to-knowldege.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/logisland-workflow.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/spark-streaming.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/es-head.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/kibana-blockchain-records.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/spark-streaming-packet-capture-job.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/kafka-usecase.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/_static/kibana-jms-records.png +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/changes.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/developer +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/developer/developer.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/developer/index.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/README.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/workflow.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials/index-apache-logs-solr.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials/iiot-opc-ua.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials/integrate-kafka-connect.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials/indexing-network-packets.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials/enrich-apache-logs.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials/outlier-detection.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials/index-apache-logs-es.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials/index-apache-logs.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials/index-excel-spreadsheet.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials/indexing-netflow-events.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials/index-jdbc-messages.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials/kubernetes1.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials/generate_unique_ids.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials/index-blockchain-transactions.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials/threshold-alerting.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials/index.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials/index-apache-logs-mongo.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials/match-queries.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials/mqtt-to-historian.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials/aggregate-events.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials/index-jms-messages.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials/indexing-bro-events.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials/prerequisites.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/tutorials/store-to-redis.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/index.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/plugins_old.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/release.rst +./target/logisland-1.4.0-full-bin/logisland-1.4.0/docs/connectors.rst +``` + +Compare different assemblies +---------------------------- + +There is a small script that can be used to compare two assembly if you are working on it "compare-assembly.sh" + +Build the assembly, move ther "target" folder in "old-target" for exemple. Then rebuild the assembly with your modification. + +Then just run : + +```bash +bash compare-assembly.sh ./old-target ./target +``` + +it will show you the diff, each output are in "assembly.txt" and "assembly2.txt". + +If you want more detail you can use intelliJ to compare content of two jars. + + + + + diff --git a/logisland-assembly/compare-assembly.sh b/logisland-assembly/compare-assembly.sh new file mode 100644 index 000000000..242c1e6f4 --- /dev/null +++ b/logisland-assembly/compare-assembly.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash + +TMP="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +declare -r current_dir="$TMP" + +assembly1=$1 +assembly2=$2 + + +# +# dif between content of directories +# +cd "${assembly1}" +content_assembly1=$(find logisland-*-full-bin/ > "${current_dir}/assembly.txt") + +cd "${current_dir}" +cd "${assembly2}" +content_assembly2=$(find logisland-*-full-bin/ > "${current_dir}/assembly2.txt") + +cd "${current_dir}" +echo "diff between files in assembly" +diff assembly.txt assembly2.txt + +# +# dif between individual jars +# + + diff --git a/logisland-assembly/pom.xml b/logisland-assembly/pom.xml index c5a097977..c0797bc81 100644 --- a/logisland-assembly/pom.xml +++ b/logisland-assembly/pom.xml @@ -22,7 +22,7 @@ com.hurence.logisland logisland - 1.3.0 + 1.4.0 logisland-assembly pom @@ -42,7 +42,7 @@ false true - 3.1.1 + 3.3.0 make shared resource diff --git a/logisland-assembly/src/assembly/full-assembly.xml b/logisland-assembly/src/assembly/full-assembly.xml index 56d82384b..deb46cfd6 100644 --- a/logisland-assembly/src/assembly/full-assembly.xml +++ b/logisland-assembly/src/assembly/full-assembly.xml @@ -36,7 +36,6 @@ com.hurence.logisland:logisland-service-inmemory-cache com.hurence.logisland:logisland-service-ip-to-geo-maxmind - com.hurence.logisland:logisland-service-hbase_1_1_2-client com.hurence.logisland:logisland-service-elasticsearch_5_4_0-client com.hurence.logisland:logisland-service-elasticsearch_2_4_0-client com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client @@ -44,8 +43,6 @@ com.hurence.logisland:logisland-service-solr_5_5_5-client com.hurence.logisland:logisland-service-solr_6_6_2-client com.hurence.logisland:logisland-service-solr_8-client - com.hurence.logisland:logisland-service-solr_chronix_6.4.2-client - com.hurence.logisland:logisland-service-solr_chronix_8-client com.hurence.logisland:logisland-service-mongodb-client com.hurence.logisland:logisland-service-cassandra-client com.hurence.logisland:logisland-service-influxdb-client @@ -61,7 +58,6 @@ com.hurence.logisland:logisland-processor-outlier-detection com.hurence.logisland:logisland-processor-computer-vision com.hurence.logisland:logisland-processor-enrichment - com.hurence.logisland:logisland-processor-hbase com.hurence.logisland:logisland-processor-elasticsearch com.hurence.logisland:logisland-processor-excel com.hurence.logisland:logisland-processor-scripting @@ -77,6 +73,7 @@ lib/plugins false false + repackaged diff --git a/logisland-assembly/src/assembly/light-assembly.xml b/logisland-assembly/src/assembly/light-assembly.xml index caf99caf0..da5accb0a 100644 --- a/logisland-assembly/src/assembly/light-assembly.xml +++ b/logisland-assembly/src/assembly/light-assembly.xml @@ -41,6 +41,7 @@ lib/plugins false false + repackaged diff --git a/logisland-assembly/src/assembly/shared-dependencies.xml b/logisland-assembly/src/assembly/shared-dependencies.xml index cb3f1322d..51cacb387 100644 --- a/logisland-assembly/src/assembly/shared-dependencies.xml +++ b/logisland-assembly/src/assembly/shared-dependencies.xml @@ -26,8 +26,10 @@ + com.hurence.logisland:logisland-engine-spark_2_1 com.hurence.logisland:logisland-engine-spark_2_3 + com.hurence.logisland:logisland-engine-spark_2_4 com.hurence.logisland:logisland-engine-spark_1_6 com.hurence.logisland:logisland-engine-vanilla @@ -53,7 +55,6 @@ com.hurence.logisland:logisland-plugin-support com.hurence.logisland:logisland-scripting-base com.hurence.logisland:logisland-scripting-mvel - com.hurence.logisland:logisland-timeseries 0770 diff --git a/logisland-components/logisland-connectors/logisland-connector-opc/pom.xml b/logisland-components/logisland-connectors/logisland-connector-opc/pom.xml index 16ec0d056..fb70c1557 100644 --- a/logisland-components/logisland-connectors/logisland-connector-opc/pom.xml +++ b/logisland-components/logisland-connectors/logisland-connector-opc/pom.xml @@ -6,7 +6,7 @@ com.hurence.logisland logisland-connectors - 1.3.0 + 1.4.0 jar @@ -51,6 +51,9 @@ spring-boot-maven-plugin + + repackaged + package diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/pom.xml b/logisland-components/logisland-connectors/logisland-connector-spooldir/pom.xml index cefee5e78..fe3262920 100644 --- a/logisland-components/logisland-connectors/logisland-connector-spooldir/pom.xml +++ b/logisland-components/logisland-connectors/logisland-connector-spooldir/pom.xml @@ -6,7 +6,7 @@ com.hurence.logisland logisland-connectors - 1.3.0 + 1.4.0 jar @@ -107,6 +107,9 @@ spring-boot-maven-plugin + + repackaged + package diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/CsvSchemaGenerator.java b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/CsvSchemaGenerator.java index 4ff39db6b..1a3eb7373 100644 --- a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/CsvSchemaGenerator.java +++ b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/CsvSchemaGenerator.java @@ -1,11 +1,11 @@ /** - * Copyright © 2016 Jeremy Custenborder (jcustenborder@gmail.com) + * Copyright (C) 2016 Hurence (support@hurence.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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, diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/JsonSchemaGenerator.java b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/JsonSchemaGenerator.java index ca2099902..c507fa485 100644 --- a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/JsonSchemaGenerator.java +++ b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/JsonSchemaGenerator.java @@ -1,11 +1,11 @@ /** - * Copyright © 2016 Jeremy Custenborder (jcustenborder@gmail.com) + * Copyright (C) 2016 Hurence (support@hurence.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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, diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SchemaGenerator.java b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SchemaGenerator.java index 12b208015..38c2dc919 100644 --- a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SchemaGenerator.java +++ b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SchemaGenerator.java @@ -1,11 +1,11 @@ /** - * Copyright © 2016 Jeremy Custenborder (jcustenborder@gmail.com) + * Copyright (C) 2016 Hurence (support@hurence.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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, diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirCsvSourceConnector.java b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirCsvSourceConnector.java index a0d8ce4b6..feb974ffe 100644 --- a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirCsvSourceConnector.java +++ b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirCsvSourceConnector.java @@ -1,11 +1,11 @@ /** - * Copyright © 2016 Jeremy Custenborder (jcustenborder@gmail.com) + * Copyright (C) 2016 Hurence (support@hurence.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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, diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirCsvSourceConnectorConfig.java b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirCsvSourceConnectorConfig.java index 80b0cc6fe..844e735ee 100644 --- a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirCsvSourceConnectorConfig.java +++ b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirCsvSourceConnectorConfig.java @@ -1,11 +1,11 @@ /** - * Copyright © 2016 Jeremy Custenborder (jcustenborder@gmail.com) + * Copyright (C) 2016 Hurence (support@hurence.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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, @@ -31,7 +31,7 @@ import java.nio.charset.Charset; import java.util.Map; -class SpoolDirCsvSourceConnectorConfig extends SpoolDirSourceConnectorConfig { +public class SpoolDirCsvSourceConnectorConfig extends SpoolDirSourceConnectorConfig { //CSVRecordProcessorConfig public static final String CSV_SKIP_LINES_CONF = "csv.skip.lines"; diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirCsvSourceTask.java b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirCsvSourceTask.java index 7759b7d26..b5e4bc87f 100644 --- a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirCsvSourceTask.java +++ b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirCsvSourceTask.java @@ -1,12 +1,12 @@ /** - * Copyright © 2016 Jeremy Custenborder (jcustenborder@gmail.com) - *

+ * Copyright (C) 2016 Hurence (support@hurence.com) + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

+ * + * 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. @@ -23,6 +23,8 @@ import org.apache.kafka.connect.data.Struct; import org.apache.kafka.connect.errors.DataException; import org.apache.kafka.connect.source.SourceRecord; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStream; @@ -32,6 +34,7 @@ import java.util.Map; public class SpoolDirCsvSourceTask extends SpoolDirSourceTask { + private static final Logger log = LoggerFactory.getLogger(SpoolDirCsvSourceTask.class); String[] fieldNames; private CSVParser csvParser; private CSVReader csvReader; @@ -46,6 +49,7 @@ protected SpoolDirCsvSourceConnectorConfig config(Map settings) { @Override protected void configure(InputStream inputStream, Map metadata, final Long lastOffset) throws IOException { + releaseCurrentRessources(); log.trace("configure() - creating csvParser"); this.csvParser = this.config.createCSVParserBuilder().build(); this.streamReader = new InputStreamReader(inputStream, this.config.charset); @@ -85,13 +89,41 @@ public void start(Map settings) { super.start(settings); } + @Override + public void stop() { + releaseCurrentRessources(); + super.stop(); + } + + private void releaseCurrentRessources() { + log.debug("releaseCurrentRessources()"); + if (this.csvReader != null) { + try { + this.csvReader.close(); + } catch (IOException e) { + log.error("Exception thrown while closing CsvReader of class : " + this.getClass().getCanonicalName(), e); + } + } + if (this.streamReader != null) { + try { + this.streamReader.close(); + } catch (IOException e) { + log.error("Exception thrown while closing InputStreamReader of class : " + this.getClass().getCanonicalName(), e); + } + } + } + @Override public long recordOffset() { - return this.csvReader.getLinesRead(); + if (this.csvReader != null) { + return this.csvReader.getLinesRead(); + } else { + return -1; + } } @Override - public List process() throws IOException { + public List process() throws IOException, DataException { List records = new ArrayList<>(this.config.batchSize); while (records.size() < this.config.batchSize) { @@ -100,7 +132,10 @@ public List process() throws IOException { if (row == null) { break; } - log.trace("process() - Row on line {} has {} field(s)", recordOffset(), row.length); + + if (log.isDebugEnabled() && (this.csvReader.getLinesRead() % 1000) == 0) { + log.debug("process() - Row on line {} has {} field(s)", recordOffset(), row.length); + } Struct keyStruct = new Struct(this.config.keySchema); Struct valueStruct = new Struct(this.config.valueSchema); diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirJsonSourceConnector.java b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirJsonSourceConnector.java index 390696cb9..76d852209 100644 --- a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirJsonSourceConnector.java +++ b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirJsonSourceConnector.java @@ -1,11 +1,11 @@ /** - * Copyright © 2016 Jeremy Custenborder (jcustenborder@gmail.com) + * Copyright (C) 2016 Hurence (support@hurence.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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, diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirJsonSourceConnectorConfig.java b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirJsonSourceConnectorConfig.java index 7ba4765b2..51b922f8b 100644 --- a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirJsonSourceConnectorConfig.java +++ b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirJsonSourceConnectorConfig.java @@ -1,11 +1,11 @@ /** - * Copyright © 2016 Jeremy Custenborder (jcustenborder@gmail.com) + * Copyright (C) 2016 Hurence (support@hurence.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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, diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirJsonSourceTask.java b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirJsonSourceTask.java index fb77dd8a4..d704079ad 100644 --- a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirJsonSourceTask.java +++ b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirJsonSourceTask.java @@ -1,12 +1,12 @@ /** - * Copyright © 2016 Jeremy Custenborder (jcustenborder@gmail.com) - *

+ * Copyright (C) 2016 Hurence (support@hurence.com) + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

+ * + * 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. @@ -23,6 +23,8 @@ import org.apache.kafka.connect.data.Struct; import org.apache.kafka.connect.errors.DataException; import org.apache.kafka.connect.source.SourceRecord; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStream; @@ -32,6 +34,7 @@ import java.util.Map; public class SpoolDirJsonSourceTask extends SpoolDirSourceTask { + private static final Logger log = LoggerFactory.getLogger(SpoolDirJsonSourceTask.class); JsonFactory jsonFactory; JsonParser jsonParser; Iterator iterator; diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirSourceConnector.java b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirSourceConnector.java index 4f8964155..75a88cb33 100644 --- a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirSourceConnector.java +++ b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirSourceConnector.java @@ -1,11 +1,11 @@ /** - * Copyright © 2016 Jeremy Custenborder (jcustenborder@gmail.com) + * Copyright (C) 2016 Hurence (support@hurence.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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, @@ -56,7 +56,7 @@ public String version() { public void start(final Map input) { this.config = config(input); final Map settings = new LinkedHashMap<>(input); - + //setup schema for key and value if needed if (null == this.config.valueSchema || null == this.config.keySchema) { log.info("Key or Value schema was not defined. Running schema generator."); SchemaGenerator generator = generator(settings); @@ -93,24 +93,7 @@ public void start(final Map input) { schemas.put(schema, schemaEntry); } - Map> schemaToFilesMap = schemaToFiles.asMap(); - if (1 != schemaToFilesMap.keySet().size()) { - StringBuilder builder = new StringBuilder(); - builder.append("More than one schema was found for the input pattern.\n"); - for (String schema : schemaToFilesMap.keySet()) { - builder.append("Schema: "); - builder.append(schema); - builder.append("\n"); - - for (File f : schemaToFilesMap.get(schema)) { - builder.append(" "); - builder.append(f); - builder.append("\n"); - } - } - - throw new DataException(builder.toString()); - } + throwDataExceptionIfMoreThanOneSchemaFound(schemaToFiles.asMap()); Map.Entry schemaPair = null; for (Map.Entry s : schemas.values()) { @@ -137,6 +120,26 @@ public void start(final Map input) { this.settings = settings; } + private void throwDataExceptionIfMoreThanOneSchemaFound(Map> schemaToFilesMap) { + if (1 != schemaToFilesMap.keySet().size()) { + StringBuilder builder = new StringBuilder(); + builder.append("More than one schema was found for the input pattern.\n"); + for (String schema : schemaToFilesMap.keySet()) { + builder.append("Schema: "); + builder.append(schema); + builder.append("\n"); + + for (File f : schemaToFilesMap.get(schema)) { + builder.append(" "); + builder.append(f); + builder.append("\n"); + } + } + + throw new DataException(builder.toString()); + } + } + @Override public List> taskConfigs(int i) { return Collections.nCopies(i, this.settings); diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirSourceConnectorConfig.java b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirSourceConnectorConfig.java index 1f7a28c74..b3b6bdc3c 100644 --- a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirSourceConnectorConfig.java +++ b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirSourceConnectorConfig.java @@ -1,12 +1,12 @@ /** - * Copyright © 2016 Jeremy Custenborder (jcustenborder@gmail.com) - *

+ * Copyright (C) 2016 Hurence (support@hurence.com) + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

+ * + * 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. @@ -59,6 +59,8 @@ abstract class SpoolDirSourceConnectorConfig extends AbstractConfig { public static final String HALT_ON_ERROR_CONF = "halt.on.error"; public static final String FILE_MINIMUM_AGE_MS_CONF = "file.minimum.age.ms"; public static final String PROCESSING_FILE_EXTENSION_CONF = "processing.file.extension"; + public static final String DELAY_ON_ERROR_BEFORE_RETRYING_MS_CONF = "file.error.delay.ms"; + //RecordProcessorConfig public static final String BATCH_SIZE_CONF = "batch.size"; public static final String PROCESSING_FILE_EXTENSION_DEFAULT = ".PROCESSING"; @@ -95,6 +97,8 @@ abstract class SpoolDirSourceConnectorConfig extends AbstractConfig { "must match the entire filename. The equivalent of Matcher.matches()."; static final String HALT_ON_ERROR_DOC = "Should the task halt when it encounters an error or continue to the next file."; static final String FILE_MINIMUM_AGE_MS_DOC = "The amount of time in milliseconds after the file was last written to before the file can be processed."; + static final String DELAY_ON_ERROR_BEFORE_RETRYING_DOC = "The amount of time in milliseconds to wait before retrying a file that ended in error earlier."; + static final String PROCESSING_FILE_EXTENSION_DOC = "Before a file is processed, it is renamed to indicate that it is currently being processed. This setting is appended to the end of the file."; static final String PARSER_TIMESTAMP_DATE_FORMATS_DOC = "The date formats that are expected in the file. This is a list " + "of strings that will be used to parse the date fields in order. The most accurate date format should be the first " + @@ -116,6 +120,7 @@ abstract class SpoolDirSourceConnectorConfig extends AbstractConfig { public final File errorPath; public final boolean haltOnError; public final long minimumFileAgeMS; + public final long delayOnErrorMs; public final int batchSize; public final String topic; public final Schema keySchema; @@ -143,6 +148,7 @@ public SpoolDirSourceConnectorConfig(final boolean isTask, ConfigDef configDef, this.errorPath = ConfigUtils.getAbsoluteFile(this, ERROR_PATH_CONFIG); this.haltOnError = this.getBoolean(HALT_ON_ERROR_CONF); this.minimumFileAgeMS = this.getLong(FILE_MINIMUM_AGE_MS_CONF); + this.delayOnErrorMs = this.getLong(DELAY_ON_ERROR_BEFORE_RETRYING_MS_CONF); this.batchSize = this.getInt(BATCH_SIZE_CONF); this.topic = this.getString(TOPIC_CONF); this.emptyPollWaitMs = this.getLong(EMPTY_POLL_WAIT_MS_CONF); @@ -291,6 +297,7 @@ public static ConfigDef config() { .define(INPUT_FILE_PATTERN_CONF, ConfigDef.Type.STRING, ConfigDef.Importance.HIGH, INPUT_FILE_PATTERN_DOC) .define(HALT_ON_ERROR_CONF, ConfigDef.Type.BOOLEAN, true, ConfigDef.Importance.HIGH, HALT_ON_ERROR_DOC) .define(FILE_MINIMUM_AGE_MS_CONF, ConfigDef.Type.LONG, 0L, ConfigDef.Range.between(0L, Long.MAX_VALUE), ConfigDef.Importance.LOW, FILE_MINIMUM_AGE_MS_DOC) + .define(DELAY_ON_ERROR_BEFORE_RETRYING_MS_CONF, ConfigDef.Type.LONG, 10000L, ConfigDef.Range.between(0L, Long.MAX_VALUE), ConfigDef.Importance.LOW, DELAY_ON_ERROR_BEFORE_RETRYING_DOC) .define(PROCESSING_FILE_EXTENSION_CONF, ConfigDef.Type.STRING, PROCESSING_FILE_EXTENSION_DEFAULT, ValidPattern.of("^.*\\..+$"), ConfigDef.Importance.LOW, PROCESSING_FILE_EXTENSION_DOC) .define(BATCH_SIZE_CONF, ConfigDef.Type.INT, BATCH_SIZE_DEFAULT, ConfigDef.Importance.LOW, BATCH_SIZE_DOC) @@ -301,7 +308,7 @@ public static ConfigDef config() { .define(PARSER_TIMESTAMP_TIMEZONE_CONF, ConfigDef.Type.STRING, PARSER_TIMESTAMP_TIMEZONE_DEFAULT, ConfigDef.Importance.LOW, PARSER_TIMESTAMP_TIMEZONE_DOC) .define(PARSER_TIMESTAMP_DATE_FORMATS_CONF, ConfigDef.Type.LIST, PARSER_TIMESTAMP_DATE_FORMATS_DEFAULT, ConfigDef.Importance.LOW, PARSER_TIMESTAMP_DATE_FORMATS_DOC) - .define(EMPTY_POLL_WAIT_MS_CONF, ConfigDef.Type.LONG, 1000L, ConfigDef.Range.between(1L, Long.MAX_VALUE), ConfigDef.Importance.LOW, EMPTY_POLL_WAIT_MS_DOC) + .define(EMPTY_POLL_WAIT_MS_CONF, ConfigDef.Type.LONG, 10000L, ConfigDef.Range.between(1L, Long.MAX_VALUE), ConfigDef.Importance.LOW, EMPTY_POLL_WAIT_MS_DOC) .define(TIMESTAMP_MODE_CONF, Type.STRING, TimestampMode.PROCESS_TIME.toString(), ValidEnum.of(TimestampMode.class), ConfigDef.Importance.MEDIUM, TIMESTAMP_MODE_DOC) .define(TIMESTAMP_FIELD_CONF, Type.STRING, "", ConfigDef.Importance.MEDIUM, TIMESTAMP_FIELD_DOC) .define(SCHEMA_GENERATION_KEY_FIELDS_CONF, Type.LIST, new ArrayList<>(), ConfigDef.Importance.MEDIUM, SCHEMA_GENERATION_KEY_FIELDS_DOC) diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirSourceTask.java b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirSourceTask.java index a462252bb..a05d20c2a 100644 --- a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirSourceTask.java +++ b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/SpoolDirSourceTask.java @@ -1,12 +1,12 @@ /** - * Copyright © 2016 Jeremy Custenborder (jcustenborder@gmail.com) - *

+ * Copyright (C) 2016 Hurence (support@hurence.com) + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

+ * + * 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. @@ -24,7 +24,8 @@ import com.google.common.base.Preconditions; import com.google.common.base.Stopwatch; import com.google.common.collect.ImmutableMap; -import com.google.common.io.Files; +import com.hurence.logisland.connect.spooldir.modele.DelayedFile; +import com.hurence.logisland.utils.LinkedHashSetBlockingQueue; import com.hurence.logisland.utils.SynchronizedFileLister; import org.apache.kafka.connect.data.Date; import org.apache.kafka.connect.data.Schema; @@ -43,23 +44,33 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.DelayQueue; import java.util.concurrent.TimeUnit; public abstract class SpoolDirSourceTask extends SourceTask { - static final Logger log = LoggerFactory.getLogger(SpoolDirSourceTask.class); + private static final Logger log = LoggerFactory.getLogger(SpoolDirSourceTask.class); protected Parser parser; protected Map sourcePartition; CONF config; Stopwatch processingTime = Stopwatch.createStarted(); + //those 4 properties are set up in openNextFileAndConfigureIt private File inputFile; - private long inputFileModifiedTime; private InputStream inputStream; - private boolean hasRecords = false; + private long inputFileModifiedTime; private Map metadata; + + private boolean currentFileFinished = false; + private boolean currentFileInError = false; + private boolean lastChance = false; + private boolean firstPoll = true; private SynchronizedFileLister fileLister; + final DelayQueue errorFileQueue = new DelayQueue<>(); + private static void checkDirectory(String key, File directoryPath) { if (log.isInfoEnabled()) { @@ -146,77 +157,158 @@ Time.SCHEMA, new TimeTypeParser(this.config.parserTimestampTimezone, this.config for (Map.Entry kvp : dateTypeParsers.entrySet()) { this.parser.registerTypeParser(kvp.getKey(), kvp.getValue()); } + config.logUnused(); + log.info("Started source task : {}", SpoolDirSourceTask.class.getCanonicalName()); } @Override public void stop() { - + if (this.inputStream != null) { + try { + this.inputStream.close(); + } catch (IOException e) { + log.error("Exception thrown while closing inputstream of class : " + this.getClass().getCanonicalName(), e); + } + } } @Override public List poll() throws InterruptedException { - fileLister.updateList(); - log.trace("poll()"); - List results = read(); + log.debug("Polling for new data (files)"); + if (fileLister.needToUpdateList()) { + fileLister.lock(); + try { + if (fileLister.needToUpdateList()) { + fileLister.updateList(); + } + } finally { + fileLister.unlock(); + } + } + if (firstPoll) { + firstPoll = false; + if (!openNextFileAndConfigureIt()) {//no file available + log.info("No more files available. Sleeping {} ms.", this.config.emptyPollWaitMs * 2); + Thread.sleep(this.config.emptyPollWaitMs * 2); + return Collections.emptyList(); + } + } + if (currentFileFinished) { + if (!openNextFileAndConfigureIt()) {//no file available + log.info("No more files available. Sleeping {} ms.", this.config.emptyPollWaitMs * 2); + Thread.sleep(this.config.emptyPollWaitMs * 2); + return Collections.emptyList(); + } + } - if (results.isEmpty()) { - log.trace("read() returned empty list. Sleeping {} ms.", this.config.emptyPollWaitMs); + List results = read(); + this.currentFileFinished = results.isEmpty(); + if (currentFileFinished) { + if (currentFileInError) { + if (lastChance) { + moveCurrentFileToErrorFolder(); + } else { + log.error("parsing file {} resulted in an error. Will try once more time after a delay", this.inputFile); + errorFileQueue.add(new DelayedFile(this.inputFile, this.config.delayOnErrorMs, TimeUnit.MILLISECONDS)); + } + lastChance = false; + currentFileInError = false; + } else { + moveCurrentFileToFinishedFolder(); + } + log.info("Current file is ended. Sleeping {} ms before processing next file.", this.config.emptyPollWaitMs); Thread.sleep(this.config.emptyPollWaitMs); + } else { + log.trace("read() returning {} result(s)", results.size()); } - log.trace("read() returning {} result(s)", results.size()); - return results; } - - public List read() { + public void moveCurrentFileToErrorFolder() { try { - if (!hasRecords) { - fileLister.closeAndMoveToFinished(this.inputStream, this.inputFile, this.config.inputPath, this.config.finishedPath, false); - this.inputStream = null; + log.info("Moving file {} to error folder {}", this.inputFile, this.config.errorPath); + fileLister.moveTo(this.inputFile, this.config.inputPath, this.config.errorPath); + } catch (IOException ex0) { + log.error( + String.format("Exception thrown while moving file %s to error folder %s", + this.inputFile, this.config.errorPath), + ex0); + } + } - File nextFile = fileLister.take(); - if (null == nextFile) { - return new ArrayList<>(); - } + public void moveCurrentFileToFinishedFolder() { + log.info("Moving file {} to finished folder {}", this.inputFile, this.config.finishedPath); + try { + fileLister.moveTo(this.inputFile, this.config.inputPath, this.config.finishedPath); + } catch (IOException e) { + log.error( + String.format("Exception encountered moving file %s to finished folder %s", + this.inputFile, this.config.finishedPath), + e); + } + } - this.metadata = ImmutableMap.of(); - this.inputFile = nextFile; - this.inputFileModifiedTime = this.inputFile.lastModified(); + /** + * + * @return true if there is a next file otherwise return false + */ + private boolean openNextFileAndConfigureIt() { + DelayedFile failedFile = errorFileQueue.poll(); + if (failedFile != null) { + this.inputFile = failedFile.getFailedFile(); + lastChance = true; + log.info("Opening {}, this file produced an error last time trying to parse it", this.inputFile); + } else { + this.inputFile = fileLister.take(); + } + if (null == this.inputFile) { + return false; + } + this.metadata = ImmutableMap.of(); + this.inputFileModifiedTime = this.inputFile.lastModified(); + try { + this.sourcePartition = ImmutableMap.of( + "fileName", this.inputFile.getName() + ); + log.info("Opening {}", this.inputFile); + Long lastOffset = null; + log.debug("looking up offset for {}", this.sourcePartition); + if (this.context != null) { + Map offset = this.context.offsetStorageReader().offset(this.sourcePartition); + if (null != offset && !offset.isEmpty()) { + Number number = (Number) offset.get("offset"); + lastOffset = number.longValue(); + } + } + if (this.inputStream != null) { try { - this.sourcePartition = ImmutableMap.of( - "fileName", this.inputFile.getName() - ); - log.info("Opening {}", this.inputFile); - Long lastOffset = null; - log.trace("looking up offset for {}", this.sourcePartition); - Map offset = this.context.offsetStorageReader().offset(this.sourcePartition); - if (null != offset && !offset.isEmpty()) { - Number number = (Number) offset.get("offset"); - lastOffset = number.longValue(); - } - this.inputStream = new FileInputStream(this.inputFile); - configure(this.inputStream, this.metadata, lastOffset); + this.inputStream.close(); } catch (Exception ex) { - throw new ConnectException(ex); + log.error("Exception during inputStream close", ex); } - processingTime.reset(); - processingTime.start(); } - List records = process(); - this.hasRecords = !records.isEmpty(); - return records; + this.inputStream = new FileInputStream(this.inputFile); + configure(this.inputStream, this.metadata, lastOffset); } catch (Exception ex) { - log.error("Exception encountered processing line {} of {}.", recordOffset(), this.inputFile, ex); + log.error("Exception during inputStream configuration", ex); + throw new ConnectException(ex); + } + processingTime.reset(); + processingTime.start(); + return true; + } - try { - fileLister.closeAndMoveToFinished(this.inputStream, this.inputFile, this.config.inputPath, this.config.errorPath, false); - this.inputStream = null; - } catch (IOException | InterruptedException ex0) { - log.error("Exception thrown while moving {} to {}", this.inputFile, this.config.errorPath, ex0); - } + private List read() { + try { + return process(); + } catch (Exception ex) { + log.error( + String.format("Exception encountered processing line %s of %s.", + recordOffset(), this.inputFile), + ex); + currentFileInError = true; if (this.config.haltOnError) { throw new ConnectException(ex); } else { @@ -230,6 +322,7 @@ protected void addRecord(List records, Struct keyStruct, Struct va "offset", recordOffset() ); + log.trace("addRecord() - {}", sourceOffset); if (this.config.hasKeyMetadataField && null != keyStruct) { keyStruct.put(this.config.keyMetadataField, this.metadata); @@ -243,7 +336,7 @@ protected void addRecord(List records, Struct keyStruct, Struct va switch (this.config.timestampMode) { case FIELD: - log.trace("addRecord() - Reading date from timestamp field '{}'", this.config.timestampField); + log.debug("addRecord() - Reading date from timestamp field '{}'", this.config.timestampField); java.util.Date date = (java.util.Date) valueStruct.get(this.config.timestampField); timestamp = date.getTime(); break; diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/modele/DelayedFile.java b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/modele/DelayedFile.java new file mode 100644 index 000000000..a911db8c0 --- /dev/null +++ b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/connect/spooldir/modele/DelayedFile.java @@ -0,0 +1,63 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.connect.spooldir.modele; + +import java.io.File; +import java.util.concurrent.Delayed; +import java.util.concurrent.TimeUnit; + +public class DelayedFile implements Delayed { + + private final File failedFile; + private final long timeDelayOk; + + public DelayedFile(File failedFile, long timestampOfError, long delay, TimeUnit unit) { + this.failedFile = failedFile; + this.timeDelayOk = timestampOfError + unit.toMillis(delay); + } + + public DelayedFile(File failedFile, long delay, TimeUnit unit) { + this(failedFile, System.currentTimeMillis(), delay, unit); + } + + public DelayedFile(File failedFile, long delay) { + this(failedFile, System.currentTimeMillis(), delay, TimeUnit.SECONDS); + } + + public DelayedFile(File failedFile) { + this(failedFile, System.currentTimeMillis(), 10, TimeUnit.SECONDS); + } + + @Override + public long getDelay(TimeUnit unit) { + long currentDate = System.currentTimeMillis(); + long delay = timeDelayOk - currentDate; + return unit.convert(delay, TimeUnit.MILLISECONDS); + } + + @Override + public int compareTo(Delayed o) { + return Long.compare(this.timeDelayOk, ((DelayedFile) o).getTimeDelayOk()); + } + + public File getFailedFile() { + return failedFile; + } + + public long getTimeDelayOk() { + return timeDelayOk; + } +} diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/utils/LinkedHashSetBlockingQueue.java b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/utils/LinkedHashSetBlockingQueue.java index 1c40165d9..1a862a229 100644 --- a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/utils/LinkedHashSetBlockingQueue.java +++ b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/utils/LinkedHashSetBlockingQueue.java @@ -1,3 +1,18 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.hurence.logisland.utils; import java.util.AbstractQueue; diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/utils/SynchronizedFileLister.java b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/utils/SynchronizedFileLister.java index 3c0899bb7..cbdd04f86 100644 --- a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/utils/SynchronizedFileLister.java +++ b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/main/java/com/hurence/logisland/utils/SynchronizedFileLister.java @@ -1,7 +1,22 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.hurence.logisland.utils; import com.google.common.io.Files; -import com.hurence.logisland.connect.spooldir.SpoolDirSourceConnector; +import com.sun.management.UnixOperatingSystemMXBean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -9,35 +24,21 @@ import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; +import java.lang.management.ManagementFactory; +import java.lang.management.OperatingSystemMXBean; +import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.LinkedHashSet; -import java.util.List; import java.util.concurrent.BlockingQueue; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; +import java.util.stream.Stream; public class SynchronizedFileLister { - private int capacity = Integer.MAX_VALUE; - - /** - * Current number of elements - */ - private final AtomicInteger count = new AtomicInteger(0); - /** * Lock held by take, poll, etc */ private final ReentrantLock updateLock = new ReentrantLock(); - /** - * Wait queue for waiting takes - */ - private final Condition notEmpty = updateLock.newCondition(); - private File inputPath; private FilenameFilter inputFilenameFilter; private String processingFileExtension; @@ -46,13 +47,13 @@ public class SynchronizedFileLister { private final BlockingQueue fileQueue = new LinkedHashSetBlockingQueue<>(1024); - private static Logger log = LoggerFactory.getLogger(SynchronizedFileLister.class); + private static final Logger log = LoggerFactory.getLogger(SynchronizedFileLister.class); /** * Holder */ - private static class SynchronizedFileListernHolder { + private static class SynchronizedFileListerHolder { /** * Instance unique non préinitialisée */ @@ -66,7 +67,7 @@ public static SynchronizedFileLister getInstance(File inputPath, FilenameFilter inputFilenameFilter, long minimumFileAgeMS, String processingFileExtension) { - return SynchronizedFileListernHolder.instance + return SynchronizedFileListerHolder.instance .config(inputPath, inputFilenameFilter, minimumFileAgeMS, processingFileExtension); } @@ -82,108 +83,138 @@ private SynchronizedFileLister config(File inputPath, return this; } - public void updateList() throws InterruptedException { - final ReentrantLock updateLock = this.updateLock; + public void unlock() { + updateLock.unlock(); + } + + public void lock() { updateLock.lock(); + } - try { - if (fileQueue.size() < 20) { - java.nio.file.Files.find(Paths.get(inputPath.getAbsolutePath()), - 10, - (filePath, fileAttr) -> fileAttr.isRegularFile() && - !filePath.toUri().getPath().contains(processingFileExtension) && - inputFilenameFilter.accept(filePath.getParent().toFile(), filePath.getFileName().toString())) - .limit(20) - .forEach(f -> { - File newFile = f.toFile(); - - File processingFile = processingFile(newFile); - log.trace("Checking for processing file: {}", processingFile); - - long fileAgeMS = System.currentTimeMillis() - newFile.lastModified(); - - if (fileAgeMS < 0L) { - log.warn("File {} has a date in the future.", newFile); - } - - if (processingFile.exists()) { - log.trace("Skipping {} because processing file exists.", f); - } else if (minimumFileAgeMS > 0L && fileAgeMS < minimumFileAgeMS) { - log.debug("Skipping {} because it does not meet the minimum age.", newFile); - } else { - fileQueue.add(newFile); - } - }); - } + public boolean needToUpdateList() { + return fileQueue.size() < 20; + } + + /** + * Fill up queue with files to be processed + * Does not create the processing file. + */ + public void updateList() { + OperatingSystemMXBean os = ManagementFactory.getOperatingSystemMXBean(); + if(log.isTraceEnabled() && os instanceof UnixOperatingSystemMXBean){ + log.trace("before updateList(), number of open file descriptors is {}", ((UnixOperatingSystemMXBean) os).getOpenFileDescriptorCount()); + } + log.debug("before updateList(), size of file queue is {}", fileQueue.size()); + try (Stream pathsToQueue = getFilesStreamToQueue()) {//so that stream is closed at end (to releases file ressources) + pathsToQueue.forEach(f -> { + File newFile = f.toFile(); + fileQueue.add(newFile); + }); } catch (IOException e) { - e.printStackTrace(); - } finally { - updateLock.unlock(); + log.error("error in updateList()", e); + } + if(log.isTraceEnabled() && os instanceof UnixOperatingSystemMXBean){ + log.trace("after updateList(), number of open file descriptors is {}", ((UnixOperatingSystemMXBean) os).getOpenFileDescriptorCount()); } + log.debug("after updateList(), size of file queue is {}", fileQueue.size()); } - public void closeAndMoveToFinished(InputStream inputStream, File inputFile, File inputDirectory, File outputDirectory, boolean errored) throws IOException, InterruptedException { - final ReentrantLock updateLock = this.updateLock; - updateLock.lock(); - try { - if (null != inputStream) { - log.info("Closing {}", inputFile); - inputStream.close(); - - String enclosingFolderName = inputFile.getAbsolutePath() - .replaceAll(inputDirectory.getAbsolutePath(), "") - .replaceAll(inputFile.getName(), ""); - - File realOutputDir = new File(outputDirectory.getAbsolutePath() + enclosingFolderName); - if (!realOutputDir.exists()) - realOutputDir.mkdirs(); + public Stream getFilesStreamToQueue() throws IOException { + return java.nio.file.Files.find(Paths.get(inputPath.getAbsolutePath()), + 10, + (filePath, fileAttr) -> fileAttr.isRegularFile() && + !filePath.toUri().getPath().contains(processingFileExtension) && + inputFilenameFilter.accept(filePath.getParent().toFile(), filePath.getFileName().toString())) + .filter(f -> { + File newFile = f.toFile(); + long fileAgeMS = System.currentTimeMillis() - newFile.lastModified(); + if (fileAgeMS < 0L) { + log.error("File {} has a date in the future.", newFile); + } + File processingFile = getProcessingFile(newFile); + if (processingFile.exists()) { + log.trace("Skipping file {} because a processing file already exists.", newFile); + return false; + } else if (minimumFileAgeMS > 0L && fileAgeMS < minimumFileAgeMS) { + log.debug("Skipping file {} because it does not meet the minimum age.", newFile); + return false; + } else { + return true; + } + }) + .limit(200); + } - File finishedFile = new File(realOutputDir, inputFile.getName()); + public void moveTo(File inputFile, File inputDirectory, File outputDirectory) throws IOException { +// updateLock.lock(); +// try { + OperatingSystemMXBean os = ManagementFactory.getOperatingSystemMXBean(); + if(log.isTraceEnabled() && os instanceof UnixOperatingSystemMXBean){ + log.trace("before moveTo(), number of open file descriptors is {}", ((UnixOperatingSystemMXBean) os).getOpenFileDescriptorCount()); + } + String enclosingFolderName = inputFile.getAbsolutePath() + .replaceAll(inputDirectory.getAbsolutePath(), "") + .replaceAll(inputFile.getName(), ""); - if (errored) { - log.error("Error during processing, moving {} to {}.", inputFile, outputDirectory); - } + File realOutputDir = new File(outputDirectory.getAbsolutePath() + enclosingFolderName); + if (!realOutputDir.exists()) + realOutputDir.mkdirs(); - if (inputFile.exists()) { - Files.move(inputFile, finishedFile); - } else { - log.trace("Unable to move file {}, may be already moved.", inputFile); - } - File processingFile = processingFile(inputFile); - if (processingFile.exists()) { - log.info("Removing processing file {}", processingFile); - processingFile.delete(); - } + File finishedFile = new File(realOutputDir, inputFile.getName()); - } - } finally { - updateLock.unlock(); + if (inputFile.exists()) { + Files.move(inputFile, finishedFile); + } else { + log.warn("file {} does not exist anymore (should not happen if there is only one VM).", inputFile); } + File processingFile = getProcessingFile(inputFile); + if (processingFile.exists()) { + processingFile.delete(); + log.info("Deleted processing file {}", processingFile); + } else { + log.warn("Processing file {} is already deleted (should not happen if there is only one VM).", + processingFile); + } + if(log.isTraceEnabled() && os instanceof UnixOperatingSystemMXBean){ + log.trace("after moveTo(), number of open file descriptors is {}", ((UnixOperatingSystemMXBean) os).getOpenFileDescriptorCount()); + } +// } finally { +// updateLock.unlock(); +// } } - public File take() throws InterruptedException { - final ReentrantLock updateLock = this.updateLock; + /** + * if it return a files, it creates the processing file in the process. + * If this creation fail then it return null. + * @return the next file in queue (can be null) + */ + public File take() { updateLock.lock(); - + log.debug("before take(), size of file queue is {}", fileQueue.size()); File file = null; try { file = fileQueue.poll(); if (file != null) { - File processingFile = processingFile(file); - Files.touch(processingFile); + File processingFile = getProcessingFile(file); + if (processingFile.createNewFile()) { + return file; + } else { + return null; + } } } catch (IOException e) { - e.printStackTrace(); + log.error("error in take()", e); } finally { + log.debug("after take(), size of file queue is {}", fileQueue.size()); updateLock.unlock(); } return file; } - File processingFile(File input) { + File getProcessingFile(File input) { String fileName = input.getName() + processingFileExtension; return new File(input.getParentFile(), fileName); } diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/java/com/hurence/connect/spooldir/SpoolDirCsvSourceConnectorTest.java b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/java/com/hurence/connect/spooldir/SpoolDirCsvSourceConnectorTest.java new file mode 100644 index 000000000..820908dea --- /dev/null +++ b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/java/com/hurence/connect/spooldir/SpoolDirCsvSourceConnectorTest.java @@ -0,0 +1,130 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.connect.spooldir; + +import com.hurence.logisland.connect.spooldir.SpoolDirCsvSourceConnector; +import com.hurence.logisland.connect.spooldir.SpoolDirCsvSourceConnectorConfig; +import com.hurence.logisland.connect.spooldir.SpoolDirCsvSourceTask; +import org.apache.kafka.connect.source.SourceRecord; +import org.junit.Assert; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class SpoolDirCsvSourceConnectorTest { + + private static final Logger logger = LoggerFactory.getLogger(SpoolDirCsvSourceConnectorTest.class); + + /** + * batch size is 5000 + * line 20081 of file is KO + * So only 20000 records should be correctly returned, then file should be in error folder. + */ + // @Test + public void testKoFile() { + final String koFileName="dataHistorian-row-20081-ko.csv"; + try { + final Path tempDirWithPrefix = Files.createTempDirectory("testKoFile"); + final SpoolDirCsvSourceTask task = new SpoolDirCsvSourceTask(); + final SpoolDirCsvSourceConnector connector = new SpoolDirCsvSourceConnector(); + try { + final File tmpDir = tempDirWithPrefix.toFile(); + final File inputDir = new File(tmpDir, "spooldir"); + inputDir.mkdir(); + final File outputDir = new File(tmpDir, "spooldir-finished"); + outputDir.mkdir(); + final File outputErrorDir = new File(tmpDir, "spooldir-finished-error"); + outputErrorDir.mkdir(); + + copyResourceToInput(inputDir, "/spooldir/bug-csv/" + koFileName); + + final Map properties = new HashMap<>(); + properties.put(SpoolDirCsvSourceConnectorConfig.INPUT_PATH_CONFIG, inputDir.getPath()); + properties.put(SpoolDirCsvSourceConnectorConfig.FINISHED_PATH_CONFIG, outputDir.getPath()); + properties.put(SpoolDirCsvSourceConnectorConfig.ERROR_PATH_CONFIG, outputErrorDir.getPath()); + properties.put(SpoolDirCsvSourceConnectorConfig.EMPTY_POLL_WAIT_MS_CONF, "500"); + properties.put(SpoolDirCsvSourceConnectorConfig.DELAY_ON_ERROR_BEFORE_RETRYING_MS_CONF, "100"); + properties.put(SpoolDirCsvSourceConnectorConfig.INPUT_FILE_PATTERN_CONF, "^.*.csv$"); + properties.put(SpoolDirCsvSourceConnectorConfig.HALT_ON_ERROR_CONF, "false"); + properties.put(SpoolDirCsvSourceConnectorConfig.TOPIC_CONF, "evoa_measures"); + properties.put(SpoolDirCsvSourceConnectorConfig.CSV_FIRST_ROW_AS_HEADER_CONF, "true"); + properties.put(SpoolDirCsvSourceConnectorConfig.SCHEMA_GENERATION_ENABLED_CONF, "false"); + properties.put(SpoolDirCsvSourceConnectorConfig.CSV_SEPARATOR_CHAR_CONF, "59"); + properties.put(SpoolDirCsvSourceConnectorConfig.BATCH_SIZE_CONF, "5000"); + properties.put(SpoolDirCsvSourceConnectorConfig.PARSER_TIMESTAMP_DATE_FORMATS_CONF, "dd/MM/yyyy HH:mm:ss"); + properties.put(SpoolDirCsvSourceConnectorConfig.KEY_SCHEMA_CONF, "{\"name\":\"com.hurence.logisland.record.TimeserieRecordKey\",\"type\":\"STRUCT\",\"isOptional\":true,\"fieldSchemas\":{\"tagname\":{\"type\":\"STRING\",\"isOptional\":false}}}"); + properties.put(SpoolDirCsvSourceConnectorConfig.VALUE_SCHEMA_CONF, "{\"name\":\"com.hurence.logisland.record.TimeserieRecordValue\",\"type\":\"STRUCT\",\"isOptional\":false,\"fieldSchemas\":{\"timestamp\":{\"name\":\"org.apache.kafka.connect.data.Timestamp\",\"type\":\"INT64\",\"version\":1,\"isOptional\":false},\"value\":{\"type\":\"FLOAT64\",\"isOptional\":false},\"tagname\":{\"type\":\"STRING\",\"isOptional\":false},\"quality\":{\"type\":\"FLOAT32\",\"isOptional\":true}}}"); + connector.start(properties); + task.start(connector.taskConfigs(1).get(0)); + + + boolean empty = false; + long counter = 0; + while (!empty) { + List records = task.poll(); + empty = records.isEmpty(); + counter += records.size(); + } + Assert.assertEquals(20000, counter); + Assert.assertFalse(new File(outputErrorDir, koFileName).exists()); + empty = false; + while (!empty) { + List records = task.poll(); + empty = records.isEmpty(); + counter += records.size(); + } + Assert.assertEquals(40000, counter);//recomputed all data ass offset is not stored without kafka + Assert.assertTrue(new File(outputErrorDir, koFileName).exists()); + } catch (Exception e){ + logger.error("error while processing", e); + } finally { + task.stop(); + connector.stop(); + deleteDirectory(tempDirWithPrefix.toFile()); + } + } catch (IOException e) { + logger.error("error setuping tmp dir", e); + } + } + + private boolean deleteDirectory(File directoryToBeDeleted) { + File[] allContents = directoryToBeDeleted.listFiles(); + if (allContents != null) { + for (File file : allContents) { + deleteDirectory(file); + } + } + return directoryToBeDeleted.delete(); + } + + private void copyResourceToInput(File inputDir, String resourcePath) throws URISyntaxException, IOException { + String fileName = new File(resourcePath).getName(); + URI csvUri = getClass().getResource(resourcePath).toURI(); + Files.copy(Paths.get(csvUri), Paths.get(new File(inputDir, fileName).toURI())); + } + +} diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/java/com/hurence/connect/spooldir/SynchronizedFileListerTest.java b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/java/com/hurence/connect/spooldir/SynchronizedFileListerTest.java new file mode 100644 index 000000000..bbcf89cde --- /dev/null +++ b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/java/com/hurence/connect/spooldir/SynchronizedFileListerTest.java @@ -0,0 +1,83 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.connect.spooldir; + +import com.google.common.io.PatternFilenameFilter; +import com.hurence.logisland.utils.SynchronizedFileLister; +import com.sun.management.UnixOperatingSystemMXBean; +import org.junit.Assert; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.lang.management.ManagementFactory; +import java.lang.management.OperatingSystemMXBean; +import java.util.regex.Pattern; + +public class SynchronizedFileListerTest { + + private static final Logger logger = LoggerFactory.getLogger(SynchronizedFileListerTest.class); + @Test + public void test1() throws Exception { + logger.info("ton cul"); + logger.debug("ton cul debug"); + logger.trace("ton cul trace"); + final String processingSuffix = ".PROCESSING"; + final String inputPath = getClass().getResource("/spooldir").getFile(); + final File inputDir = new File(inputPath); + PatternFilenameFilter inputFilenameFilter = new PatternFilenameFilter(Pattern.compile("^.*.csv$")); + SynchronizedFileLister fileLsiter = SynchronizedFileLister.getInstance( + inputDir, inputFilenameFilter, 0, processingSuffix + ); + Assert.assertNull(fileLsiter.take()); + OperatingSystemMXBean os = ManagementFactory.getOperatingSystemMXBean(); + logger.info("Number of open file descriptors is {}", ((UnixOperatingSystemMXBean) os).getOpenFileDescriptorCount()); + fileLsiter.updateList(); + logger.info("Number of open file descriptors is {}", ((UnixOperatingSystemMXBean) os).getOpenFileDescriptorCount()); + fileLsiter.updateList(); + logger.info("Number of open file descriptors is {}", ((UnixOperatingSystemMXBean) os).getOpenFileDescriptorCount()); + fileLsiter.updateList(); + logger.info("Number of open file descriptors is {}", ((UnixOperatingSystemMXBean) os).getOpenFileDescriptorCount()); + fileLsiter.updateList(); + logger.info("Number of open file descriptors is {}", ((UnixOperatingSystemMXBean) os).getOpenFileDescriptorCount()); + fileLsiter.updateList(); + logger.info("Number of open file descriptors is {}", ((UnixOperatingSystemMXBean) os).getOpenFileDescriptorCount()); + fileLsiter.updateList(); + logger.info("Number of open file descriptors is {}", ((UnixOperatingSystemMXBean) os).getOpenFileDescriptorCount()); + fileLsiter.updateList(); + logger.info("Number of open file descriptors is {}", ((UnixOperatingSystemMXBean) os).getOpenFileDescriptorCount()); + fileLsiter.updateList(); + logger.info("Number of open file descriptors is {}", ((UnixOperatingSystemMXBean) os).getOpenFileDescriptorCount()); + fileLsiter.updateList(); + logger.info("Number of open file descriptors is {}", ((UnixOperatingSystemMXBean) os).getOpenFileDescriptorCount()); + fileLsiter.updateList(); + logger.info("Number of open file descriptors is {}", ((UnixOperatingSystemMXBean) os).getOpenFileDescriptorCount()); + File firstFileInQueue = fileLsiter.take(); + + Assert.assertNotNull(firstFileInQueue); + + final File outputDir = new File(inputDir.getParent(), "spooldir-finished"); + final File firstFileInQueueProcessingFile = new File(firstFileInQueue.getParent(), firstFileInQueue.getName() + processingSuffix); + Assert.assertTrue(firstFileInQueue.exists()); + Assert.assertTrue(firstFileInQueueProcessingFile.exists()); + fileLsiter.moveTo(firstFileInQueue, inputDir, outputDir); + logger.info("Number of open file descriptors is {}", ((UnixOperatingSystemMXBean) os).getOpenFileDescriptorCount()); + Assert.assertFalse(firstFileInQueue.exists()); + Assert.assertFalse(firstFileInQueueProcessingFile.exists()); + } + +} diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/java/com/hurence/connect/spooldir/modele/DelayedFileTest.java b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/java/com/hurence/connect/spooldir/modele/DelayedFileTest.java new file mode 100644 index 000000000..8cfbc06b6 --- /dev/null +++ b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/java/com/hurence/connect/spooldir/modele/DelayedFileTest.java @@ -0,0 +1,68 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.connect.spooldir.modele; + +import com.hurence.logisland.connect.spooldir.modele.DelayedFile; +import com.hurence.logisland.utils.LinkedHashSetBlockingQueue; +import org.junit.Assert; +import org.junit.Test; + +import java.io.File; +import java.util.concurrent.DelayQueue; +import java.util.concurrent.TimeUnit; + +public class DelayedFileTest { + + /** + * test ordered by delai + */ + @Test + public void testOrderedbyDelay() { + final DelayQueue errorFileQueue = new DelayQueue<>(); + DelayedFile a = new DelayedFile(new File("a"), 100, TimeUnit.MILLISECONDS); + DelayedFile b = new DelayedFile(new File("b"), 200, TimeUnit.MILLISECONDS); + DelayedFile c = new DelayedFile(new File("c"), 300, TimeUnit.MILLISECONDS); + DelayedFile d = new DelayedFile(new File("c"), 400, TimeUnit.MILLISECONDS); + errorFileQueue.add(a); + errorFileQueue.add(c); + errorFileQueue.add(b); + errorFileQueue.add(d); + + Assert.assertNull(errorFileQueue.poll()); + Assert.assertNull(errorFileQueue.poll()); + while (!errorFileQueue.isEmpty()) { + DelayedFile currentFile = errorFileQueue.poll(); + if (currentFile != null) { + switch (errorFileQueue.size()) { + case 0: + Assert.assertEquals(currentFile, d); + break; + case 1: + Assert.assertEquals(currentFile, c); + break; + case 2: + Assert.assertEquals(currentFile, b); + break; + case 3: + Assert.assertEquals(currentFile, a); + break; + default: + Assert.fail("uncorrect size"); + } + } + } + } +} diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/DataHasMoreFields.json b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/DataHasMoreFields.json deleted file mode 100644 index b9ceea34b..000000000 --- a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/DataHasMoreFields.json +++ /dev/null @@ -1,4621 +0,0 @@ -{ - "settings" : { - "csv.first.row.as.header" : "true" - }, - "offset" : { }, - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "expected" : [ { - "sourcePartition" : { - "fileName" : "DataHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 2 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 1 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 1 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Jack" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Garcia" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jgarcia0@shop-pro.jp" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "196.56.44.185" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1443626943000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 347.77 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "IT" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#4a2313" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "DataHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 3 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 2 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 2 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "John" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Kim" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jkim1@miibeian.gov.cn" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "53.19.132.185" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1447497249000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 251.24 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CZ" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#3e56cf" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "DataHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 4 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 3 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 3 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Ashley" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Austin" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "aaustin2@hatena.ne.jp" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "21.164.37.9" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - } - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 819.47 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "DataHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 5 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 4 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 4 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Jonathan" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Mcdonald" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jmcdonald3@amazon.co.uk" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "188.172.42.140" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1451313421000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 868.38 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ID" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#1b1414" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "DataHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 6 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 5 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 5 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Helen" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Lane" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "hlane4@trellian.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "159.171.138.190" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1467312078000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 398.97 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "TN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "DataHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 7 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 6 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 6 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Scott" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Lopez" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "slopez5@google.co.jp" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "86.194.226.35" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1439432031000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 322.99 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "BR" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "DataHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 8 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 7 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 7 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Christine" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Franklin" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "cfranklin6@reuters.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "248.173.207.64" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1450783797000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 301.26 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "PH" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#1d5e9d" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "DataHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 9 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 8 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 8 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Helen" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Andrews" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "handrews7@histats.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "83.160.63.181" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1457264470000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 217.96 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CU" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "DataHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 10 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 9 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 9 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Stephanie" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Gordon" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "sgordon8@goodreads.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "193.143.42.212" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1445983644000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 495.80 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "DataHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 11 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 10 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 10 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Shirley" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Andrews" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "sandrews9@flickr.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "99.113.183.206" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1446894772000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 157.75 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "BR" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#fc1da9" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "DataHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 12 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 11 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 11 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Joshua" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Reid" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jreida@wikia.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "197.96.118.164" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1440249378000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 431.80 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CO" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#6e3e36" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "DataHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 13 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 12 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 12 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Frances" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Parker" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "fparkerb@engadget.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "226.237.57.25" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1445133015000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 188.21 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "BR" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#73e909" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "DataHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 14 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 13 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 13 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Sharon" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Lawson" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "slawsonc@bravesites.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "198.189.134.106" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1452793869000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 206.73 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "VN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "DataHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 15 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 14 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 14 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Elizabeth" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Wells" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ewellsd@redcross.org" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "120.108.59.206" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1441230787000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 499.48 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CZ" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#e9c943" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "DataHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 16 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 15 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 15 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Norma" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Wilson" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "nwilsone@google.com.br" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "18.246.76.220" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1443319848000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : -65.19 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "SE" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#645119" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "DataHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 17 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 16 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 16 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Joan" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Watkins" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jwatkinsf@yolasite.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "240.27.33.114" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1459384154000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 264.23 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "PH" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "DataHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 18 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 17 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 17 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Gerald" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Hamilton" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ghamiltong@fc2.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "182.75.62.95" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1455114575000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 309.26 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ID" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "DataHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 19 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 18 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 18 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Paula" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Taylor" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ptaylorh@wikispaces.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "245.74.203.0" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1462936510000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 927.45 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "DataHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 20 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 19 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 19 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Carolyn" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Burns" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "cburnsi@marketwatch.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "180.243.11.10" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1456685363000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 752.76 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "NL" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "DataHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 21 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 20 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 20 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Robin" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Bennett" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "rbennettj@cdc.gov" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "169.77.92.179" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1455498404000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 143.30 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ID" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#506128" - } ] - } - } ] -} \ No newline at end of file diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/FieldsMatch.json b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/FieldsMatch.json deleted file mode 100644 index f73b69d1b..000000000 --- a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/FieldsMatch.json +++ /dev/null @@ -1,4621 +0,0 @@ -{ - "settings" : { - "csv.first.row.as.header" : "true" - }, - "offset" : { }, - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "expected" : [ { - "sourcePartition" : { - "fileName" : "FieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 2 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 1 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 1 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Jack" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Garcia" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jgarcia0@shop-pro.jp" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "196.56.44.185" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1443626943000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 347.77 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "IT" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#4a2313" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 3 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 2 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 2 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "John" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Kim" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jkim1@miibeian.gov.cn" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "53.19.132.185" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1447497249000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 251.24 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CZ" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#3e56cf" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 4 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 3 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 3 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Ashley" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Austin" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "aaustin2@hatena.ne.jp" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "21.164.37.9" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - } - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 819.47 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 5 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 4 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 4 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Jonathan" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Mcdonald" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jmcdonald3@amazon.co.uk" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "188.172.42.140" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1451313421000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 868.38 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ID" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#1b1414" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 6 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 5 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 5 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Helen" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Lane" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "hlane4@trellian.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "159.171.138.190" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1467312078000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 398.97 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "TN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 7 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 6 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 6 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Scott" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Lopez" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "slopez5@google.co.jp" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "86.194.226.35" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1439432031000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 322.99 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "BR" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 8 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 7 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 7 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Christine" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Franklin" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "cfranklin6@reuters.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "248.173.207.64" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1450783797000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 301.26 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "PH" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#1d5e9d" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 9 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 8 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 8 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Helen" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Andrews" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "handrews7@histats.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "83.160.63.181" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1457264470000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 217.96 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CU" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 10 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 9 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 9 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Stephanie" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Gordon" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "sgordon8@goodreads.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "193.143.42.212" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1445983644000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 495.80 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 11 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 10 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 10 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Shirley" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Andrews" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "sandrews9@flickr.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "99.113.183.206" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1446894772000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 157.75 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "BR" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#fc1da9" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 12 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 11 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 11 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Joshua" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Reid" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jreida@wikia.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "197.96.118.164" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1440249378000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 431.80 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CO" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#6e3e36" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 13 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 12 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 12 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Frances" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Parker" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "fparkerb@engadget.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "226.237.57.25" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1445133015000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 188.21 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "BR" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#73e909" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 14 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 13 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 13 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Sharon" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Lawson" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "slawsonc@bravesites.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "198.189.134.106" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1452793869000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 206.73 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "VN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 15 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 14 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 14 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Elizabeth" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Wells" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ewellsd@redcross.org" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "120.108.59.206" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1441230787000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 499.48 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CZ" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#e9c943" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 16 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 15 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 15 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Norma" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Wilson" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "nwilsone@google.com.br" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "18.246.76.220" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1443319848000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : -65.19 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "SE" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#645119" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 17 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 16 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 16 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Joan" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Watkins" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jwatkinsf@yolasite.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "240.27.33.114" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1459384154000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 264.23 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "PH" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 18 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 17 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 17 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Gerald" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Hamilton" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ghamiltong@fc2.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "182.75.62.95" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1455114575000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 309.26 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ID" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 19 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 18 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 18 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Paula" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Taylor" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ptaylorh@wikispaces.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "245.74.203.0" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1462936510000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 927.45 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 20 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 19 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 19 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Carolyn" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Burns" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "cburnsi@marketwatch.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "180.243.11.10" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1456685363000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 752.76 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "NL" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 21 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 20 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 20 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Robin" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Bennett" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "rbennettj@cdc.gov" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "169.77.92.179" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1455498404000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 143.30 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ID" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#506128" - } ] - } - } ] -} \ No newline at end of file diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/FileModeFieldFieldsMatch.json b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/FileModeFieldFieldsMatch.json deleted file mode 100644 index 0a83e9720..000000000 --- a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/FileModeFieldFieldsMatch.json +++ /dev/null @@ -1,4622 +0,0 @@ -{ - "settings" : { - "csv.first.row.as.header" : "true" - }, - "offset" : { }, - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "expected" : [ { - "sourcePartition" : { - "fileName" : "FileModeFieldFieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 2 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 1 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 1 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Jack" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Garcia" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jgarcia0@shop-pro.jp" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "196.56.44.185" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "storage" : 1443626943000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 347.77 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "IT" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#4a2313" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FileModeFieldFieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 3 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 2 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 2 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "John" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Kim" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jkim1@miibeian.gov.cn" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "53.19.132.185" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "storage" : 1447497249000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 251.24 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CZ" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#3e56cf" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FileModeFieldFieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 4 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 3 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 3 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Ashley" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Austin" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "aaustin2@hatena.ne.jp" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "21.164.37.9" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "storage" : 1447497249000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 819.47 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FileModeFieldFieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 5 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 4 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 4 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Jonathan" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Mcdonald" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jmcdonald3@amazon.co.uk" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "188.172.42.140" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "storage" : 1451313421000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 868.38 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ID" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#1b1414" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FileModeFieldFieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 6 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 5 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 5 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Helen" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Lane" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "hlane4@trellian.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "159.171.138.190" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "storage" : 1467312078000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 398.97 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "TN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FileModeFieldFieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 7 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 6 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 6 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Scott" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Lopez" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "slopez5@google.co.jp" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "86.194.226.35" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "storage" : 1439432031000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 322.99 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "BR" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FileModeFieldFieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 8 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 7 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 7 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Christine" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Franklin" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "cfranklin6@reuters.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "248.173.207.64" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "storage" : 1450783797000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 301.26 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "PH" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#1d5e9d" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FileModeFieldFieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 9 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 8 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 8 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Helen" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Andrews" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "handrews7@histats.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "83.160.63.181" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "storage" : 1457264470000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 217.96 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CU" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FileModeFieldFieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 10 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 9 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 9 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Stephanie" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Gordon" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "sgordon8@goodreads.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "193.143.42.212" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "storage" : 1445983644000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 495.80 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FileModeFieldFieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 11 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 10 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 10 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Shirley" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Andrews" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "sandrews9@flickr.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "99.113.183.206" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "storage" : 1446894772000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 157.75 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "BR" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#fc1da9" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FileModeFieldFieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 12 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 11 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 11 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Joshua" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Reid" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jreida@wikia.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "197.96.118.164" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "storage" : 1440249378000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 431.80 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CO" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#6e3e36" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FileModeFieldFieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 13 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 12 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 12 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Frances" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Parker" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "fparkerb@engadget.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "226.237.57.25" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "storage" : 1445133015000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 188.21 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "BR" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#73e909" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FileModeFieldFieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 14 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 13 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 13 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Sharon" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Lawson" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "slawsonc@bravesites.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "198.189.134.106" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "storage" : 1452793869000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 206.73 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "VN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FileModeFieldFieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 15 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 14 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 14 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Elizabeth" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Wells" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ewellsd@redcross.org" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "120.108.59.206" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "storage" : 1441230787000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 499.48 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CZ" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#e9c943" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FileModeFieldFieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 16 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 15 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 15 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Norma" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Wilson" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "nwilsone@google.com.br" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "18.246.76.220" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "storage" : 1443319848000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : -65.19 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "SE" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#645119" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FileModeFieldFieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 17 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 16 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 16 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Joan" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Watkins" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jwatkinsf@yolasite.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "240.27.33.114" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "storage" : 1459384154000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 264.23 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "PH" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FileModeFieldFieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 18 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 17 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 17 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Gerald" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Hamilton" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ghamiltong@fc2.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "182.75.62.95" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "storage" : 1455114575000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 309.26 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ID" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FileModeFieldFieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 19 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 18 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 18 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Paula" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Taylor" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ptaylorh@wikispaces.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "245.74.203.0" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "storage" : 1462936510000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 927.45 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FileModeFieldFieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 20 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 19 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 19 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Carolyn" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Burns" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "cburnsi@marketwatch.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "180.243.11.10" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "storage" : 1456685363000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 752.76 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "NL" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "FileModeFieldFieldsMatch.csv" - }, - "sourceOffset" : { - "offset" : 21 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 20 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 20 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Robin" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Bennett" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "rbennettj@cdc.gov" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "169.77.92.179" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : false - }, - "storage" : 1455498404000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 143.30 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ID" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#506128" - } ] - } - } ] -} \ No newline at end of file diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/SchemaHasMoreFields.json b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/SchemaHasMoreFields.json deleted file mode 100644 index ec75028b4..000000000 --- a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/SchemaHasMoreFields.json +++ /dev/null @@ -1,4611 +0,0 @@ -{ - "settings" : { - "csv.first.row.as.header" : "true" - }, - "offset" : { }, - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "expected" : [ { - "sourcePartition" : { - "fileName" : "SchemaHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 2 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 1 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 1 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Jack" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Garcia" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jgarcia0@shop-pro.jp" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "196.56.44.185" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1443626943000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 347.77 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "IT" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SchemaHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 3 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 2 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 2 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "John" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Kim" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jkim1@miibeian.gov.cn" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "53.19.132.185" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1447497249000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 251.24 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CZ" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SchemaHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 4 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 3 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 3 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Ashley" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Austin" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "aaustin2@hatena.ne.jp" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "21.164.37.9" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - } - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 819.47 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SchemaHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 5 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 4 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 4 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Jonathan" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Mcdonald" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jmcdonald3@amazon.co.uk" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "188.172.42.140" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1451313421000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 868.38 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ID" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SchemaHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 6 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 5 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 5 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Helen" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Lane" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "hlane4@trellian.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "159.171.138.190" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1467312078000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 398.97 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "TN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SchemaHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 7 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 6 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 6 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Scott" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Lopez" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "slopez5@google.co.jp" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "86.194.226.35" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1439432031000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 322.99 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "BR" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SchemaHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 8 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 7 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 7 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Christine" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Franklin" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "cfranklin6@reuters.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "248.173.207.64" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1450783797000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 301.26 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "PH" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SchemaHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 9 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 8 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 8 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Helen" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Andrews" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "handrews7@histats.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "83.160.63.181" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1457264470000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 217.96 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CU" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SchemaHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 10 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 9 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 9 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Stephanie" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Gordon" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "sgordon8@goodreads.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "193.143.42.212" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1445983644000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 495.80 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SchemaHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 11 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 10 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 10 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Shirley" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Andrews" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "sandrews9@flickr.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "99.113.183.206" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1446894772000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 157.75 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "BR" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SchemaHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 12 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 11 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 11 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Joshua" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Reid" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jreida@wikia.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "197.96.118.164" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1440249378000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 431.80 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CO" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SchemaHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 13 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 12 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 12 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Frances" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Parker" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "fparkerb@engadget.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "226.237.57.25" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1445133015000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 188.21 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "BR" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SchemaHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 14 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 13 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 13 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Sharon" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Lawson" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "slawsonc@bravesites.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "198.189.134.106" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1452793869000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 206.73 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "VN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SchemaHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 15 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 14 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 14 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Elizabeth" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Wells" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ewellsd@redcross.org" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "120.108.59.206" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1441230787000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 499.48 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CZ" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SchemaHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 16 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 15 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 15 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Norma" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Wilson" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "nwilsone@google.com.br" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "18.246.76.220" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1443319848000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : -65.19 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "SE" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SchemaHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 17 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 16 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 16 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Joan" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Watkins" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jwatkinsf@yolasite.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "240.27.33.114" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1459384154000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 264.23 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "PH" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SchemaHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 18 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 17 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 17 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Gerald" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Hamilton" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ghamiltong@fc2.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "182.75.62.95" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1455114575000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 309.26 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ID" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SchemaHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 19 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 18 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 18 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Paula" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Taylor" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ptaylorh@wikispaces.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "245.74.203.0" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1462936510000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 927.45 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SchemaHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 20 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 19 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 19 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Carolyn" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Burns" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "cburnsi@marketwatch.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "180.243.11.10" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1456685363000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 752.76 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "NL" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SchemaHasMoreFields.csv" - }, - "sourceOffset" : { - "offset" : 21 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 20 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 20 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Robin" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Bennett" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "rbennettj@cdc.gov" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "169.77.92.179" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1455498404000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 143.30 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ID" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - } ] -} \ No newline at end of file diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/SourceOffset.json b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/SourceOffset.json deleted file mode 100644 index bde368ca9..000000000 --- a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/SourceOffset.json +++ /dev/null @@ -1,2577 +0,0 @@ -{ - "settings" : { - "csv.first.row.as.header" : "true" - }, - "offset" : { - "offset" : 10 - }, - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "expected" : [ { - "sourcePartition" : { - "fileName" : "SourceOffset.csv" - }, - "sourceOffset" : { - "offset" : 11 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 10 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 10 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Shirley" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Andrews" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "sandrews9@flickr.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "99.113.183.206" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1446894772000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 157.75 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "BR" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#fc1da9" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SourceOffset.csv" - }, - "sourceOffset" : { - "offset" : 12 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 11 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 11 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Joshua" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Reid" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jreida@wikia.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "197.96.118.164" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1440249378000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 431.80 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CO" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#6e3e36" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SourceOffset.csv" - }, - "sourceOffset" : { - "offset" : 13 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 12 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 12 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Frances" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Parker" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "fparkerb@engadget.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "226.237.57.25" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1445133015000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 188.21 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "BR" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#73e909" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SourceOffset.csv" - }, - "sourceOffset" : { - "offset" : 14 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 13 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 13 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Sharon" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Lawson" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "slawsonc@bravesites.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "198.189.134.106" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1452793869000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 206.73 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "VN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SourceOffset.csv" - }, - "sourceOffset" : { - "offset" : 15 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 14 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 14 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Elizabeth" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Wells" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ewellsd@redcross.org" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "120.108.59.206" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1441230787000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 499.48 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CZ" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#e9c943" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SourceOffset.csv" - }, - "sourceOffset" : { - "offset" : 16 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 15 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 15 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Norma" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Wilson" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "nwilsone@google.com.br" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "18.246.76.220" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1443319848000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : -65.19 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "SE" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#645119" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SourceOffset.csv" - }, - "sourceOffset" : { - "offset" : 17 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 16 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 16 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Joan" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Watkins" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jwatkinsf@yolasite.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "240.27.33.114" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1459384154000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 264.23 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "PH" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SourceOffset.csv" - }, - "sourceOffset" : { - "offset" : 18 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 17 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 17 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Gerald" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Hamilton" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ghamiltong@fc2.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "182.75.62.95" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1455114575000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 309.26 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ID" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SourceOffset.csv" - }, - "sourceOffset" : { - "offset" : 19 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 18 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 18 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Paula" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Taylor" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ptaylorh@wikispaces.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "245.74.203.0" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1462936510000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 927.45 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SourceOffset.csv" - }, - "sourceOffset" : { - "offset" : 20 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 19 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 19 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Carolyn" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Burns" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "cburnsi@marketwatch.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "180.243.11.10" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1456685363000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 752.76 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "NL" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "SourceOffset.csv" - }, - "sourceOffset" : { - "offset" : 21 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 20 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 20 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Robin" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Bennett" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "rbennettj@cdc.gov" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "169.77.92.179" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1455498404000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 143.30 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ID" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#506128" - } ] - } - } ] -} \ No newline at end of file diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/WithoutHeader.json b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/WithoutHeader.json deleted file mode 100644 index c0bcd425e..000000000 --- a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/WithoutHeader.json +++ /dev/null @@ -1,4621 +0,0 @@ -{ - "settings" : { - "csv.first.row.as.header" : "false" - }, - "offset" : { }, - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "expected" : [ { - "sourcePartition" : { - "fileName" : "WithoutHeader.csv" - }, - "sourceOffset" : { - "offset" : 1 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 1 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 1 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Jack" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Garcia" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jgarcia0@shop-pro.jp" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "196.56.44.185" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1443626943000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 347.77 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "IT" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#4a2313" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "WithoutHeader.csv" - }, - "sourceOffset" : { - "offset" : 2 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 2 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 2 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "John" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Kim" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jkim1@miibeian.gov.cn" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "53.19.132.185" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1447497249000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 251.24 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CZ" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#3e56cf" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "WithoutHeader.csv" - }, - "sourceOffset" : { - "offset" : 3 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 3 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 3 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Ashley" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Austin" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "aaustin2@hatena.ne.jp" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "21.164.37.9" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - } - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 819.47 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "WithoutHeader.csv" - }, - "sourceOffset" : { - "offset" : 4 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 4 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 4 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Jonathan" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Mcdonald" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jmcdonald3@amazon.co.uk" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "188.172.42.140" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1451313421000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 868.38 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ID" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#1b1414" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "WithoutHeader.csv" - }, - "sourceOffset" : { - "offset" : 5 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 5 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 5 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Helen" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Lane" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "hlane4@trellian.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "159.171.138.190" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1467312078000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 398.97 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "TN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "WithoutHeader.csv" - }, - "sourceOffset" : { - "offset" : 6 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 6 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 6 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Scott" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Lopez" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "slopez5@google.co.jp" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "86.194.226.35" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1439432031000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 322.99 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "BR" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "WithoutHeader.csv" - }, - "sourceOffset" : { - "offset" : 7 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 7 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 7 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Christine" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Franklin" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "cfranklin6@reuters.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "248.173.207.64" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1450783797000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 301.26 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "PH" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#1d5e9d" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "WithoutHeader.csv" - }, - "sourceOffset" : { - "offset" : 8 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 8 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 8 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Helen" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Andrews" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "handrews7@histats.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "83.160.63.181" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1457264470000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 217.96 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CU" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "WithoutHeader.csv" - }, - "sourceOffset" : { - "offset" : 9 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 9 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 9 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Stephanie" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Gordon" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "sgordon8@goodreads.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "193.143.42.212" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1445983644000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 495.80 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "WithoutHeader.csv" - }, - "sourceOffset" : { - "offset" : 10 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 10 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 10 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Shirley" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Andrews" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "sandrews9@flickr.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "99.113.183.206" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1446894772000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 157.75 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "BR" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#fc1da9" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "WithoutHeader.csv" - }, - "sourceOffset" : { - "offset" : 11 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 11 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 11 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Joshua" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Reid" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jreida@wikia.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "197.96.118.164" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1440249378000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 431.80 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CO" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#6e3e36" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "WithoutHeader.csv" - }, - "sourceOffset" : { - "offset" : 12 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 12 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 12 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Frances" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Parker" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "fparkerb@engadget.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "226.237.57.25" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1445133015000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 188.21 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "BR" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#73e909" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "WithoutHeader.csv" - }, - "sourceOffset" : { - "offset" : 13 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 13 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 13 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Sharon" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Lawson" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "slawsonc@bravesites.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "198.189.134.106" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1452793869000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 206.73 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "VN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "WithoutHeader.csv" - }, - "sourceOffset" : { - "offset" : 14 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 14 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 14 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Elizabeth" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Wells" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ewellsd@redcross.org" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "120.108.59.206" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1441230787000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 499.48 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CZ" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#e9c943" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "WithoutHeader.csv" - }, - "sourceOffset" : { - "offset" : 15 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 15 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 15 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Norma" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Wilson" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "nwilsone@google.com.br" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "18.246.76.220" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1443319848000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : -65.19 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "SE" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#645119" - } ] - } - }, { - "sourcePartition" : { - "fileName" : "WithoutHeader.csv" - }, - "sourceOffset" : { - "offset" : 16 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 16 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 16 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Joan" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Watkins" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "jwatkinsf@yolasite.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "240.27.33.114" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1459384154000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 264.23 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "PH" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "WithoutHeader.csv" - }, - "sourceOffset" : { - "offset" : 17 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 17 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 17 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Gerald" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Hamilton" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ghamiltong@fc2.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Male" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "182.75.62.95" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1455114575000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 309.26 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ID" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "WithoutHeader.csv" - }, - "sourceOffset" : { - "offset" : 18 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 18 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 18 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Paula" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Taylor" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ptaylorh@wikispaces.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "245.74.203.0" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1462936510000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 927.45 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "CN" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "WithoutHeader.csv" - }, - "sourceOffset" : { - "offset" : 19 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 19 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 19 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Carolyn" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Burns" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "cburnsi@marketwatch.com" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "180.243.11.10" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1456685363000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 752.76 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "NL" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - } - } ] - } - }, { - "sourcePartition" : { - "fileName" : "WithoutHeader.csv" - }, - "sourceOffset" : { - "offset" : 20 - }, - "topic" : "testing", - "keySchema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "key" : { - "schema" : { - "name" : "com.example.users.UserKey", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 20 - } ] - }, - "valueSchema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "value" : { - "schema" : { - "name" : "com.example.users.User", - "type" : "STRUCT", - "isOptional" : false, - "fieldSchemas" : { - "id" : { - "type" : "INT64", - "isOptional" : false - }, - "first_name" : { - "type" : "STRING", - "isOptional" : true - }, - "last_name" : { - "type" : "STRING", - "isOptional" : true - }, - "email" : { - "type" : "STRING", - "isOptional" : true - }, - "gender" : { - "type" : "STRING", - "isOptional" : true - }, - "ip_address" : { - "type" : "STRING", - "isOptional" : true - }, - "last_login" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "account_balance" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "country" : { - "type" : "STRING", - "isOptional" : true - }, - "favorite_color" : { - "type" : "STRING", - "isOptional" : true - } - } - }, - "fieldValues" : [ { - "name" : "id", - "schema" : { - "type" : "INT64", - "isOptional" : false - }, - "storage" : 20 - }, { - "name" : "first_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Robin" - }, { - "name" : "last_name", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Bennett" - }, { - "name" : "email", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "rbennettj@cdc.gov" - }, { - "name" : "gender", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "Female" - }, { - "name" : "ip_address", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "169.77.92.179" - }, { - "name" : "last_login", - "schema" : { - "name" : "org.apache.kafka.connect.data.Timestamp", - "type" : "INT64", - "version" : 1, - "isOptional" : true - }, - "storage" : 1455498404000 - }, { - "name" : "account_balance", - "schema" : { - "name" : "org.apache.kafka.connect.data.Decimal", - "type" : "BYTES", - "version" : 1, - "parameters" : { - "scale" : "2" - }, - "isOptional" : true - }, - "storage" : 143.30 - }, { - "name" : "country", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "ID" - }, { - "name" : "favorite_color", - "schema" : { - "type" : "STRING", - "isOptional" : true - }, - "storage" : "#506128" - } ] - } - } ] -} \ No newline at end of file diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/bug-csv/dataHistorian-row-20081-ko.csv b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/bug-csv/dataHistorian-row-20081-ko.csv new file mode 100644 index 000000000..cea0349ea --- /dev/null +++ b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/bug-csv/dataHistorian-row-20081-ko.csv @@ -0,0 +1,53227 @@ +timestamp;tagname;value;quality +25/10/2020 02:06:18;100;12.051505089;100.0 +25/10/2020 02:06:56;D0112.A51.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.A52.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.AC51_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.AC51_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.AC51_OP.F_CV;1500.000000000;100.0 +25/10/2020 02:06:45;D0112.AC51_PV.F_CV;0.289351851;100.0 +25/10/2020 02:06:53;D0112.AC51_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;D0112.AC52_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.AC52_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.AC52_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;D0112.AC52_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:53;D0112.AC52_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;D0112.Extrudeuse.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F41.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F50.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F51.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F54.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F59.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F60.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F62.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F63.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F64.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F65.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F66.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F70.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F75.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F80.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F81.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F82.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F83.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F84.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F90.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F91.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F92.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F93.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F94.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F95.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.F96.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.FC50_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.FC50_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:06;D0112.FC50_PV.F_CV;1.509602785;100.0 +25/10/2020 02:06:13;D0112.FC50_PV.F_CV;2.701822996;100.0 +25/10/2020 02:06:15;D0112.FC50_PV.F_CV;2.246093750;100.0 +25/10/2020 02:06:16;D0112.FC50_PV.F_CV;2.734375000;100.0 +25/10/2020 02:06:29;D0112.FC50_PV.F_CV;1.765324473;100.0 +25/10/2020 02:06:33;D0112.FC50_PV.F_CV;2.408854246;100.0 +25/10/2020 02:06:38;D0112.FC50_PV.F_CV;1.367187500;100.0 +25/10/2020 02:06:40;D0112.FC50_PV.F_CV;2.571614504;100.0 +25/10/2020 02:06:41;D0112.FC50_PV.F_CV;1.888020873;100.0 +25/10/2020 02:06:45;D0112.FC50_PV.F_CV;2.864583254;100.0 +25/10/2020 02:06:54;D0112.FC50_PV.F_CV;1.953125000;100.0 +25/10/2020 02:06:55;D0112.FC50_PV.F_CV;2.571614504;100.0 +25/10/2020 02:06:56;D0112.FC50_PV.F_CV;1.888020873;100.0 +25/10/2020 02:06:58;D0112.FC50_PV.F_CV;2.343750000;100.0 +25/10/2020 02:06:53;D0112.FC50_SP.F_CV;300.000000000;100.0 +25/10/2020 02:06:56;D0112.FourGC.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.HEV52.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.HEV57.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.KG.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.LC51_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.LC51_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.LC51_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;D0112.LC51_PV.F_CV;-0.614872694;100.0 +25/10/2020 02:06:53;D0112.LC51_SP.F_CV;100.000000000;100.0 +25/10/2020 02:06:56;D0112.LI50_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.LI50_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.LI50_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:56;D0112.P10.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.PI52_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.PI52_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.PI54_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.PI54_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:13;D0112.PI54_PV.F_CV;12.011718750;100.0 +25/10/2020 02:06:56;D0112.PI56_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.PI56_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:13;D0112.PI56_PV.F_CV;12.084056854;100.0 +25/10/2020 02:06:56;D0112.PI57_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.PI57_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;D0112.PI57_PV.F_CV;10.977286339;100.0 +25/10/2020 02:06:56;D0112.TC41_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TC41_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TC41_OP.F_CV;40.000000000;100.0 +25/10/2020 02:06:18;D0112.TC41_PV.F_CV;18.500000000;100.0 +25/10/2020 02:06:53;D0112.TC41_SP.F_CV;9.733333588;100.0 +25/10/2020 02:06:56;D0112.TC50_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TC50_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TC50_OP.F_CV;2.601444006;100.0 +25/10/2020 02:06:36;D0112.TC50_PV.F_CV;18.700000763;100.0 +25/10/2020 02:06:53;D0112.TC50_SP.F_CV;21.225000381;100.0 +25/10/2020 02:06:56;D0112.TC51_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TC51_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TC51_OP.F_CV;20.000000000;100.0 +25/10/2020 02:06:53;D0112.TC51_PV.F_CV;18.299999237;100.0 +25/10/2020 02:06:53;D0112.TC51_SP.F_CV;8.700000763;100.0 +25/10/2020 02:06:56;D0112.TC54_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TC54_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TC54_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;D0112.TC54_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:53;D0112.TC54_SP.F_CV;7.133333206;100.0 +25/10/2020 02:06:56;D0112.TC59_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TC59_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TC59_OP.F_CV;50.000000000;100.0 +25/10/2020 02:06:53;D0112.TC59_PV.F_CV;18.200000763;100.0 +25/10/2020 02:06:53;D0112.TC59_SP.F_CV;16.299999237;100.0 +25/10/2020 02:06:56;D0112.TC60_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TC60_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TC60_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;D0112.TC60_PV.F_CV;18.500000000;100.0 +25/10/2020 02:06:53;D0112.TC60_SP.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;D0112.TC62_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TC62_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TC62_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;D0112.TC62_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:53;D0112.TC62_SP.F_CV;2.700001001;100.0 +25/10/2020 02:06:56;D0112.TC63_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TC63_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TC63_OP.F_CV;11.178739548;100.0 +25/10/2020 02:06:01;D0112.TC63_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:53;D0112.TC63_SP.F_CV;5.366668224;100.0 +25/10/2020 02:06:56;D0112.TC64_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TC64_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TC64_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;D0112.TC64_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:53;D0112.TC64_SP.F_CV;5.233333111;100.0 +25/10/2020 02:06:56;D0112.TC65_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TC65_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TC65_OP.F_CV;36.947399139;100.0 +25/10/2020 02:06:36;D0112.TC65_PV.F_CV;18.200000763;100.0 +25/10/2020 02:06:53;D0112.TC65_SP.F_CV;11.100000381;100.0 +25/10/2020 02:06:56;D0112.TC66_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TC66_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TC66_OP.F_CV;50.000000000;100.0 +25/10/2020 02:06:53;D0112.TC66_PV.F_CV;18.100000381;100.0 +25/10/2020 02:06:53;D0112.TC66_SP.F_CV;9.033334732;100.0 +25/10/2020 02:06:56;D0112.TC75_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TC75_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TC75_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;D0112.TC75_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;D0112.TC75_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;D0112.TC81_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TC81_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TC81_OP.F_CV;30.000000000;100.0 +25/10/2020 02:06:40;D0112.TC81_PV.F_CV;18.600000381;100.0 +25/10/2020 02:06:53;D0112.TC81_SP.F_CV;1.033332944;100.0 +25/10/2020 02:06:56;D0112.TC82_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TC82_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TC82_OP.F_CV;30.000000000;100.0 +25/10/2020 02:06:53;D0112.TC82_PV.F_CV;18.200000763;100.0 +25/10/2020 02:06:53;D0112.TC82_SP.F_CV;5.933333874;100.0 +25/10/2020 02:06:56;D0112.TC83_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TC83_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TC83_OP.F_CV;30.000000000;100.0 +25/10/2020 02:06:53;D0112.TC83_PV.F_CV;18.200000763;100.0 +25/10/2020 02:06:53;D0112.TC83_SP.F_CV;4.366668224;100.0 +25/10/2020 02:06:56;D0112.TC84_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TC84_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TC84_OP.F_CV;30.000000000;100.0 +25/10/2020 02:06:53;D0112.TC84_PV.F_CV;18.000000000;100.0 +25/10/2020 02:06:53;D0112.TC84_SP.F_CV;5.733334064;100.0 +25/10/2020 02:06:56;D0112.TC91_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TC91_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TC91_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;D0112.TC91_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:53;D0112.TC91_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;D0112.TC92_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TC92_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TC92_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;D0112.TC92_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:53;D0112.TC92_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;D0112.TC93_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TC93_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TC93_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;D0112.TC93_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:53;D0112.TC93_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;D0112.TC94_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TC94_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TC94_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;D0112.TC94_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:53;D0112.TC94_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;D0112.TC95_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TC95_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TC95_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;D0112.TC95_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:53;D0112.TC95_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;D0112.TC96_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TC96_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TC96_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;D0112.TC96_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:53;D0112.TC96_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;D0112.TI141_PV.F_CV;18.100000381;100.0 +25/10/2020 02:06:45;D0112.TI142_PV.F_CV;18.899999619;100.0 +25/10/2020 02:06:15;D0112.TI150_PV.F_CV;18.600000381;100.0 +25/10/2020 02:06:18;D0112.TI151_PV.F_CV;18.100000381;100.0 +25/10/2020 02:06:53;D0112.TI154_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:33;D0112.TI159_PV.F_CV;16.000000000;100.0 +25/10/2020 02:06:37;D0112.TI160_PV.F_CV;18.100000381;100.0 +25/10/2020 02:06:53;D0112.TI162_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:24;D0112.TI163_PV.F_CV;19.000000000;100.0 +25/10/2020 02:06:53;D0112.TI164_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:35;D0112.TI165_PV.F_CV;18.100000381;100.0 +25/10/2020 02:06:28;D0112.TI166_PV.F_CV;18.000000000;100.0 +25/10/2020 02:06:08;D0112.TI170_PV.F_CV;18.899999619;100.0 +25/10/2020 02:06:25;D0112.TI170_PV.F_CV;18.745454788;100.0 +25/10/2020 02:06:31;D0112.TI170_PV.F_CV;18.899999619;100.0 +25/10/2020 02:06:38;D0112.TI170_PV.F_CV;18.744445801;100.0 +25/10/2020 02:06:42;D0112.TI170_PV.F_CV;18.899999619;100.0 +25/10/2020 02:06:52;D0112.TI170_PV.F_CV;18.746154785;100.0 +25/10/2020 02:06:57;D0112.TI170_PV.F_CV;18.899999619;100.0 +25/10/2020 02:06:53;D0112.TI175_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:13;D0112.TI181_PV.F_CV;18.299999237;100.0 +25/10/2020 02:06:28;D0112.TI182_PV.F_CV;18.113334656;100.0 +25/10/2020 02:06:08;D0112.TI183_PV.F_CV;18.000000000;100.0 +25/10/2020 02:06:19;D0112.TI184_PV.F_CV;18.014999390;100.0 +25/10/2020 02:06:53;D0112.TI191_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:53;D0112.TI192_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:53;D0112.TI193_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:53;D0112.TI194_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:53;D0112.TI195_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:53;D0112.TI196_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:20;D0112.TI250_PV.F_CV;17.600000381;100.0 +25/10/2020 02:06:00;D0112.TI270_PV.F_CV;18.399999619;100.0 +25/10/2020 02:06:53;D0112.TI275_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:53;D0112.TI291_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:53;D0112.TI292_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:53;D0112.TI293_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:53;D0112.TI294_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:53;D0112.TI295_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:53;D0112.TI296_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:56;D0112.TI30_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TI30_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:21;D0112.TI30_PV.F_CV;17.700000763;100.0 +25/10/2020 02:06:56;D0112.TI31_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TI31_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TI31_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:56;D0112.TI70_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TI70_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TI70_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:54;D0112.TI70_PV.F_CV;19.000000000;100.0 +25/10/2020 02:06:56;D0112.TI70_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TI71_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TI71_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:42;D0112.TI71_PV.F_CV;18.700000763;100.0 +25/10/2020 02:06:56;D0112.TI72_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TI72_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TI72_PV.F_CV;18.899999619;100.0 +25/10/2020 02:06:56;D0112.TI73_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TI73_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;D0112.TI73_PV.F_CV;18.799999237;100.0 +25/10/2020 02:06:56;D0112.TI75_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TI75_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TI75_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:56;D0112.TI76_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TI76_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TI76_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:56;D0112.TI77_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TI77_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TI77_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:56;D0112.TI78_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;D0112.TI78_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;D0112.TI78_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:54;D0221.FI01_PV.F_CV;-6.221065044;100.0 +25/10/2020 02:06:58;D0221.FQT01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;D0221.SC01_PV.F_CV;100.000000000;100.0 +25/10/2020 02:06:11;D0221.SC02_PV.F_CV;4324.739257813;100.0 +25/10/2020 02:06:35;D0221.TC01_PV.F_CV;47.753906250;100.0 +25/10/2020 02:06:14;D0221.TC02_PV.F_CV;144.759109497;100.0 +25/10/2020 02:06:23;D0221.TC02_PV.F_CV;144.921875000;100.0 +25/10/2020 02:06:54;D0221.TC02_PV.F_CV;144.520401001;100.0 +25/10/2020 02:06:59;D0221.TC02_PV.F_CV;144.715713501;100.0 +25/10/2020 02:06:05;D0221.TC03_PV.F_CV;49.283855438;100.0 +25/10/2020 02:06:06;D0221.TC03_PV.F_CV;49.121093750;100.0 +25/10/2020 02:06:10;D0221.TC03_PV.F_CV;50.596786499;100.0 +25/10/2020 02:06:17;D0221.TC03_PV.F_CV;50.401473999;100.0 +25/10/2020 02:06:21;D0221.TC03_PV.F_CV;49.902343750;100.0 +25/10/2020 02:06:28;D0221.TC03_PV.F_CV;49.533420563;100.0 +25/10/2020 02:06:31;D0221.TC03_PV.F_CV;49.186199188;100.0 +25/10/2020 02:06:35;D0221.TC03_PV.F_CV;50.542533875;100.0 +25/10/2020 02:06:44;D0221.TC03_PV.F_CV;50.130207062;100.0 +25/10/2020 02:06:53;D0221.TC03_PV.F_CV;49.511718750;100.0 +25/10/2020 02:06:56;D0221.TC03_PV.F_CV;49.164497375;100.0 +25/10/2020 02:06:26;D0221.TC04_PV.F_CV;50.086807251;100.0 +25/10/2020 02:06:32;D0221.TC04_PV.F_CV;49.924045563;100.0 +25/10/2020 02:06:43;D0221.TC04_PV.F_CV;50.075954437;100.0 +25/10/2020 02:06:58;D0221.TC04_PV.F_CV;49.924045563;100.0 +25/10/2020 02:06:25;D0221.TC05_PV.F_CV;149.869796753;100.0 +25/10/2020 02:06:28;D0221.TC05_PV.F_CV;150.021697998;100.0 +25/10/2020 02:06:33;D0221.TC05_PV.F_CV;149.858947754;100.0 +25/10/2020 02:06:49;D0221.TC05_PV.F_CV;150.054260254;100.0 +25/10/2020 02:06:06;D0221.TC06_PV.F_CV;139.843750000;100.0 +25/10/2020 02:06:11;D0221.TC06_PV.F_CV;140.190979004;100.0 +25/10/2020 02:06:14;D0221.TC06_PV.F_CV;139.876296997;100.0 +25/10/2020 02:06:19;D0221.TC06_PV.F_CV;140.115020752;100.0 +25/10/2020 02:06:25;D0221.TC06_PV.F_CV;139.865447998;100.0 +25/10/2020 02:06:31;D0221.TC06_PV.F_CV;140.245223999;100.0 +25/10/2020 02:06:35;D0221.TC06_PV.F_CV;139.843750000;100.0 +25/10/2020 02:06:45;D0221.TC06_PV.F_CV;139.529083252;100.0 +25/10/2020 02:06:51;D0221.TC06_PV.F_CV;140.190979004;100.0 +25/10/2020 02:06:55;D0221.TC06_PV.F_CV;139.800354004;100.0 +25/10/2020 02:06:11;D0221.TC07_PV.F_CV;44.835067749;100.0 +25/10/2020 02:06:24;D0221.TC07_PV.F_CV;45.019531250;100.0 +25/10/2020 02:06:30;D0221.TC07_PV.F_CV;44.845920563;100.0 +25/10/2020 02:06:14;D0221.TC08_PV.F_CV;138.357208252;100.0 +25/10/2020 02:06:19;D0221.TC08_PV.F_CV;138.194442749;100.0 +25/10/2020 02:06:10;D0221.TI101_PV.F_CV;54.000000000;100.0 +25/10/2020 02:06:11;D0221.TI101_PV.F_CV;53.000000000;100.0 +25/10/2020 02:06:28;D0221.TI102_PV.F_CV;94.000000000;100.0 +25/10/2020 02:06:01;D0221.TI103_PV.F_CV;42.000000000;100.0 +25/10/2020 02:06:06;D0221.TI103_PV.F_CV;42.000000000;100.0 +25/10/2020 02:06:08;D0221.TI103_PV.F_CV;44.000000000;100.0 +25/10/2020 02:06:12;D0221.TI103_PV.F_CV;44.000000000;100.0 +25/10/2020 02:06:13;D0221.TI103_PV.F_CV;43.000000000;100.0 +25/10/2020 02:06:20;D0221.TI103_PV.F_CV;43.000000000;100.0 +25/10/2020 02:06:21;D0221.TI103_PV.F_CV;42.000000000;100.0 +25/10/2020 02:06:22;D0221.TI103_PV.F_CV;43.000000000;100.0 +25/10/2020 02:06:26;D0221.TI103_PV.F_CV;42.000000000;100.0 +25/10/2020 02:06:27;D0221.TI103_PV.F_CV;43.000000000;100.0 +25/10/2020 02:06:28;D0221.TI103_PV.F_CV;42.000000000;100.0 +25/10/2020 02:06:32;D0221.TI103_PV.F_CV;43.000000000;100.0 +25/10/2020 02:06:33;D0221.TI103_PV.F_CV;44.000000000;100.0 +25/10/2020 02:06:38;D0221.TI103_PV.F_CV;44.000000000;100.0 +25/10/2020 02:06:39;D0221.TI103_PV.F_CV;43.000000000;100.0 +25/10/2020 02:06:52;D0221.TI103_PV.F_CV;43.000000000;100.0 +25/10/2020 02:06:53;D0221.TI103_PV.F_CV;42.000000000;100.0 +25/10/2020 02:06:57;D0221.TI103_PV.F_CV;42.000000000;100.0 +25/10/2020 02:06:59;D0221.TI103_PV.F_CV;44.000000000;100.0 +25/10/2020 02:06:11;D0221.TI104_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:24;D0221.TI105_PV.F_CV;164.000000000;100.0 +25/10/2020 02:06:56;D0221.TI106_PV.F_CV;125.000000000;100.0 +25/10/2020 02:06:06;D0221.TI107_PV.F_CV;37.000000000;100.0 +25/10/2020 02:06:07;D0221.TI107_PV.F_CV;36.000000000;100.0 +25/10/2020 02:06:08;D0221.TI107_PV.F_CV;37.000000000;100.0 +25/10/2020 02:06:16;D0221.TI107_PV.F_CV;37.000000000;100.0 +25/10/2020 02:06:17;D0221.TI107_PV.F_CV;36.000000000;100.0 +25/10/2020 02:06:19;D0221.TI107_PV.F_CV;37.000000000;100.0 +25/10/2020 02:06:34;D0221.TI107_PV.F_CV;37.000000000;100.0 +25/10/2020 02:06:35;D0221.TI107_PV.F_CV;36.000000000;100.0 +25/10/2020 02:06:39;D0221.TI107_PV.F_CV;37.000000000;100.0 +25/10/2020 02:06:44;D0221.TI107_PV.F_CV;37.000000000;100.0 +25/10/2020 02:06:45;D0221.TI107_PV.F_CV;36.000000000;100.0 +25/10/2020 02:06:49;D0221.TI107_PV.F_CV;37.000000000;100.0 +25/10/2020 02:06:55;D0221.TI107_PV.F_CV;37.000000000;100.0 +25/10/2020 02:06:56;D0221.TI107_PV.F_CV;36.000000000;100.0 +25/10/2020 02:06:59;D0221.TI107_PV.F_CV;37.000000000;100.0 +25/10/2020 02:06:54;D0221.TI108_PV.F_CV;137.000000000;100.0 +25/10/2020 02:06:29;D0221.TI12_PV.F_CV;146.082901001;100.0 +25/10/2020 02:06:39;D0221.TI12_PV.F_CV;145.930984497;100.0 +25/10/2020 02:06:40;D0221.TI12_PV.F_CV;146.104598999;100.0 +25/10/2020 02:06:44;D0221.TI12_PV.F_CV;145.941833496;100.0 +25/10/2020 02:06:43;D0221.WI01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;D0221.WI02_PV.F_CV;3.641900063;100.0 +25/10/2020 02:06:01;D0221.WI02_PV.F_CV;3.677500010;100.0 +25/10/2020 02:06:08;D0221.WI02_PV.F_CV;3.629600048;100.0 +25/10/2020 02:06:10;D0221.WI02_PV.F_CV;3.640700102;100.0 +25/10/2020 02:06:11;D0221.WI02_PV.F_CV;3.674099922;100.0 +25/10/2020 02:06:18;D0221.WI02_PV.F_CV;3.621500015;100.0 +25/10/2020 02:06:20;D0221.WI02_PV.F_CV;3.632600069;100.0 +25/10/2020 02:06:21;D0221.WI02_PV.F_CV;3.666300058;100.0 +25/10/2020 02:06:28;D0221.WI02_PV.F_CV;3.615700006;100.0 +25/10/2020 02:06:30;D0221.WI02_PV.F_CV;3.626699924;100.0 +25/10/2020 02:06:31;D0221.WI02_PV.F_CV;3.671000004;100.0 +25/10/2020 02:06:38;D0221.WI02_PV.F_CV;3.617399931;100.0 +25/10/2020 02:06:40;D0221.WI02_PV.F_CV;3.628000021;100.0 +25/10/2020 02:06:41;D0221.WI02_PV.F_CV;3.672600031;100.0 +25/10/2020 02:06:48;D0221.WI02_PV.F_CV;3.622699976;100.0 +25/10/2020 02:06:51;D0221.WI02_PV.F_CV;3.668499947;100.0 +25/10/2020 02:06:58;D0221.WI02_PV.F_CV;3.620199919;100.0 +25/10/2020 02:06:00;D0223_Consigne_Four_M�trologie;0.000000000;0.0 +25/10/2020 02:06:00;D0223_Consigne_Position_Chariot;0.000000000;0.0 +25/10/2020 02:06:00;D0223_Four_Consigne_1;0.000000000;0.0 +25/10/2020 02:06:00;D0223_Four_Consigne_2;0.000000000;0.0 +25/10/2020 02:06:00;D0223_Four_Consigne_3;0.000000000;0.0 +25/10/2020 02:06:00;D0223_Four_Consigne_4;0.000000000;0.0 +25/10/2020 02:06:00;D0223_Four_Consigne_5;0.000000000;0.0 +25/10/2020 02:06:00;D0223_Four_Consigne_6;0.000000000;0.0 +25/10/2020 02:06:00;D0223_Four_Consigne_7;0.000000000;0.0 +25/10/2020 02:06:00;D0223_Four_Consigne_8;0.000000000;0.0 +25/10/2020 02:06:00;D0223_Longueur_Point_Mesure_En_Cours;0.000000000;0.0 +25/10/2020 02:06:00;D0223_Mesure_Canne_Etalon;0.000000000;0.0 +25/10/2020 02:06:00;D0223_Mesure_Four_M�trologie;0.000000000;0.0 +25/10/2020 02:06:00;D0223_Num�ro_Point_Mesure_En_Cours;0.000000000;0.0 +25/10/2020 02:06:00;D0223_Num�ro_Unit�_S�lectionn�e;0.000000000;0.0 +25/10/2020 02:06:00;D0223_Recopie_Position_Chariot;0.000000000;0.0 +25/10/2020 02:06:42;PerfTag_UT800C_iFIX32_InterfaceAverageEventRate;296.000000000;100.0 +25/10/2020 02:06:42;PerfTag_UT800C_iFIX32_InterfaceCompression;0.981050780;100.0 +25/10/2020 02:06:42;PerfTag_UT800C_iFIX32_InterfaceOverrunsPercent;0.060457548;100.0 +25/10/2020 02:06:42;PerfTag_UT800C_iFIX32_InterfaceTotalEventsCollected;648429954.000000000;100.0 +25/10/2020 02:06:42;PerfTag_UT800C_iFIX32_InterfaceTotalEventsReported;12287242.000000000;100.0 +25/10/2020 02:06:00;T239.AC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.AC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.AC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.AC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.AC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.AC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.AC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.AC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.AC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.AC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.AC02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.AC02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.AC02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.AC02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.AC02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.AC02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.AC02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.AC02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.AC02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.AC02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.AC03_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.AC03_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.AC03_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.AC03_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.AC03_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.AC03_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.AC03_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.AC03_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.AC03_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.AC03_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.AC04_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.AC04_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.AC04_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.AC04_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.AC04_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.AC04_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.AC04_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.AC04_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.AC04_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.AC04_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.AC05_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.AC05_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.AC05_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.AC05_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.AC05_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.AC05_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.AC05_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.AC05_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.AC05_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.AC05_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.AC06_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.AC06_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.AC06_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.AC06_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.AC06_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.AC06_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.AC06_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.AC06_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.AC06_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.AC06_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.CALC_FQ1_R1_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.CALC_FQ1_R2_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.CALC_FQ1_R3_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.CALC_FQ1_R4_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.CALC_FQ1_R5_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;T239.CALC_FQ1_R6_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.CALC_FQ2_R1_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.CALC_FQ2_R2_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.CALC_FQ2_R3_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.CALC_FQ2_R4_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.CALC_FQ2_R5_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.CALC_FQ2_R6_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;T239.EV10.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV11.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV110.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV12.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV120.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV13.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV130.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV14.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV140.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV15.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV150.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV16.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV160.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV17.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV20.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV21.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV22.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV23.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV24.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV25.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV26.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV27.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV30.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV31.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV32.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV33.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV34.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV35.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV36.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV37.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV40.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV41.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV42.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV43.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV44.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV45.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV46.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV47.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV50.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV51.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV52.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV53.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV54.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV55.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV56.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV57.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV60.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV61.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV62.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV63.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV64.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV65.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV66.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.EV67.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.FK01.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.FK02.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.FK03.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.FK04.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.FK05.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.FK06.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;T239.FQ1_M_R1_IN_PV.F_CV;12.547781944;100.0 +25/10/2020 02:06:06;T239.FQ1_M_R1_IN_PV.F_CV;12.547781944;100.0 +25/10/2020 02:06:12;T239.FQ1_M_R1_IN_PV.F_CV;12.547781944;100.0 +25/10/2020 02:06:18;T239.FQ1_M_R1_IN_PV.F_CV;12.547781944;100.0 +25/10/2020 02:06:24;T239.FQ1_M_R1_IN_PV.F_CV;12.547781944;100.0 +25/10/2020 02:06:30;T239.FQ1_M_R1_IN_PV.F_CV;12.547781944;100.0 +25/10/2020 02:06:36;T239.FQ1_M_R1_IN_PV.F_CV;12.547781944;100.0 +25/10/2020 02:06:42;T239.FQ1_M_R1_IN_PV.F_CV;12.547781944;100.0 +25/10/2020 02:06:48;T239.FQ1_M_R1_IN_PV.F_CV;12.547781944;100.0 +25/10/2020 02:06:54;T239.FQ1_M_R1_IN_PV.F_CV;12.547781944;100.0 +25/10/2020 02:06:00;T239.FQ1_M_R2_IN_PV.F_CV;1.669524789;100.0 +25/10/2020 02:06:06;T239.FQ1_M_R2_IN_PV.F_CV;1.669524789;100.0 +25/10/2020 02:06:12;T239.FQ1_M_R2_IN_PV.F_CV;1.669524789;100.0 +25/10/2020 02:06:18;T239.FQ1_M_R2_IN_PV.F_CV;1.669524789;100.0 +25/10/2020 02:06:24;T239.FQ1_M_R2_IN_PV.F_CV;1.669524789;100.0 +25/10/2020 02:06:30;T239.FQ1_M_R2_IN_PV.F_CV;1.669524789;100.0 +25/10/2020 02:06:36;T239.FQ1_M_R2_IN_PV.F_CV;1.669524789;100.0 +25/10/2020 02:06:42;T239.FQ1_M_R2_IN_PV.F_CV;1.669524789;100.0 +25/10/2020 02:06:48;T239.FQ1_M_R2_IN_PV.F_CV;1.669524789;100.0 +25/10/2020 02:06:54;T239.FQ1_M_R2_IN_PV.F_CV;1.669524789;100.0 +25/10/2020 02:06:00;T239.FQ1_M_R3_IN_PV.F_CV;3.773118734;100.0 +25/10/2020 02:06:06;T239.FQ1_M_R3_IN_PV.F_CV;3.773118734;100.0 +25/10/2020 02:06:12;T239.FQ1_M_R3_IN_PV.F_CV;3.773118734;100.0 +25/10/2020 02:06:18;T239.FQ1_M_R3_IN_PV.F_CV;3.773118734;100.0 +25/10/2020 02:06:24;T239.FQ1_M_R3_IN_PV.F_CV;3.773118734;100.0 +25/10/2020 02:06:30;T239.FQ1_M_R3_IN_PV.F_CV;3.773118734;100.0 +25/10/2020 02:06:36;T239.FQ1_M_R3_IN_PV.F_CV;3.773118734;100.0 +25/10/2020 02:06:42;T239.FQ1_M_R3_IN_PV.F_CV;3.773118734;100.0 +25/10/2020 02:06:48;T239.FQ1_M_R3_IN_PV.F_CV;3.773118734;100.0 +25/10/2020 02:06:54;T239.FQ1_M_R3_IN_PV.F_CV;3.773118734;100.0 +25/10/2020 02:06:00;T239.FQ1_M_R4_IN_PV.F_CV;3.715730429;100.0 +25/10/2020 02:06:06;T239.FQ1_M_R4_IN_PV.F_CV;3.715730429;100.0 +25/10/2020 02:06:12;T239.FQ1_M_R4_IN_PV.F_CV;3.715730429;100.0 +25/10/2020 02:06:18;T239.FQ1_M_R4_IN_PV.F_CV;3.715730429;100.0 +25/10/2020 02:06:24;T239.FQ1_M_R4_IN_PV.F_CV;3.715730429;100.0 +25/10/2020 02:06:30;T239.FQ1_M_R4_IN_PV.F_CV;3.715730429;100.0 +25/10/2020 02:06:36;T239.FQ1_M_R4_IN_PV.F_CV;3.715730429;100.0 +25/10/2020 02:06:42;T239.FQ1_M_R4_IN_PV.F_CV;3.715730429;100.0 +25/10/2020 02:06:48;T239.FQ1_M_R4_IN_PV.F_CV;3.715730429;100.0 +25/10/2020 02:06:54;T239.FQ1_M_R4_IN_PV.F_CV;3.715730429;100.0 +25/10/2020 02:06:00;T239.FQ1_M_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.FQ1_M_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.FQ1_M_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.FQ1_M_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.FQ1_M_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.FQ1_M_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.FQ1_M_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.FQ1_M_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.FQ1_M_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.FQ1_M_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.FQ1_M_R6_IN_PV.F_CV;3.495806456;100.0 +25/10/2020 02:06:06;T239.FQ1_M_R6_IN_PV.F_CV;3.495806456;100.0 +25/10/2020 02:06:12;T239.FQ1_M_R6_IN_PV.F_CV;3.495806456;100.0 +25/10/2020 02:06:18;T239.FQ1_M_R6_IN_PV.F_CV;3.495806456;100.0 +25/10/2020 02:06:24;T239.FQ1_M_R6_IN_PV.F_CV;3.495806456;100.0 +25/10/2020 02:06:30;T239.FQ1_M_R6_IN_PV.F_CV;3.495806456;100.0 +25/10/2020 02:06:36;T239.FQ1_M_R6_IN_PV.F_CV;3.495806456;100.0 +25/10/2020 02:06:42;T239.FQ1_M_R6_IN_PV.F_CV;3.495806456;100.0 +25/10/2020 02:06:48;T239.FQ1_M_R6_IN_PV.F_CV;3.495806456;100.0 +25/10/2020 02:06:54;T239.FQ1_M_R6_IN_PV.F_CV;3.495806456;100.0 +25/10/2020 02:06:00;T239.FQ1_V_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.FQ1_V_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.FQ1_V_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.FQ1_V_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.FQ1_V_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.FQ1_V_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.FQ1_V_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.FQ1_V_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.FQ1_V_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.FQ1_V_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.FQ1_V_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.FQ1_V_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.FQ1_V_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.FQ1_V_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.FQ1_V_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.FQ1_V_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.FQ1_V_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.FQ1_V_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.FQ1_V_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.FQ1_V_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.FQ1_V_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.FQ1_V_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.FQ1_V_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.FQ1_V_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.FQ1_V_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.FQ1_V_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.FQ1_V_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.FQ1_V_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.FQ1_V_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.FQ1_V_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.FQ1_V_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.FQ1_V_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.FQ1_V_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.FQ1_V_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.FQ1_V_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.FQ1_V_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.FQ1_V_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.FQ1_V_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.FQ1_V_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.FQ1_V_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.FQ1_V_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.FQ1_V_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.FQ1_V_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.FQ1_V_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.FQ1_V_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.FQ1_V_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.FQ1_V_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.FQ1_V_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.FQ1_V_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.FQ1_V_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.FQ1_V_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.FQ1_V_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.FQ1_V_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.FQ1_V_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.FQ1_V_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.FQ1_V_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.FQ1_V_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.FQ1_V_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.FQ1_V_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.FQ1_V_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.FQ2_M_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.FQ2_M_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.FQ2_M_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.FQ2_M_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.FQ2_M_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.FQ2_M_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.FQ2_M_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.FQ2_M_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.FQ2_M_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.FQ2_M_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.FQ2_M_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.FQ2_M_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.FQ2_M_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.FQ2_M_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.FQ2_M_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.FQ2_M_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.FQ2_M_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.FQ2_M_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.FQ2_M_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.FQ2_M_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.FQ2_M_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.FQ2_M_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.FQ2_M_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.FQ2_M_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.FQ2_M_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.FQ2_M_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.FQ2_M_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.FQ2_M_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.FQ2_M_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.FQ2_M_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.FQ2_M_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.FQ2_M_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.FQ2_M_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.FQ2_M_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.FQ2_M_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.FQ2_M_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.FQ2_M_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.FQ2_M_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.FQ2_M_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.FQ2_M_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.FQ2_M_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.FQ2_M_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.FQ2_M_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.FQ2_M_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.FQ2_M_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.FQ2_M_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.FQ2_M_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.FQ2_M_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.FQ2_M_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.FQ2_M_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.FQ2_M_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.FQ2_M_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.FQ2_M_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.FQ2_M_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.FQ2_M_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.FQ2_M_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.FQ2_M_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.FQ2_M_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.FQ2_M_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.FQ2_M_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.FQ2_V_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.FQ2_V_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.FQ2_V_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.FQ2_V_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.FQ2_V_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.FQ2_V_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.FQ2_V_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.FQ2_V_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.FQ2_V_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.FQ2_V_R1_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.FQ2_V_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.FQ2_V_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.FQ2_V_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.FQ2_V_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.FQ2_V_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.FQ2_V_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.FQ2_V_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.FQ2_V_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.FQ2_V_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.FQ2_V_R2_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.FQ2_V_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.FQ2_V_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.FQ2_V_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.FQ2_V_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.FQ2_V_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.FQ2_V_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.FQ2_V_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.FQ2_V_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.FQ2_V_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.FQ2_V_R3_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.FQ2_V_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.FQ2_V_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.FQ2_V_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.FQ2_V_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.FQ2_V_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.FQ2_V_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.FQ2_V_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.FQ2_V_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.FQ2_V_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.FQ2_V_R4_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.FQ2_V_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.FQ2_V_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.FQ2_V_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.FQ2_V_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.FQ2_V_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.FQ2_V_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.FQ2_V_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.FQ2_V_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.FQ2_V_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.FQ2_V_R5_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.FQ2_V_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T239.FQ2_V_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;T239.FQ2_V_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;T239.FQ2_V_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.FQ2_V_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T239.FQ2_V_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T239.FQ2_V_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T239.FQ2_V_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.FQ2_V_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;T239.FQ2_V_R6_IN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.PC11_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;T239.PC11_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;T239.PC11_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.PC11_PV.F_CV;17.582021713;100.0 +25/10/2020 02:06:06;T239.PC11_PV.F_CV;17.588264465;100.0 +25/10/2020 02:06:12;T239.PC11_PV.F_CV;17.588983536;100.0 +25/10/2020 02:06:18;T239.PC11_PV.F_CV;17.589223862;100.0 +25/10/2020 02:06:24;T239.PC11_PV.F_CV;17.589223862;100.0 +25/10/2020 02:06:30;T239.PC11_PV.F_CV;17.589223862;100.0 +25/10/2020 02:06:36;T239.PC11_PV.F_CV;17.589223862;100.0 +25/10/2020 02:06:42;T239.PC11_PV.F_CV;17.589223862;100.0 +25/10/2020 02:06:48;T239.PC11_PV.F_CV;17.589223862;100.0 +25/10/2020 02:06:54;T239.PC11_PV.F_CV;17.589223862;100.0 +25/10/2020 02:06:06;T239.PC11_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.PC21_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;T239.PC21_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;T239.PC21_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.PC21_PV.F_CV;17.099433899;100.0 +25/10/2020 02:06:06;T239.PC21_PV.F_CV;17.099433899;100.0 +25/10/2020 02:06:12;T239.PC21_PV.F_CV;17.099433899;100.0 +25/10/2020 02:06:18;T239.PC21_PV.F_CV;17.099433899;100.0 +25/10/2020 02:06:24;T239.PC21_PV.F_CV;17.099433899;100.0 +25/10/2020 02:06:30;T239.PC21_PV.F_CV;17.099433899;100.0 +25/10/2020 02:06:36;T239.PC21_PV.F_CV;17.099433899;100.0 +25/10/2020 02:06:42;T239.PC21_PV.F_CV;17.099433899;100.0 +25/10/2020 02:06:48;T239.PC21_PV.F_CV;17.099433899;100.0 +25/10/2020 02:06:54;T239.PC21_PV.F_CV;17.099433899;100.0 +25/10/2020 02:06:06;T239.PC21_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.PC31_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;T239.PC31_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;T239.PC31_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.PC31_PV.F_CV;17.898944855;100.0 +25/10/2020 02:06:06;T239.PC31_PV.F_CV;17.898944855;100.0 +25/10/2020 02:06:12;T239.PC31_PV.F_CV;17.898944855;100.0 +25/10/2020 02:06:18;T239.PC31_PV.F_CV;17.898944855;100.0 +25/10/2020 02:06:24;T239.PC31_PV.F_CV;17.898944855;100.0 +25/10/2020 02:06:30;T239.PC31_PV.F_CV;17.898944855;100.0 +25/10/2020 02:06:36;T239.PC31_PV.F_CV;17.898944855;100.0 +25/10/2020 02:06:42;T239.PC31_PV.F_CV;17.898944855;100.0 +25/10/2020 02:06:48;T239.PC31_PV.F_CV;17.898944855;100.0 +25/10/2020 02:06:54;T239.PC31_PV.F_CV;17.898944855;100.0 +25/10/2020 02:06:05;T239.PC31_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.PC41_PV.F_CV;18.799293518;100.0 +25/10/2020 02:06:06;T239.PC41_PV.F_CV;18.799293518;100.0 +25/10/2020 02:06:12;T239.PC41_PV.F_CV;18.792692184;100.0 +25/10/2020 02:06:18;T239.PC41_PV.F_CV;18.792091370;100.0 +25/10/2020 02:06:24;T239.PC41_PV.F_CV;18.792091370;100.0 +25/10/2020 02:06:30;T239.PC41_PV.F_CV;18.792091370;100.0 +25/10/2020 02:06:36;T239.PC41_PV.F_CV;18.792091370;100.0 +25/10/2020 02:06:42;T239.PC41_PV.F_CV;18.792091370;100.0 +25/10/2020 02:06:48;T239.PC41_PV.F_CV;18.792091370;100.0 +25/10/2020 02:06:54;T239.PC41_PV.F_CV;18.792091370;100.0 +25/10/2020 02:06:00;T239.PC51_PV.F_CV;0.064825155;100.0 +25/10/2020 02:06:06;T239.PC51_PV.F_CV;0.064825155;100.0 +25/10/2020 02:06:12;T239.PC51_PV.F_CV;0.064825155;100.0 +25/10/2020 02:06:18;T239.PC51_PV.F_CV;0.064825155;100.0 +25/10/2020 02:06:24;T239.PC51_PV.F_CV;0.064825155;100.0 +25/10/2020 02:06:30;T239.PC51_PV.F_CV;0.064825155;100.0 +25/10/2020 02:06:36;T239.PC51_PV.F_CV;0.064825155;100.0 +25/10/2020 02:06:42;T239.PC51_PV.F_CV;0.064825155;100.0 +25/10/2020 02:06:48;T239.PC51_PV.F_CV;0.064825155;100.0 +25/10/2020 02:06:54;T239.PC51_PV.F_CV;0.064825155;100.0 +25/10/2020 02:06:00;T239.PC61_PV.F_CV;18.100622177;100.0 +25/10/2020 02:06:06;T239.PC61_PV.F_CV;18.100622177;100.0 +25/10/2020 02:06:12;T239.PC61_PV.F_CV;18.100622177;100.0 +25/10/2020 02:06:18;T239.PC61_PV.F_CV;18.100622177;100.0 +25/10/2020 02:06:24;T239.PC61_PV.F_CV;18.100622177;100.0 +25/10/2020 02:06:30;T239.PC61_PV.F_CV;18.100622177;100.0 +25/10/2020 02:06:36;T239.PC61_PV.F_CV;18.100622177;100.0 +25/10/2020 02:06:42;T239.PC61_PV.F_CV;18.100622177;100.0 +25/10/2020 02:06:48;T239.PC61_PV.F_CV;18.100622177;100.0 +25/10/2020 02:06:54;T239.PC61_PV.F_CV;18.100622177;100.0 +25/10/2020 02:06:48;T239.PI100_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T239.PI10_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;T239.PI10_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;T239.PI10_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;T239.PI10_PV.F_CV;41.574531555;100.0 +25/10/2020 02:06:19;T239.PI10_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;T239.PI20_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;T239.PI20_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;T239.PI20_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;T239.PI20_PV.F_CV;40.706748962;100.0 +25/10/2020 02:06:19;T239.PI20_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;T239.PI30_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;T239.PI30_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;T239.PI30_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:25;T239.PI30_PV.F_CV;40.627258301;100.0 +25/10/2020 02:06:19;T239.PI30_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;T239.PI40_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;T239.PI40_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;T239.PI40_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:24;T239.PI40_PV.F_CV;40.724601746;100.0 +25/10/2020 02:06:19;T239.PI40_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;T239.PI50_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;T239.PI50_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;T239.PI50_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:09;T239.PI50_PV.F_CV;42.035511017;100.0 +25/10/2020 02:06:19;T239.PI50_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;T239.PI60_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;T239.PI60_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;T239.PI60_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:42;T239.PI60_PV.F_CV;40.357257843;100.0 +25/10/2020 02:06:19;T239.PI60_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;T239.TC01_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;T239.TC01_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;T239.TC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.TC01_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:06;T239.TC01_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:12;T239.TC01_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:18;T239.TC01_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:24;T239.TC01_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:30;T239.TC01_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:36;T239.TC01_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:42;T239.TC01_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:48;T239.TC01_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:54;T239.TC01_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:06;T239.TC01_SP.F_CV;19.799999237;100.0 +25/10/2020 02:06:48;T239.TC02_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;T239.TC02_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T239.TC02_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.TC02_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:06;T239.TC02_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:12;T239.TC02_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:18;T239.TC02_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:24;T239.TC02_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:30;T239.TC02_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:36;T239.TC02_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:42;T239.TC02_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:48;T239.TC02_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:54;T239.TC02_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:06;T239.TC02_SP.F_CV;19.799999237;100.0 +25/10/2020 02:06:48;T239.TC03_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;T239.TC03_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;T239.TC03_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.TC03_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:06;T239.TC03_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:12;T239.TC03_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:18;T239.TC03_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:24;T239.TC03_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:30;T239.TC03_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:36;T239.TC03_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:42;T239.TC03_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:48;T239.TC03_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:54;T239.TC03_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:05;T239.TC03_SP.F_CV;19.799999237;100.0 +25/10/2020 02:06:48;T239.TC04_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;T239.TC04_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;T239.TC04_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.TC04_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:06;T239.TC04_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:12;T239.TC04_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:18;T239.TC04_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:24;T239.TC04_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:30;T239.TC04_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:36;T239.TC04_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:42;T239.TC04_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:48;T239.TC04_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:54;T239.TC04_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:05;T239.TC04_SP.F_CV;19.799999237;100.0 +25/10/2020 02:06:48;T239.TC05_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;T239.TC05_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;T239.TC05_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:00;T239.TC05_PV.F_CV;20.600000381;100.0 +25/10/2020 02:06:06;T239.TC05_PV.F_CV;20.600000381;100.0 +25/10/2020 02:06:12;T239.TC05_PV.F_CV;20.600000381;100.0 +25/10/2020 02:06:18;T239.TC05_PV.F_CV;20.600000381;100.0 +25/10/2020 02:06:24;T239.TC05_PV.F_CV;20.600000381;100.0 +25/10/2020 02:06:30;T239.TC05_PV.F_CV;20.600000381;100.0 +25/10/2020 02:06:36;T239.TC05_PV.F_CV;20.600000381;100.0 +25/10/2020 02:06:42;T239.TC05_PV.F_CV;20.600000381;100.0 +25/10/2020 02:06:48;T239.TC05_PV.F_CV;20.600000381;100.0 +25/10/2020 02:06:54;T239.TC05_PV.F_CV;20.600000381;100.0 +25/10/2020 02:06:01;T239.TC05_SP.F_CV;25.000000000;100.0 +25/10/2020 02:06:48;T239.TC06_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;T239.TC06_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;T239.TC06_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;T239.TC06_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:06;T239.TC06_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:12;T239.TC06_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:18;T239.TC06_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:24;T239.TC06_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:30;T239.TC06_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:36;T239.TC06_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:42;T239.TC06_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:48;T239.TC06_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:54;T239.TC06_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:05;T239.TC06_SP.F_CV;19.799999237;100.0 +25/10/2020 02:06:44;T239.TI10_PV.F_CV;19.799999237;100.0 +25/10/2020 02:06:19;T239.XAK01.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.XAK02.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.XAK03.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.XAK04.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.XAK05.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.XAK06.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.XAR1.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.XAR2.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.XAR3.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.XAR4.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.XAR5.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.XAR6.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.XKK01.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;T239.XNK230.F_CV;0.000000000;0.0 +25/10/2020 02:06:02;T473.FC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;T473.FC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T473.FC01_SP.F_CV;100.000000000;100.0 +25/10/2020 02:06:00;T473.FC02_PV.F_CV;2.152853489;100.0 +25/10/2020 02:06:01;T473.FC02_PV.F_CV;1.934491396;100.0 +25/10/2020 02:06:02;T473.FC02_PV.F_CV;2.104003429;100.0 +25/10/2020 02:06:03;T473.FC02_PV.F_CV;2.030727386;100.0 +25/10/2020 02:06:04;T473.FC02_PV.F_CV;1.734367371;100.0 +25/10/2020 02:06:05;T473.FC02_PV.F_CV;2.003615379;100.0 +25/10/2020 02:06:06;T473.FC02_PV.F_CV;1.953705788;100.0 +25/10/2020 02:06:07;T473.FC02_PV.F_CV;2.087638378;100.0 +25/10/2020 02:06:09;T473.FC02_PV.F_CV;2.054582834;100.0 +25/10/2020 02:06:10;T473.FC02_PV.F_CV;2.173370838;100.0 +25/10/2020 02:06:11;T473.FC02_PV.F_CV;1.856005430;100.0 +25/10/2020 02:06:12;T473.FC02_PV.F_CV;1.781507969;100.0 +25/10/2020 02:06:13;T473.FC02_PV.F_CV;1.887594700;100.0 +25/10/2020 02:06:14;T473.FC02_PV.F_CV;2.025027514;100.0 +25/10/2020 02:06:15;T473.FC02_PV.F_CV;1.975037456;100.0 +25/10/2020 02:06:16;T473.FC02_PV.F_CV;2.008826256;100.0 +25/10/2020 02:06:17;T473.FC02_PV.F_CV;2.201785088;100.0 +25/10/2020 02:06:18;T473.FC02_PV.F_CV;1.897935629;100.0 +25/10/2020 02:06:19;T473.FC02_PV.F_CV;2.117681026;100.0 +25/10/2020 02:06:20;T473.FC02_PV.F_CV;2.240458965;100.0 +25/10/2020 02:06:21;T473.FC02_PV.F_CV;1.907460928;100.0 +25/10/2020 02:06:26;T473.FC02_PV.F_CV;2.298916817;100.0 +25/10/2020 02:06:27;T473.FC02_PV.F_CV;2.187293053;100.0 +25/10/2020 02:06:28;T473.FC02_PV.F_CV;2.465089560;100.0 +25/10/2020 02:06:29;T473.FC02_PV.F_CV;1.938644409;100.0 +25/10/2020 02:06:30;T473.FC02_PV.F_CV;2.028366089;100.0 +25/10/2020 02:06:31;T473.FC02_PV.F_CV;1.777925491;100.0 +25/10/2020 02:06:32;T473.FC02_PV.F_CV;2.087638378;100.0 +25/10/2020 02:06:33;T473.FC02_PV.F_CV;1.906646490;100.0 +25/10/2020 02:06:34;T473.FC02_PV.F_CV;1.939213872;100.0 +25/10/2020 02:06:35;T473.FC02_PV.F_CV;2.108725071;100.0 +25/10/2020 02:06:36;T473.FC02_PV.F_CV;2.216603518;100.0 +25/10/2020 02:06:38;T473.FC02_PV.F_CV;2.146502972;100.0 +25/10/2020 02:06:39;T473.FC02_PV.F_CV;2.037159204;100.0 +25/10/2020 02:06:40;T473.FC02_PV.F_CV;2.090813160;100.0 +25/10/2020 02:06:41;T473.FC02_PV.F_CV;1.877010822;100.0 +25/10/2020 02:06:42;T473.FC02_PV.F_CV;1.713768840;100.0 +25/10/2020 02:06:43;T473.FC02_PV.F_CV;1.832149982;100.0 +25/10/2020 02:06:44;T473.FC02_PV.F_CV;2.072494507;100.0 +25/10/2020 02:06:45;T473.FC02_PV.F_CV;1.918778181;100.0 +25/10/2020 02:06:46;T473.FC02_PV.F_CV;2.118739605;100.0 +25/10/2020 02:06:48;T473.FC02_PV.F_CV;2.306814194;100.0 +25/10/2020 02:06:49;T473.FC02_PV.F_CV;2.095372915;100.0 +25/10/2020 02:06:50;T473.FC02_PV.F_CV;2.059141636;100.0 +25/10/2020 02:06:52;T473.FC02_PV.F_CV;1.656939030;100.0 +25/10/2020 02:06:53;T473.FC02_PV.F_CV;1.778250933;100.0 +25/10/2020 02:06:54;T473.FC02_PV.F_CV;1.988471746;100.0 +25/10/2020 02:06:58;T473.FC02_PV.F_CV;1.988471746;100.0 +25/10/2020 02:06:59;T473.FC02_PV.F_CV;2.079333305;100.0 +25/10/2020 02:06:55;T473.FC02_SP.F_CV;2.000000000;100.0 +25/10/2020 02:06:05;T473.FC03_OP.F_CV;30.808435440;100.0 +25/10/2020 02:06:10;T473.FC03_OP.F_CV;30.906093597;100.0 +25/10/2020 02:06:11;T473.FC03_OP.F_CV;30.832849503;100.0 +25/10/2020 02:06:17;T473.FC03_OP.F_CV;30.906093597;100.0 +25/10/2020 02:06:18;T473.FC03_OP.F_CV;31.003753662;100.0 +25/10/2020 02:06:23;T473.FC03_OP.F_CV;30.930509567;100.0 +25/10/2020 02:06:35;T473.FC03_OP.F_CV;31.003753662;100.0 +25/10/2020 02:06:43;T473.FC03_OP.F_CV;30.930509567;100.0 +25/10/2020 02:06:45;T473.FC03_OP.F_CV;31.028167725;100.0 +25/10/2020 02:06:57;T473.FC03_OP.F_CV;30.857265472;100.0 +25/10/2020 02:06:59;T473.FC03_OP.F_CV;30.954923630;100.0 +25/10/2020 02:06:18;T473.FC03_PV.F_CV;1.829007268;100.0 +25/10/2020 02:06:57;T473.FC03_PV.F_CV;2.138356209;100.0 +25/10/2020 02:06:01;T473.FC03_SP.F_CV;2.000000000;100.0 +25/10/2020 02:06:39;T473.FC04_OP.F_CV;50.000000000;100.0 +25/10/2020 02:06:03;T473.FC04_PV.F_CV;0.629299700;100.0 +25/10/2020 02:06:05;T473.FC04_PV.F_CV;0.319669127;100.0 +25/10/2020 02:06:06;T473.FC04_PV.F_CV;0.573564529;100.0 +25/10/2020 02:06:09;T473.FC04_PV.F_CV;0.092674136;100.0 +25/10/2020 02:06:14;T473.FC04_PV.F_CV;0.386652172;100.0 +25/10/2020 02:06:15;T473.FC04_PV.F_CV;0.762271821;100.0 +25/10/2020 02:06:21;T473.FC04_PV.F_CV;0.080904245;100.0 +25/10/2020 02:06:22;T473.FC04_PV.F_CV;0.303732276;100.0 +25/10/2020 02:06:23;T473.FC04_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T473.FC04_PV.F_CV;0.226315260;100.0 +25/10/2020 02:06:32;T473.FC04_PV.F_CV;0.039256096;100.0 +25/10/2020 02:06:34;T473.FC04_PV.F_CV;0.192837596;100.0 +25/10/2020 02:06:36;T473.FC04_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;T473.FC04_PV.F_CV;0.700311363;100.0 +25/10/2020 02:06:47;T473.FC04_PV.F_CV;0.512994289;100.0 +25/10/2020 02:06:49;T473.FC04_PV.F_CV;0.123220801;100.0 +25/10/2020 02:06:50;T473.FC04_PV.F_CV;0.647707820;100.0 +25/10/2020 02:06:51;T473.FC04_PV.F_CV;0.185387015;100.0 +25/10/2020 02:06:53;T473.FC04_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;T473.FC04_PV.F_CV;0.704140306;100.0 +25/10/2020 02:06:58;T473.FC04_PV.F_CV;0.172206759;100.0 +25/10/2020 02:06:52;T473.FC04_SP.F_CV;120.000000000;100.0 +25/10/2020 02:06:09;T473.FI04_PV.F_CV;0.092674136;100.0 +25/10/2020 02:06:14;T473.FI04_PV.F_CV;0.386652172;100.0 +25/10/2020 02:06:15;T473.FI04_PV.F_CV;0.762271821;100.0 +25/10/2020 02:06:21;T473.FI04_PV.F_CV;0.080904245;100.0 +25/10/2020 02:06:22;T473.FI04_PV.F_CV;0.303732276;100.0 +25/10/2020 02:06:23;T473.FI04_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;T473.FI04_PV.F_CV;0.226315260;100.0 +25/10/2020 02:06:36;T473.FI04_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;T473.FI04_PV.F_CV;0.700311363;100.0 +25/10/2020 02:06:49;T473.FI04_PV.F_CV;0.123220801;100.0 +25/10/2020 02:06:50;T473.FI04_PV.F_CV;0.647707820;100.0 +25/10/2020 02:06:51;T473.FI04_PV.F_CV;0.185387015;100.0 +25/10/2020 02:06:56;T473.FI04_PV.F_CV;0.704140306;100.0 +25/10/2020 02:06:58;T473.FI04_PV.F_CV;0.172206759;100.0 +25/10/2020 02:06:02;T473.FI05_PV.F_CV;0.387541145;100.0 +25/10/2020 02:06:05;T473.FI05_PV.F_CV;0.342899173;100.0 +25/10/2020 02:06:06;T473.FI05_PV.F_CV;-0.131780669;100.0 +25/10/2020 02:06:07;T473.FI05_PV.F_CV;0.100320905;100.0 +25/10/2020 02:06:08;T473.FI05_PV.F_CV;-0.335143059;100.0 +25/10/2020 02:06:09;T473.FI05_PV.F_CV;-0.207978979;100.0 +25/10/2020 02:06:13;T473.FI05_PV.F_CV;-0.207978979;100.0 +25/10/2020 02:06:14;T473.FI05_PV.F_CV;-0.030126464;100.0 +25/10/2020 02:06:15;T473.FI05_PV.F_CV;0.260137707;100.0 +25/10/2020 02:06:18;T473.FI05_PV.F_CV;0.100951217;100.0 +25/10/2020 02:06:21;T473.FI05_PV.F_CV;0.382597476;100.0 +25/10/2020 02:06:22;T473.FI05_PV.F_CV;-0.057154983;100.0 +25/10/2020 02:06:23;T473.FI05_PV.F_CV;0.430302739;100.0 +25/10/2020 02:06:24;T473.FI05_PV.F_CV;-0.006452764;100.0 +25/10/2020 02:06:29;T473.FI05_PV.F_CV;-0.006452764;100.0 +25/10/2020 02:06:30;T473.FI05_PV.F_CV;0.396604925;100.0 +25/10/2020 02:06:32;T473.FI05_PV.F_CV;0.608934522;100.0 +25/10/2020 02:06:34;T473.FI05_PV.F_CV;0.149277702;100.0 +25/10/2020 02:06:35;T473.FI05_PV.F_CV;-0.039758842;100.0 +25/10/2020 02:06:38;T473.FI05_PV.F_CV;0.731331944;100.0 +25/10/2020 02:06:39;T473.FI05_PV.F_CV;0.130614832;100.0 +25/10/2020 02:06:40;T473.FI05_PV.F_CV;0.073063731;100.0 +25/10/2020 02:06:41;T473.FI05_PV.F_CV;-0.097440511;100.0 +25/10/2020 02:06:46;T473.FI05_PV.F_CV;-0.097440511;100.0 +25/10/2020 02:06:47;T473.FI05_PV.F_CV;-0.302671999;100.0 +25/10/2020 02:06:49;T473.FI05_PV.F_CV;0.138342395;100.0 +25/10/2020 02:06:51;T473.FI05_PV.F_CV;-0.191585019;100.0 +25/10/2020 02:06:53;T473.FI05_PV.F_CV;-0.038451418;100.0 +25/10/2020 02:06:54;T473.FI05_PV.F_CV;-0.342104405;100.0 +25/10/2020 02:06:56;T473.FI05_PV.F_CV;0.716276526;100.0 +25/10/2020 02:06:57;T473.FI05_PV.F_CV;-0.234434247;100.0 +25/10/2020 02:06:58;T473.FI05_PV.F_CV;0.363405854;100.0 +25/10/2020 02:06:40;T473.FI06_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;T473.FI07_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;T473.FQ07.F_CV;11634.041015625;100.0 +25/10/2020 02:06:25;T473.II01_PV.F_CV;0.156765252;100.0 +25/10/2020 02:06:01;T473.II02_PV.F_CV;1.294100761;100.0 +25/10/2020 02:06:02;T473.II02_PV.F_CV;1.376130104;100.0 +25/10/2020 02:06:03;T473.II02_PV.F_CV;1.319626808;100.0 +25/10/2020 02:06:04;T473.II02_PV.F_CV;1.379685402;100.0 +25/10/2020 02:06:09;T473.II02_PV.F_CV;1.315623283;100.0 +25/10/2020 02:06:18;T473.II02_PV.F_CV;1.370934486;100.0 +25/10/2020 02:06:29;T473.II02_PV.F_CV;1.312771797;100.0 +25/10/2020 02:06:31;T473.II02_PV.F_CV;1.383709908;100.0 +25/10/2020 02:06:35;T473.II02_PV.F_CV;1.293398857;100.0 +25/10/2020 02:06:40;T473.II02_PV.F_CV;1.391266823;100.0 +25/10/2020 02:06:41;T473.II02_PV.F_CV;1.278964043;100.0 +25/10/2020 02:06:42;T473.II02_PV.F_CV;1.334061623;100.0 +25/10/2020 02:06:05;T473.LC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;T473.LC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;T473.LC01_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;T473.LC02_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;T473.LC02_PV.F_CV;4.211941242;100.0 +25/10/2020 02:06:09;T473.LC02_PV.F_CV;4.269978523;100.0 +25/10/2020 02:06:13;T473.LC02_PV.F_CV;4.165294647;100.0 +25/10/2020 02:06:15;T473.LC02_PV.F_CV;4.215738297;100.0 +25/10/2020 02:06:16;T473.LC02_PV.F_CV;4.157158852;100.0 +25/10/2020 02:06:19;T473.LC02_PV.F_CV;4.287335396;100.0 +25/10/2020 02:06:20;T473.LC02_PV.F_CV;4.152548313;100.0 +25/10/2020 02:06:23;T473.LC02_PV.F_CV;4.290589809;100.0 +25/10/2020 02:06:25;T473.LC02_PV.F_CV;4.153361797;100.0 +25/10/2020 02:06:29;T473.LC02_PV.F_CV;4.222517967;100.0 +25/10/2020 02:06:30;T473.LC02_PV.F_CV;4.162854195;100.0 +25/10/2020 02:06:31;T473.LC02_PV.F_CV;4.213026047;100.0 +25/10/2020 02:06:32;T473.LC02_PV.F_CV;4.152819633;100.0 +25/10/2020 02:06:34;T473.LC02_PV.F_CV;4.271334648;100.0 +25/10/2020 02:06:39;T473.LC02_PV.F_CV;4.154717922;100.0 +25/10/2020 02:06:42;T473.LC02_PV.F_CV;4.285979271;100.0 +25/10/2020 02:06:45;T473.LC02_PV.F_CV;4.158514977;100.0 +25/10/2020 02:06:46;T473.LC02_PV.F_CV;4.288962364;100.0 +25/10/2020 02:06:47;T473.LC02_PV.F_CV;4.152548313;100.0 +25/10/2020 02:06:49;T473.LC02_PV.F_CV;4.223603249;100.0 +25/10/2020 02:06:51;T473.LC02_PV.F_CV;4.149836540;100.0 +25/10/2020 02:06:55;T473.LC02_PV.F_CV;4.282996178;100.0 +25/10/2020 02:06:56;T473.LC02_PV.F_CV;4.152548313;100.0 +25/10/2020 02:06:09;T473.LC02_SP.F_CV;12.000000000;100.0 +25/10/2020 02:06:00;T473.LI01_PV.F_CV;67.150024414;100.0 +25/10/2020 02:06:02;T473.LI01_PV.F_CV;66.494644165;100.0 +25/10/2020 02:06:04;T473.LI01_PV.F_CV;67.104949951;100.0 +25/10/2020 02:06:06;T473.LI01_PV.F_CV;66.727172852;100.0 +25/10/2020 02:06:08;T473.LI01_PV.F_CV;66.878532410;100.0 +25/10/2020 02:06:09;T473.LI01_PV.F_CV;66.752990723;100.0 +25/10/2020 02:06:11;T473.LI01_PV.F_CV;66.916725159;100.0 +25/10/2020 02:06:12;T473.LI01_PV.F_CV;66.764167786;100.0 +25/10/2020 02:06:13;T473.LI01_PV.F_CV;66.924591064;100.0 +25/10/2020 02:06:14;T473.LI01_PV.F_CV;66.829032898;100.0 +25/10/2020 02:06:16;T473.LI01_PV.F_CV;67.393005371;100.0 +25/10/2020 02:06:17;T473.LI01_PV.F_CV;67.009315491;100.0 +25/10/2020 02:06:18;T473.LI01_PV.F_CV;66.876113892;100.0 +25/10/2020 02:06:20;T473.LI01_PV.F_CV;67.032806396;100.0 +25/10/2020 02:06:21;T473.LI01_PV.F_CV;67.479904175;100.0 +25/10/2020 02:06:22;T473.LI01_PV.F_CV;67.304588318;100.0 +25/10/2020 02:06:23;T473.LI01_PV.F_CV;67.605224609;100.0 +25/10/2020 02:06:24;T473.LI01_PV.F_CV;67.076515198;100.0 +25/10/2020 02:06:25;T473.LI01_PV.F_CV;66.906700134;100.0 +25/10/2020 02:06:27;T473.LI01_PV.F_CV;66.806015015;100.0 +25/10/2020 02:06:28;T473.LI01_PV.F_CV;67.485244751;100.0 +25/10/2020 02:06:29;T473.LI01_PV.F_CV;66.749694824;100.0 +25/10/2020 02:06:31;T473.LI01_PV.F_CV;66.947731018;100.0 +25/10/2020 02:06:32;T473.LI01_PV.F_CV;67.430847168;100.0 +25/10/2020 02:06:34;T473.LI01_PV.F_CV;67.186645508;100.0 +25/10/2020 02:06:35;T473.LI01_PV.F_CV;66.827117920;100.0 +25/10/2020 02:06:36;T473.LI01_PV.F_CV;66.649414063;100.0 +25/10/2020 02:06:38;T473.LI01_PV.F_CV;67.756835938;100.0 +25/10/2020 02:06:40;T473.LI01_PV.F_CV;67.293502808;100.0 +25/10/2020 02:06:42;T473.LI01_PV.F_CV;67.361541748;100.0 +25/10/2020 02:06:43;T473.LI01_PV.F_CV;66.903289795;100.0 +25/10/2020 02:06:45;T473.LI01_PV.F_CV;66.580886841;100.0 +25/10/2020 02:06:47;T473.LI01_PV.F_CV;67.312431335;100.0 +25/10/2020 02:06:49;T473.LI01_PV.F_CV;66.901832581;100.0 +25/10/2020 02:06:51;T473.LI01_PV.F_CV;67.153182983;100.0 +25/10/2020 02:06:53;T473.LI01_PV.F_CV;67.525558472;100.0 +25/10/2020 02:06:55;T473.LI01_PV.F_CV;66.733673096;100.0 +25/10/2020 02:06:56;T473.LI01_PV.F_CV;67.021270752;100.0 +25/10/2020 02:06:57;T473.LI01_PV.F_CV;66.934371948;100.0 +25/10/2020 02:06:58;T473.LI01_PV.F_CV;67.071777344;100.0 +25/10/2020 02:06:05;T473.LT01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;T473.PC08_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;T473.PC08_PV.F_CV;56.305137634;100.0 +25/10/2020 02:06:52;T473.PC08_SP.F_CV;60.000000000;100.0 +25/10/2020 02:06:03;T473.PC24_PV.F_CV;58.065612793;100.0 +25/10/2020 02:06:17;T473.PC24_PV.F_CV;57.892024994;100.0 +25/10/2020 02:06:23;T473.PC24_PV.F_CV;58.064788818;100.0 +25/10/2020 02:06:24;T473.PC24_PV.F_CV;57.890380859;100.0 +25/10/2020 02:06:54;T473.PI09_PV.F_CV;52.457923889;100.0 +25/10/2020 02:06:21;T473.PI21_PV.F_CV;66.127410889;100.0 +25/10/2020 02:06:48;T473.PI23_PV.F_CV;67.482337952;100.0 +25/10/2020 02:06:00;T473.SC01_OP.F_CV;61.693168640;100.0 +25/10/2020 02:06:03;T473.SC01_OP.F_CV;62.059387207;100.0 +25/10/2020 02:06:04;T473.SC01_OP.F_CV;61.278114319;100.0 +25/10/2020 02:06:05;T473.SC01_OP.F_CV;61.619922638;100.0 +25/10/2020 02:06:06;T473.SC01_OP.F_CV;61.815242767;100.0 +25/10/2020 02:06:07;T473.SC01_OP.F_CV;61.156040192;100.0 +25/10/2020 02:06:09;T473.SC01_OP.F_CV;61.522262573;100.0 +25/10/2020 02:06:11;T473.SC01_OP.F_CV;61.351360321;100.0 +25/10/2020 02:06:12;T473.SC01_OP.F_CV;62.157047272;100.0 +25/10/2020 02:06:13;T473.SC01_OP.F_CV;62.083805084;100.0 +25/10/2020 02:06:15;T473.SC01_OP.F_CV;60.887477875;100.0 +25/10/2020 02:06:19;T473.SC01_OP.F_CV;61.473434448;100.0 +25/10/2020 02:06:20;T473.SC01_OP.F_CV;61.864070892;100.0 +25/10/2020 02:06:22;T473.SC01_OP.F_CV;62.230293274;100.0 +25/10/2020 02:06:23;T473.SC01_OP.F_CV;62.083805084;100.0 +25/10/2020 02:06:24;T473.SC01_OP.F_CV;61.278114319;100.0 +25/10/2020 02:06:27;T473.SC01_OP.F_CV;61.693168640;100.0 +25/10/2020 02:06:28;T473.SC01_OP.F_CV;61.278114319;100.0 +25/10/2020 02:06:30;T473.SC01_OP.F_CV;62.254707336;100.0 +25/10/2020 02:06:32;T473.SC01_OP.F_CV;62.474441528;100.0 +25/10/2020 02:06:35;T473.SC01_OP.F_CV;61.888484955;100.0 +25/10/2020 02:06:36;T473.SC01_OP.F_CV;61.009552002;100.0 +25/10/2020 02:06:37;T473.SC01_OP.F_CV;61.790824890;100.0 +25/10/2020 02:06:38;T473.SC01_OP.F_CV;62.303535461;100.0 +25/10/2020 02:06:39;T473.SC01_OP.F_CV;62.108219147;100.0 +25/10/2020 02:06:42;T473.SC01_OP.F_CV;61.131626129;100.0 +25/10/2020 02:06:44;T473.SC01_OP.F_CV;62.083805084;100.0 +25/10/2020 02:06:45;T473.SC01_OP.F_CV;61.400188446;100.0 +25/10/2020 02:06:46;T473.SC01_OP.F_CV;61.546676636;100.0 +25/10/2020 02:06:47;T473.SC01_OP.F_CV;62.327953339;100.0 +25/10/2020 02:06:49;T473.SC01_OP.F_CV;61.644336700;100.0 +25/10/2020 02:06:53;T473.SC01_OP.F_CV;62.352367401;100.0 +25/10/2020 02:06:55;T473.SC01_OP.F_CV;61.717582703;100.0 +25/10/2020 02:06:56;T473.SC01_OP.F_CV;61.497848511;100.0 +25/10/2020 02:06:57;T473.SC01_OP.F_CV;61.888484955;100.0 +25/10/2020 02:06:58;T473.SC01_OP.F_CV;61.351360321;100.0 +25/10/2020 02:06:00;T473.SC01_PV.F_CV;1202.080810547;100.0 +25/10/2020 02:06:03;T473.SC01_PV.F_CV;1186.958618164;100.0 +25/10/2020 02:06:04;T473.SC01_PV.F_CV;1218.541870117;100.0 +25/10/2020 02:06:05;T473.SC01_PV.F_CV;1204.579345703;100.0 +25/10/2020 02:06:06;T473.SC01_PV.F_CV;1197.263183594;100.0 +25/10/2020 02:06:07;T473.SC01_PV.F_CV;1223.424682617;100.0 +25/10/2020 02:06:08;T473.SC01_PV.F_CV;1184.999023438;100.0 +25/10/2020 02:06:09;T473.SC01_PV.F_CV;1209.021240234;100.0 +25/10/2020 02:06:11;T473.SC01_PV.F_CV;1215.488037109;100.0 +25/10/2020 02:06:12;T473.SC01_PV.F_CV;1183.251708984;100.0 +25/10/2020 02:06:13;T473.SC01_PV.F_CV;1186.305419922;100.0 +25/10/2020 02:06:15;T473.SC01_PV.F_CV;1233.516967773;100.0 +25/10/2020 02:06:16;T473.SC01_PV.F_CV;1190.567626953;100.0 +25/10/2020 02:06:17;T473.SC01_PV.F_CV;1221.383422852;100.0 +25/10/2020 02:06:19;T473.SC01_PV.F_CV;1210.507202148;100.0 +25/10/2020 02:06:20;T473.SC01_PV.F_CV;1194.960571289;100.0 +25/10/2020 02:06:22;T473.SC01_PV.F_CV;1179.805908203;100.0 +25/10/2020 02:06:23;T473.SC01_PV.F_CV;1186.370727539;100.0 +25/10/2020 02:06:24;T473.SC01_PV.F_CV;1218.100952148;100.0 +25/10/2020 02:06:25;T473.SC01_PV.F_CV;1195.728027344;100.0 +25/10/2020 02:06:27;T473.SC01_PV.F_CV;1201.688842773;100.0 +25/10/2020 02:06:28;T473.SC01_PV.F_CV;1217.855957031;100.0 +25/10/2020 02:06:29;T473.SC01_PV.F_CV;1200.153686523;100.0 +25/10/2020 02:06:30;T473.SC01_PV.F_CV;1178.875000000;100.0 +25/10/2020 02:06:31;T473.SC01_PV.F_CV;1172.702026367;100.0 +25/10/2020 02:06:32;T473.SC01_PV.F_CV;1170.873046875;100.0 +25/10/2020 02:06:35;T473.SC01_PV.F_CV;1194.323608398;100.0 +25/10/2020 02:06:36;T473.SC01_PV.F_CV;1228.928100586;100.0 +25/10/2020 02:06:37;T473.SC01_PV.F_CV;1197.410156250;100.0 +25/10/2020 02:06:38;T473.SC01_PV.F_CV;1177.633911133;100.0 +25/10/2020 02:06:39;T473.SC01_PV.F_CV;1185.456298828;100.0 +25/10/2020 02:06:42;T473.SC01_PV.F_CV;1204.677368164;100.0 +25/10/2020 02:06:44;T473.SC01_PV.F_CV;1186.158447266;100.0 +25/10/2020 02:06:45;T473.SC01_PV.F_CV;1213.332519531;100.0 +25/10/2020 02:06:46;T473.SC01_PV.F_CV;1207.420898438;100.0 +25/10/2020 02:06:47;T473.SC01_PV.F_CV;1176.621459961;100.0 +25/10/2020 02:06:49;T473.SC01_PV.F_CV;1203.485229492;100.0 +25/10/2020 02:06:50;T473.SC01_PV.F_CV;1222.591796875;100.0 +25/10/2020 02:06:51;T473.SC01_PV.F_CV;1202.521606445;100.0 +25/10/2020 02:06:53;T473.SC01_PV.F_CV;1175.510986328;100.0 +25/10/2020 02:06:55;T473.SC01_PV.F_CV;1201.362182617;100.0 +25/10/2020 02:06:56;T473.SC01_PV.F_CV;1209.217041016;100.0 +25/10/2020 02:06:57;T473.SC01_PV.F_CV;1193.768432617;100.0 +25/10/2020 02:06:58;T473.SC01_PV.F_CV;1215.194091797;100.0 +25/10/2020 02:06:05;T473.SC01_SP.F_CV;1200.000000000;100.0 +25/10/2020 02:06:08;T473.SC02_OP.F_CV;10.000000000;100.0 +25/10/2020 02:06:14;T473.SC02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;T473.SC02_SP.F_CV;500.000000000;100.0 +25/10/2020 02:06:04;T473.TC03_OP.F_CV;57.713554382;100.0 +25/10/2020 02:06:18;T473.TC03_OP.F_CV;57.786796570;100.0 +25/10/2020 02:06:22;T473.TC03_OP.F_CV;57.689136505;100.0 +25/10/2020 02:06:27;T473.TC03_OP.F_CV;57.762382507;100.0 +25/10/2020 02:06:37;T473.TC03_OP.F_CV;57.689136505;100.0 +25/10/2020 02:06:40;T473.TC03_OP.F_CV;57.860042572;100.0 +25/10/2020 02:06:44;T473.TC03_OP.F_CV;57.786796570;100.0 +25/10/2020 02:06:46;T473.TC03_OP.F_CV;57.860042572;100.0 +25/10/2020 02:06:56;T473.TC03_OP.F_CV;57.689136505;100.0 +25/10/2020 02:06:57;T473.TC03_OP.F_CV;57.762382507;100.0 +25/10/2020 02:06:40;T473.TC03_PV.F_CV;135.155700684;100.0 +25/10/2020 02:06:56;T473.TC03_PV.F_CV;135.372192383;100.0 +25/10/2020 02:06:59;T473.TC03_SP.F_CV;135.000000000;100.0 +25/10/2020 02:06:10;T473.TC04_OP.F_CV;60.472427368;100.0 +25/10/2020 02:06:12;T473.TC04_OP.F_CV;60.545669556;100.0 +25/10/2020 02:06:14;T473.TC04_OP.F_CV;60.448013306;100.0 +25/10/2020 02:06:15;T473.TC04_OP.F_CV;60.545669556;100.0 +25/10/2020 02:06:37;T473.TC04_OP.F_CV;60.765403748;100.0 +25/10/2020 02:06:38;T473.TC04_OP.F_CV;60.863063812;100.0 +25/10/2020 02:06:54;T473.TC04_OP.F_CV;61.156040192;100.0 +25/10/2020 02:06:10;T473.TC04_PV.F_CV;145.376358032;100.0 +25/10/2020 02:06:27;T473.TC04_PV.F_CV;145.055358887;100.0 +25/10/2020 02:06:28;T473.TC04_PV.F_CV;145.187225342;100.0 +25/10/2020 02:06:43;T473.TC04_PV.F_CV;144.595230103;100.0 +25/10/2020 02:06:49;T473.TC04_SP.F_CV;145.000000000;100.0 +25/10/2020 02:06:09;T473.TC06_OP.F_CV;92.602310181;100.0 +25/10/2020 02:06:11;T473.TC06_OP.F_CV;92.675559998;100.0 +25/10/2020 02:06:13;T473.TC06_OP.F_CV;92.602310181;100.0 +25/10/2020 02:06:14;T473.TC06_OP.F_CV;92.675559998;100.0 +25/10/2020 02:06:17;T473.TC06_OP.F_CV;92.602310181;100.0 +25/10/2020 02:06:18;T473.TC06_OP.F_CV;92.699974060;100.0 +25/10/2020 02:06:20;T473.TC06_OP.F_CV;92.577896118;100.0 +25/10/2020 02:06:21;T473.TC06_OP.F_CV;92.675559998;100.0 +25/10/2020 02:06:33;T473.TC06_OP.F_CV;92.602310181;100.0 +25/10/2020 02:06:37;T473.TC06_OP.F_CV;92.675559998;100.0 +25/10/2020 02:06:51;T473.TC06_OP.F_CV;92.455825806;100.0 +25/10/2020 02:06:58;T473.TC06_OP.F_CV;92.529067993;100.0 +25/10/2020 02:06:59;T473.TC06_OP.F_CV;92.431411743;100.0 +25/10/2020 02:06:00;T473.TC06_PV.F_CV;140.434173584;100.0 +25/10/2020 02:06:02;T473.TC06_PV.F_CV;140.297424316;100.0 +25/10/2020 02:06:09;T473.TC06_PV.F_CV;140.481887817;100.0 +25/10/2020 02:06:12;T473.TC06_PV.F_CV;140.356597900;100.0 +25/10/2020 02:06:51;T473.TC06_PV.F_CV;140.515609741;100.0 +25/10/2020 02:06:14;T473.TC06_SP.F_CV;140.000000000;100.0 +25/10/2020 02:06:41;T473.TC07_OP.F_CV;99.978637695;100.0 +25/10/2020 02:06:31;T473.TC07_PV.F_CV;26.476066589;100.0 +25/10/2020 02:06:33;T473.TC07_SP.F_CV;135.000000000;100.0 +25/10/2020 02:06:04;T473.TC20_OP.F_CV;148.083435059;100.0 +25/10/2020 02:06:05;T473.TC20_OP.F_CV;148.266555786;100.0 +25/10/2020 02:06:06;T473.TC20_OP.F_CV;148.144470215;100.0 +25/10/2020 02:06:07;T473.TC20_OP.F_CV;148.205505371;100.0 +25/10/2020 02:06:09;T473.TC20_OP.F_CV;148.144470215;100.0 +25/10/2020 02:06:11;T473.TC20_OP.F_CV;148.205505371;100.0 +25/10/2020 02:06:15;T473.TC20_OP.F_CV;148.083435059;100.0 +25/10/2020 02:06:17;T473.TC20_OP.F_CV;148.266555786;100.0 +25/10/2020 02:06:19;T473.TC20_OP.F_CV;148.144470215;100.0 +25/10/2020 02:06:22;T473.TC20_OP.F_CV;148.205505371;100.0 +25/10/2020 02:06:23;T473.TC20_OP.F_CV;148.144470215;100.0 +25/10/2020 02:06:24;T473.TC20_OP.F_CV;148.205505371;100.0 +25/10/2020 02:06:29;T473.TC20_OP.F_CV;148.083435059;100.0 +25/10/2020 02:06:30;T473.TC20_OP.F_CV;148.144470215;100.0 +25/10/2020 02:06:35;T473.TC20_OP.F_CV;148.022399902;100.0 +25/10/2020 02:06:38;T473.TC20_OP.F_CV;148.205505371;100.0 +25/10/2020 02:06:39;T473.TC20_OP.F_CV;148.144470215;100.0 +25/10/2020 02:06:42;T473.TC20_OP.F_CV;148.205505371;100.0 +25/10/2020 02:06:45;T473.TC20_OP.F_CV;148.144470215;100.0 +25/10/2020 02:06:47;T473.TC20_OP.F_CV;148.266555786;100.0 +25/10/2020 02:06:48;T473.TC20_OP.F_CV;148.083435059;100.0 +25/10/2020 02:06:49;T473.TC20_OP.F_CV;148.022399902;100.0 +25/10/2020 02:06:51;T473.TC20_OP.F_CV;148.144470215;100.0 +25/10/2020 02:06:56;T473.TC20_OP.F_CV;148.205505371;100.0 +25/10/2020 02:06:57;T473.TC20_OP.F_CV;148.144470215;100.0 +25/10/2020 02:06:32;T473.TC20_PV.F_CV;135.010070801;100.0 +25/10/2020 02:06:41;T473.TC20_SP.F_CV;135.000000000;100.0 +25/10/2020 02:06:09;T473.TC23_OP.F_CV;2.807702780;100.0 +25/10/2020 02:06:01;T473.TC23_PV.F_CV;134.186798096;100.0 +25/10/2020 02:06:28;T473.TC23_PV.F_CV;134.289108276;100.0 +25/10/2020 02:06:12;T473.TC23_SP.F_CV;134.307052612;100.0 +25/10/2020 02:06:57;T473.TI10_PV.F_CV;23.549018860;100.0 +25/10/2020 02:06:52;T473.TI21_PV.F_CV;134.990142822;100.0 +25/10/2020 02:06:26;T473.TI22T_PV.F_CV;135.068344116;100.0 +25/10/2020 02:06:08;T473.TI23_PV.F_CV;135.056335449;100.0 +25/10/2020 02:06:00;T473.TI24_PV.F_CV;134.186798096;100.0 +25/10/2020 02:06:26;T473.TI24_PV.F_CV;134.289108276;100.0 +25/10/2020 02:06:59;T473.TI24_PV.F_CV;134.183776855;100.0 +25/10/2020 02:06:30;T473.TI25_PV.F_CV;133.276367188;100.0 +25/10/2020 02:06:36;T473.TI25_PV.F_CV;133.383804321;100.0 +25/10/2020 02:06:53;T473.TI25_PV.F_CV;133.274291992;100.0 +25/10/2020 02:06:28;T473.TI26_PV.F_CV;132.357116699;100.0 +25/10/2020 02:06:35;T473.TI26_PV.F_CV;132.595291138;100.0 +25/10/2020 02:06:56;T473.TI26_PV.F_CV;132.219787598;100.0 +25/10/2020 02:06:35;T473.TI27_PV.F_CV;130.944549561;100.0 +25/10/2020 02:06:37;T473.TI27_PV.F_CV;131.051116943;100.0 +25/10/2020 02:06:49;T548.AI01_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;T548.AI01_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T548.AI01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;T548.AI02_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;T548.AI02_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;T548.AI02_PV.F_CV;96.028320313;100.0 +25/10/2020 02:06:34;T548.F01.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;T548.F02.F_CV;0.000000000;0.0 +25/10/2020 02:06:49;T548.FC01_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;T548.FC01_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;T548.FC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;T548.FC01_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;T548.FC02_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;T548.FC02_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;T548.FC02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;T548.FC02_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;T548.FC03_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;T548.FC03_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;T548.FC03_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;T548.FC03_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;T548.FC04_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;T548.FC04_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;T548.FC04_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;T548.FC04_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;T548.FC05_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;T548.FC05_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;T548.FC05_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;T548.FC05_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;T548.HEV01.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;T548.HEV02.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;T548.HEV03.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;T548.HEV04.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;T548.HEV05.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;T548.HEV06.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;T548.HEV10A.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;T548.HEV10B.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;T548.HEV10X.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;T548.HEV11.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;T548.HEV22.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;T548.HEV33.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;T548.Retour_HSA10.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;T548.Retour_HSB10.F_CV;0.000000000;0.0 +25/10/2020 02:06:49;T548.TC01_Coef_A.F_CV;0.998399973;100.0 +25/10/2020 02:06:49;T548.TC01_Coef_B.F_CV;0.381000012;100.0 +25/10/2020 02:06:49;T548.TC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;T548.TC01_PV.F_CV;20.748359680;100.0 +25/10/2020 02:06:49;T548.TC01_SP.F_CV;10.000000000;100.0 +25/10/2020 02:06:49;T548.TC02_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;T548.TC02_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;T548.TC02_PV.F_CV;20.600000381;100.0 +25/10/2020 02:06:49;T548.TC02_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:49;T548.TC101_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;T548.TC101_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:49;T548.TC101_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;T548.TI01_Coef_A.F_CV;0.998399973;100.0 +25/10/2020 02:06:49;T548.TI01_Coef_B.F_CV;0.381000012;100.0 +25/10/2020 02:06:49;T548.TI01_PV.F_CV;20.748359680;100.0 +25/10/2020 02:06:49;T548.TI101_Coef_A.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;T548.TI101_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;T548.TI101_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:49;T548.TI102_Coef_A.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;T548.TI102_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;T548.TI102_PV.F_CV;20.600000381;100.0 +25/10/2020 02:06:36;T579.Agitation_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;T579.Arret_echantillonage;0.000000000;100.0 +25/10/2020 02:06:44;T579.Demande_echantillonnage;0.000000000;100.0 +25/10/2020 02:06:44;T579.Depart_immediat;0.000000000;100.0 +25/10/2020 02:06:44;T579.HEV01_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;T579.HEV02_Out.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;T579.HEV03_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;T579.HEV04_Out.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;T579.HEV05_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;T579.HEV06_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;T579.HEV07_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;T579.LI01_Inhibition.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;T579.LI01_PV.F_CV;2.962299824;100.0 +25/10/2020 02:06:44;T579.LI01_SH.F_CV;100.000000000;100.0 +25/10/2020 02:06:44;T579.Marche_echantillonage;0.000000000;100.0 +25/10/2020 02:06:44;T579.Mode_Repli;0.000000000;100.0 +25/10/2020 02:06:44;T579.Mode_Repli_Actif;0.000000000;100.0 +25/10/2020 02:06:35;T579.PI09_PV.F_CV;-0.055338543;100.0 +25/10/2020 02:06:44;T579.PI09_SH.F_CV;30.000000000;100.0 +25/10/2020 02:06:44;T579.PI15_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;T579.PI15_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;T579.PI15_PV.F_CV;0.042317707;100.0 +25/10/2020 02:06:12;T579.Pompe1_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;T579.Pompe2_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;T579.SC01_OP.F_CV;50.000000000;100.0 +25/10/2020 02:06:08;T579.SC01_PV.F_CV;23.799999237;100.0 +25/10/2020 02:06:10;T579.SC01_PV.F_CV;23.899999619;100.0 +25/10/2020 02:06:11;T579.SC01_PV.F_CV;23.799999237;100.0 +25/10/2020 02:06:13;T579.SC01_PV.F_CV;23.866666794;100.0 +25/10/2020 02:06:15;T579.SC01_PV.F_CV;23.799999237;100.0 +25/10/2020 02:06:20;T579.SC01_PV.F_CV;23.862499237;100.0 +25/10/2020 02:06:26;T579.SC01_PV.F_CV;23.700000763;100.0 +25/10/2020 02:06:27;T579.SC01_PV.F_CV;23.799999237;100.0 +25/10/2020 02:06:01;T579.TC05_OP.F_CV;23.216678619;100.0 +25/10/2020 02:06:09;T579.TC05_PV.F_CV;23.399999619;100.0 +25/10/2020 02:06:44;T579.TC05_SH.F_CV;160.000000000;100.0 +25/10/2020 02:06:11;T579.TC05_SP.F_CV;140.000000000;100.0 +25/10/2020 02:06:44;T579.TC07_OP.F_CV;4.347699165;100.0 +25/10/2020 02:06:55;T579.TC07_PV.F_CV;24.200000763;100.0 +25/10/2020 02:06:44;T579.TC07_SH.F_CV;150.000000000;100.0 +25/10/2020 02:06:44;T579.TC07_SP.F_CV;45.809661865;100.0 +25/10/2020 02:06:51;T579.TC10_OP.F_CV;16.623840332;100.0 +25/10/2020 02:06:58;T579.TC10_PV.F_CV;24.600000381;100.0 +25/10/2020 02:06:44;T579.TC10_SH.F_CV;170.000000000;100.0 +25/10/2020 02:06:56;T579.TC10_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:46;T579.TC11_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;T579.TC11_PV.F_CV;23.700000763;100.0 +25/10/2020 02:06:44;T579.TC11_SH.F_CV;170.000000000;100.0 +25/10/2020 02:06:03;T579.TC11_SP.F_CV;60.000000000;100.0 +25/10/2020 02:06:00;T579.TC12_OP.F_CV;36.663352966;100.0 +25/10/2020 02:06:17;T579.TC12_PV.F_CV;24.200000763;100.0 +25/10/2020 02:06:44;T579.TC12_SH.F_CV;150.000000000;100.0 +25/10/2020 02:06:23;T579.TC12_SP.F_CV;85.000000000;100.0 +25/10/2020 02:06:50;T579.TC13_OP.F_CV;39.815334320;100.0 +25/10/2020 02:06:43;T579.TC13_PV.F_CV;23.899999619;100.0 +25/10/2020 02:06:44;T579.TC13_SH.F_CV;130.000000000;100.0 +25/10/2020 02:06:52;T579.TC13_SP.F_CV;100.000000000;100.0 +25/10/2020 02:06:14;T579.TC15_OP.F_CV;43.120223999;100.0 +25/10/2020 02:06:13;T579.TC15_PV.F_CV;24.200000763;100.0 +25/10/2020 02:06:44;T579.TC15_SH.F_CV;130.000000000;100.0 +25/10/2020 02:06:36;T579.TC15_SP.F_CV;65.000000000;100.0 +25/10/2020 02:06:44;T579.TC16_OP.F_CV;73.025886536;100.0 +25/10/2020 02:06:15;T579.TC16_PV.F_CV;24.200000763;100.0 +25/10/2020 02:06:44;T579.TC16_SH.F_CV;130.000000000;100.0 +25/10/2020 02:06:44;T579.TC16_SP.F_CV;45.590000153;100.0 +25/10/2020 02:06:44;T579.Tempo_injection;0.000000000;100.0 +25/10/2020 02:06:44;T579.Tempo_rempl;0.000000000;100.0 +25/10/2020 02:06:01;T579.TI03_PV.F_CV;23.500000000;100.0 +25/10/2020 02:06:44;T579.TI03_SH.F_CV;170.000000000;100.0 +25/10/2020 02:06:58;T579.TI04_PV.F_CV;23.600000381;100.0 +25/10/2020 02:06:44;T579.TI04_SH.F_CV;170.000000000;100.0 +25/10/2020 02:06:55;T579.TI07_PV.F_CV;24.200000763;100.0 +25/10/2020 02:06:44;T579.TI07_SH.F_CV;150.000000000;100.0 +25/10/2020 02:06:00;T579.TI08_PV.F_CV;23.600000381;100.0 +25/10/2020 02:06:52;T579.TI105_PV.F_CV;23.600000381;100.0 +25/10/2020 02:06:44;T579.TI105_SH.F_CV;190.000000000;100.0 +25/10/2020 02:06:11;T579.TI107_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:44;T579.TI107_SH.F_CV;150.000000000;100.0 +25/10/2020 02:06:22;T579.TI110A_PV.F_CV;23.799999237;100.0 +25/10/2020 02:06:44;T579.TI110A_SH.F_CV;170.000000000;100.0 +25/10/2020 02:06:27;T579.TI110B_PV.F_CV;24.000000000;100.0 +25/10/2020 02:06:44;T579.TI110B_SH.F_CV;170.000000000;100.0 +25/10/2020 02:06:41;T579.TI110C_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:44;T579.TI110C_SH.F_CV;170.000000000;100.0 +25/10/2020 02:06:09;T579.TI111_PV.F_CV;23.037500381;100.0 +25/10/2020 02:06:15;T579.TI111_PV.F_CV;22.899999619;100.0 +25/10/2020 02:06:44;T579.TI111_SH.F_CV;170.000000000;100.0 +25/10/2020 02:06:12;T579.TI112_PV.F_CV;24.399999619;100.0 +25/10/2020 02:06:44;T579.TI112_SH.F_CV;170.000000000;100.0 +25/10/2020 02:06:29;T579.TI113_PV.F_CV;23.500000000;100.0 +25/10/2020 02:06:44;T579.TI113_SH.F_CV;170.000000000;100.0 +25/10/2020 02:06:10;T579.TI115_PV.F_CV;23.899999619;100.0 +25/10/2020 02:06:44;T579.TI115_SH.F_CV;170.000000000;100.0 +25/10/2020 02:06:03;T579.TI116_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:44;T579.TI116_SH.F_CV;130.000000000;100.0 +25/10/2020 02:06:24;T579.TI117_PV.F_CV;23.799999237;100.0 +25/10/2020 02:06:44;T579.TI117_SH.F_CV;150.000000000;100.0 +25/10/2020 02:06:21;T585.FC101A_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;T585.FC101A_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T585.FC101B_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;T585.FC101B_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;T585.FC102_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;T585.FC102_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;T585.FC104_PV.F_CV;5.684748650;100.0 +25/10/2020 02:06:24;T585.FC104_PV.F_CV;5.836408615;100.0 +25/10/2020 02:06:57;T585.FC104_PV.F_CV;5.613193512;100.0 +25/10/2020 02:06:58;T585.FC104_PV.F_CV;5.816866398;100.0 +25/10/2020 02:06:21;T585.FC104_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;T585.FC201A_PV.F_CV;-0.161306724;100.0 +25/10/2020 02:06:38;T585.FC201A_PV.F_CV;0.034023479;100.0 +25/10/2020 02:06:10;T585.FC201A_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;T585.FC201B_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;T585.FC201B_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;T585.FC202_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;T585.FC202_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;T585.FC204_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;T585.FC204_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;T585.FC301A_PV.F_CV;-0.368852645;100.0 +25/10/2020 02:06:17;T585.FC301A_PV.F_CV;-0.197200418;100.0 +25/10/2020 02:06:45;T585.FC301A_PV.F_CV;-0.355261385;100.0 +25/10/2020 02:06:46;T585.FC301A_PV.F_CV;-0.184686050;100.0 +25/10/2020 02:06:42;T585.FC301A_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;T585.FC301B_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;T585.FC301B_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;T585.FC302_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;T585.FC302_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;T585.FC304_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;T585.FC304_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;T585.P101_2_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;T585.P101_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;T585.P201_2_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;T585.P201_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;T585.P301_2_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;T585.P301_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;T585.TC101_PV.F_CV;19.600000381;100.0 +25/10/2020 02:06:06;T585.TC101_SP.F_CV;25.000000000;100.0 +25/10/2020 02:06:25;T585.TC102_PV.F_CV;19.100000381;100.0 +25/10/2020 02:06:58;T585.TC102_SP.F_CV;25.000000000;100.0 +25/10/2020 02:06:31;T585.TC103_PV.F_CV;19.700000763;100.0 +25/10/2020 02:06:24;T585.TC103_SP.F_CV;25.000000000;100.0 +25/10/2020 02:06:12;T585.TC201_PV.F_CV;19.100000381;100.0 +25/10/2020 02:06:31;T585.TC201_SP.F_CV;25.000000000;100.0 +25/10/2020 02:06:40;T585.TC202_PV.F_CV;18.700000763;100.0 +25/10/2020 02:06:52;T585.TC202_SP.F_CV;25.000000000;100.0 +25/10/2020 02:06:10;T585.TC203_PV.F_CV;19.000000000;100.0 +25/10/2020 02:06:31;T585.TC203_SP.F_CV;25.000000000;100.0 +25/10/2020 02:06:51;T585.TC301_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:05;T585.TC301_SP.F_CV;25.000000000;100.0 +25/10/2020 02:06:58;T585.TC302_PV.F_CV;19.000000000;100.0 +25/10/2020 02:06:26;T585.TC302_SP.F_CV;25.000000000;100.0 +25/10/2020 02:06:32;T585.TC303_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:05;T585.TC303_SP.F_CV;25.000000000;100.0 +25/10/2020 02:06:23;T585.TI104_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:38;T585.TI105_PV.F_CV;19.600000381;100.0 +25/10/2020 02:06:23;T585.TI106_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:58;T585.TI204_PV.F_CV;18.799999237;100.0 +25/10/2020 02:06:07;T585.TI205_PV.F_CV;18.799999237;100.0 +25/10/2020 02:06:54;T585.TI206_PV.F_CV;17.600000381;100.0 +25/10/2020 02:06:37;T585.TI304_PV.F_CV;19.000000000;100.0 +25/10/2020 02:06:52;T585.TI305_PV.F_CV;19.000000000;100.0 +25/10/2020 02:06:58;T585.TI306_PV.F_CV;18.000000000;100.0 +25/10/2020 02:06:05;T586.FC101A_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;T586.FC101A_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;T586.FC101B_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;T586.FC101B_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;T586.FC102_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;T586.FC102_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;T586.FC104_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;T586.FC104_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;T586.FC201A_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;T586.FC201A_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;T586.FC201B_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;T586.FC201B_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;T586.FC202_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;T586.FC202_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;T586.FC204_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;T586.FC204_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;T586.FC301A_PV.F_CV;30.000358582;100.0 +25/10/2020 02:06:04;T586.FC301A_SP.F_CV;30.000000000;100.0 +25/10/2020 02:06:14;T586.FC301B_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;T586.FC301B_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;T586.FC302_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;T586.FC302_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;T586.FC304_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;T586.FC304_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;T586.P101_2_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;T586.P101_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;T586.P201_2_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;T586.P201_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;T586.P301_2_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;T586.P301_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;T586.TC101_PV.F_CV;18.700000763;100.0 +25/10/2020 02:06:08;T586.TC101_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:14;T586.TC102_PV.F_CV;18.100000381;100.0 +25/10/2020 02:06:59;T586.TC102_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:15;T586.TC103_PV.F_CV;18.700000763;100.0 +25/10/2020 02:06:52;T586.TC103_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:49;T586.TC201_PV.F_CV;18.399999619;100.0 +25/10/2020 02:06:06;T586.TC201_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:11;T586.TC202_PV.F_CV;17.899999619;100.0 +25/10/2020 02:06:32;T586.TC202_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:25;T586.TC203_PV.F_CV;18.200000763;100.0 +25/10/2020 02:06:31;T586.TC203_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:20;T586.TC301_PV.F_CV;18.899999619;100.0 +25/10/2020 02:06:50;T586.TC301_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:34;T586.TC302_PV.F_CV;18.899999619;100.0 +25/10/2020 02:06:41;T586.TC302_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:51;T586.TC303_PV.F_CV;18.700000763;100.0 +25/10/2020 02:06:34;T586.TC303_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:50;T586.TI104_PV.F_CV;18.299999237;100.0 +25/10/2020 02:06:57;T586.TI105_PV.F_CV;16.899999619;100.0 +25/10/2020 02:06:33;T586.TI106_PV.F_CV;18.200000763;100.0 +25/10/2020 02:06:21;T586.TI204_PV.F_CV;17.899999619;100.0 +25/10/2020 02:06:52;T586.TI205_PV.F_CV;18.000000000;100.0 +25/10/2020 02:06:41;T586.TI206_PV.F_CV;17.700000763;100.0 +25/10/2020 02:06:09;T586.TI304_PV.F_CV;18.700000763;100.0 +25/10/2020 02:06:59;T586.TI305_PV.F_CV;18.700000763;100.0 +25/10/2020 02:06:09;T586.TI306_PV.F_CV;18.700000763;100.0 +25/10/2020 02:06:32;U036.AR101_Out.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U036.AR102_Out.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U036.AR103_Out.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U036.AR151_Out.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U036.AR301_Out.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U036.AR302_Out.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U036.AR303_Out.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U036.AR351_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U036.AS70_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U036.CDE_HEV111_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U036.CDE_HEV353_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U036.CDE_KCG70_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U036.CDE_KH100_Out.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U036.CDE_KH200_Out.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U036.CDE_KH300_Out.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U036.CDE_KP_Out.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U036.CDE_LT61_C_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U036.CDE_UY61_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U036.DPI132_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.DPI132_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.DPI132_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:22;U036.DPI132_PV.F_CV;0.018084526;100.0 +25/10/2020 02:06:32;U036.DPI132_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:22;U036.DPSH132_PV.F_CV;0.018084526;100.0 +25/10/2020 02:06:32;U036.FC100_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.FC100_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;U036.FC100_PV.F_CV;0.451388896;100.0 +25/10/2020 02:06:01;U036.FC100_PV.F_CV;0.717592597;100.0 +25/10/2020 02:06:04;U036.FC100_PV.F_CV;0.590277791;100.0 +25/10/2020 02:06:05;U036.FC100_PV.F_CV;0.949074090;100.0 +25/10/2020 02:06:06;U036.FC100_PV.F_CV;0.798611104;100.0 +25/10/2020 02:06:07;U036.FC100_PV.F_CV;1.030092597;100.0 +25/10/2020 02:06:09;U036.FC100_PV.F_CV;0.775462985;100.0 +25/10/2020 02:06:10;U036.FC100_PV.F_CV;0.868055582;100.0 +25/10/2020 02:06:13;U036.FC100_PV.F_CV;0.694444418;100.0 +25/10/2020 02:06:14;U036.FC100_PV.F_CV;0.856481493;100.0 +25/10/2020 02:06:17;U036.FC100_PV.F_CV;0.706018507;100.0 +25/10/2020 02:06:18;U036.FC100_PV.F_CV;0.868055582;100.0 +25/10/2020 02:06:22;U036.FC100_PV.F_CV;0.682870388;100.0 +25/10/2020 02:06:23;U036.FC100_PV.F_CV;1.006944418;100.0 +25/10/2020 02:06:25;U036.FC100_PV.F_CV;0.810185194;100.0 +25/10/2020 02:06:26;U036.FC100_PV.F_CV;1.041666627;100.0 +25/10/2020 02:06:27;U036.FC100_PV.F_CV;0.856481493;100.0 +25/10/2020 02:06:29;U036.FC100_PV.F_CV;0.995370388;100.0 +25/10/2020 02:06:31;U036.FC100_PV.F_CV;0.752314806;100.0 +25/10/2020 02:06:34;U036.FC100_PV.F_CV;0.972222209;100.0 +25/10/2020 02:06:36;U036.FC100_PV.F_CV;0.752314806;100.0 +25/10/2020 02:06:39;U036.FC100_PV.F_CV;0.972222209;100.0 +25/10/2020 02:06:41;U036.FC100_PV.F_CV;0.821759284;100.0 +25/10/2020 02:06:42;U036.FC100_PV.F_CV;0.972222209;100.0 +25/10/2020 02:06:44;U036.FC100_PV.F_CV;0.694444418;100.0 +25/10/2020 02:06:45;U036.FC100_PV.F_CV;0.868055582;100.0 +25/10/2020 02:06:48;U036.FC100_PV.F_CV;0.682870388;100.0 +25/10/2020 02:06:50;U036.FC100_PV.F_CV;0.983796299;100.0 +25/10/2020 02:06:51;U036.FC100_PV.F_CV;0.856481493;100.0 +25/10/2020 02:06:52;U036.FC100_PV.F_CV;0.937500000;100.0 +25/10/2020 02:06:53;U036.FC100_PV.F_CV;0.833333313;100.0 +25/10/2020 02:06:54;U036.FC100_PV.F_CV;1.111111164;100.0 +25/10/2020 02:06:55;U036.FC100_PV.F_CV;0.775462985;100.0 +25/10/2020 02:06:57;U036.FC100_PV.F_CV;0.868055582;100.0 +25/10/2020 02:06:46;U036.FC100_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U036.FC121_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.FC121_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:24;U036.FC121_PV.F_CV;-0.043402776;100.0 +25/10/2020 02:06:20;U036.FC121_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U036.FC321_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.FC321_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;U036.FC321_PV.F_CV;-0.090422451;100.0 +25/10/2020 02:06:33;U036.FC321_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U036.LC61_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.LC61_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U036.LC61_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U036.LC61_PV.F_CV;15.310329437;100.0 +25/10/2020 02:06:46;U036.LC61_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U036.PC332_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.PC332_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:40;U036.PC332_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U036.PC332_PV.F_CV;4.674840927;100.0 +25/10/2020 02:06:32;U036.PC332_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U036.PI132_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.PI132_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.PI132_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;U036.PI132_PV.F_CV;4.694733620;100.0 +25/10/2020 02:06:32;U036.PI132_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.RES_CHROM.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.START_CHROM.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TC101_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TC101_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:05;U036.TC101_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U036.TC101_PV.F_CV;25.000000000;100.0 +25/10/2020 02:06:05;U036.TC101_SP.F_CV;200.000000000;100.0 +25/10/2020 02:06:32;U036.TC102_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TC102_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TC102_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U036.TC102_PV.F_CV;25.000000000;100.0 +25/10/2020 02:06:32;U036.TC102_SP.F_CV;200.000000000;100.0 +25/10/2020 02:06:32;U036.TC103_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TC103_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U036.TC103_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U036.TC103_PV.F_CV;25.100000381;100.0 +25/10/2020 02:06:32;U036.TC103_SP.F_CV;175.000000000;100.0 +25/10/2020 02:06:32;U036.TC151_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TC151_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:39;U036.TC151_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U036.TC151_PV.F_CV;23.700000763;100.0 +25/10/2020 02:06:57;U036.TC151_SP.F_CV;190.000000000;100.0 +25/10/2020 02:06:32;U036.TC251_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TC251_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:05;U036.TC251_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U036.TC251_PV.F_CV;21.899999619;100.0 +25/10/2020 02:06:32;U036.TC251_SP.F_CV;190.000000000;100.0 +25/10/2020 02:06:32;U036.TC301_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TC301_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:40;U036.TC301_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U036.TC301_PV.F_CV;24.600000381;100.0 +25/10/2020 02:06:33;U036.TC301_SP.F_CV;375.000000000;100.0 +25/10/2020 02:06:32;U036.TC302_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TC302_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TC302_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U036.TC302_PV.F_CV;24.600000381;100.0 +25/10/2020 02:06:42;U036.TC302_SP.F_CV;375.000000000;100.0 +25/10/2020 02:06:32;U036.TC303_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TC303_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:06;U036.TC303_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U036.TC303_PV.F_CV;24.600000381;100.0 +25/10/2020 02:06:46;U036.TC303_SP.F_CV;375.000000000;100.0 +25/10/2020 02:06:32;U036.TC351_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TC351_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TC351_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U036.TC351_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:32;U036.TC351_SP.F_CV;136.733322144;100.0 +25/10/2020 02:06:32;U036.TI100_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI100_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI100_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI100_PV.F_CV;26.329999924;100.0 +25/10/2020 02:06:32;U036.TI100_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI104_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI104_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI104_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;U036.TI104_PV.F_CV;25.000000000;100.0 +25/10/2020 02:06:32;U036.TI104_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI105_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI105_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI105_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:33;U036.TI105_PV.F_CV;24.600000381;100.0 +25/10/2020 02:06:32;U036.TI105_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI106_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI106_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI106_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:43;U036.TI106_PV.F_CV;25.700000763;100.0 +25/10/2020 02:06:55;U036.TI106_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:32;U036.TI106_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U036.TI1151_PV.F_CV;22.299999237;100.0 +25/10/2020 02:06:47;U036.TI1251_PV.F_CV;22.000000000;100.0 +25/10/2020 02:06:57;U036.TI1351_PV.F_CV;23.700000763;100.0 +25/10/2020 02:06:32;U036.TI304_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI304_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI304_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:01;U036.TI304_PV.F_CV;23.399999619;100.0 +25/10/2020 02:06:32;U036.TI304_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI305_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI305_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI305_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:25;U036.TI305_PV.F_CV;23.000000000;100.0 +25/10/2020 02:06:44;U036.TI305_PV.F_CV;23.200000763;100.0 +25/10/2020 02:06:32;U036.TI305_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI306_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI306_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI306_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U036.TI306_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:32;U036.TI306_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI307_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI307_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U036.TI307_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U036.TI307_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:46;U036.TI307_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U036.TI51_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI51_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI51_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;U036.TI51_PV.F_CV;22.500000000;100.0 +25/10/2020 02:06:29;U036.TI51_PV.F_CV;22.700000763;100.0 +25/10/2020 02:06:46;U036.TI51_PV.F_CV;23.100000381;100.0 +25/10/2020 02:06:49;U036.TI51_PV.F_CV;22.799999237;100.0 +25/10/2020 02:06:32;U036.TI51_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI52_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI52_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI52_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:21;U036.TI52_PV.F_CV;23.399999619;100.0 +25/10/2020 02:06:32;U036.TI52_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI53_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI53_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U036.TI53_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:05;U036.TI53_PV.F_CV;24.399999619;100.0 +25/10/2020 02:06:09;U036.TI53_PV.F_CV;24.200000763;100.0 +25/10/2020 02:06:28;U036.TI53_PV.F_CV;24.000000000;100.0 +25/10/2020 02:06:32;U036.TI53_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:57;U063.AI01_PV.F_CV;0.037073206;100.0 +25/10/2020 02:06:05;U063.AI02_PV.F_CV;0.003978588;100.0 +25/10/2020 02:06:52;U063.AI03_PV.F_CV;0.000361690;100.0 +25/10/2020 02:06:29;U063.FC01_PV.F_CV;0.730837166;100.0 +25/10/2020 02:06:20;U063.FC02_PV.F_CV;0.002717972;100.0 +25/10/2020 02:06:25;U063.FC02_PV.F_CV;0.087629050;100.0 +25/10/2020 02:06:29;U063.FC02_PV.F_CV;-0.000143051;100.0 +25/10/2020 02:06:47;U063.FC02_PV.F_CV;0.076064698;100.0 +25/10/2020 02:06:16;U063.FC21_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:16;U063.FC21_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:20;U063.FC21_PV.F_CV;100.000267029;100.0 +25/10/2020 02:06:16;U063.FC23_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:16;U063.FC23_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:17;U063.FC23_PV.F_CV;-0.362100035;100.0 +25/10/2020 02:06:19;U063.FC23_PV.F_CV;-0.331876755;100.0 +25/10/2020 02:06:22;U063.FC23_PV.F_CV;-0.369500399;100.0 +25/10/2020 02:06:24;U063.FC23_PV.F_CV;-0.310322344;100.0 +25/10/2020 02:06:25;U063.FC23_PV.F_CV;-0.342521369;100.0 +25/10/2020 02:06:38;U063.FC23_PV.F_CV;-0.369152397;100.0 +25/10/2020 02:06:41;U063.FC23_PV.F_CV;-0.332468867;100.0 +25/10/2020 02:06:42;U063.FC23_PV.F_CV;-0.357539058;100.0 +25/10/2020 02:06:51;U063.FC23_PV.F_CV;-0.330165714;100.0 +25/10/2020 02:06:16;U063.FC24_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:16;U063.FC24_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:36;U063.FC24_PV.F_CV;0.582700014;100.0 +25/10/2020 02:06:13;U063.FI60_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U063.FI60_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U063.FI60_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U063.FQ60_Coef_A.F_CV;0.982900023;100.0 +25/10/2020 02:06:13;U063.FQ60_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U063.FQ60_PV.F_CV;375636.062500000;100.0 +25/10/2020 02:06:18;U063.LC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U063.LC01_PV.F_CV;-0.632957160;100.0 +25/10/2020 02:06:13;U063.LC02_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U063.LC02_PV.F_CV;-0.629400551;100.0 +25/10/2020 02:06:46;U063.LC03_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U063.LC03_PV.F_CV;-0.654116035;100.0 +25/10/2020 02:06:14;U063.LI10_PV.F_CV;34.819877625;100.0 +25/10/2020 02:06:15;U063.LI10_PV.F_CV;34.183303833;100.0 +25/10/2020 02:06:16;U063.LI10_PV.F_CV;34.823493958;100.0 +25/10/2020 02:06:22;U063.LI10_PV.F_CV;34.706848145;100.0 +25/10/2020 02:06:25;U063.LI10_PV.F_CV;34.132667542;100.0 +25/10/2020 02:06:27;U063.LI10_PV.F_CV;34.823493958;100.0 +25/10/2020 02:06:28;U063.LI10_PV.F_CV;34.476272583;100.0 +25/10/2020 02:06:29;U063.LI10_PV.F_CV;34.823493958;100.0 +25/10/2020 02:06:32;U063.LI10_PV.F_CV;34.653499603;100.0 +25/10/2020 02:06:33;U063.LI10_PV.F_CV;34.704135895;100.0 +25/10/2020 02:06:34;U063.LI10_PV.F_CV;34.494358063;100.0 +25/10/2020 02:06:35;U063.LI10_PV.F_CV;34.816261292;100.0 +25/10/2020 02:06:36;U063.LI10_PV.F_CV;34.581161499;100.0 +25/10/2020 02:06:37;U063.LI10_PV.F_CV;34.816261292;100.0 +25/10/2020 02:06:38;U063.LI10_PV.F_CV;34.624565125;100.0 +25/10/2020 02:06:40;U063.LI10_PV.F_CV;34.823493958;100.0 +25/10/2020 02:06:41;U063.LI10_PV.F_CV;34.313510895;100.0 +25/10/2020 02:06:42;U063.LI10_PV.F_CV;34.371383667;100.0 +25/10/2020 02:06:43;U063.LI10_PV.F_CV;34.823493958;100.0 +25/10/2020 02:06:44;U063.LI10_PV.F_CV;34.758392334;100.0 +25/10/2020 02:06:45;U063.LI10_PV.F_CV;34.552227020;100.0 +25/10/2020 02:06:46;U063.LI10_PV.F_CV;34.132667542;100.0 +25/10/2020 02:06:48;U063.LI10_PV.F_CV;34.805412292;100.0 +25/10/2020 02:06:49;U063.LI10_PV.F_CV;34.620948792;100.0 +25/10/2020 02:06:50;U063.LI10_PV.F_CV;34.197772980;100.0 +25/10/2020 02:06:52;U063.LI10_PV.F_CV;34.816261292;100.0 +25/10/2020 02:06:54;U063.LI10_PV.F_CV;34.765625000;100.0 +25/10/2020 02:06:55;U063.LI10_PV.F_CV;34.176071167;100.0 +25/10/2020 02:06:56;U063.LI10_PV.F_CV;34.754776001;100.0 +25/10/2020 02:06:58;U063.LI10_PV.F_CV;34.819877625;100.0 +25/10/2020 02:06:16;U063.PC01_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:16;U063.PC01_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:16;U063.PC01_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:26;U063.PC01_PV.F_CV;0.296585649;100.0 +25/10/2020 02:06:01;U063.PDI02_PV.F_CV;1.044448972;100.0 +25/10/2020 02:06:07;U063.PDI02_PV.F_CV;1.034432888;100.0 +25/10/2020 02:06:14;U063.PDI02_PV.F_CV;1.044560194;100.0 +25/10/2020 02:06:19;U063.PDI02_PV.F_CV;1.034432888;100.0 +25/10/2020 02:06:22;U063.PDI02_PV.F_CV;1.048900485;100.0 +25/10/2020 02:06:27;U063.PDI02_PV.F_CV;1.036844134;100.0 +25/10/2020 02:06:32;U063.PDI02_PV.F_CV;1.048900485;100.0 +25/10/2020 02:06:35;U063.PDI02_PV.F_CV;1.038049817;100.0 +25/10/2020 02:06:40;U063.PDI02_PV.F_CV;1.048900485;100.0 +25/10/2020 02:06:46;U063.PDI02_PV.F_CV;1.038049817;100.0 +25/10/2020 02:06:50;U063.PDI02_PV.F_CV;1.048900485;100.0 +25/10/2020 02:06:19;U063.PI02_PV.F_CV;1.338252306;100.0 +25/10/2020 02:06:19;U063.PI60_PV.F_CV;-0.005425347;100.0 +25/10/2020 02:06:39;U063.PI62_PV.F_CV;0.334924757;100.0 +25/10/2020 02:06:16;U063.TC10_OP.F_CV;47.837436676;100.0 +25/10/2020 02:06:47;U063.TC10_PV.F_CV;510.098327637;100.0 +25/10/2020 02:06:49;U063.TC14_OP.F_CV;53.319782257;100.0 +25/10/2020 02:06:03;U063.TC14_PV.F_CV;340.000000000;100.0 +25/10/2020 02:06:13;U063.TI01_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U063.TI01_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U063.TI01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:10;U063.TI01_PV.F_CV;540.700012207;100.0 +25/10/2020 02:06:13;U063.TI02_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U063.TI02_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U063.TI02_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:42;U063.TI02_PV.F_CV;540.700012207;100.0 +25/10/2020 02:06:13;U063.TI03_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U063.TI03_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U063.TI03_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U063.TI03_PV.F_CV;541.299987793;100.0 +25/10/2020 02:06:44;U063.TI05_PV.F_CV;23.885000229;100.0 +25/10/2020 02:06:16;U063.TI11_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:04;U063.TI11_PV.F_CV;555.700012207;100.0 +25/10/2020 02:06:16;U063.TI12_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;U063.TI12_PV.F_CV;541.700012207;100.0 +25/10/2020 02:06:16;U063.TI13_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:42;U063.TI13_PV.F_CV;164.800003052;100.0 +25/10/2020 02:06:23;U063.TI60_PV.F_CV;24.600000381;100.0 +25/10/2020 02:06:09;U063.WI01_PV.F_CV;13169.766601563;100.0 +25/10/2020 02:06:09;U063.WI02_PV.F_CV;-1.088641405;100.0 +25/10/2020 02:06:33;U063.WI18_PV.F_CV;209.600006104;100.0 +25/10/2020 02:06:00;U084.DPY1_PV.F_CV;-0.656079292;100.0 +25/10/2020 02:06:01;U084.DPY1_PV.F_CV;-0.650593042;100.0 +25/10/2020 02:06:02;U084.DPY1_PV.F_CV;-0.643137991;100.0 +25/10/2020 02:06:03;U084.DPY1_PV.F_CV;-0.631963253;100.0 +25/10/2020 02:06:04;U084.DPY1_PV.F_CV;-0.623584986;100.0 +25/10/2020 02:06:05;U084.DPY1_PV.F_CV;-0.615307033;100.0 +25/10/2020 02:06:06;U084.DPY1_PV.F_CV;-0.610753775;100.0 +25/10/2020 02:06:07;U084.DPY1_PV.F_CV;-0.612774014;100.0 +25/10/2020 02:06:08;U084.DPY1_PV.F_CV;-0.617925942;100.0 +25/10/2020 02:06:09;U084.DPY1_PV.F_CV;-0.623734355;100.0 +25/10/2020 02:06:10;U084.DPY1_PV.F_CV;-0.625681221;100.0 +25/10/2020 02:06:11;U084.DPY1_PV.F_CV;-0.625669062;100.0 +25/10/2020 02:06:12;U084.DPY1_PV.F_CV;-0.623171031;100.0 +25/10/2020 02:06:13;U084.DPY1_PV.F_CV;-0.621474981;100.0 +25/10/2020 02:06:14;U084.DPY1_PV.F_CV;-0.619544446;100.0 +25/10/2020 02:06:15;U084.DPY1_PV.F_CV;-0.618750095;100.0 +25/10/2020 02:06:16;U084.DPY1_PV.F_CV;-0.619228005;100.0 +25/10/2020 02:06:17;U084.DPY1_PV.F_CV;-0.620032966;100.0 +25/10/2020 02:06:18;U084.DPY1_PV.F_CV;-0.623419285;100.0 +25/10/2020 02:06:19;U084.DPY1_PV.F_CV;-0.628921807;100.0 +25/10/2020 02:06:20;U084.DPY1_PV.F_CV;-0.635633826;100.0 +25/10/2020 02:06:21;U084.DPY1_PV.F_CV;-0.642203212;100.0 +25/10/2020 02:06:22;U084.DPY1_PV.F_CV;-0.642044783;100.0 +25/10/2020 02:06:23;U084.DPY1_PV.F_CV;-0.640150428;100.0 +25/10/2020 02:06:24;U084.DPY1_PV.F_CV;-0.638433456;100.0 +25/10/2020 02:06:25;U084.DPY1_PV.F_CV;-0.635274172;100.0 +25/10/2020 02:06:26;U084.DPY1_PV.F_CV;-0.630292594;100.0 +25/10/2020 02:06:27;U084.DPY1_PV.F_CV;-0.614792168;100.0 +25/10/2020 02:06:28;U084.DPY1_PV.F_CV;-0.609060645;100.0 +25/10/2020 02:06:29;U084.DPY1_PV.F_CV;-0.607627749;100.0 +25/10/2020 02:06:30;U084.DPY1_PV.F_CV;-0.612153292;100.0 +25/10/2020 02:06:31;U084.DPY1_PV.F_CV;-0.619263470;100.0 +25/10/2020 02:06:32;U084.DPY1_PV.F_CV;-0.626149595;100.0 +25/10/2020 02:06:33;U084.DPY1_PV.F_CV;-0.631222188;100.0 +25/10/2020 02:06:34;U084.DPY1_PV.F_CV;-0.638794303;100.0 +25/10/2020 02:06:35;U084.DPY1_PV.F_CV;-0.652091980;100.0 +25/10/2020 02:06:36;U084.DPY1_PV.F_CV;-0.662070096;100.0 +25/10/2020 02:06:37;U084.DPY1_PV.F_CV;-0.669551253;100.0 +25/10/2020 02:06:38;U084.DPY1_PV.F_CV;-0.676931202;100.0 +25/10/2020 02:06:39;U084.DPY1_PV.F_CV;-0.679969847;100.0 +25/10/2020 02:06:40;U084.DPY1_PV.F_CV;-0.679408610;100.0 +25/10/2020 02:06:41;U084.DPY1_PV.F_CV;-0.678861260;100.0 +25/10/2020 02:06:42;U084.DPY1_PV.F_CV;-0.678588331;100.0 +25/10/2020 02:06:43;U084.DPY1_PV.F_CV;-0.677711308;100.0 +25/10/2020 02:06:44;U084.DPY1_PV.F_CV;-0.675498843;100.0 +25/10/2020 02:06:45;U084.DPY1_PV.F_CV;-0.671738863;100.0 +25/10/2020 02:06:46;U084.DPY1_PV.F_CV;-0.667735517;100.0 +25/10/2020 02:06:47;U084.DPY1_PV.F_CV;-0.665804863;100.0 +25/10/2020 02:06:48;U084.DPY1_PV.F_CV;-0.665982664;100.0 +25/10/2020 02:06:49;U084.DPY1_PV.F_CV;-0.666095078;100.0 +25/10/2020 02:06:50;U084.DPY1_PV.F_CV;-0.664965272;100.0 +25/10/2020 02:06:51;U084.DPY1_PV.F_CV;-0.663729787;100.0 +25/10/2020 02:06:52;U084.DPY1_PV.F_CV;-0.662810802;100.0 +25/10/2020 02:06:53;U084.DPY1_PV.F_CV;-0.664370656;100.0 +25/10/2020 02:06:54;U084.DPY1_PV.F_CV;-0.665445745;100.0 +25/10/2020 02:06:55;U084.DPY1_PV.F_CV;-0.667263329;100.0 +25/10/2020 02:06:56;U084.DPY1_PV.F_CV;-0.666258276;100.0 +25/10/2020 02:06:57;U084.DPY1_PV.F_CV;-0.662377834;100.0 +25/10/2020 02:06:58;U084.DPY1_PV.F_CV;-0.657290518;100.0 +25/10/2020 02:06:59;U084.DPY1_PV.F_CV;-0.648051500;100.0 +25/10/2020 02:06:00;U084.DPY2_PV.F_CV;-0.225952938;100.0 +25/10/2020 02:06:01;U084.DPY2_PV.F_CV;-0.233776018;100.0 +25/10/2020 02:06:02;U084.DPY2_PV.F_CV;-0.238770261;100.0 +25/10/2020 02:06:03;U084.DPY2_PV.F_CV;-0.242831737;100.0 +25/10/2020 02:06:04;U084.DPY2_PV.F_CV;-0.249351948;100.0 +25/10/2020 02:06:05;U084.DPY2_PV.F_CV;-0.249351948;100.0 +25/10/2020 02:06:06;U084.DPY2_PV.F_CV;-0.250602990;100.0 +25/10/2020 02:06:07;U084.DPY2_PV.F_CV;-0.251775354;100.0 +25/10/2020 02:06:08;U084.DPY2_PV.F_CV;-0.251734823;100.0 +25/10/2020 02:06:09;U084.DPY2_PV.F_CV;-0.250220120;100.0 +25/10/2020 02:06:10;U084.DPY2_PV.F_CV;-0.241179168;100.0 +25/10/2020 02:06:11;U084.DPY2_PV.F_CV;-0.229658812;100.0 +25/10/2020 02:06:12;U084.DPY2_PV.F_CV;-0.215742365;100.0 +25/10/2020 02:06:13;U084.DPY2_PV.F_CV;-0.195982933;100.0 +25/10/2020 02:06:14;U084.DPY2_PV.F_CV;-0.184036553;100.0 +25/10/2020 02:06:15;U084.DPY2_PV.F_CV;-0.176401675;100.0 +25/10/2020 02:06:16;U084.DPY2_PV.F_CV;-0.172357842;100.0 +25/10/2020 02:06:17;U084.DPY2_PV.F_CV;-0.172856703;100.0 +25/10/2020 02:06:18;U084.DPY2_PV.F_CV;-0.175577849;100.0 +25/10/2020 02:06:19;U084.DPY2_PV.F_CV;-0.175998926;100.0 +25/10/2020 02:06:20;U084.DPY2_PV.F_CV;-0.171705052;100.0 +25/10/2020 02:06:21;U084.DPY2_PV.F_CV;-0.165158853;100.0 +25/10/2020 02:06:22;U084.DPY2_PV.F_CV;-0.157884404;100.0 +25/10/2020 02:06:23;U084.DPY2_PV.F_CV;-0.155609593;100.0 +25/10/2020 02:06:24;U084.DPY2_PV.F_CV;-0.156259552;100.0 +25/10/2020 02:06:25;U084.DPY2_PV.F_CV;-0.160955623;100.0 +25/10/2020 02:06:26;U084.DPY2_PV.F_CV;-0.165992513;100.0 +25/10/2020 02:06:27;U084.DPY2_PV.F_CV;-0.171678424;100.0 +25/10/2020 02:06:28;U084.DPY2_PV.F_CV;-0.180809379;100.0 +25/10/2020 02:06:29;U084.DPY2_PV.F_CV;-0.187746257;100.0 +25/10/2020 02:06:30;U084.DPY2_PV.F_CV;-0.194702014;100.0 +25/10/2020 02:06:31;U084.DPY2_PV.F_CV;-0.203686550;100.0 +25/10/2020 02:06:32;U084.DPY2_PV.F_CV;-0.209323809;100.0 +25/10/2020 02:06:33;U084.DPY2_PV.F_CV;-0.215097681;100.0 +25/10/2020 02:06:34;U084.DPY2_PV.F_CV;-0.225010470;100.0 +25/10/2020 02:06:35;U084.DPY2_PV.F_CV;-0.225010470;100.0 +25/10/2020 02:06:36;U084.DPY2_PV.F_CV;-0.225270942;100.0 +25/10/2020 02:06:37;U084.DPY2_PV.F_CV;-0.215715632;100.0 +25/10/2020 02:06:38;U084.DPY2_PV.F_CV;-0.203028888;100.0 +25/10/2020 02:06:39;U084.DPY2_PV.F_CV;-0.188484222;100.0 +25/10/2020 02:06:40;U084.DPY2_PV.F_CV;-0.167143986;100.0 +25/10/2020 02:06:41;U084.DPY2_PV.F_CV;-0.151262879;100.0 +25/10/2020 02:06:42;U084.DPY2_PV.F_CV;-0.136866137;100.0 +25/10/2020 02:06:43;U084.DPY2_PV.F_CV;-0.120290689;100.0 +25/10/2020 02:06:44;U084.DPY2_PV.F_CV;-0.112523906;100.0 +25/10/2020 02:06:45;U084.DPY2_PV.F_CV;-0.109977819;100.0 +25/10/2020 02:06:46;U084.DPY2_PV.F_CV;-0.114427865;100.0 +25/10/2020 02:06:47;U084.DPY2_PV.F_CV;-0.122005671;100.0 +25/10/2020 02:06:48;U084.DPY2_PV.F_CV;-0.131682634;100.0 +25/10/2020 02:06:49;U084.DPY2_PV.F_CV;-0.145803079;100.0 +25/10/2020 02:06:50;U084.DPY2_PV.F_CV;-0.156110466;100.0 +25/10/2020 02:06:51;U084.DPY2_PV.F_CV;-0.162138432;100.0 +25/10/2020 02:06:52;U084.DPY2_PV.F_CV;-0.162878051;100.0 +25/10/2020 02:06:53;U084.DPY2_PV.F_CV;-0.158771396;100.0 +25/10/2020 02:06:54;U084.DPY2_PV.F_CV;-0.152569771;100.0 +25/10/2020 02:06:55;U084.DPY2_PV.F_CV;-0.142930001;100.0 +25/10/2020 02:06:56;U084.DPY2_PV.F_CV;-0.136246756;100.0 +25/10/2020 02:06:57;U084.DPY2_PV.F_CV;-0.131053001;100.0 +25/10/2020 02:06:58;U084.DPY2_PV.F_CV;-0.128829852;100.0 +25/10/2020 02:06:59;U084.DPY2_PV.F_CV;-0.131444246;100.0 +25/10/2020 02:06:00;U084.DPY3_PV.F_CV;2.806387424;100.0 +25/10/2020 02:06:06;U084.DPY3_PV.F_CV;2.776870012;100.0 +25/10/2020 02:06:14;U084.DPY3_PV.F_CV;2.567066193;100.0 +25/10/2020 02:06:21;U084.DPY3_PV.F_CV;2.622629642;100.0 +25/10/2020 02:06:28;U084.DPY3_PV.F_CV;2.818131685;100.0 +25/10/2020 02:06:42;U084.DPY3_PV.F_CV;2.611787796;100.0 +25/10/2020 02:06:49;U084.DPY3_PV.F_CV;2.462767363;100.0 +25/10/2020 02:06:59;U084.DPY3_PV.F_CV;2.555265903;100.0 +25/10/2020 02:06:00;U084.DPY4_PV.F_CV;13.609417915;100.0 +25/10/2020 02:06:07;U084.DPY4_PV.F_CV;13.747289658;100.0 +25/10/2020 02:06:10;U084.DPY4_PV.F_CV;13.863430977;100.0 +25/10/2020 02:06:13;U084.DPY4_PV.F_CV;13.790171623;100.0 +25/10/2020 02:06:22;U084.DPY4_PV.F_CV;13.039605141;100.0 +25/10/2020 02:06:27;U084.DPY4_PV.F_CV;12.794827461;100.0 +25/10/2020 02:06:30;U084.DPY4_PV.F_CV;12.731881142;100.0 +25/10/2020 02:06:34;U084.DPY4_PV.F_CV;12.796180725;100.0 +25/10/2020 02:06:42;U084.DPY4_PV.F_CV;13.107429504;100.0 +25/10/2020 02:06:43;U084.DPY4_PV.F_CV;13.202534676;100.0 +25/10/2020 02:06:58;U084.DPY4_PV.F_CV;13.770329475;100.0 +25/10/2020 02:06:51;U084.FC111_OP.F_CV;28.166900635;100.0 +25/10/2020 02:06:04;U084.FC111_PV.F_CV;1.999969363;100.0 +25/10/2020 02:06:07;U084.FC111_SP.F_CV;2.000000000;100.0 +25/10/2020 02:06:07;U084.FC121_OP.F_CV;33.348747253;100.0 +25/10/2020 02:06:07;U084.FC121_PV.F_CV;6.699856281;100.0 +25/10/2020 02:06:07;U084.FC121_SP.F_CV;6.699999809;100.0 +25/10/2020 02:06:39;U084.FC130_OP.F_CV;2.859310389;100.0 +25/10/2020 02:06:33;U084.FC130_PV.F_CV;16.999570847;100.0 +25/10/2020 02:06:41;U084.FC130_PV.F_CV;17.028472900;100.0 +25/10/2020 02:06:57;U084.FC130_PV.F_CV;16.966247559;100.0 +25/10/2020 02:06:07;U084.FC130_SP.F_CV;17.000000000;100.0 +25/10/2020 02:06:12;U084.FC211_OP.F_CV;36.310630798;100.0 +25/10/2020 02:06:30;U084.FC211_PV.F_CV;1.998460770;100.0 +25/10/2020 02:06:50;U084.FC211_PV.F_CV;2.003621340;100.0 +25/10/2020 02:06:07;U084.FC211_SP.F_CV;2.000000000;100.0 +25/10/2020 02:06:53;U084.FC221_OP.F_CV;22.871797562;100.0 +25/10/2020 02:06:07;U084.FC221_PV.F_CV;3.299304962;100.0 +25/10/2020 02:06:07;U084.FC221_SP.F_CV;3.299999952;100.0 +25/10/2020 02:06:56;U084.FC230_OP.F_CV;1.449655294;100.0 +25/10/2020 02:06:03;U084.FC230_PV.F_CV;8.716608047;100.0 +25/10/2020 02:06:08;U084.FC230_PV.F_CV;8.688069344;100.0 +25/10/2020 02:06:10;U084.FC230_PV.F_CV;8.736246109;100.0 +25/10/2020 02:06:15;U084.FC230_PV.F_CV;8.662383080;100.0 +25/10/2020 02:06:18;U084.FC230_PV.F_CV;8.687634468;100.0 +25/10/2020 02:06:22;U084.FC230_PV.F_CV;8.653566360;100.0 +25/10/2020 02:06:25;U084.FC230_PV.F_CV;8.735562325;100.0 +25/10/2020 02:06:28;U084.FC230_PV.F_CV;8.694701195;100.0 +25/10/2020 02:06:31;U084.FC230_PV.F_CV;8.739151001;100.0 +25/10/2020 02:06:34;U084.FC230_PV.F_CV;8.668624878;100.0 +25/10/2020 02:06:39;U084.FC230_PV.F_CV;8.732925415;100.0 +25/10/2020 02:06:58;U084.FC230_PV.F_CV;8.664717674;100.0 +25/10/2020 02:06:07;U084.FC230_SP.F_CV;8.699999809;100.0 +25/10/2020 02:06:00;U084.FC311_OP.F_CV;29.529626846;100.0 +25/10/2020 02:06:58;U084.FC311_PV.F_CV;1.999690533;100.0 +25/10/2020 02:06:15;U084.FC311_SP.F_CV;2.000000000;100.0 +25/10/2020 02:06:44;U084.FC321_OP.F_CV;33.958766937;100.0 +25/10/2020 02:06:34;U084.FC321_PV.F_CV;6.698445320;100.0 +25/10/2020 02:06:13;U084.FC321_SP.F_CV;6.699999809;100.0 +25/10/2020 02:06:11;U084.FC330_OP.F_CV;2.897510290;100.0 +25/10/2020 02:06:05;U084.FC330_PV.F_CV;17.054191589;100.0 +25/10/2020 02:06:16;U084.FC330_PV.F_CV;16.920448303;100.0 +25/10/2020 02:06:18;U084.FC330_PV.F_CV;16.985149384;100.0 +25/10/2020 02:06:27;U084.FC330_PV.F_CV;16.916704178;100.0 +25/10/2020 02:06:35;U084.FC330_PV.F_CV;17.068685532;100.0 +25/10/2020 02:06:40;U084.FC330_PV.F_CV;16.996530533;100.0 +25/10/2020 02:06:42;U084.FC330_PV.F_CV;16.864793777;100.0 +25/10/2020 02:06:44;U084.FC330_PV.F_CV;16.823843002;100.0 +25/10/2020 02:06:50;U084.FC330_PV.F_CV;16.889038086;100.0 +25/10/2020 02:06:56;U084.FC330_PV.F_CV;16.853635788;100.0 +25/10/2020 02:06:39;U084.FC330_SP.F_CV;17.000000000;100.0 +25/10/2020 02:06:39;U084.FC411_OP.F_CV;35.962169647;100.0 +25/10/2020 02:06:01;U084.FC411_PV.F_CV;1.998119473;100.0 +25/10/2020 02:06:07;U084.FC411_SP.F_CV;2.000000000;100.0 +25/10/2020 02:06:03;U084.FC421_OP.F_CV;32.230525970;100.0 +25/10/2020 02:06:41;U084.FC421_PV.F_CV;6.699487209;100.0 +25/10/2020 02:06:07;U084.FC421_SP.F_CV;6.699999809;100.0 +25/10/2020 02:06:56;U084.FC430_OP.F_CV;2.880072594;100.0 +25/10/2020 02:06:13;U084.FC430_PV.F_CV;17.054485321;100.0 +25/10/2020 02:06:16;U084.FC430_PV.F_CV;17.130264282;100.0 +25/10/2020 02:06:24;U084.FC430_PV.F_CV;17.071521759;100.0 +25/10/2020 02:06:33;U084.FC430_PV.F_CV;16.928649902;100.0 +25/10/2020 02:06:07;U084.FC430_SP.F_CV;17.000000000;100.0 +25/10/2020 02:06:09;U084.FI100_PV.F_CV;9.525007248;100.0 +25/10/2020 02:06:49;U084.FI100_PV.F_CV;9.664773941;100.0 +25/10/2020 02:06:52;U084.FI100_PV.F_CV;9.980927467;100.0 +25/10/2020 02:06:57;U084.FI100_PV.F_CV;10.221091270;100.0 +25/10/2020 02:06:38;U084.FI200_PV.F_CV;5.835558891;100.0 +25/10/2020 02:06:42;U084.FI200_PV.F_CV;5.511959076;100.0 +25/10/2020 02:06:48;U084.FI200_PV.F_CV;5.325995922;100.0 +25/10/2020 02:06:54;U084.FI200_PV.F_CV;5.272047043;100.0 +25/10/2020 02:06:15;U084.FI300_PV.F_CV;7.874995708;100.0 +25/10/2020 02:06:56;U084.FI300_PV.F_CV;8.063996315;100.0 +25/10/2020 02:06:57;U084.FI300_PV.F_CV;8.713199615;100.0 +25/10/2020 02:06:07;U084.FI400_PV.F_CV;7.800003529;100.0 +25/10/2020 02:06:43;U084.FI400_PV.F_CV;7.706963539;100.0 +25/10/2020 02:06:51;U084.FI400_PV.F_CV;7.541420460;100.0 +25/10/2020 02:06:07;U084.FQ100_PV.F_CV;5490.357421875;100.0 +25/10/2020 02:06:07;U084.FQ200_PV.F_CV;6701.245605469;100.0 +25/10/2020 02:06:07;U084.FQ300_PV.F_CV;5893.388671875;100.0 +25/10/2020 02:06:07;U084.FQ400_PV.F_CV;6594.219238281;100.0 +25/10/2020 02:06:07;U084.HV171_CONSIGNE_POSITIONS.F_CV;9.000000000;100.0 +25/10/2020 02:06:54;U084.HV171_RETOUR_POSITIONS.F_CV;9.000000000;100.0 +25/10/2020 02:06:07;U084.HV271_CONSIGNE_POSITIONS.F_CV;9.000000000;100.0 +25/10/2020 02:06:15;U084.HV271_RETOUR_POSITIONS.F_CV;9.000000000;100.0 +25/10/2020 02:06:20;U084.HV371_CONSIGNE_POSITIONS.F_CV;9.000000000;100.0 +25/10/2020 02:06:35;U084.HV371_RETOUR_POSITIONS.F_CV;9.000000000;100.0 +25/10/2020 02:06:07;U084.HV471_CONSIGNE_POSITIONS.F_CV;9.000000000;100.0 +25/10/2020 02:06:51;U084.HV471_RETOUR_POSITIONS.F_CV;9.000000000;100.0 +25/10/2020 02:06:20;U084.LI171_PV.F_CV;69.763763428;100.0 +25/10/2020 02:06:32;U084.LI171_PV.F_CV;69.983360291;100.0 +25/10/2020 02:06:39;U084.LI171_PV.F_CV;69.824096680;100.0 +25/10/2020 02:06:46;U084.LI171_PV.F_CV;69.089485168;100.0 +25/10/2020 02:06:51;U084.LI171_PV.F_CV;68.880096436;100.0 +25/10/2020 02:06:55;U084.LI171_PV.F_CV;68.828269958;100.0 +25/10/2020 02:06:31;U084.LI271_PV.F_CV;69.168159485;100.0 +25/10/2020 02:06:52;U084.LI271_PV.F_CV;69.329063416;100.0 +25/10/2020 02:06:29;U084.LI371_PV.F_CV;69.586860657;100.0 +25/10/2020 02:06:01;U084.LI41_PV.F_CV;47.838871002;100.0 +25/10/2020 02:06:09;U084.LI41_PV.F_CV;47.783973694;100.0 +25/10/2020 02:06:08;U084.LI42_PV.F_CV;74.508529663;100.0 +25/10/2020 02:06:45;U084.LI42_PV.F_CV;74.622520447;100.0 +25/10/2020 02:06:48;U084.LI42_PV.F_CV;74.554443359;100.0 +25/10/2020 02:06:53;U084.LI42_PV.F_CV;74.611915588;100.0 +25/10/2020 02:06:50;U084.LI43_PV.F_CV;66.685768127;100.0 +25/10/2020 02:06:01;U084.LI44_PV.F_CV;62.635375977;100.0 +25/10/2020 02:06:24;U084.LI471_PV.F_CV;69.914962769;100.0 +25/10/2020 02:06:30;U084.LI471_PV.F_CV;70.027122498;100.0 +25/10/2020 02:06:40;U084.LI471_PV.F_CV;69.795028687;100.0 +25/10/2020 02:06:49;U084.LI471_PV.F_CV;69.436485291;100.0 +25/10/2020 02:06:07;U084.PC161_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U084.PC161_PV.F_CV;39.352050781;100.0 +25/10/2020 02:06:54;U084.PC161_PV.F_CV;39.483570099;100.0 +25/10/2020 02:06:07;U084.PC161_SP.F_CV;40.000000000;100.0 +25/10/2020 02:06:07;U084.PC261_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U084.PC261_PV.F_CV;39.774345398;100.0 +25/10/2020 02:06:42;U084.PC261_PV.F_CV;39.647888184;100.0 +25/10/2020 02:06:07;U084.PC261_SP.F_CV;40.000000000;100.0 +25/10/2020 02:06:07;U084.PC361_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U084.PC361_PV.F_CV;39.482856750;100.0 +25/10/2020 02:06:46;U084.PC361_PV.F_CV;39.895751953;100.0 +25/10/2020 02:06:44;U084.PC361_SP.F_CV;40.000000000;100.0 +25/10/2020 02:06:07;U084.PC461_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U084.PC461_PV.F_CV;39.480319977;100.0 +25/10/2020 02:06:08;U084.PC461_PV.F_CV;39.341552734;100.0 +25/10/2020 02:06:12;U084.PC461_PV.F_CV;39.539787292;100.0 +25/10/2020 02:06:15;U084.PC461_PV.F_CV;39.404090881;100.0 +25/10/2020 02:06:24;U084.PC461_PV.F_CV;39.726974487;100.0 +25/10/2020 02:06:40;U084.PC461_PV.F_CV;39.438045502;100.0 +25/10/2020 02:06:07;U084.PC461_SP.F_CV;40.000000000;100.0 +25/10/2020 02:06:54;U084.PI100_PV.F_CV;0.996013224;100.0 +25/10/2020 02:06:03;U084.PI180_PV.F_CV;0.249208540;100.0 +25/10/2020 02:06:05;U084.PI180_PV.F_CV;0.250299841;100.0 +25/10/2020 02:06:09;U084.PI180_PV.F_CV;0.249740586;100.0 +25/10/2020 02:06:16;U084.PI180_PV.F_CV;0.252623677;100.0 +25/10/2020 02:06:25;U084.PI180_PV.F_CV;0.253421307;100.0 +25/10/2020 02:06:27;U084.PI180_PV.F_CV;0.255033344;100.0 +25/10/2020 02:06:34;U084.PI180_PV.F_CV;0.253929168;100.0 +25/10/2020 02:06:38;U084.PI180_PV.F_CV;0.250600606;100.0 +25/10/2020 02:06:41;U084.PI180_PV.F_CV;0.249423563;100.0 +25/10/2020 02:06:47;U084.PI180_PV.F_CV;0.248841405;100.0 +25/10/2020 02:06:55;U084.PI200_PV.F_CV;0.994593203;100.0 +25/10/2020 02:06:01;U084.PI280_PV.F_CV;0.267190009;100.0 +25/10/2020 02:06:07;U084.PI280_PV.F_CV;0.264546633;100.0 +25/10/2020 02:06:09;U084.PI280_PV.F_CV;0.264024943;100.0 +25/10/2020 02:06:14;U084.PI280_PV.F_CV;0.267248899;100.0 +25/10/2020 02:06:19;U084.PI280_PV.F_CV;0.267753929;100.0 +25/10/2020 02:06:21;U084.PI280_PV.F_CV;0.268894166;100.0 +25/10/2020 02:06:28;U084.PI280_PV.F_CV;0.268170059;100.0 +25/10/2020 02:06:34;U084.PI280_PV.F_CV;0.265396833;100.0 +25/10/2020 02:06:38;U084.PI280_PV.F_CV;0.266596794;100.0 +25/10/2020 02:06:44;U084.PI280_PV.F_CV;0.272156924;100.0 +25/10/2020 02:06:49;U084.PI280_PV.F_CV;0.271456391;100.0 +25/10/2020 02:06:55;U084.PI280_PV.F_CV;0.273018360;100.0 +25/10/2020 02:06:57;U084.PI280_PV.F_CV;0.274037808;100.0 +25/10/2020 02:06:15;U084.PI300_PV.F_CV;0.997214794;100.0 +25/10/2020 02:06:06;U084.PI380_PV.F_CV;0.054209664;100.0 +25/10/2020 02:06:07;U084.PI380_PV.F_CV;0.054998264;100.0 +25/10/2020 02:06:10;U084.PI380_PV.F_CV;0.054205727;100.0 +25/10/2020 02:06:18;U084.PI380_PV.F_CV;0.046349004;100.0 +25/10/2020 02:06:23;U084.PI380_PV.F_CV;0.047720369;100.0 +25/10/2020 02:06:29;U084.PI380_PV.F_CV;0.045716859;100.0 +25/10/2020 02:06:40;U084.PI380_PV.F_CV;0.048782729;100.0 +25/10/2020 02:06:42;U084.PI380_PV.F_CV;0.049648490;100.0 +25/10/2020 02:06:48;U084.PI380_PV.F_CV;0.047929905;100.0 +25/10/2020 02:06:55;U084.PI380_PV.F_CV;0.042048339;100.0 +25/10/2020 02:06:59;U084.PI380_PV.F_CV;0.043999940;100.0 +25/10/2020 02:06:10;U084.PI400_PV.F_CV;0.996527553;100.0 +25/10/2020 02:06:01;U084.PI480_PV.F_CV;0.012653646;100.0 +25/10/2020 02:06:03;U084.PI480_PV.F_CV;0.013408171;100.0 +25/10/2020 02:06:06;U084.PI480_PV.F_CV;0.016375288;100.0 +25/10/2020 02:06:10;U084.PI480_PV.F_CV;0.015796952;100.0 +25/10/2020 02:06:12;U084.PI480_PV.F_CV;0.021147391;100.0 +25/10/2020 02:06:13;U084.PI480_PV.F_CV;0.025668606;100.0 +25/10/2020 02:06:14;U084.PI480_PV.F_CV;0.027517566;100.0 +25/10/2020 02:06:17;U084.PI480_PV.F_CV;0.026063399;100.0 +25/10/2020 02:06:20;U084.PI480_PV.F_CV;0.020171456;100.0 +25/10/2020 02:06:25;U084.PI480_PV.F_CV;0.014965728;100.0 +25/10/2020 02:06:27;U084.PI480_PV.F_CV;0.013439308;100.0 +25/10/2020 02:06:40;U084.PI480_PV.F_CV;0.014757673;100.0 +25/10/2020 02:06:00;U084.PIIP100_PV.F_CV;101.534683228;100.0 +25/10/2020 02:06:02;U084.PIIP100_PV.F_CV;101.399383545;100.0 +25/10/2020 02:06:04;U084.PIIP100_PV.F_CV;101.533340454;100.0 +25/10/2020 02:06:09;U084.PIIP100_PV.F_CV;101.370651245;100.0 +25/10/2020 02:06:15;U084.PIIP100_PV.F_CV;101.572654724;100.0 +25/10/2020 02:06:21;U084.PIIP100_PV.F_CV;101.310478210;100.0 +25/10/2020 02:06:22;U084.PIIP100_PV.F_CV;101.430290222;100.0 +25/10/2020 02:06:24;U084.PIIP100_PV.F_CV;101.239921570;100.0 +25/10/2020 02:06:33;U084.PIIP100_PV.F_CV;101.767745972;100.0 +25/10/2020 02:06:38;U084.PIIP100_PV.F_CV;101.404029846;100.0 +25/10/2020 02:06:44;U084.PIIP100_PV.F_CV;101.666465759;100.0 +25/10/2020 02:06:46;U084.PIIP100_PV.F_CV;101.464302063;100.0 +25/10/2020 02:06:47;U084.PIIP100_PV.F_CV;101.606575012;100.0 +25/10/2020 02:06:53;U084.PIIP100_PV.F_CV;101.370521545;100.0 +25/10/2020 02:06:55;U084.PIIP100_PV.F_CV;101.568260193;100.0 +25/10/2020 02:06:23;U084.PIIP200_PV.F_CV;132.676071167;100.0 +25/10/2020 02:06:24;U084.PIIP200_PV.F_CV;132.805755615;100.0 +25/10/2020 02:06:44;U084.PIIP200_PV.F_CV;132.971771240;100.0 +25/10/2020 02:06:49;U084.PIIP200_PV.F_CV;132.703826904;100.0 +25/10/2020 02:06:53;U084.PIIP200_PV.F_CV;132.838882446;100.0 +25/10/2020 02:06:58;U084.PIIP200_PV.F_CV;132.458038330;100.0 +25/10/2020 02:06:20;U084.PIIP300_PV.F_CV;112.772186279;100.0 +25/10/2020 02:06:51;U084.PIIP300_PV.F_CV;112.661727905;100.0 +25/10/2020 02:06:53;U084.PIIP300_PV.F_CV;112.910514832;100.0 +25/10/2020 02:06:19;U084.PIIP400_PV.F_CV;65.468009949;100.0 +25/10/2020 02:06:35;U084.PIIP400_PV.F_CV;65.586853027;100.0 +25/10/2020 02:06:41;U084.PIIP400_PV.F_CV;65.486320496;100.0 +25/10/2020 02:06:58;U084.PIIP400_PV.F_CV;65.592689514;100.0 +25/10/2020 02:06:45;U084.TC101_OP.F_CV;31.028367996;100.0 +25/10/2020 02:06:53;U084.TC101_OP.F_CV;30.974657059;100.0 +25/10/2020 02:06:07;U084.TC101_PV.F_CV;332.019348145;100.0 +25/10/2020 02:06:07;U084.TC101_SP.F_CV;332.000000000;100.0 +25/10/2020 02:06:15;U084.TC102_OP.F_CV;31.003448486;100.0 +25/10/2020 02:06:21;U084.TC102_OP.F_CV;30.945785522;100.0 +25/10/2020 02:06:45;U084.TC102_OP.F_CV;30.995826721;100.0 +25/10/2020 02:06:07;U084.TC102_PV.F_CV;331.984008789;100.0 +25/10/2020 02:06:07;U084.TC102_SP.F_CV;332.000000000;100.0 +25/10/2020 02:06:16;U084.TC103_OP.F_CV;33.030216217;100.0 +25/10/2020 02:06:22;U084.TC103_OP.F_CV;32.978000641;100.0 +25/10/2020 02:06:30;U084.TC103_OP.F_CV;33.032573700;100.0 +25/10/2020 02:06:53;U084.TC103_OP.F_CV;32.981166840;100.0 +25/10/2020 02:06:07;U084.TC103_PV.F_CV;332.036132813;100.0 +25/10/2020 02:06:07;U084.TC103_SP.F_CV;332.000000000;100.0 +25/10/2020 02:06:05;U084.TC104_OP.F_CV;33.669445038;100.0 +25/10/2020 02:06:07;U084.TC104_PV.F_CV;332.059204102;100.0 +25/10/2020 02:06:07;U084.TC104_SP.F_CV;332.000000000;100.0 +25/10/2020 02:06:09;U084.TC106_PV.F_CV;80.036231995;100.0 +25/10/2020 02:06:14;U084.TC107_PV.F_CV;59.718948364;100.0 +25/10/2020 02:06:37;U084.TC107_PV.F_CV;60.046703339;100.0 +25/10/2020 02:06:56;U084.TC107_PV.F_CV;60.373756409;100.0 +25/10/2020 02:06:33;U084.TC108_PV.F_CV;59.769012451;100.0 +25/10/2020 02:06:50;U084.TC108_PV.F_CV;60.048892975;100.0 +25/10/2020 02:06:56;U084.TC108_PV.F_CV;60.282424927;100.0 +25/10/2020 02:06:02;U084.TC109_PV.F_CV;79.999938965;100.0 +25/10/2020 02:06:06;U084.TC201_OP.F_CV;33.032836914;100.0 +25/10/2020 02:06:07;U084.TC201_PV.F_CV;346.988952637;100.0 +25/10/2020 02:06:07;U084.TC201_SP.F_CV;347.000000000;100.0 +25/10/2020 02:06:02;U084.TC202_OP.F_CV;34.961891174;100.0 +25/10/2020 02:06:08;U084.TC202_OP.F_CV;35.013999939;100.0 +25/10/2020 02:06:07;U084.TC202_PV.F_CV;346.982879639;100.0 +25/10/2020 02:06:07;U084.TC202_SP.F_CV;347.000000000;100.0 +25/10/2020 02:06:20;U084.TC203_OP.F_CV;33.027408600;100.0 +25/10/2020 02:06:28;U084.TC203_OP.F_CV;32.975101471;100.0 +25/10/2020 02:06:07;U084.TC203_PV.F_CV;346.993988037;100.0 +25/10/2020 02:06:07;U084.TC203_SP.F_CV;347.000000000;100.0 +25/10/2020 02:06:32;U084.TC204_OP.F_CV;33.055698395;100.0 +25/10/2020 02:06:41;U084.TC204_OP.F_CV;33.005275726;100.0 +25/10/2020 02:06:49;U084.TC204_OP.F_CV;33.056636810;100.0 +25/10/2020 02:06:56;U084.TC204_OP.F_CV;33.003887177;100.0 +25/10/2020 02:06:07;U084.TC204_PV.F_CV;347.017852783;100.0 +25/10/2020 02:06:07;U084.TC204_SP.F_CV;347.000000000;100.0 +25/10/2020 02:06:40;U084.TC206_PV.F_CV;80.014610291;100.0 +25/10/2020 02:06:41;U084.TC207_PV.F_CV;60.071510315;100.0 +25/10/2020 02:06:30;U084.TC208_PV.F_CV;60.049865723;100.0 +25/10/2020 02:06:13;U084.TC209_PV.F_CV;80.121765137;100.0 +25/10/2020 02:06:04;U084.TC301_OP.F_CV;31.041923523;100.0 +25/10/2020 02:06:10;U084.TC301_OP.F_CV;30.991483688;100.0 +25/10/2020 02:06:34;U084.TC301_OP.F_CV;31.043281555;100.0 +25/10/2020 02:06:42;U084.TC301_OP.F_CV;30.986740112;100.0 +25/10/2020 02:06:58;U084.TC301_PV.F_CV;345.020629883;100.0 +25/10/2020 02:06:10;U084.TC301_SP.F_CV;345.000000000;100.0 +25/10/2020 02:06:33;U084.TC302_OP.F_CV;34.986732483;100.0 +25/10/2020 02:06:01;U084.TC302_PV.F_CV;344.995422363;100.0 +25/10/2020 02:06:28;U084.TC302_SP.F_CV;345.000000000;100.0 +25/10/2020 02:06:15;U084.TC303_OP.F_CV;35.043682098;100.0 +25/10/2020 02:06:24;U084.TC303_OP.F_CV;34.987857819;100.0 +25/10/2020 02:06:30;U084.TC303_OP.F_CV;35.039398193;100.0 +25/10/2020 02:06:37;U084.TC303_OP.F_CV;34.987083435;100.0 +25/10/2020 02:06:15;U084.TC303_PV.F_CV;344.951385498;100.0 +25/10/2020 02:06:10;U084.TC303_SP.F_CV;345.000000000;100.0 +25/10/2020 02:06:07;U084.TC304_OP.F_CV;31.006652832;100.0 +25/10/2020 02:06:05;U084.TC304_PV.F_CV;345.006469727;100.0 +25/10/2020 02:06:09;U084.TC304_SP.F_CV;345.000000000;100.0 +25/10/2020 02:06:13;U084.TC306_PV.F_CV;79.889785767;100.0 +25/10/2020 02:06:32;U084.TC306_PV.F_CV;80.103996277;100.0 +25/10/2020 02:06:42;U084.TC306_PV.F_CV;79.963890076;100.0 +25/10/2020 02:06:09;U084.TC307_PV.F_CV;60.074165344;100.0 +25/10/2020 02:06:26;U084.TC307_PV.F_CV;59.859310150;100.0 +25/10/2020 02:06:06;U084.TC308_PV.F_CV;60.960811615;100.0 +25/10/2020 02:06:13;U084.TC308_PV.F_CV;60.434242249;100.0 +25/10/2020 02:06:34;U084.TC308_PV.F_CV;60.077144623;100.0 +25/10/2020 02:06:37;U084.TC308_PV.F_CV;59.949272156;100.0 +25/10/2020 02:06:59;U084.TC308_PV.F_CV;60.156349182;100.0 +25/10/2020 02:06:20;U084.TC309_PV.F_CV;79.960685730;100.0 +25/10/2020 02:06:46;U084.TC401_OP.F_CV;31.268091202;100.0 +25/10/2020 02:06:07;U084.TC401_PV.F_CV;331.830291748;100.0 +25/10/2020 02:06:07;U084.TC401_SP.F_CV;332.000000000;100.0 +25/10/2020 02:06:31;U084.TC402_OP.F_CV;30.975175858;100.0 +25/10/2020 02:06:43;U084.TC402_OP.F_CV;30.923656464;100.0 +25/10/2020 02:06:48;U084.TC402_OP.F_CV;30.977863312;100.0 +25/10/2020 02:06:57;U084.TC402_OP.F_CV;30.926984787;100.0 +25/10/2020 02:06:07;U084.TC402_PV.F_CV;331.979309082;100.0 +25/10/2020 02:06:07;U084.TC402_SP.F_CV;332.000000000;100.0 +25/10/2020 02:06:05;U084.TC403_OP.F_CV;33.010261536;100.0 +25/10/2020 02:06:43;U084.TC403_OP.F_CV;32.958667755;100.0 +25/10/2020 02:06:51;U084.TC403_OP.F_CV;33.009223938;100.0 +25/10/2020 02:06:57;U084.TC403_OP.F_CV;32.952453613;100.0 +25/10/2020 02:06:07;U084.TC403_PV.F_CV;331.979644775;100.0 +25/10/2020 02:06:07;U084.TC403_SP.F_CV;332.000000000;100.0 +25/10/2020 02:06:23;U084.TC404_OP.F_CV;37.002853394;100.0 +25/10/2020 02:06:07;U084.TC404_PV.F_CV;332.010009766;100.0 +25/10/2020 02:06:07;U084.TC404_SP.F_CV;332.000000000;100.0 +25/10/2020 02:06:19;U084.TC406_PV.F_CV;79.892288208;100.0 +25/10/2020 02:06:59;U084.TC406_PV.F_CV;80.242568970;100.0 +25/10/2020 02:06:02;U084.TC407_PV.F_CV;59.329589844;100.0 +25/10/2020 02:06:10;U084.TC407_PV.F_CV;58.991016388;100.0 +25/10/2020 02:06:18;U084.TC407_PV.F_CV;58.871509552;100.0 +25/10/2020 02:06:30;U084.TC407_PV.F_CV;59.090148926;100.0 +25/10/2020 02:06:51;U084.TC407_PV.F_CV;58.282417297;100.0 +25/10/2020 02:06:10;U084.TC408_PV.F_CV;59.750930786;100.0 +25/10/2020 02:06:18;U084.TC408_PV.F_CV;59.520984650;100.0 +25/10/2020 02:06:24;U084.TC408_PV.F_CV;59.771202087;100.0 +25/10/2020 02:06:37;U084.TC408_PV.F_CV;59.660259247;100.0 +25/10/2020 02:06:55;U084.TC409_PV.F_CV;79.992500305;100.0 +25/10/2020 02:06:01;U084.TI1000_PV.F_CV;174.209228516;100.0 +25/10/2020 02:06:04;U084.TI1000_PV.F_CV;174.331878662;100.0 +25/10/2020 02:06:07;U084.TI1000_PV.F_CV;175.165100098;100.0 +25/10/2020 02:06:12;U084.TI1000_PV.F_CV;176.878677368;100.0 +25/10/2020 02:06:14;U084.TI1000_PV.F_CV;177.285034180;100.0 +25/10/2020 02:06:16;U084.TI1000_PV.F_CV;177.425338745;100.0 +25/10/2020 02:06:20;U084.TI1000_PV.F_CV;177.059036255;100.0 +25/10/2020 02:06:32;U084.TI1000_PV.F_CV;175.061965942;100.0 +25/10/2020 02:06:34;U084.TI1000_PV.F_CV;174.942855835;100.0 +25/10/2020 02:06:42;U084.TI1000_PV.F_CV;175.200683594;100.0 +25/10/2020 02:06:49;U084.TI1000_PV.F_CV;175.908645630;100.0 +25/10/2020 02:06:54;U084.TI1000_PV.F_CV;175.443695068;100.0 +25/10/2020 02:06:22;U084.TI100_PV.F_CV;24.200016022;100.0 +25/10/2020 02:06:32;U084.TI1101_PV.F_CV;331.799987793;100.0 +25/10/2020 02:06:07;U084.TI1102_PV.F_CV;254.800003052;100.0 +25/10/2020 02:06:07;U084.TI1103_PV.F_CV;334.899993896;100.0 +25/10/2020 02:06:07;U084.TI1104_PV.F_CV;328.600006104;100.0 +25/10/2020 02:06:03;U084.TI1108_PV.F_CV;67.699996948;100.0 +25/10/2020 02:06:04;U084.TI1108_PV.F_CV;67.800003052;100.0 +25/10/2020 02:06:05;U084.TI1108_PV.F_CV;67.699996948;100.0 +25/10/2020 02:06:15;U084.TI1201_PV.F_CV;344.899993896;100.0 +25/10/2020 02:06:07;U084.TI1202_PV.F_CV;345.700012207;100.0 +25/10/2020 02:06:07;U084.TI1203_PV.F_CV;343.700012207;100.0 +25/10/2020 02:06:07;U084.TI1204_PV.F_CV;343.299987793;100.0 +25/10/2020 02:06:59;U084.TI1208_PV.F_CV;69.300003052;100.0 +25/10/2020 02:06:28;U084.TI1301_PV.F_CV;345.399993896;100.0 +25/10/2020 02:06:24;U084.TI1302_PV.F_CV;343.200012207;100.0 +25/10/2020 02:06:58;U084.TI1303_PV.F_CV;343.399993896;100.0 +25/10/2020 02:06:31;U084.TI1304_PV.F_CV;343.899993896;100.0 +25/10/2020 02:06:02;U084.TI1308_PV.F_CV;68.599998474;100.0 +25/10/2020 02:06:07;U084.TI1401_PV.F_CV;327.899993896;100.0 +25/10/2020 02:06:07;U084.TI1402_PV.F_CV;330.299987793;100.0 +25/10/2020 02:06:07;U084.TI1403_PV.F_CV;297.100006104;100.0 +25/10/2020 02:06:07;U084.TI1404_PV.F_CV;329.899993896;100.0 +25/10/2020 02:06:48;U084.TI1408_PV.F_CV;70.800003052;100.0 +25/10/2020 02:06:00;U084.TI200_PV.F_CV;23.700016022;100.0 +25/10/2020 02:06:29;U084.TI300_PV.F_CV;22.800014496;100.0 +25/10/2020 02:06:26;U084.TI400_PV.F_CV;22.777965546;100.0 +25/10/2020 02:06:43;U084.TI41_PV.F_CV;21.800014496;100.0 +25/10/2020 02:06:21;U084.TI42_PV.F_CV;22.085102081;100.0 +25/10/2020 02:06:06;U084.TI43_PV.F_CV;21.900014877;100.0 +25/10/2020 02:06:57;U084.TI44_PV.F_CV;22.200016022;100.0 +25/10/2020 02:06:00;U084.WI100_PV.F_CV;91.425132751;100.0 +25/10/2020 02:06:01;U084.WI100_PV.F_CV;91.427650452;100.0 +25/10/2020 02:06:02;U084.WI100_PV.F_CV;91.429740906;100.0 +25/10/2020 02:06:03;U084.WI100_PV.F_CV;91.431991577;100.0 +25/10/2020 02:06:04;U084.WI100_PV.F_CV;91.433349609;100.0 +25/10/2020 02:06:05;U084.WI100_PV.F_CV;91.434471130;100.0 +25/10/2020 02:06:06;U084.WI100_PV.F_CV;91.434516907;100.0 +25/10/2020 02:06:07;U084.WI100_PV.F_CV;91.433753967;100.0 +25/10/2020 02:06:08;U084.WI100_PV.F_CV;91.433113098;100.0 +25/10/2020 02:06:09;U084.WI100_PV.F_CV;91.430236816;100.0 +25/10/2020 02:06:10;U084.WI100_PV.F_CV;91.429664612;100.0 +25/10/2020 02:06:11;U084.WI100_PV.F_CV;91.429718018;100.0 +25/10/2020 02:06:12;U084.WI100_PV.F_CV;91.427589417;100.0 +25/10/2020 02:06:13;U084.WI100_PV.F_CV;91.428596497;100.0 +25/10/2020 02:06:14;U084.WI100_PV.F_CV;91.432220459;100.0 +25/10/2020 02:06:15;U084.WI100_PV.F_CV;91.434951782;100.0 +25/10/2020 02:06:16;U084.WI100_PV.F_CV;91.434112549;100.0 +25/10/2020 02:06:17;U084.WI100_PV.F_CV;91.434577942;100.0 +25/10/2020 02:06:18;U084.WI100_PV.F_CV;91.435768127;100.0 +25/10/2020 02:06:19;U084.WI100_PV.F_CV;91.435317993;100.0 +25/10/2020 02:06:20;U084.WI100_PV.F_CV;91.434417725;100.0 +25/10/2020 02:06:21;U084.WI100_PV.F_CV;91.435142517;100.0 +25/10/2020 02:06:22;U084.WI100_PV.F_CV;91.438819885;100.0 +25/10/2020 02:06:23;U084.WI100_PV.F_CV;91.434265137;100.0 +25/10/2020 02:06:24;U084.WI100_PV.F_CV;91.431304932;100.0 +25/10/2020 02:06:25;U084.WI100_PV.F_CV;91.429924011;100.0 +25/10/2020 02:06:26;U084.WI100_PV.F_CV;91.428848267;100.0 +25/10/2020 02:06:27;U084.WI100_PV.F_CV;91.429260254;100.0 +25/10/2020 02:06:28;U084.WI100_PV.F_CV;91.428222656;100.0 +25/10/2020 02:06:29;U084.WI100_PV.F_CV;91.426414490;100.0 +25/10/2020 02:06:30;U084.WI100_PV.F_CV;91.427093506;100.0 +25/10/2020 02:06:31;U084.WI100_PV.F_CV;91.429283142;100.0 +25/10/2020 02:06:32;U084.WI100_PV.F_CV;91.428276062;100.0 +25/10/2020 02:06:33;U084.WI100_PV.F_CV;91.426872253;100.0 +25/10/2020 02:06:34;U084.WI100_PV.F_CV;91.425704956;100.0 +25/10/2020 02:06:35;U084.WI100_PV.F_CV;91.422264099;100.0 +25/10/2020 02:06:36;U084.WI100_PV.F_CV;91.419090271;100.0 +25/10/2020 02:06:37;U084.WI100_PV.F_CV;91.417556763;100.0 +25/10/2020 02:06:38;U084.WI100_PV.F_CV;91.415901184;100.0 +25/10/2020 02:06:39;U084.WI100_PV.F_CV;91.414901733;100.0 +25/10/2020 02:06:40;U084.WI100_PV.F_CV;91.414070129;100.0 +25/10/2020 02:06:41;U084.WI100_PV.F_CV;91.417663574;100.0 +25/10/2020 02:06:42;U084.WI100_PV.F_CV;91.421447754;100.0 +25/10/2020 02:06:43;U084.WI100_PV.F_CV;91.423423767;100.0 +25/10/2020 02:06:44;U084.WI100_PV.F_CV;91.424873352;100.0 +25/10/2020 02:06:45;U084.WI100_PV.F_CV;91.426910400;100.0 +25/10/2020 02:06:46;U084.WI100_PV.F_CV;91.429130554;100.0 +25/10/2020 02:06:47;U084.WI100_PV.F_CV;91.430343628;100.0 +25/10/2020 02:06:48;U084.WI100_PV.F_CV;91.430282593;100.0 +25/10/2020 02:06:49;U084.WI100_PV.F_CV;91.427940369;100.0 +25/10/2020 02:06:50;U084.WI100_PV.F_CV;91.424003601;100.0 +25/10/2020 02:06:51;U084.WI100_PV.F_CV;91.421638489;100.0 +25/10/2020 02:06:52;U084.WI100_PV.F_CV;91.419670105;100.0 +25/10/2020 02:06:53;U084.WI100_PV.F_CV;91.419242859;100.0 +25/10/2020 02:06:54;U084.WI100_PV.F_CV;91.419372559;100.0 +25/10/2020 02:06:55;U084.WI100_PV.F_CV;91.421241760;100.0 +25/10/2020 02:06:56;U084.WI100_PV.F_CV;91.424758911;100.0 +25/10/2020 02:06:57;U084.WI100_PV.F_CV;91.423957825;100.0 +25/10/2020 02:06:58;U084.WI100_PV.F_CV;91.423286438;100.0 +25/10/2020 02:06:59;U084.WI100_PV.F_CV;91.418083191;100.0 +25/10/2020 02:06:26;U084.WI200_PV.F_CV;17.307626724;100.0 +25/10/2020 02:06:22;U084.WI300_PV.F_CV;-0.650286615;100.0 +25/10/2020 02:06:57;U084.WI400_PV.F_CV;39.931385040;100.0 +25/10/2020 02:06:06;U086.AI101.F_CV;0.883101881;100.0 +25/10/2020 02:06:07;U086.AI101.F_CV;0.882523119;100.0 +25/10/2020 02:06:08;U086.AI101.F_CV;0.883101881;100.0 +25/10/2020 02:06:20;U086.AI101.F_CV;0.883101881;100.0 +25/10/2020 02:06:21;U086.AI101.F_CV;0.882523119;100.0 +25/10/2020 02:06:23;U086.AI101.F_CV;0.883101881;100.0 +25/10/2020 02:06:25;U086.AI101.F_CV;0.882523119;100.0 +25/10/2020 02:06:26;U086.AI101.F_CV;0.883101881;100.0 +25/10/2020 02:06:28;U086.AI101.F_CV;0.882523119;100.0 +25/10/2020 02:06:29;U086.AI101.F_CV;0.883101881;100.0 +25/10/2020 02:06:01;U086.AI201.F_CV;0.847800910;100.0 +25/10/2020 02:06:02;U086.AI201.F_CV;0.847222209;100.0 +25/10/2020 02:06:03;U086.AI201.F_CV;0.847800910;100.0 +25/10/2020 02:06:09;U086.AI201.F_CV;0.847800910;100.0 +25/10/2020 02:06:10;U086.AI201.F_CV;0.847222209;100.0 +25/10/2020 02:06:12;U086.AI201.F_CV;0.847800910;100.0 +25/10/2020 02:06:34;U086.AI201.F_CV;0.847800910;100.0 +25/10/2020 02:06:35;U086.AI201.F_CV;0.847222209;100.0 +25/10/2020 02:06:36;U086.AI201.F_CV;0.847800910;100.0 +25/10/2020 02:06:39;U086.AI201.F_CV;0.847222209;100.0 +25/10/2020 02:06:40;U086.AI201.F_CV;0.847800910;100.0 +25/10/2020 02:06:41;U086.AI201.F_CV;0.847222209;100.0 +25/10/2020 02:06:42;U086.AI201.F_CV;0.847800910;100.0 +25/10/2020 02:06:52;U086.AI201.F_CV;0.847800910;100.0 +25/10/2020 02:06:53;U086.AI201.F_CV;0.847222209;100.0 +25/10/2020 02:06:55;U086.AI201.F_CV;0.847800910;100.0 +25/10/2020 02:06:56;U086.AI201.F_CV;0.847222209;100.0 +25/10/2020 02:06:57;U086.AI201.F_CV;0.847800910;100.0 +25/10/2020 02:06:59;U086.AI201.F_CV;0.847222209;100.0 +25/10/2020 02:06:50;U086.AI301.F_CV;0.895254612;100.0 +25/10/2020 02:06:00;U086.AI401.F_CV;0.828125000;100.0 +25/10/2020 02:06:03;U086.AI401.F_CV;0.829861104;100.0 +25/10/2020 02:06:05;U086.AI401.F_CV;0.830439806;100.0 +25/10/2020 02:06:11;U086.AI401.F_CV;0.830439806;100.0 +25/10/2020 02:06:12;U086.AI401.F_CV;0.829861104;100.0 +25/10/2020 02:06:17;U086.AI401.F_CV;0.829861104;100.0 +25/10/2020 02:06:18;U086.AI401.F_CV;0.828703701;100.0 +25/10/2020 02:06:20;U086.AI401.F_CV;0.828125000;100.0 +25/10/2020 02:06:23;U086.AI401.F_CV;0.828703701;100.0 +25/10/2020 02:06:24;U086.AI401.F_CV;0.829861104;100.0 +25/10/2020 02:06:25;U086.AI401.F_CV;0.830439806;100.0 +25/10/2020 02:06:28;U086.AI401.F_CV;0.829861104;100.0 +25/10/2020 02:06:29;U086.AI401.F_CV;0.828125000;100.0 +25/10/2020 02:06:33;U086.AI401.F_CV;0.829861104;100.0 +25/10/2020 02:06:35;U086.AI401.F_CV;0.830439806;100.0 +25/10/2020 02:06:37;U086.AI401.F_CV;0.828703701;100.0 +25/10/2020 02:06:38;U086.AI401.F_CV;0.828125000;100.0 +25/10/2020 02:06:41;U086.AI401.F_CV;0.828703701;100.0 +25/10/2020 02:06:42;U086.AI401.F_CV;0.829861104;100.0 +25/10/2020 02:06:45;U086.AI401.F_CV;0.828125000;100.0 +25/10/2020 02:06:49;U086.AI401.F_CV;0.829861104;100.0 +25/10/2020 02:06:50;U086.AI401.F_CV;0.830439806;100.0 +25/10/2020 02:06:52;U086.AI401.F_CV;0.828703701;100.0 +25/10/2020 02:06:54;U086.AI401.F_CV;0.829861104;100.0 +25/10/2020 02:06:56;U086.AI401.F_CV;0.828703701;100.0 +25/10/2020 02:06:58;U086.AI401.F_CV;0.828125000;100.0 +25/10/2020 02:06:00;U086.FC101_PV.F_CV;0.127314821;100.0 +25/10/2020 02:06:01;U086.FC101_PV.F_CV;0.138888896;100.0 +25/10/2020 02:06:03;U086.FC101_PV.F_CV;0.173611104;100.0 +25/10/2020 02:06:05;U086.FC101_PV.F_CV;0.219907403;100.0 +25/10/2020 02:06:06;U086.FC101_PV.F_CV;0.185185179;100.0 +25/10/2020 02:06:07;U086.FC101_PV.F_CV;0.173611104;100.0 +25/10/2020 02:06:08;U086.FC101_PV.F_CV;0.138888896;100.0 +25/10/2020 02:06:09;U086.FC101_PV.F_CV;0.127314821;100.0 +25/10/2020 02:06:11;U086.FC101_PV.F_CV;0.115740739;100.0 +25/10/2020 02:06:12;U086.FC101_PV.F_CV;0.023148147;100.0 +25/10/2020 02:06:15;U086.FC101_PV.F_CV;-0.011574074;100.0 +25/10/2020 02:06:17;U086.FC101_PV.F_CV;0.011574074;100.0 +25/10/2020 02:06:18;U086.FC101_PV.F_CV;0.104166664;100.0 +25/10/2020 02:06:19;U086.FC101_PV.F_CV;0.138888896;100.0 +25/10/2020 02:06:20;U086.FC101_PV.F_CV;0.127314821;100.0 +25/10/2020 02:06:22;U086.FC101_PV.F_CV;0.115740739;100.0 +25/10/2020 02:06:23;U086.FC101_PV.F_CV;0.162037030;100.0 +25/10/2020 02:06:24;U086.FC101_PV.F_CV;0.173611104;100.0 +25/10/2020 02:06:25;U086.FC101_PV.F_CV;0.115740739;100.0 +25/10/2020 02:06:27;U086.FC101_PV.F_CV;0.104166664;100.0 +25/10/2020 02:06:28;U086.FC101_PV.F_CV;0.138888896;100.0 +25/10/2020 02:06:30;U086.FC101_PV.F_CV;0.173611104;100.0 +25/10/2020 02:06:31;U086.FC101_PV.F_CV;0.162037030;100.0 +25/10/2020 02:06:33;U086.FC101_PV.F_CV;0.127314821;100.0 +25/10/2020 02:06:34;U086.FC101_PV.F_CV;0.138888896;100.0 +25/10/2020 02:06:35;U086.FC101_PV.F_CV;0.057870369;100.0 +25/10/2020 02:06:36;U086.FC101_PV.F_CV;0.023148147;100.0 +25/10/2020 02:06:37;U086.FC101_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U086.FC101_PV.F_CV;-0.011574074;100.0 +25/10/2020 02:06:39;U086.FC101_PV.F_CV;0.023148147;100.0 +25/10/2020 02:06:40;U086.FC101_PV.F_CV;0.081018515;100.0 +25/10/2020 02:06:41;U086.FC101_PV.F_CV;0.115740739;100.0 +25/10/2020 02:06:43;U086.FC101_PV.F_CV;0.127314821;100.0 +25/10/2020 02:06:44;U086.FC101_PV.F_CV;0.219907403;100.0 +25/10/2020 02:06:45;U086.FC101_PV.F_CV;0.127314821;100.0 +25/10/2020 02:06:46;U086.FC101_PV.F_CV;0.104166664;100.0 +25/10/2020 02:06:48;U086.FC101_PV.F_CV;0.115740739;100.0 +25/10/2020 02:06:49;U086.FC101_PV.F_CV;0.104166664;100.0 +25/10/2020 02:06:50;U086.FC101_PV.F_CV;0.069444448;100.0 +25/10/2020 02:06:51;U086.FC101_PV.F_CV;0.104166664;100.0 +25/10/2020 02:06:52;U086.FC101_PV.F_CV;0.081018515;100.0 +25/10/2020 02:06:53;U086.FC101_PV.F_CV;0.115740739;100.0 +25/10/2020 02:06:54;U086.FC101_PV.F_CV;0.081018515;100.0 +25/10/2020 02:06:55;U086.FC101_PV.F_CV;0.104166664;100.0 +25/10/2020 02:06:57;U086.FC101_PV.F_CV;0.081018515;100.0 +25/10/2020 02:06:58;U086.FC101_PV.F_CV;0.127314821;100.0 +25/10/2020 02:06:59;U086.FC101_PV.F_CV;0.185185179;100.0 +25/10/2020 02:06:13;U086.FC101_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U086.FC102_PV.F_CV;0.129999995;100.0 +25/10/2020 02:06:47;U086.FC102_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U086.FC103_PV.F_CV;0.047546506;100.0 +25/10/2020 02:06:13;U086.FC103_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U086.FC104_PV.F_CV;4.999965191;100.0 +25/10/2020 02:06:01;U086.FC104_PV.F_CV;5.000098228;100.0 +25/10/2020 02:06:02;U086.FC104_PV.F_CV;4.999398708;100.0 +25/10/2020 02:06:03;U086.FC104_PV.F_CV;5.001918793;100.0 +25/10/2020 02:06:04;U086.FC104_PV.F_CV;4.998660564;100.0 +25/10/2020 02:06:05;U086.FC104_PV.F_CV;5.001241207;100.0 +25/10/2020 02:06:06;U086.FC104_PV.F_CV;4.997000217;100.0 +25/10/2020 02:06:07;U086.FC104_PV.F_CV;4.998255253;100.0 +25/10/2020 02:06:08;U086.FC104_PV.F_CV;5.003576756;100.0 +25/10/2020 02:06:09;U086.FC104_PV.F_CV;5.000935078;100.0 +25/10/2020 02:06:10;U086.FC104_PV.F_CV;5.000013828;100.0 +25/10/2020 02:06:11;U086.FC104_PV.F_CV;4.999005795;100.0 +25/10/2020 02:06:12;U086.FC104_PV.F_CV;4.998288631;100.0 +25/10/2020 02:06:13;U086.FC104_PV.F_CV;4.998812199;100.0 +25/10/2020 02:06:14;U086.FC104_PV.F_CV;4.998151302;100.0 +25/10/2020 02:06:15;U086.FC104_PV.F_CV;4.996446609;100.0 +25/10/2020 02:06:16;U086.FC104_PV.F_CV;5.002336025;100.0 +25/10/2020 02:06:17;U086.FC104_PV.F_CV;4.998897552;100.0 +25/10/2020 02:06:18;U086.FC104_PV.F_CV;5.001795292;100.0 +25/10/2020 02:06:19;U086.FC104_PV.F_CV;4.994962692;100.0 +25/10/2020 02:06:20;U086.FC104_PV.F_CV;4.995357037;100.0 +25/10/2020 02:06:21;U086.FC104_PV.F_CV;4.990733147;100.0 +25/10/2020 02:06:22;U086.FC104_PV.F_CV;4.997309685;100.0 +25/10/2020 02:06:23;U086.FC104_PV.F_CV;4.998764038;100.0 +25/10/2020 02:06:24;U086.FC104_PV.F_CV;4.996930122;100.0 +25/10/2020 02:06:25;U086.FC104_PV.F_CV;5.001996040;100.0 +25/10/2020 02:06:26;U086.FC104_PV.F_CV;5.001835346;100.0 +25/10/2020 02:06:27;U086.FC104_PV.F_CV;4.997893333;100.0 +25/10/2020 02:06:28;U086.FC104_PV.F_CV;5.004877090;100.0 +25/10/2020 02:06:29;U086.FC104_PV.F_CV;5.000685692;100.0 +25/10/2020 02:06:30;U086.FC104_PV.F_CV;4.994743347;100.0 +25/10/2020 02:06:31;U086.FC104_PV.F_CV;4.994617462;100.0 +25/10/2020 02:06:32;U086.FC104_PV.F_CV;4.996249199;100.0 +25/10/2020 02:06:33;U086.FC104_PV.F_CV;4.999855995;100.0 +25/10/2020 02:06:34;U086.FC104_PV.F_CV;4.997947216;100.0 +25/10/2020 02:06:35;U086.FC104_PV.F_CV;5.001077175;100.0 +25/10/2020 02:06:36;U086.FC104_PV.F_CV;4.998522758;100.0 +25/10/2020 02:06:37;U086.FC104_PV.F_CV;5.002058506;100.0 +25/10/2020 02:06:38;U086.FC104_PV.F_CV;4.998145103;100.0 +25/10/2020 02:06:39;U086.FC104_PV.F_CV;5.000953674;100.0 +25/10/2020 02:06:40;U086.FC104_PV.F_CV;4.999600410;100.0 +25/10/2020 02:06:41;U086.FC104_PV.F_CV;5.002488136;100.0 +25/10/2020 02:06:42;U086.FC104_PV.F_CV;5.001531124;100.0 +25/10/2020 02:06:43;U086.FC104_PV.F_CV;4.994323254;100.0 +25/10/2020 02:06:44;U086.FC104_PV.F_CV;4.999406815;100.0 +25/10/2020 02:06:45;U086.FC104_PV.F_CV;5.003633976;100.0 +25/10/2020 02:06:46;U086.FC104_PV.F_CV;5.000733852;100.0 +25/10/2020 02:06:47;U086.FC104_PV.F_CV;5.000144482;100.0 +25/10/2020 02:06:48;U086.FC104_PV.F_CV;4.999383926;100.0 +25/10/2020 02:06:49;U086.FC104_PV.F_CV;5.002063751;100.0 +25/10/2020 02:06:50;U086.FC104_PV.F_CV;5.001197815;100.0 +25/10/2020 02:06:51;U086.FC104_PV.F_CV;4.996157646;100.0 +25/10/2020 02:06:52;U086.FC104_PV.F_CV;4.995899677;100.0 +25/10/2020 02:06:53;U086.FC104_PV.F_CV;4.998458385;100.0 +25/10/2020 02:06:54;U086.FC104_PV.F_CV;5.002851963;100.0 +25/10/2020 02:06:55;U086.FC104_PV.F_CV;5.002463818;100.0 +25/10/2020 02:06:56;U086.FC104_PV.F_CV;5.001385689;100.0 +25/10/2020 02:06:57;U086.FC104_PV.F_CV;4.997243404;100.0 +25/10/2020 02:06:58;U086.FC104_PV.F_CV;4.997683048;100.0 +25/10/2020 02:06:59;U086.FC104_PV.F_CV;4.999612331;100.0 +25/10/2020 02:06:13;U086.FC104_SP.F_CV;5.000000000;100.0 +25/10/2020 02:06:01;U086.FC120_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U086.FC121_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U086.FC201_PV.F_CV;-0.173611104;100.0 +25/10/2020 02:06:01;U086.FC201_PV.F_CV;-0.150462970;100.0 +25/10/2020 02:06:02;U086.FC201_PV.F_CV;-0.127314821;100.0 +25/10/2020 02:06:04;U086.FC201_PV.F_CV;-0.104166664;100.0 +25/10/2020 02:06:05;U086.FC201_PV.F_CV;-0.092592590;100.0 +25/10/2020 02:06:08;U086.FC201_PV.F_CV;-0.057870369;100.0 +25/10/2020 02:06:09;U086.FC201_PV.F_CV;-0.092592590;100.0 +25/10/2020 02:06:10;U086.FC201_PV.F_CV;-0.185185179;100.0 +25/10/2020 02:06:11;U086.FC201_PV.F_CV;-0.127314821;100.0 +25/10/2020 02:06:12;U086.FC201_PV.F_CV;-0.115740739;100.0 +25/10/2020 02:06:14;U086.FC201_PV.F_CV;-0.127314821;100.0 +25/10/2020 02:06:15;U086.FC201_PV.F_CV;-0.104166664;100.0 +25/10/2020 02:06:16;U086.FC201_PV.F_CV;-0.092592590;100.0 +25/10/2020 02:06:17;U086.FC201_PV.F_CV;-0.150462970;100.0 +25/10/2020 02:06:18;U086.FC201_PV.F_CV;-0.092592590;100.0 +25/10/2020 02:06:19;U086.FC201_PV.F_CV;-0.057870369;100.0 +25/10/2020 02:06:20;U086.FC201_PV.F_CV;-0.034722224;100.0 +25/10/2020 02:06:21;U086.FC201_PV.F_CV;-0.046296295;100.0 +25/10/2020 02:06:22;U086.FC201_PV.F_CV;-0.011574074;100.0 +25/10/2020 02:06:24;U086.FC201_PV.F_CV;0.023148147;100.0 +25/10/2020 02:06:25;U086.FC201_PV.F_CV;0.046296295;100.0 +25/10/2020 02:06:26;U086.FC201_PV.F_CV;-0.057870369;100.0 +25/10/2020 02:06:27;U086.FC201_PV.F_CV;-0.034722224;100.0 +25/10/2020 02:06:28;U086.FC201_PV.F_CV;-0.011574074;100.0 +25/10/2020 02:06:29;U086.FC201_PV.F_CV;0.011574074;100.0 +25/10/2020 02:06:30;U086.FC201_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U086.FC201_PV.F_CV;0.023148147;100.0 +25/10/2020 02:06:33;U086.FC201_PV.F_CV;-0.069444448;100.0 +25/10/2020 02:06:35;U086.FC201_PV.F_CV;0.011574074;100.0 +25/10/2020 02:06:36;U086.FC201_PV.F_CV;-0.011574074;100.0 +25/10/2020 02:06:37;U086.FC201_PV.F_CV;0.011574074;100.0 +25/10/2020 02:06:38;U086.FC201_PV.F_CV;0.046296295;100.0 +25/10/2020 02:06:39;U086.FC201_PV.F_CV;0.069444448;100.0 +25/10/2020 02:06:40;U086.FC201_PV.F_CV;0.057870369;100.0 +25/10/2020 02:06:42;U086.FC201_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U086.FC201_PV.F_CV;-0.046296295;100.0 +25/10/2020 02:06:44;U086.FC201_PV.F_CV;-0.069444448;100.0 +25/10/2020 02:06:45;U086.FC201_PV.F_CV;-0.057870369;100.0 +25/10/2020 02:06:47;U086.FC201_PV.F_CV;-0.046296295;100.0 +25/10/2020 02:06:48;U086.FC201_PV.F_CV;-0.034722224;100.0 +25/10/2020 02:06:49;U086.FC201_PV.F_CV;-0.011574074;100.0 +25/10/2020 02:06:50;U086.FC201_PV.F_CV;-0.057870369;100.0 +25/10/2020 02:06:53;U086.FC201_PV.F_CV;-0.011574074;100.0 +25/10/2020 02:06:54;U086.FC201_PV.F_CV;0.081018515;100.0 +25/10/2020 02:06:55;U086.FC201_PV.F_CV;0.127314821;100.0 +25/10/2020 02:06:56;U086.FC201_PV.F_CV;0.138888896;100.0 +25/10/2020 02:06:57;U086.FC201_PV.F_CV;0.046296295;100.0 +25/10/2020 02:06:58;U086.FC201_PV.F_CV;0.127314821;100.0 +25/10/2020 02:06:59;U086.FC201_PV.F_CV;0.081018515;100.0 +25/10/2020 02:06:36;U086.FC201_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U086.FC202_PV.F_CV;-0.046599999;100.0 +25/10/2020 02:06:47;U086.FC202_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U086.FC203_PV.F_CV;0.039999999;100.0 +25/10/2020 02:06:13;U086.FC203_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U086.FC204_PV.F_CV;4.999310970;100.0 +25/10/2020 02:06:01;U086.FC204_PV.F_CV;4.999755859;100.0 +25/10/2020 02:06:02;U086.FC204_PV.F_CV;4.998762608;100.0 +25/10/2020 02:06:03;U086.FC204_PV.F_CV;4.999478340;100.0 +25/10/2020 02:06:04;U086.FC204_PV.F_CV;4.998575211;100.0 +25/10/2020 02:06:05;U086.FC204_PV.F_CV;4.999862671;100.0 +25/10/2020 02:06:06;U086.FC204_PV.F_CV;4.998250008;100.0 +25/10/2020 02:06:07;U086.FC204_PV.F_CV;4.999376774;100.0 +25/10/2020 02:06:08;U086.FC204_PV.F_CV;4.999921322;100.0 +25/10/2020 02:06:09;U086.FC204_PV.F_CV;5.000740528;100.0 +25/10/2020 02:06:10;U086.FC204_PV.F_CV;5.001095772;100.0 +25/10/2020 02:06:11;U086.FC204_PV.F_CV;4.999659538;100.0 +25/10/2020 02:06:12;U086.FC204_PV.F_CV;4.998523712;100.0 +25/10/2020 02:06:13;U086.FC204_PV.F_CV;5.000922680;100.0 +25/10/2020 02:06:14;U086.FC204_PV.F_CV;5.000444889;100.0 +25/10/2020 02:06:15;U086.FC204_PV.F_CV;4.998906136;100.0 +25/10/2020 02:06:16;U086.FC204_PV.F_CV;5.001368046;100.0 +25/10/2020 02:06:17;U086.FC204_PV.F_CV;4.999327183;100.0 +25/10/2020 02:06:18;U086.FC204_PV.F_CV;5.000905037;100.0 +25/10/2020 02:06:19;U086.FC204_PV.F_CV;5.000204086;100.0 +25/10/2020 02:06:20;U086.FC204_PV.F_CV;5.000313282;100.0 +25/10/2020 02:06:21;U086.FC204_PV.F_CV;4.998269558;100.0 +25/10/2020 02:06:22;U086.FC204_PV.F_CV;5.000404835;100.0 +25/10/2020 02:06:23;U086.FC204_PV.F_CV;4.999646664;100.0 +25/10/2020 02:06:24;U086.FC204_PV.F_CV;5.000187874;100.0 +25/10/2020 02:06:25;U086.FC204_PV.F_CV;5.000369072;100.0 +25/10/2020 02:06:26;U086.FC204_PV.F_CV;4.999190331;100.0 +25/10/2020 02:06:27;U086.FC204_PV.F_CV;5.000094414;100.0 +25/10/2020 02:06:28;U086.FC204_PV.F_CV;5.000032902;100.0 +25/10/2020 02:06:29;U086.FC204_PV.F_CV;5.000048161;100.0 +25/10/2020 02:06:30;U086.FC204_PV.F_CV;5.000614643;100.0 +25/10/2020 02:06:31;U086.FC204_PV.F_CV;4.999701977;100.0 +25/10/2020 02:06:32;U086.FC204_PV.F_CV;5.000194550;100.0 +25/10/2020 02:06:33;U086.FC204_PV.F_CV;4.998230934;100.0 +25/10/2020 02:06:34;U086.FC204_PV.F_CV;4.999858856;100.0 +25/10/2020 02:06:35;U086.FC204_PV.F_CV;5.000096798;100.0 +25/10/2020 02:06:36;U086.FC204_PV.F_CV;5.000314236;100.0 +25/10/2020 02:06:37;U086.FC204_PV.F_CV;4.998124123;100.0 +25/10/2020 02:06:38;U086.FC204_PV.F_CV;4.998870373;100.0 +25/10/2020 02:06:39;U086.FC204_PV.F_CV;4.999354839;100.0 +25/10/2020 02:06:40;U086.FC204_PV.F_CV;5.000815868;100.0 +25/10/2020 02:06:41;U086.FC204_PV.F_CV;4.999501228;100.0 +25/10/2020 02:06:42;U086.FC204_PV.F_CV;4.998703003;100.0 +25/10/2020 02:06:43;U086.FC204_PV.F_CV;5.000677586;100.0 +25/10/2020 02:06:44;U086.FC204_PV.F_CV;4.999368668;100.0 +25/10/2020 02:06:45;U086.FC204_PV.F_CV;4.999632835;100.0 +25/10/2020 02:06:46;U086.FC204_PV.F_CV;5.000987053;100.0 +25/10/2020 02:06:47;U086.FC204_PV.F_CV;4.999540806;100.0 +25/10/2020 02:06:48;U086.FC204_PV.F_CV;5.000069618;100.0 +25/10/2020 02:06:49;U086.FC204_PV.F_CV;4.998166561;100.0 +25/10/2020 02:06:50;U086.FC204_PV.F_CV;4.998529434;100.0 +25/10/2020 02:06:51;U086.FC204_PV.F_CV;5.000463009;100.0 +25/10/2020 02:06:52;U086.FC204_PV.F_CV;4.999903202;100.0 +25/10/2020 02:06:53;U086.FC204_PV.F_CV;5.000578880;100.0 +25/10/2020 02:06:54;U086.FC204_PV.F_CV;4.999371052;100.0 +25/10/2020 02:06:55;U086.FC204_PV.F_CV;4.999547482;100.0 +25/10/2020 02:06:56;U086.FC204_PV.F_CV;4.999208927;100.0 +25/10/2020 02:06:57;U086.FC204_PV.F_CV;5.000127792;100.0 +25/10/2020 02:06:58;U086.FC204_PV.F_CV;5.000404358;100.0 +25/10/2020 02:06:59;U086.FC204_PV.F_CV;4.998995781;100.0 +25/10/2020 02:06:13;U086.FC204_SP.F_CV;5.000000000;100.0 +25/10/2020 02:06:06;U086.FC220_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U086.FC221_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U086.FC301_PV.F_CV;0.104166664;100.0 +25/10/2020 02:06:01;U086.FC301_PV.F_CV;0.081018515;100.0 +25/10/2020 02:06:02;U086.FC301_PV.F_CV;0.069444448;100.0 +25/10/2020 02:06:03;U086.FC301_PV.F_CV;0.162037030;100.0 +25/10/2020 02:06:04;U086.FC301_PV.F_CV;0.138888896;100.0 +25/10/2020 02:06:05;U086.FC301_PV.F_CV;0.127314821;100.0 +25/10/2020 02:06:06;U086.FC301_PV.F_CV;0.081018515;100.0 +25/10/2020 02:06:07;U086.FC301_PV.F_CV;0.231481478;100.0 +25/10/2020 02:06:08;U086.FC301_PV.F_CV;0.219907403;100.0 +25/10/2020 02:06:09;U086.FC301_PV.F_CV;0.196759254;100.0 +25/10/2020 02:06:10;U086.FC301_PV.F_CV;0.162037030;100.0 +25/10/2020 02:06:12;U086.FC301_PV.F_CV;0.185185179;100.0 +25/10/2020 02:06:13;U086.FC301_PV.F_CV;0.173611104;100.0 +25/10/2020 02:06:15;U086.FC301_PV.F_CV;0.185185179;100.0 +25/10/2020 02:06:16;U086.FC301_PV.F_CV;0.243055552;100.0 +25/10/2020 02:06:17;U086.FC301_PV.F_CV;0.231481478;100.0 +25/10/2020 02:06:19;U086.FC301_PV.F_CV;0.254629642;100.0 +25/10/2020 02:06:20;U086.FC301_PV.F_CV;0.196759254;100.0 +25/10/2020 02:06:21;U086.FC301_PV.F_CV;0.173611104;100.0 +25/10/2020 02:06:22;U086.FC301_PV.F_CV;0.127314821;100.0 +25/10/2020 02:06:23;U086.FC301_PV.F_CV;0.138888896;100.0 +25/10/2020 02:06:24;U086.FC301_PV.F_CV;0.162037030;100.0 +25/10/2020 02:06:25;U086.FC301_PV.F_CV;0.069444448;100.0 +25/10/2020 02:06:26;U086.FC301_PV.F_CV;0.057870369;100.0 +25/10/2020 02:06:27;U086.FC301_PV.F_CV;0.069444448;100.0 +25/10/2020 02:06:29;U086.FC301_PV.F_CV;0.081018515;100.0 +25/10/2020 02:06:30;U086.FC301_PV.F_CV;0.069444448;100.0 +25/10/2020 02:06:32;U086.FC301_PV.F_CV;0.023148147;100.0 +25/10/2020 02:06:33;U086.FC301_PV.F_CV;0.046296295;100.0 +25/10/2020 02:06:34;U086.FC301_PV.F_CV;0.069444448;100.0 +25/10/2020 02:06:35;U086.FC301_PV.F_CV;0.127314821;100.0 +25/10/2020 02:06:36;U086.FC301_PV.F_CV;0.115740739;100.0 +25/10/2020 02:06:39;U086.FC301_PV.F_CV;0.011574074;100.0 +25/10/2020 02:06:40;U086.FC301_PV.F_CV;-0.011574074;100.0 +25/10/2020 02:06:41;U086.FC301_PV.F_CV;-0.034722224;100.0 +25/10/2020 02:06:42;U086.FC301_PV.F_CV;-0.046296295;100.0 +25/10/2020 02:06:43;U086.FC301_PV.F_CV;-0.034722224;100.0 +25/10/2020 02:06:44;U086.FC301_PV.F_CV;-0.092592590;100.0 +25/10/2020 02:06:45;U086.FC301_PV.F_CV;-0.069444448;100.0 +25/10/2020 02:06:47;U086.FC301_PV.F_CV;-0.046296295;100.0 +25/10/2020 02:06:48;U086.FC301_PV.F_CV;-0.011574074;100.0 +25/10/2020 02:06:49;U086.FC301_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U086.FC301_PV.F_CV;-0.011574074;100.0 +25/10/2020 02:06:51;U086.FC301_PV.F_CV;0.023148147;100.0 +25/10/2020 02:06:52;U086.FC301_PV.F_CV;-0.011574074;100.0 +25/10/2020 02:06:53;U086.FC301_PV.F_CV;0.011574074;100.0 +25/10/2020 02:06:54;U086.FC301_PV.F_CV;0.104166664;100.0 +25/10/2020 02:06:55;U086.FC301_PV.F_CV;0.081018515;100.0 +25/10/2020 02:06:56;U086.FC301_PV.F_CV;0.046296295;100.0 +25/10/2020 02:06:58;U086.FC301_PV.F_CV;-0.034722224;100.0 +25/10/2020 02:06:59;U086.FC301_PV.F_CV;-0.046296295;100.0 +25/10/2020 02:06:36;U086.FC301_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U086.FC302_PV.F_CV;0.047300000;100.0 +25/10/2020 02:06:01;U086.FC302_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U086.FC303_PV.F_CV;0.029999999;100.0 +25/10/2020 02:06:13;U086.FC303_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U086.FC304_PV.F_CV;4.999180317;100.0 +25/10/2020 02:06:01;U086.FC304_PV.F_CV;4.998386860;100.0 +25/10/2020 02:06:02;U086.FC304_PV.F_CV;4.996395588;100.0 +25/10/2020 02:06:03;U086.FC304_PV.F_CV;4.998621941;100.0 +25/10/2020 02:06:04;U086.FC304_PV.F_CV;4.997940540;100.0 +25/10/2020 02:06:05;U086.FC304_PV.F_CV;4.999074459;100.0 +25/10/2020 02:06:06;U086.FC304_PV.F_CV;4.999723434;100.0 +25/10/2020 02:06:07;U086.FC304_PV.F_CV;4.997179031;100.0 +25/10/2020 02:06:08;U086.FC304_PV.F_CV;4.998997688;100.0 +25/10/2020 02:06:09;U086.FC304_PV.F_CV;5.001398563;100.0 +25/10/2020 02:06:10;U086.FC304_PV.F_CV;5.006812572;100.0 +25/10/2020 02:06:11;U086.FC304_PV.F_CV;5.002223015;100.0 +25/10/2020 02:06:12;U086.FC304_PV.F_CV;4.999100208;100.0 +25/10/2020 02:06:13;U086.FC304_PV.F_CV;4.999925137;100.0 +25/10/2020 02:06:14;U086.FC304_PV.F_CV;4.997307777;100.0 +25/10/2020 02:06:15;U086.FC304_PV.F_CV;4.998694897;100.0 +25/10/2020 02:06:16;U086.FC304_PV.F_CV;4.998657703;100.0 +25/10/2020 02:06:17;U086.FC304_PV.F_CV;4.998725891;100.0 +25/10/2020 02:06:18;U086.FC304_PV.F_CV;4.999608040;100.0 +25/10/2020 02:06:19;U086.FC304_PV.F_CV;5.000542164;100.0 +25/10/2020 02:06:20;U086.FC304_PV.F_CV;5.001310349;100.0 +25/10/2020 02:06:21;U086.FC304_PV.F_CV;5.003776550;100.0 +25/10/2020 02:06:22;U086.FC304_PV.F_CV;4.999475002;100.0 +25/10/2020 02:06:23;U086.FC304_PV.F_CV;4.995662689;100.0 +25/10/2020 02:06:24;U086.FC304_PV.F_CV;5.002369404;100.0 +25/10/2020 02:06:25;U086.FC304_PV.F_CV;5.003717422;100.0 +25/10/2020 02:06:26;U086.FC304_PV.F_CV;5.000586033;100.0 +25/10/2020 02:06:27;U086.FC304_PV.F_CV;5.000983238;100.0 +25/10/2020 02:06:28;U086.FC304_PV.F_CV;5.000127792;100.0 +25/10/2020 02:06:29;U086.FC304_PV.F_CV;4.998546600;100.0 +25/10/2020 02:06:30;U086.FC304_PV.F_CV;5.007678032;100.0 +25/10/2020 02:06:31;U086.FC304_PV.F_CV;5.003542423;100.0 +25/10/2020 02:06:32;U086.FC304_PV.F_CV;5.000751495;100.0 +25/10/2020 02:06:33;U086.FC304_PV.F_CV;5.001945496;100.0 +25/10/2020 02:06:34;U086.FC304_PV.F_CV;5.002423286;100.0 +25/10/2020 02:06:35;U086.FC304_PV.F_CV;4.996940136;100.0 +25/10/2020 02:06:36;U086.FC304_PV.F_CV;4.995133400;100.0 +25/10/2020 02:06:37;U086.FC304_PV.F_CV;4.997043133;100.0 +25/10/2020 02:06:38;U086.FC304_PV.F_CV;4.997370243;100.0 +25/10/2020 02:06:39;U086.FC304_PV.F_CV;5.000206947;100.0 +25/10/2020 02:06:40;U086.FC304_PV.F_CV;4.999751091;100.0 +25/10/2020 02:06:41;U086.FC304_PV.F_CV;5.001239777;100.0 +25/10/2020 02:06:42;U086.FC304_PV.F_CV;5.000762463;100.0 +25/10/2020 02:06:43;U086.FC304_PV.F_CV;5.001091480;100.0 +25/10/2020 02:06:44;U086.FC304_PV.F_CV;5.001626968;100.0 +25/10/2020 02:06:45;U086.FC304_PV.F_CV;4.996864796;100.0 +25/10/2020 02:06:46;U086.FC304_PV.F_CV;4.998540878;100.0 +25/10/2020 02:06:47;U086.FC304_PV.F_CV;4.995715141;100.0 +25/10/2020 02:06:48;U086.FC304_PV.F_CV;4.997071743;100.0 +25/10/2020 02:06:49;U086.FC304_PV.F_CV;4.996224880;100.0 +25/10/2020 02:06:50;U086.FC304_PV.F_CV;5.001315594;100.0 +25/10/2020 02:06:51;U086.FC304_PV.F_CV;5.000060558;100.0 +25/10/2020 02:06:52;U086.FC304_PV.F_CV;5.000205517;100.0 +25/10/2020 02:06:53;U086.FC304_PV.F_CV;4.996547699;100.0 +25/10/2020 02:06:54;U086.FC304_PV.F_CV;4.990539551;100.0 +25/10/2020 02:06:55;U086.FC304_PV.F_CV;4.995978355;100.0 +25/10/2020 02:06:56;U086.FC304_PV.F_CV;5.000429630;100.0 +25/10/2020 02:06:57;U086.FC304_PV.F_CV;5.000154018;100.0 +25/10/2020 02:06:58;U086.FC304_PV.F_CV;5.000078678;100.0 +25/10/2020 02:06:59;U086.FC304_PV.F_CV;4.992778778;100.0 +25/10/2020 02:06:36;U086.FC304_SP.F_CV;5.000000000;100.0 +25/10/2020 02:06:06;U086.FC320_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U086.FC321_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U086.FC401_PV.F_CV;-0.011574074;100.0 +25/10/2020 02:06:01;U086.FC401_PV.F_CV;-0.069444448;100.0 +25/10/2020 02:06:02;U086.FC401_PV.F_CV;-0.127314821;100.0 +25/10/2020 02:06:03;U086.FC401_PV.F_CV;-0.115740739;100.0 +25/10/2020 02:06:04;U086.FC401_PV.F_CV;-0.185185179;100.0 +25/10/2020 02:06:05;U086.FC401_PV.F_CV;-0.219907403;100.0 +25/10/2020 02:06:06;U086.FC401_PV.F_CV;-0.243055552;100.0 +25/10/2020 02:06:07;U086.FC401_PV.F_CV;-0.208333328;100.0 +25/10/2020 02:06:08;U086.FC401_PV.F_CV;-0.231481478;100.0 +25/10/2020 02:06:09;U086.FC401_PV.F_CV;-0.173611104;100.0 +25/10/2020 02:06:10;U086.FC401_PV.F_CV;-0.185185179;100.0 +25/10/2020 02:06:11;U086.FC401_PV.F_CV;-0.266203701;100.0 +25/10/2020 02:06:12;U086.FC401_PV.F_CV;-0.335648149;100.0 +25/10/2020 02:06:13;U086.FC401_PV.F_CV;-0.289351851;100.0 +25/10/2020 02:06:14;U086.FC401_PV.F_CV;-0.266203701;100.0 +25/10/2020 02:06:15;U086.FC401_PV.F_CV;-0.219907403;100.0 +25/10/2020 02:06:16;U086.FC401_PV.F_CV;-0.243055552;100.0 +25/10/2020 02:06:18;U086.FC401_PV.F_CV;-0.335648149;100.0 +25/10/2020 02:06:20;U086.FC401_PV.F_CV;-0.347222209;100.0 +25/10/2020 02:06:21;U086.FC401_PV.F_CV;-0.335648149;100.0 +25/10/2020 02:06:22;U086.FC401_PV.F_CV;-0.324074060;100.0 +25/10/2020 02:06:23;U086.FC401_PV.F_CV;-0.300925940;100.0 +25/10/2020 02:06:24;U086.FC401_PV.F_CV;-0.231481478;100.0 +25/10/2020 02:06:26;U086.FC401_PV.F_CV;-0.243055552;100.0 +25/10/2020 02:06:27;U086.FC401_PV.F_CV;-0.185185179;100.0 +25/10/2020 02:06:29;U086.FC401_PV.F_CV;-0.150462970;100.0 +25/10/2020 02:06:30;U086.FC401_PV.F_CV;-0.173611104;100.0 +25/10/2020 02:06:31;U086.FC401_PV.F_CV;-0.162037030;100.0 +25/10/2020 02:06:32;U086.FC401_PV.F_CV;-0.219907403;100.0 +25/10/2020 02:06:33;U086.FC401_PV.F_CV;-0.185185179;100.0 +25/10/2020 02:06:34;U086.FC401_PV.F_CV;-0.162037030;100.0 +25/10/2020 02:06:35;U086.FC401_PV.F_CV;-0.173611104;100.0 +25/10/2020 02:06:36;U086.FC401_PV.F_CV;-0.127314821;100.0 +25/10/2020 02:06:37;U086.FC401_PV.F_CV;-0.185185179;100.0 +25/10/2020 02:06:38;U086.FC401_PV.F_CV;-0.173611104;100.0 +25/10/2020 02:06:39;U086.FC401_PV.F_CV;-0.208333328;100.0 +25/10/2020 02:06:40;U086.FC401_PV.F_CV;-0.231481478;100.0 +25/10/2020 02:06:41;U086.FC401_PV.F_CV;-0.266203701;100.0 +25/10/2020 02:06:42;U086.FC401_PV.F_CV;-0.208333328;100.0 +25/10/2020 02:06:43;U086.FC401_PV.F_CV;-0.219907403;100.0 +25/10/2020 02:06:44;U086.FC401_PV.F_CV;-0.289351851;100.0 +25/10/2020 02:06:45;U086.FC401_PV.F_CV;-0.266203701;100.0 +25/10/2020 02:06:46;U086.FC401_PV.F_CV;-0.335648149;100.0 +25/10/2020 02:06:47;U086.FC401_PV.F_CV;-0.347222209;100.0 +25/10/2020 02:06:48;U086.FC401_PV.F_CV;-0.324074060;100.0 +25/10/2020 02:06:49;U086.FC401_PV.F_CV;-0.277777791;100.0 +25/10/2020 02:06:50;U086.FC401_PV.F_CV;-0.231481478;100.0 +25/10/2020 02:06:51;U086.FC401_PV.F_CV;-0.289351851;100.0 +25/10/2020 02:06:52;U086.FC401_PV.F_CV;-0.208333328;100.0 +25/10/2020 02:06:53;U086.FC401_PV.F_CV;-0.231481478;100.0 +25/10/2020 02:06:54;U086.FC401_PV.F_CV;-0.185185179;100.0 +25/10/2020 02:06:55;U086.FC401_PV.F_CV;-0.173611104;100.0 +25/10/2020 02:06:56;U086.FC401_PV.F_CV;-0.185185179;100.0 +25/10/2020 02:06:57;U086.FC401_PV.F_CV;-0.231481478;100.0 +25/10/2020 02:06:58;U086.FC401_PV.F_CV;-0.266203701;100.0 +25/10/2020 02:06:59;U086.FC401_PV.F_CV;-0.231481478;100.0 +25/10/2020 02:06:01;U086.FC401_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U086.FC402_PV.F_CV;-0.127800003;100.0 +25/10/2020 02:06:06;U086.FC402_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U086.FC403_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U086.FC403_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U086.FC404_PV.F_CV;5.000347137;100.0 +25/10/2020 02:06:01;U086.FC404_PV.F_CV;5.001321793;100.0 +25/10/2020 02:06:02;U086.FC404_PV.F_CV;5.001268387;100.0 +25/10/2020 02:06:03;U086.FC404_PV.F_CV;4.998837471;100.0 +25/10/2020 02:06:04;U086.FC404_PV.F_CV;5.001626968;100.0 +25/10/2020 02:06:05;U086.FC404_PV.F_CV;5.000563622;100.0 +25/10/2020 02:06:06;U086.FC404_PV.F_CV;5.003054142;100.0 +25/10/2020 02:06:07;U086.FC404_PV.F_CV;4.999788284;100.0 +25/10/2020 02:06:08;U086.FC404_PV.F_CV;5.003339767;100.0 +25/10/2020 02:06:09;U086.FC404_PV.F_CV;4.998146057;100.0 +25/10/2020 02:06:10;U086.FC404_PV.F_CV;4.999557972;100.0 +25/10/2020 02:06:11;U086.FC404_PV.F_CV;4.999957085;100.0 +25/10/2020 02:06:12;U086.FC404_PV.F_CV;5.000669479;100.0 +25/10/2020 02:06:13;U086.FC404_PV.F_CV;5.003380299;100.0 +25/10/2020 02:06:14;U086.FC404_PV.F_CV;5.003846169;100.0 +25/10/2020 02:06:15;U086.FC404_PV.F_CV;5.001229763;100.0 +25/10/2020 02:06:16;U086.FC404_PV.F_CV;5.000798225;100.0 +25/10/2020 02:06:17;U086.FC404_PV.F_CV;5.000046253;100.0 +25/10/2020 02:06:18;U086.FC404_PV.F_CV;4.998423576;100.0 +25/10/2020 02:06:19;U086.FC404_PV.F_CV;4.999902725;100.0 +25/10/2020 02:06:20;U086.FC404_PV.F_CV;5.001543522;100.0 +25/10/2020 02:06:21;U086.FC404_PV.F_CV;5.003046036;100.0 +25/10/2020 02:06:22;U086.FC404_PV.F_CV;5.001541615;100.0 +25/10/2020 02:06:23;U086.FC404_PV.F_CV;4.998001575;100.0 +25/10/2020 02:06:24;U086.FC404_PV.F_CV;4.999637127;100.0 +25/10/2020 02:06:25;U086.FC404_PV.F_CV;5.000573635;100.0 +25/10/2020 02:06:26;U086.FC404_PV.F_CV;5.000557423;100.0 +25/10/2020 02:06:27;U086.FC404_PV.F_CV;5.003416061;100.0 +25/10/2020 02:06:28;U086.FC404_PV.F_CV;4.998581409;100.0 +25/10/2020 02:06:29;U086.FC404_PV.F_CV;5.006134987;100.0 +25/10/2020 02:06:30;U086.FC404_PV.F_CV;5.000801563;100.0 +25/10/2020 02:06:31;U086.FC404_PV.F_CV;4.999802113;100.0 +25/10/2020 02:06:32;U086.FC404_PV.F_CV;5.004054070;100.0 +25/10/2020 02:06:33;U086.FC404_PV.F_CV;5.001001358;100.0 +25/10/2020 02:06:34;U086.FC404_PV.F_CV;4.999547958;100.0 +25/10/2020 02:06:35;U086.FC404_PV.F_CV;5.001121521;100.0 +25/10/2020 02:06:36;U086.FC404_PV.F_CV;5.002800941;100.0 +25/10/2020 02:06:37;U086.FC404_PV.F_CV;4.998978615;100.0 +25/10/2020 02:06:38;U086.FC404_PV.F_CV;5.006022453;100.0 +25/10/2020 02:06:39;U086.FC404_PV.F_CV;5.001840115;100.0 +25/10/2020 02:06:40;U086.FC404_PV.F_CV;4.997186184;100.0 +25/10/2020 02:06:41;U086.FC404_PV.F_CV;5.002576828;100.0 +25/10/2020 02:06:42;U086.FC404_PV.F_CV;5.000220299;100.0 +25/10/2020 02:06:43;U086.FC404_PV.F_CV;4.999157906;100.0 +25/10/2020 02:06:44;U086.FC404_PV.F_CV;5.000433445;100.0 +25/10/2020 02:06:45;U086.FC404_PV.F_CV;5.000624180;100.0 +25/10/2020 02:06:46;U086.FC404_PV.F_CV;5.002188206;100.0 +25/10/2020 02:06:47;U086.FC404_PV.F_CV;5.000760078;100.0 +25/10/2020 02:06:48;U086.FC404_PV.F_CV;4.998699188;100.0 +25/10/2020 02:06:49;U086.FC404_PV.F_CV;5.001919270;100.0 +25/10/2020 02:06:50;U086.FC404_PV.F_CV;4.999456882;100.0 +25/10/2020 02:06:51;U086.FC404_PV.F_CV;5.004341125;100.0 +25/10/2020 02:06:52;U086.FC404_PV.F_CV;4.997893333;100.0 +25/10/2020 02:06:53;U086.FC404_PV.F_CV;5.004182816;100.0 +25/10/2020 02:06:54;U086.FC404_PV.F_CV;5.000688553;100.0 +25/10/2020 02:06:55;U086.FC404_PV.F_CV;4.999171734;100.0 +25/10/2020 02:06:56;U086.FC404_PV.F_CV;5.001146793;100.0 +25/10/2020 02:06:57;U086.FC404_PV.F_CV;5.000461102;100.0 +25/10/2020 02:06:58;U086.FC404_PV.F_CV;4.999876499;100.0 +25/10/2020 02:06:59;U086.FC404_PV.F_CV;5.000021935;100.0 +25/10/2020 02:06:36;U086.FC404_SP.F_CV;5.000000000;100.0 +25/10/2020 02:06:13;U086.FC420_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U086.FC421_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U086.FI003.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U086.FI101_GAIN.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U086.FI101_OFFSET.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U086.FI102_GAIN.F_CV;0.980499983;100.0 +25/10/2020 02:06:13;U086.FI102_OFFSET.F_CV;0.129999995;100.0 +25/10/2020 02:06:13;U086.FI103_GAIN.F_CV;0.970000029;100.0 +25/10/2020 02:06:13;U086.FI103_OFFSET.F_CV;0.020000000;100.0 +25/10/2020 02:06:13;U086.FI104_GAIN.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U086.FI104_OFFSET.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U086.FI201_GAIN.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U086.FI201_OFFSET.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U086.FI202_GAIN.F_CV;0.979499996;100.0 +25/10/2020 02:06:13;U086.FI202_OFFSET.F_CV;-0.046599999;100.0 +25/10/2020 02:06:13;U086.FI203_GAIN.F_CV;0.970000029;100.0 +25/10/2020 02:06:13;U086.FI203_OFFSET.F_CV;0.039999999;100.0 +25/10/2020 02:06:13;U086.FI204_GAIN.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U086.FI204_OFFSET.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U086.FI301_GAIN.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U086.FI301_OFFSET.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U086.FI302_GAIN.F_CV;0.973599970;100.0 +25/10/2020 02:06:13;U086.FI302_OFFSET.F_CV;0.047300000;100.0 +25/10/2020 02:06:13;U086.FI303_GAIN.F_CV;0.980000019;100.0 +25/10/2020 02:06:13;U086.FI303_OFFSET.F_CV;0.029999999;100.0 +25/10/2020 02:06:13;U086.FI304_GAIN.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U086.FI304_OFFSET.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U086.FI401_GAIN.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U086.FI401_OFFSET.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U086.FI402_GAIN.F_CV;0.982999980;100.0 +25/10/2020 02:06:13;U086.FI402_OFFSET.F_CV;-0.127800003;100.0 +25/10/2020 02:06:13;U086.FI403_GAIN.F_CV;0.980000019;100.0 +25/10/2020 02:06:13;U086.FI403_OFFSET.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U086.FI404_GAIN.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U086.FI404_OFFSET.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U086.FQ003.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U086.HEV100_POS.F_CV;9.000000000;100.0 +25/10/2020 02:06:01;U086.HEV200_POS.F_CV;9.000000000;100.0 +25/10/2020 02:06:01;U086.HEV300_POS.F_CV;9.000000000;100.0 +25/10/2020 02:06:01;U086.HEV400_POS.F_CV;9.000000000;100.0 +25/10/2020 02:06:44;U086.LI100.F_CV;57.754631042;100.0 +25/10/2020 02:06:01;U086.LI101.F_CV;14.221643448;100.0 +25/10/2020 02:06:02;U086.LI101.F_CV;14.525463104;100.0 +25/10/2020 02:06:03;U086.LI101.F_CV;14.380786896;100.0 +25/10/2020 02:06:04;U086.LI101.F_CV;14.496527672;100.0 +25/10/2020 02:06:07;U086.LI101.F_CV;14.221643448;100.0 +25/10/2020 02:06:08;U086.LI101.F_CV;14.409722328;100.0 +25/10/2020 02:06:10;U086.LI101.F_CV;14.525463104;100.0 +25/10/2020 02:06:11;U086.LI101.F_CV;14.293981552;100.0 +25/10/2020 02:06:12;U086.LI101.F_CV;14.178240776;100.0 +25/10/2020 02:06:13;U086.LI101.F_CV;14.525463104;100.0 +25/10/2020 02:06:15;U086.LI101.F_CV;14.178240776;100.0 +25/10/2020 02:06:16;U086.LI101.F_CV;14.482060432;100.0 +25/10/2020 02:06:18;U086.LI101.F_CV;14.178240776;100.0 +25/10/2020 02:06:19;U086.LI101.F_CV;14.265046120;100.0 +25/10/2020 02:06:22;U086.LI101.F_CV;14.178240776;100.0 +25/10/2020 02:06:23;U086.LI101.F_CV;14.453125000;100.0 +25/10/2020 02:06:25;U086.LI101.F_CV;14.178240776;100.0 +25/10/2020 02:06:27;U086.LI101.F_CV;14.250578880;100.0 +25/10/2020 02:06:29;U086.LI101.F_CV;14.453125000;100.0 +25/10/2020 02:06:31;U086.LI101.F_CV;14.525463104;100.0 +25/10/2020 02:06:35;U086.LI101.F_CV;14.236110687;100.0 +25/10/2020 02:06:36;U086.LI101.F_CV;14.525463104;100.0 +25/10/2020 02:06:37;U086.LI101.F_CV;14.236110687;100.0 +25/10/2020 02:06:38;U086.LI101.F_CV;14.178240776;100.0 +25/10/2020 02:06:39;U086.LI101.F_CV;14.467592239;100.0 +25/10/2020 02:06:40;U086.LI101.F_CV;14.525463104;100.0 +25/10/2020 02:06:41;U086.LI101.F_CV;14.192708015;100.0 +25/10/2020 02:06:42;U086.LI101.F_CV;14.250578880;100.0 +25/10/2020 02:06:43;U086.LI101.F_CV;14.467592239;100.0 +25/10/2020 02:06:44;U086.LI101.F_CV;14.236110687;100.0 +25/10/2020 02:06:45;U086.LI101.F_CV;14.178240776;100.0 +25/10/2020 02:06:48;U086.LI101.F_CV;14.467592239;100.0 +25/10/2020 02:06:50;U086.LI101.F_CV;14.192708015;100.0 +25/10/2020 02:06:51;U086.LI101.F_CV;14.453125000;100.0 +25/10/2020 02:06:52;U086.LI101.F_CV;14.525463104;100.0 +25/10/2020 02:06:55;U086.LI101.F_CV;14.192708015;100.0 +25/10/2020 02:06:56;U086.LI101.F_CV;14.525463104;100.0 +25/10/2020 02:06:58;U086.LI101.F_CV;14.207176208;100.0 +25/10/2020 02:06:59;U086.LI101.F_CV;14.525463104;100.0 +25/10/2020 02:06:00;U086.LI102.F_CV;12.196180344;100.0 +25/10/2020 02:06:02;U086.LI102.F_CV;12.138310432;100.0 +25/10/2020 02:06:03;U086.LI102.F_CV;12.196180344;100.0 +25/10/2020 02:06:04;U086.LI102.F_CV;12.138310432;100.0 +25/10/2020 02:06:08;U086.LI102.F_CV;12.528935432;100.0 +25/10/2020 02:06:09;U086.LI102.F_CV;12.138310432;100.0 +25/10/2020 02:06:16;U086.LI102.F_CV;12.138310432;100.0 +25/10/2020 02:06:17;U086.LI102.F_CV;12.485532761;100.0 +25/10/2020 02:06:18;U086.LI102.F_CV;12.138310432;100.0 +25/10/2020 02:06:20;U086.LI102.F_CV;12.196180344;100.0 +25/10/2020 02:06:21;U086.LI102.F_CV;12.514467239;100.0 +25/10/2020 02:06:22;U086.LI102.F_CV;12.138310432;100.0 +25/10/2020 02:06:27;U086.LI102.F_CV;12.138310432;100.0 +25/10/2020 02:06:28;U086.LI102.F_CV;12.355323792;100.0 +25/10/2020 02:06:29;U086.LI102.F_CV;12.138310432;100.0 +25/10/2020 02:06:30;U086.LI102.F_CV;12.528935432;100.0 +25/10/2020 02:06:32;U086.LI102.F_CV;12.138310432;100.0 +25/10/2020 02:06:36;U086.LI102.F_CV;12.471064568;100.0 +25/10/2020 02:06:37;U086.LI102.F_CV;12.152777672;100.0 +25/10/2020 02:06:40;U086.LI102.F_CV;12.442130089;100.0 +25/10/2020 02:06:41;U086.LI102.F_CV;12.138310432;100.0 +25/10/2020 02:06:46;U086.LI102.F_CV;12.138310432;100.0 +25/10/2020 02:06:47;U086.LI102.F_CV;12.427661896;100.0 +25/10/2020 02:06:48;U086.LI102.F_CV;12.340856552;100.0 +25/10/2020 02:06:49;U086.LI102.F_CV;12.138310432;100.0 +25/10/2020 02:06:54;U086.LI102.F_CV;12.210648537;100.0 +25/10/2020 02:06:55;U086.LI102.F_CV;12.528935432;100.0 +25/10/2020 02:06:56;U086.LI102.F_CV;12.138310432;100.0 +25/10/2020 02:06:57;U086.LI102.F_CV;12.225115776;100.0 +25/10/2020 02:06:58;U086.LI102.F_CV;12.138310432;100.0 +25/10/2020 02:06:19;U086.LI200.F_CV;75.651039124;100.0 +25/10/2020 02:06:00;U086.LI201.F_CV;43.055557251;100.0 +25/10/2020 02:06:01;U086.LI201.F_CV;43.287036896;100.0 +25/10/2020 02:06:02;U086.LI201.F_CV;43.055557251;100.0 +25/10/2020 02:06:04;U086.LI201.F_CV;43.287036896;100.0 +25/10/2020 02:06:10;U086.LI201.F_CV;43.214698792;100.0 +25/10/2020 02:06:11;U086.LI201.F_CV;43.301506042;100.0 +25/10/2020 02:06:29;U086.LI201.F_CV;43.113426208;100.0 +25/10/2020 02:06:30;U086.LI201.F_CV;43.301506042;100.0 +25/10/2020 02:06:00;U086.LI202.F_CV;26.837385178;100.0 +25/10/2020 02:06:02;U086.LI202.F_CV;26.924190521;100.0 +25/10/2020 02:06:05;U086.LI202.F_CV;26.562500000;100.0 +25/10/2020 02:06:06;U086.LI202.F_CV;26.736110687;100.0 +25/10/2020 02:06:07;U086.LI202.F_CV;26.576967239;100.0 +25/10/2020 02:06:10;U086.LI202.F_CV;26.909721375;100.0 +25/10/2020 02:06:11;U086.LI202.F_CV;26.562500000;100.0 +25/10/2020 02:06:12;U086.LI202.F_CV;26.953125000;100.0 +25/10/2020 02:06:13;U086.LI202.F_CV;26.576967239;100.0 +25/10/2020 02:06:15;U086.LI202.F_CV;26.895254135;100.0 +25/10/2020 02:06:16;U086.LI202.F_CV;26.692708969;100.0 +25/10/2020 02:06:17;U086.LI202.F_CV;26.591434479;100.0 +25/10/2020 02:06:18;U086.LI202.F_CV;26.938657761;100.0 +25/10/2020 02:06:19;U086.LI202.F_CV;26.591434479;100.0 +25/10/2020 02:06:20;U086.LI202.F_CV;26.880786896;100.0 +25/10/2020 02:06:21;U086.LI202.F_CV;26.953125000;100.0 +25/10/2020 02:06:24;U086.LI202.F_CV;26.851852417;100.0 +25/10/2020 02:06:25;U086.LI202.F_CV;26.953125000;100.0 +25/10/2020 02:06:27;U086.LI202.F_CV;26.591434479;100.0 +25/10/2020 02:06:29;U086.LI202.F_CV;26.953125000;100.0 +25/10/2020 02:06:38;U086.LI202.F_CV;26.822916031;100.0 +25/10/2020 02:06:39;U086.LI202.F_CV;26.953125000;100.0 +25/10/2020 02:06:40;U086.LI202.F_CV;26.576967239;100.0 +25/10/2020 02:06:41;U086.LI202.F_CV;26.649305344;100.0 +25/10/2020 02:06:42;U086.LI202.F_CV;26.953125000;100.0 +25/10/2020 02:06:43;U086.LI202.F_CV;26.620370865;100.0 +25/10/2020 02:06:44;U086.LI202.F_CV;26.562500000;100.0 +25/10/2020 02:06:45;U086.LI202.F_CV;26.880786896;100.0 +25/10/2020 02:06:46;U086.LI202.F_CV;26.953125000;100.0 +25/10/2020 02:06:50;U086.LI202.F_CV;26.953125000;100.0 +25/10/2020 02:06:51;U086.LI202.F_CV;26.678239822;100.0 +25/10/2020 02:06:52;U086.LI202.F_CV;26.953125000;100.0 +25/10/2020 02:06:55;U086.LI202.F_CV;26.707176208;100.0 +25/10/2020 02:06:56;U086.LI202.F_CV;26.953125000;100.0 +25/10/2020 02:06:06;U086.LI300.F_CV;63.831020355;100.0 +25/10/2020 02:06:07;U086.LI300.F_CV;64.120368958;100.0 +25/10/2020 02:06:08;U086.LI300.F_CV;63.831020355;100.0 +25/10/2020 02:06:21;U086.LI300.F_CV;63.917823792;100.0 +25/10/2020 02:06:22;U086.LI300.F_CV;63.831020355;100.0 +25/10/2020 02:06:23;U086.LI300.F_CV;64.091438293;100.0 +25/10/2020 02:06:24;U086.LI300.F_CV;63.831020355;100.0 +25/10/2020 02:06:25;U086.LI300.F_CV;64.091438293;100.0 +25/10/2020 02:06:26;U086.LI300.F_CV;63.831020355;100.0 +25/10/2020 02:06:30;U086.LI300.F_CV;64.076965332;100.0 +25/10/2020 02:06:31;U086.LI300.F_CV;63.831020355;100.0 +25/10/2020 02:06:33;U086.LI300.F_CV;64.062500000;100.0 +25/10/2020 02:06:34;U086.LI300.F_CV;63.831020355;100.0 +25/10/2020 02:06:38;U086.LI300.F_CV;63.932292938;100.0 +25/10/2020 02:06:39;U086.LI300.F_CV;63.831020355;100.0 +25/10/2020 02:06:45;U086.LI300.F_CV;63.961227417;100.0 +25/10/2020 02:06:47;U086.LI300.F_CV;64.076965332;100.0 +25/10/2020 02:06:48;U086.LI300.F_CV;63.831020355;100.0 +25/10/2020 02:06:51;U086.LI300.F_CV;64.091438293;100.0 +25/10/2020 02:06:52;U086.LI300.F_CV;63.903354645;100.0 +25/10/2020 02:06:53;U086.LI300.F_CV;64.120368958;100.0 +25/10/2020 02:06:56;U086.LI300.F_CV;63.831020355;100.0 +25/10/2020 02:06:57;U086.LI300.F_CV;64.004631042;100.0 +25/10/2020 02:06:58;U086.LI300.F_CV;63.831020355;100.0 +25/10/2020 02:06:04;U086.LI301.F_CV;77.329284668;100.0 +25/10/2020 02:06:06;U086.LI301.F_CV;77.488426208;100.0 +25/10/2020 02:06:07;U086.LI301.F_CV;77.199073792;100.0 +25/10/2020 02:06:08;U086.LI301.F_CV;77.488426208;100.0 +25/10/2020 02:06:12;U086.LI301.F_CV;77.343750000;100.0 +25/10/2020 02:06:13;U086.LI301.F_CV;77.488426208;100.0 +25/10/2020 02:06:17;U086.LI301.F_CV;77.213539124;100.0 +25/10/2020 02:06:18;U086.LI301.F_CV;77.488426208;100.0 +25/10/2020 02:06:19;U086.LI301.F_CV;77.228012085;100.0 +25/10/2020 02:06:20;U086.LI301.F_CV;77.488426208;100.0 +25/10/2020 02:06:37;U086.LI301.F_CV;77.488426208;100.0 +25/10/2020 02:06:38;U086.LI301.F_CV;77.184608459;100.0 +25/10/2020 02:06:39;U086.LI301.F_CV;77.488426208;100.0 +25/10/2020 02:06:51;U086.LI301.F_CV;77.314811707;100.0 +25/10/2020 02:06:52;U086.LI301.F_CV;77.170135498;100.0 +25/10/2020 02:06:53;U086.LI301.F_CV;77.445022583;100.0 +25/10/2020 02:06:58;U086.LI301.F_CV;77.300346375;100.0 +25/10/2020 02:06:59;U086.LI301.F_CV;77.213539124;100.0 +25/10/2020 02:06:01;U086.LI302.F_CV;27.387153625;100.0 +25/10/2020 02:06:06;U086.LI302.F_CV;26.996528625;100.0 +25/10/2020 02:06:09;U086.LI302.F_CV;27.199073792;100.0 +25/10/2020 02:06:10;U086.LI302.F_CV;26.996528625;100.0 +25/10/2020 02:06:11;U086.LI302.F_CV;27.358217239;100.0 +25/10/2020 02:06:12;U086.LI302.F_CV;26.996528625;100.0 +25/10/2020 02:06:15;U086.LI302.F_CV;27.083333969;100.0 +25/10/2020 02:06:16;U086.LI302.F_CV;27.387153625;100.0 +25/10/2020 02:06:17;U086.LI302.F_CV;27.329282761;100.0 +25/10/2020 02:06:18;U086.LI302.F_CV;26.996528625;100.0 +25/10/2020 02:06:19;U086.LI302.F_CV;27.387153625;100.0 +25/10/2020 02:06:20;U086.LI302.F_CV;27.010995865;100.0 +25/10/2020 02:06:22;U086.LI302.F_CV;27.097801208;100.0 +25/10/2020 02:06:23;U086.LI302.F_CV;26.996528625;100.0 +25/10/2020 02:06:24;U086.LI302.F_CV;27.372684479;100.0 +25/10/2020 02:06:25;U086.LI302.F_CV;26.996528625;100.0 +25/10/2020 02:06:27;U086.LI302.F_CV;27.387153625;100.0 +25/10/2020 02:06:29;U086.LI302.F_CV;27.010995865;100.0 +25/10/2020 02:06:30;U086.LI302.F_CV;27.401620865;100.0 +25/10/2020 02:06:32;U086.LI302.F_CV;27.010995865;100.0 +25/10/2020 02:06:33;U086.LI302.F_CV;27.126735687;100.0 +25/10/2020 02:06:34;U086.LI302.F_CV;26.996528625;100.0 +25/10/2020 02:06:36;U086.LI302.F_CV;27.054397583;100.0 +25/10/2020 02:06:37;U086.LI302.F_CV;27.401620865;100.0 +25/10/2020 02:06:38;U086.LI302.F_CV;26.996528625;100.0 +25/10/2020 02:06:39;U086.LI302.F_CV;27.358217239;100.0 +25/10/2020 02:06:40;U086.LI302.F_CV;27.010995865;100.0 +25/10/2020 02:06:45;U086.LI302.F_CV;27.010995865;100.0 +25/10/2020 02:06:46;U086.LI302.F_CV;27.372684479;100.0 +25/10/2020 02:06:47;U086.LI302.F_CV;27.025463104;100.0 +25/10/2020 02:06:50;U086.LI302.F_CV;27.199073792;100.0 +25/10/2020 02:06:52;U086.LI302.F_CV;26.996528625;100.0 +25/10/2020 02:06:55;U086.LI302.F_CV;27.228010178;100.0 +25/10/2020 02:06:56;U086.LI302.F_CV;26.996528625;100.0 +25/10/2020 02:06:59;U086.LI302.F_CV;27.372684479;100.0 +25/10/2020 02:06:00;U086.LI400.F_CV;58.506942749;100.0 +25/10/2020 02:06:01;U086.LI400.F_CV;58.854167938;100.0 +25/10/2020 02:06:02;U086.LI400.F_CV;58.767360687;100.0 +25/10/2020 02:06:03;U086.LI400.F_CV;58.550346375;100.0 +25/10/2020 02:06:04;U086.LI400.F_CV;58.796295166;100.0 +25/10/2020 02:06:05;U086.LI400.F_CV;58.506942749;100.0 +25/10/2020 02:06:06;U086.LI400.F_CV;58.579280853;100.0 +25/10/2020 02:06:07;U086.LI400.F_CV;58.521411896;100.0 +25/10/2020 02:06:10;U086.LI400.F_CV;58.868633270;100.0 +25/10/2020 02:06:12;U086.LI400.F_CV;58.506942749;100.0 +25/10/2020 02:06:14;U086.LI400.F_CV;58.579280853;100.0 +25/10/2020 02:06:15;U086.LI400.F_CV;58.868633270;100.0 +25/10/2020 02:06:17;U086.LI400.F_CV;58.506942749;100.0 +25/10/2020 02:06:41;U086.LI400.F_CV;58.637153625;100.0 +25/10/2020 02:06:42;U086.LI400.F_CV;58.506942749;100.0 +25/10/2020 02:06:00;U086.LI401.F_CV;60.156250000;100.0 +25/10/2020 02:06:01;U086.LI401.F_CV;60.416667938;100.0 +25/10/2020 02:06:02;U086.LI401.F_CV;60.344329834;100.0 +25/10/2020 02:06:03;U086.LI401.F_CV;60.431133270;100.0 +25/10/2020 02:06:00;U086.LI402.F_CV;20.674190521;100.0 +25/10/2020 02:06:01;U086.LI402.F_CV;20.355903625;100.0 +25/10/2020 02:06:05;U086.LI402.F_CV;20.486110687;100.0 +25/10/2020 02:06:06;U086.LI402.F_CV;20.355903625;100.0 +25/10/2020 02:06:19;U086.PC106_PV.F_CV;7.014638901;100.0 +25/10/2020 02:06:20;U086.PC106_PV.F_CV;6.985703945;100.0 +25/10/2020 02:06:21;U086.PC106_PV.F_CV;7.014638901;100.0 +25/10/2020 02:06:23;U086.PC106_PV.F_CV;6.985703945;100.0 +25/10/2020 02:06:25;U086.PC106_PV.F_CV;7.014638901;100.0 +25/10/2020 02:06:26;U086.PC106_PV.F_CV;6.985703945;100.0 +25/10/2020 02:06:27;U086.PC106_PV.F_CV;7.014638901;100.0 +25/10/2020 02:06:32;U086.PC106_PV.F_CV;7.014638901;100.0 +25/10/2020 02:06:33;U086.PC106_PV.F_CV;6.985703945;100.0 +25/10/2020 02:06:34;U086.PC106_PV.F_CV;7.014638901;100.0 +25/10/2020 02:06:35;U086.PC106_PV.F_CV;6.985703945;100.0 +25/10/2020 02:06:36;U086.PC106_PV.F_CV;7.014638901;100.0 +25/10/2020 02:06:48;U086.PC106_PV.F_CV;7.014638901;100.0 +25/10/2020 02:06:49;U086.PC106_PV.F_CV;6.985703945;100.0 +25/10/2020 02:06:51;U086.PC106_PV.F_CV;7.014638901;100.0 +25/10/2020 02:06:56;U086.PC106_PV.F_CV;7.014638901;100.0 +25/10/2020 02:06:57;U086.PC106_PV.F_CV;6.985703945;100.0 +25/10/2020 02:06:01;U086.PC106_SP.F_CV;5.000000000;100.0 +25/10/2020 02:06:16;U086.PC206_PV.F_CV;7.156031132;100.0 +25/10/2020 02:06:17;U086.PC206_PV.F_CV;7.184937477;100.0 +25/10/2020 02:06:18;U086.PC206_PV.F_CV;7.156031132;100.0 +25/10/2020 02:06:23;U086.PC206_PV.F_CV;7.156031132;100.0 +25/10/2020 02:06:24;U086.PC206_PV.F_CV;7.184937477;100.0 +25/10/2020 02:06:25;U086.PC206_PV.F_CV;7.156031132;100.0 +25/10/2020 02:06:51;U086.PC206_PV.F_CV;7.156031132;100.0 +25/10/2020 02:06:52;U086.PC206_PV.F_CV;7.184937477;100.0 +25/10/2020 02:06:53;U086.PC206_PV.F_CV;7.156031132;100.0 +25/10/2020 02:06:59;U086.PC206_PV.F_CV;7.156031132;100.0 +25/10/2020 02:06:01;U086.PC206_SP.F_CV;5.000000000;100.0 +25/10/2020 02:06:00;U086.PC306_PV.F_CV;5.710686207;100.0 +25/10/2020 02:06:02;U086.PC306_PV.F_CV;5.739569664;100.0 +25/10/2020 02:06:03;U086.PC306_PV.F_CV;5.710686207;100.0 +25/10/2020 02:06:04;U086.PC306_PV.F_CV;5.739569664;100.0 +25/10/2020 02:06:05;U086.PC306_PV.F_CV;5.710686207;100.0 +25/10/2020 02:06:23;U086.PC306_PV.F_CV;5.710686207;100.0 +25/10/2020 02:06:24;U086.PC306_PV.F_CV;5.739569664;100.0 +25/10/2020 02:06:25;U086.PC306_PV.F_CV;5.710686207;100.0 +25/10/2020 02:06:29;U086.PC306_PV.F_CV;5.739569664;100.0 +25/10/2020 02:06:30;U086.PC306_PV.F_CV;5.710686207;100.0 +25/10/2020 02:06:44;U086.PC306_PV.F_CV;5.710686207;100.0 +25/10/2020 02:06:45;U086.PC306_PV.F_CV;5.739569664;100.0 +25/10/2020 02:06:46;U086.PC306_PV.F_CV;5.710686207;100.0 +25/10/2020 02:06:01;U086.PC306_SP.F_CV;5.000000000;100.0 +25/10/2020 02:06:11;U086.PC406_PV.F_CV;5.406405449;100.0 +25/10/2020 02:06:21;U086.PC406_PV.F_CV;5.406405449;100.0 +25/10/2020 02:06:22;U086.PC406_PV.F_CV;5.377556801;100.0 +25/10/2020 02:06:23;U086.PC406_PV.F_CV;5.406405449;100.0 +25/10/2020 02:06:28;U086.PC406_PV.F_CV;5.406405449;100.0 +25/10/2020 02:06:29;U086.PC406_PV.F_CV;5.377556801;100.0 +25/10/2020 02:06:31;U086.PC406_PV.F_CV;5.406405449;100.0 +25/10/2020 02:06:36;U086.PC406_PV.F_CV;5.406405449;100.0 +25/10/2020 02:06:37;U086.PC406_PV.F_CV;5.377556801;100.0 +25/10/2020 02:06:38;U086.PC406_PV.F_CV;5.406405449;100.0 +25/10/2020 02:06:42;U086.PC406_PV.F_CV;5.377556801;100.0 +25/10/2020 02:06:45;U086.PC406_PV.F_CV;5.406405449;100.0 +25/10/2020 02:06:46;U086.PC406_PV.F_CV;5.377556801;100.0 +25/10/2020 02:06:47;U086.PC406_PV.F_CV;5.406405449;100.0 +25/10/2020 02:06:13;U086.PC406_SP.F_CV;5.000000000;100.0 +25/10/2020 02:06:00;U086.PI003.F_CV;0.999305606;100.0 +25/10/2020 02:06:02;U086.PI003.F_CV;0.999132037;100.0 +25/10/2020 02:06:03;U086.PI003.F_CV;0.999305606;100.0 +25/10/2020 02:06:05;U086.PI003.F_CV;0.999132037;100.0 +25/10/2020 02:06:06;U086.PI003.F_CV;0.999305606;100.0 +25/10/2020 02:06:20;U086.PI003.F_CV;0.999305606;100.0 +25/10/2020 02:06:21;U086.PI003.F_CV;0.999132037;100.0 +25/10/2020 02:06:23;U086.PI003.F_CV;0.999305606;100.0 +25/10/2020 02:06:27;U086.PI003.F_CV;0.999132037;100.0 +25/10/2020 02:06:30;U086.PI003.F_CV;0.999305606;100.0 +25/10/2020 02:06:31;U086.PI003.F_CV;0.999132037;100.0 +25/10/2020 02:06:33;U086.PI003.F_CV;0.999305606;100.0 +25/10/2020 02:06:34;U086.PI003.F_CV;0.999132037;100.0 +25/10/2020 02:06:36;U086.PI003.F_CV;0.999305606;100.0 +25/10/2020 02:06:46;U086.PI003.F_CV;0.999305606;100.0 +25/10/2020 02:06:47;U086.PI003.F_CV;0.999132037;100.0 +25/10/2020 02:06:49;U086.PI003.F_CV;0.999305606;100.0 +25/10/2020 02:06:51;U086.PI003.F_CV;0.999132037;100.0 +25/10/2020 02:06:52;U086.PI003.F_CV;0.999305606;100.0 +25/10/2020 02:06:55;U086.PI003.F_CV;0.999132037;100.0 +25/10/2020 02:06:57;U086.PI003.F_CV;0.999305606;100.0 +25/10/2020 02:06:02;U086.PI010.F_CV;15.071614265;100.0 +25/10/2020 02:06:53;U086.PI010.F_CV;15.071614265;100.0 +25/10/2020 02:06:54;U086.PI010.F_CV;15.067997932;100.0 +25/10/2020 02:06:55;U086.PI010.F_CV;15.071614265;100.0 +25/10/2020 02:06:41;U086.PI013.F_CV;160.590270996;100.0 +25/10/2020 02:06:32;U086.PI105.F_CV;7.209887028;100.0 +25/10/2020 02:06:33;U086.PI105.F_CV;7.238851547;100.0 +25/10/2020 02:06:34;U086.PI105.F_CV;7.209887028;100.0 +25/10/2020 02:06:38;U086.PI105.F_CV;7.238851547;100.0 +25/10/2020 02:06:39;U086.PI105.F_CV;7.209887028;100.0 +25/10/2020 02:06:55;U086.PI105.F_CV;7.209887028;100.0 +25/10/2020 02:06:56;U086.PI105.F_CV;7.238851547;100.0 +25/10/2020 02:06:57;U086.PI105.F_CV;7.209887028;100.0 +25/10/2020 02:06:13;U086.PI105_GAIN.F_CV;1.001000047;100.0 +25/10/2020 02:06:13;U086.PI105_OFFSET.F_CV;-0.147000000;100.0 +25/10/2020 02:06:13;U086.PI106_GAIN.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U086.PI106_OFFSET.F_CV;0.157000005;100.0 +25/10/2020 02:06:00;U086.PI120.F_CV;4.282407284;100.0 +25/10/2020 02:06:04;U086.PI120.F_CV;4.282407284;100.0 +25/10/2020 02:06:05;U086.PI120.F_CV;4.166666508;100.0 +25/10/2020 02:06:08;U086.PI120.F_CV;4.108796120;100.0 +25/10/2020 02:06:12;U086.PI120.F_CV;4.108796120;100.0 +25/10/2020 02:06:13;U086.PI120.F_CV;4.050925732;100.0 +25/10/2020 02:06:16;U086.PI120.F_CV;3.993055582;100.0 +25/10/2020 02:06:20;U086.PI120.F_CV;3.993055582;100.0 +25/10/2020 02:06:21;U086.PI120.F_CV;3.877314806;100.0 +25/10/2020 02:06:33;U086.PI120.F_CV;3.703703642;100.0 +25/10/2020 02:06:37;U086.PI120.F_CV;3.587962866;100.0 +25/10/2020 02:06:41;U086.PI120.F_CV;3.530092478;100.0 +25/10/2020 02:06:44;U086.PI120.F_CV;3.472222328;100.0 +25/10/2020 02:06:48;U086.PI120.F_CV;3.472222328;100.0 +25/10/2020 02:06:49;U086.PI120.F_CV;3.414351940;100.0 +25/10/2020 02:06:53;U086.PI120.F_CV;3.298611164;100.0 +25/10/2020 02:06:56;U086.PI120.F_CV;3.240740776;100.0 +25/10/2020 02:06:13;U086.PI121.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U086.PI205.F_CV;7.803421021;100.0 +25/10/2020 02:06:13;U086.PI205_GAIN.F_CV;1.001000047;100.0 +25/10/2020 02:06:13;U086.PI205_OFFSET.F_CV;0.070000000;100.0 +25/10/2020 02:06:13;U086.PI206_GAIN.F_CV;0.999000013;100.0 +25/10/2020 02:06:13;U086.PI206_OFFSET.F_CV;0.074000001;100.0 +25/10/2020 02:06:54;U086.PI220.F_CV;76.736114502;100.0 +25/10/2020 02:06:55;U086.PI220.F_CV;76.793983459;100.0 +25/10/2020 02:06:58;U086.PI220.F_CV;76.736114502;100.0 +25/10/2020 02:06:59;U086.PI220.F_CV;76.793983459;100.0 +25/10/2020 02:06:13;U086.PI221.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U086.PI305.F_CV;7.294430733;100.0 +25/10/2020 02:06:13;U086.PI305_GAIN.F_CV;0.996999979;100.0 +25/10/2020 02:06:13;U086.PI305_OFFSET.F_CV;0.717000008;100.0 +25/10/2020 02:06:13;U086.PI306_GAIN.F_CV;0.998199999;100.0 +25/10/2020 02:06:13;U086.PI306_OFFSET.F_CV;-0.123700000;100.0 +25/10/2020 02:06:15;U086.PI320.F_CV;1.967592597;100.0 +25/10/2020 02:06:50;U086.PI320.F_CV;1.967592597;100.0 +25/10/2020 02:06:51;U086.PI320.F_CV;1.851851821;100.0 +25/10/2020 02:06:52;U086.PI320.F_CV;1.967592597;100.0 +25/10/2020 02:06:53;U086.PI320.F_CV;1.851851821;100.0 +25/10/2020 02:06:13;U086.PI321.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U086.PI405.F_CV;5.310434341;100.0 +25/10/2020 02:06:02;U086.PI405.F_CV;5.281470776;100.0 +25/10/2020 02:06:04;U086.PI405.F_CV;5.310434341;100.0 +25/10/2020 02:06:06;U086.PI405.F_CV;5.281470776;100.0 +25/10/2020 02:06:09;U086.PI405.F_CV;5.310434341;100.0 +25/10/2020 02:06:10;U086.PI405.F_CV;5.281470776;100.0 +25/10/2020 02:06:13;U086.PI405.F_CV;5.310434341;100.0 +25/10/2020 02:06:15;U086.PI405.F_CV;5.281470776;100.0 +25/10/2020 02:06:18;U086.PI405.F_CV;5.310434341;100.0 +25/10/2020 02:06:19;U086.PI405.F_CV;5.281470776;100.0 +25/10/2020 02:06:20;U086.PI405.F_CV;5.310434341;100.0 +25/10/2020 02:06:21;U086.PI405.F_CV;5.281470776;100.0 +25/10/2020 02:06:34;U086.PI405.F_CV;5.281470776;100.0 +25/10/2020 02:06:35;U086.PI405.F_CV;5.310434341;100.0 +25/10/2020 02:06:36;U086.PI405.F_CV;5.281470776;100.0 +25/10/2020 02:06:40;U086.PI405.F_CV;5.310434341;100.0 +25/10/2020 02:06:41;U086.PI405.F_CV;5.281470776;100.0 +25/10/2020 02:06:45;U086.PI405.F_CV;5.310434341;100.0 +25/10/2020 02:06:46;U086.PI405.F_CV;5.281470776;100.0 +25/10/2020 02:06:50;U086.PI405.F_CV;5.281470776;100.0 +25/10/2020 02:06:51;U086.PI405.F_CV;5.310434341;100.0 +25/10/2020 02:06:52;U086.PI405.F_CV;5.281470776;100.0 +25/10/2020 02:06:53;U086.PI405.F_CV;5.310434341;100.0 +25/10/2020 02:06:54;U086.PI405.F_CV;5.281470776;100.0 +25/10/2020 02:06:13;U086.PI405_GAIN.F_CV;1.001000047;100.0 +25/10/2020 02:06:13;U086.PI405_OFFSET.F_CV;0.010000000;100.0 +25/10/2020 02:06:13;U086.PI406_GAIN.F_CV;0.996999979;100.0 +25/10/2020 02:06:13;U086.PI406_OFFSET.F_CV;0.156000003;100.0 +25/10/2020 02:06:14;U086.PI420.F_CV;90.393516541;100.0 +25/10/2020 02:06:15;U086.PI420.F_CV;90.509262085;100.0 +25/10/2020 02:06:13;U086.PI421.F_CV;25.000000000;100.0 +25/10/2020 02:06:14;U086.PI421.F_CV;26.000000000;100.0 +25/10/2020 02:06:17;U086.PI421.F_CV;25.000000000;100.0 +25/10/2020 02:06:55;U086.PI421.F_CV;25.000000000;100.0 +25/10/2020 02:06:56;U086.PI421.F_CV;24.000000000;100.0 +25/10/2020 02:06:58;U086.PI421.F_CV;25.000000000;100.0 +25/10/2020 02:06:13;U086.PULSE_MOTEUR_P120.F_CV;364.000000000;100.0 +25/10/2020 02:06:01;U086.PULSE_MOTEUR_P220.F_CV;53.000000000;100.0 +25/10/2020 02:06:13;U086.PULSE_MOTEUR_P320.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U086.PULSE_MOTEUR_P420.F_CV;18.000000000;100.0 +25/10/2020 02:06:00;U086.TC006_OP.F_CV;27.259069443;100.0 +25/10/2020 02:06:10;U086.TC006_OP.F_CV;26.826557159;100.0 +25/10/2020 02:06:20;U086.TC006_OP.F_CV;24.607820511;100.0 +25/10/2020 02:06:30;U086.TC006_OP.F_CV;23.464071274;100.0 +25/10/2020 02:06:40;U086.TC006_OP.F_CV;22.039073944;100.0 +25/10/2020 02:06:50;U086.TC006_OP.F_CV;20.815322876;100.0 +25/10/2020 02:06:00;U086.TC006_PV.F_CV;65.400001526;100.0 +25/10/2020 02:06:20;U086.TC006_PV.F_CV;65.500000000;100.0 +25/10/2020 02:06:30;U086.TC006_PV.F_CV;65.599998474;100.0 +25/10/2020 02:06:50;U086.TC006_PV.F_CV;65.500000000;100.0 +25/10/2020 02:06:20;U086.TC006_SP.F_CV;65.000000000;100.0 +25/10/2020 02:06:00;U086.TC009_OP.F_CV;25.068546295;100.0 +25/10/2020 02:06:20;U086.TC009_OP.F_CV;25.930665970;100.0 +25/10/2020 02:06:40;U086.TC009_OP.F_CV;24.337623596;100.0 +25/10/2020 02:06:50;U086.TC009_OP.F_CV;25.137077332;100.0 +25/10/2020 02:06:00;U086.TC009_PV.F_CV;90.099998474;100.0 +25/10/2020 02:06:20;U086.TC009_PV.F_CV;90.199996948;100.0 +25/10/2020 02:06:30;U086.TC009_PV.F_CV;90.000000000;100.0 +25/10/2020 02:06:10;U086.TC009_SP.F_CV;90.000000000;100.0 +25/10/2020 02:06:40;U086.TC101_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U086.TC101_PV.F_CV;25.520999908;100.0 +25/10/2020 02:06:30;U086.TC101_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:10;U086.TC102_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U086.TC102_PV.F_CV;24.816999435;100.0 +25/10/2020 02:06:30;U086.TC102_PV.F_CV;24.916999817;100.0 +25/10/2020 02:06:50;U086.TC102_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:00;U086.TC103_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U086.TC103_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U086.TC103_PV.F_CV;24.603399277;100.0 +25/10/2020 02:06:10;U086.TC103_PV.F_CV;24.402801514;100.0 +25/10/2020 02:06:20;U086.TC103_PV.F_CV;24.603399277;100.0 +25/10/2020 02:06:30;U086.TC103_PV.F_CV;24.503101349;100.0 +25/10/2020 02:06:10;U086.TC103_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:10;U086.TC104_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U086.TC104_PV.F_CV;80.800003052;100.0 +25/10/2020 02:06:10;U086.TC104_PV.F_CV;80.699996948;100.0 +25/10/2020 02:06:30;U086.TC104_PV.F_CV;80.800003052;100.0 +25/10/2020 02:06:50;U086.TC104_PV.F_CV;80.900001526;100.0 +25/10/2020 02:06:10;U086.TC104_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U086.TC105_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U086.TC105_PV.F_CV;75.000000000;100.0 +25/10/2020 02:06:20;U086.TC105_PV.F_CV;74.900001526;100.0 +25/10/2020 02:06:40;U086.TC105_PV.F_CV;75.000000000;100.0 +25/10/2020 02:06:10;U086.TC105_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U086.TC130_OP.F_CV;14.930737495;100.0 +25/10/2020 02:06:10;U086.TC130_OP.F_CV;15.057336807;100.0 +25/10/2020 02:06:20;U086.TC130_OP.F_CV;14.994838715;100.0 +25/10/2020 02:06:20;U086.TC130_PV.F_CV;84.500000000;100.0 +25/10/2020 02:06:40;U086.TC130_PV.F_CV;84.599998474;100.0 +25/10/2020 02:06:50;U086.TC130_PV.F_CV;84.699996948;100.0 +25/10/2020 02:06:10;U086.TC130_SP.F_CV;85.000000000;100.0 +25/10/2020 02:06:10;U086.TC131_OP.F_CV;35.037788391;100.0 +25/10/2020 02:06:50;U086.TC131_OP.F_CV;34.979885101;100.0 +25/10/2020 02:06:10;U086.TC131_PV.F_CV;79.900001526;100.0 +25/10/2020 02:06:20;U086.TC131_PV.F_CV;80.000000000;100.0 +25/10/2020 02:06:50;U086.TC131_PV.F_CV;80.199996948;100.0 +25/10/2020 02:06:10;U086.TC131_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:00;U086.TC132_OP.F_CV;44.072357178;100.0 +25/10/2020 02:06:40;U086.TC132_OP.F_CV;44.291126251;100.0 +25/10/2020 02:06:50;U086.TC132_OP.F_CV;44.234016418;100.0 +25/10/2020 02:06:00;U086.TC132_PV.F_CV;79.500000000;100.0 +25/10/2020 02:06:10;U086.TC132_PV.F_CV;79.300003052;100.0 +25/10/2020 02:06:40;U086.TC132_PV.F_CV;79.199996948;100.0 +25/10/2020 02:06:50;U086.TC132_PV.F_CV;79.300003052;100.0 +25/10/2020 02:06:10;U086.TC132_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:50;U086.TC133_OP.F_CV;24.992063522;100.0 +25/10/2020 02:06:00;U086.TC133_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:20;U086.TC133_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:40;U086.TC133_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:10;U086.TC133_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:10;U086.TC134_OP.F_CV;24.835977554;100.0 +25/10/2020 02:06:20;U086.TC134_OP.F_CV;25.277854919;100.0 +25/10/2020 02:06:30;U086.TC134_OP.F_CV;25.089773178;100.0 +25/10/2020 02:06:50;U086.TC134_OP.F_CV;25.035573959;100.0 +25/10/2020 02:06:20;U086.TC134_PV.F_CV;79.800003052;100.0 +25/10/2020 02:06:50;U086.TC134_PV.F_CV;80.099998474;100.0 +25/10/2020 02:06:10;U086.TC134_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:10;U086.TC201_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U086.TC201_PV.F_CV;26.500999451;100.0 +25/10/2020 02:06:40;U086.TC201_PV.F_CV;26.600801468;100.0 +25/10/2020 02:06:30;U086.TC201_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:40;U086.TC202_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U086.TC202_PV.F_CV;25.151998520;100.0 +25/10/2020 02:06:40;U086.TC202_PV.F_CV;25.151998520;100.0 +25/10/2020 02:06:50;U086.TC202_PV.F_CV;25.251998901;100.0 +25/10/2020 02:06:40;U086.TC202_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:50;U086.TC203_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U086.TC203_PV.F_CV;26.759601593;100.0 +25/10/2020 02:06:50;U086.TC203_PV.F_CV;26.859399796;100.0 +25/10/2020 02:06:50;U086.TC203_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:10;U086.TC204_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U086.TC204_PV.F_CV;89.300003052;100.0 +25/10/2020 02:06:20;U086.TC204_PV.F_CV;89.500000000;100.0 +25/10/2020 02:06:30;U086.TC204_PV.F_CV;89.599998474;100.0 +25/10/2020 02:06:50;U086.TC204_PV.F_CV;89.699996948;100.0 +25/10/2020 02:06:10;U086.TC204_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U086.TC205_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U086.TC205_PV.F_CV;88.000000000;100.0 +25/10/2020 02:06:20;U086.TC205_PV.F_CV;88.199996948;100.0 +25/10/2020 02:06:30;U086.TC205_PV.F_CV;88.300003052;100.0 +25/10/2020 02:06:40;U086.TC205_PV.F_CV;88.400001526;100.0 +25/10/2020 02:06:10;U086.TC205_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U086.TC230_OP.F_CV;15.112195015;100.0 +25/10/2020 02:06:00;U086.TC230_PV.F_CV;84.199996948;100.0 +25/10/2020 02:06:40;U086.TC230_PV.F_CV;84.300003052;100.0 +25/10/2020 02:06:50;U086.TC230_PV.F_CV;84.400001526;100.0 +25/10/2020 02:06:10;U086.TC230_SP.F_CV;85.000000000;100.0 +25/10/2020 02:06:10;U086.TC231_OP.F_CV;13.959614754;100.0 +25/10/2020 02:06:30;U086.TC231_OP.F_CV;14.536208153;100.0 +25/10/2020 02:06:40;U086.TC231_OP.F_CV;14.476911545;100.0 +25/10/2020 02:06:50;U086.TC231_OP.F_CV;14.868208885;100.0 +25/10/2020 02:06:00;U086.TC231_PV.F_CV;80.199996948;100.0 +25/10/2020 02:06:10;U086.TC231_PV.F_CV;80.000000000;100.0 +25/10/2020 02:06:20;U086.TC231_PV.F_CV;79.699996948;100.0 +25/10/2020 02:06:30;U086.TC231_PV.F_CV;79.400001526;100.0 +25/10/2020 02:06:40;U086.TC231_PV.F_CV;79.300003052;100.0 +25/10/2020 02:06:50;U086.TC231_PV.F_CV;79.000000000;100.0 +25/10/2020 02:06:10;U086.TC231_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:10;U086.TC232_OP.F_CV;40.247177124;100.0 +25/10/2020 02:06:00;U086.TC232_PV.F_CV;79.900001526;100.0 +25/10/2020 02:06:10;U086.TC232_PV.F_CV;80.000000000;100.0 +25/10/2020 02:06:20;U086.TC232_PV.F_CV;79.900001526;100.0 +25/10/2020 02:06:30;U086.TC232_PV.F_CV;80.000000000;100.0 +25/10/2020 02:06:40;U086.TC232_PV.F_CV;79.900001526;100.0 +25/10/2020 02:06:10;U086.TC232_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:10;U086.TC233_OP.F_CV;25.107961655;100.0 +25/10/2020 02:06:40;U086.TC233_OP.F_CV;24.882713318;100.0 +25/10/2020 02:06:10;U086.TC233_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:30;U086.TC233_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:50;U086.TC233_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:10;U086.TC233_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:30;U086.TC234_OP.F_CV;25.045009613;100.0 +25/10/2020 02:06:50;U086.TC234_OP.F_CV;24.969211578;100.0 +25/10/2020 02:06:30;U086.TC234_PV.F_CV;80.199996948;100.0 +25/10/2020 02:06:10;U086.TC234_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:00;U086.TC301_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U086.TC301_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U086.TC301_OP.F_CV;0.972527504;100.0 +25/10/2020 02:06:20;U086.TC301_PV.F_CV;23.175197601;100.0 +25/10/2020 02:06:50;U086.TC301_PV.F_CV;23.074798584;100.0 +25/10/2020 02:06:10;U086.TC301_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:40;U086.TC302_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U086.TC302_PV.F_CV;23.115602493;100.0 +25/10/2020 02:06:20;U086.TC302_PV.F_CV;23.215900421;100.0 +25/10/2020 02:06:20;U086.TC302_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:10;U086.TC303_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U086.TC303_OP.F_CV;0.824028015;100.0 +25/10/2020 02:06:40;U086.TC303_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U086.TC303_OP.F_CV;0.824028015;100.0 +25/10/2020 02:06:00;U086.TC303_PV.F_CV;23.472196579;100.0 +25/10/2020 02:06:10;U086.TC303_PV.F_CV;23.271398544;100.0 +25/10/2020 02:06:20;U086.TC303_PV.F_CV;23.371799469;100.0 +25/10/2020 02:06:30;U086.TC303_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:10;U086.TC304_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U086.TC304_PV.F_CV;60.500000000;100.0 +25/10/2020 02:06:10;U086.TC304_PV.F_CV;60.400001526;100.0 +25/10/2020 02:06:30;U086.TC304_PV.F_CV;60.500000000;100.0 +25/10/2020 02:06:40;U086.TC304_PV.F_CV;60.900001526;100.0 +25/10/2020 02:06:50;U086.TC304_PV.F_CV;60.799999237;100.0 +25/10/2020 02:06:10;U086.TC304_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U086.TC305_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U086.TC305_PV.F_CV;56.400001526;100.0 +25/10/2020 02:06:30;U086.TC305_PV.F_CV;56.599998474;100.0 +25/10/2020 02:06:50;U086.TC305_PV.F_CV;56.700000763;100.0 +25/10/2020 02:06:10;U086.TC305_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U086.TC330_OP.F_CV;14.953946114;100.0 +25/10/2020 02:06:00;U086.TC330_PV.F_CV;84.699996948;100.0 +25/10/2020 02:06:40;U086.TC330_PV.F_CV;84.500000000;100.0 +25/10/2020 02:06:10;U086.TC330_SP.F_CV;85.000000000;100.0 +25/10/2020 02:06:20;U086.TC331_OP.F_CV;25.184091568;100.0 +25/10/2020 02:06:30;U086.TC331_PV.F_CV;80.000000000;100.0 +25/10/2020 02:06:10;U086.TC331_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:30;U086.TC332_OP.F_CV;34.987770081;100.0 +25/10/2020 02:06:50;U086.TC332_OP.F_CV;35.182064056;100.0 +25/10/2020 02:06:30;U086.TC332_PV.F_CV;80.099998474;100.0 +25/10/2020 02:06:40;U086.TC332_PV.F_CV;80.199996948;100.0 +25/10/2020 02:06:50;U086.TC332_PV.F_CV;80.000000000;100.0 +25/10/2020 02:06:10;U086.TC332_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:00;U086.TC333_OP.F_CV;24.951082230;100.0 +25/10/2020 02:06:10;U086.TC333_OP.F_CV;25.193311691;100.0 +25/10/2020 02:06:20;U086.TC333_OP.F_CV;24.992547989;100.0 +25/10/2020 02:06:20;U086.TC333_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:50;U086.TC333_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:10;U086.TC333_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U086.TC334_OP.F_CV;15.331951141;100.0 +25/10/2020 02:06:20;U086.TC334_OP.F_CV;15.404617310;100.0 +25/10/2020 02:06:30;U086.TC334_OP.F_CV;15.627915382;100.0 +25/10/2020 02:06:50;U086.TC334_OP.F_CV;15.209487915;100.0 +25/10/2020 02:06:00;U086.TC334_PV.F_CV;79.199996948;100.0 +25/10/2020 02:06:10;U086.TC334_PV.F_CV;79.300003052;100.0 +25/10/2020 02:06:20;U086.TC334_PV.F_CV;79.400001526;100.0 +25/10/2020 02:06:30;U086.TC334_PV.F_CV;79.599998474;100.0 +25/10/2020 02:06:40;U086.TC334_PV.F_CV;79.800003052;100.0 +25/10/2020 02:06:50;U086.TC334_PV.F_CV;80.000000000;100.0 +25/10/2020 02:06:10;U086.TC334_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:20;U086.TC401_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U086.TC401_PV.F_CV;25.190999985;100.0 +25/10/2020 02:06:20;U086.TC401_PV.F_CV;25.090999603;100.0 +25/10/2020 02:06:30;U086.TC401_PV.F_CV;25.190999985;100.0 +25/10/2020 02:06:40;U086.TC401_PV.F_CV;25.090999603;100.0 +25/10/2020 02:06:50;U086.TC401_PV.F_CV;25.190999985;100.0 +25/10/2020 02:06:50;U086.TC401_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:50;U086.TC402_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U086.TC402_PV.F_CV;25.127300262;100.0 +25/10/2020 02:06:30;U086.TC402_PV.F_CV;25.027400970;100.0 +25/10/2020 02:06:00;U086.TC402_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:00;U086.TC403_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U086.TC403_PV.F_CV;24.908700943;100.0 +25/10/2020 02:06:20;U086.TC403_PV.F_CV;24.808801651;100.0 +25/10/2020 02:06:10;U086.TC403_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:10;U086.TC404_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U086.TC404_PV.F_CV;71.400001526;100.0 +25/10/2020 02:06:10;U086.TC404_PV.F_CV;71.500000000;100.0 +25/10/2020 02:06:20;U086.TC404_PV.F_CV;71.400001526;100.0 +25/10/2020 02:06:50;U086.TC404_PV.F_CV;71.300003052;100.0 +25/10/2020 02:06:10;U086.TC404_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U086.TC405_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U086.TC405_PV.F_CV;61.299999237;100.0 +25/10/2020 02:06:40;U086.TC405_PV.F_CV;61.500000000;100.0 +25/10/2020 02:06:50;U086.TC405_PV.F_CV;61.400001526;100.0 +25/10/2020 02:06:10;U086.TC405_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U086.TC430_OP.F_CV;15.155438423;100.0 +25/10/2020 02:06:40;U086.TC430_OP.F_CV;15.043171883;100.0 +25/10/2020 02:06:50;U086.TC430_OP.F_CV;15.100669861;100.0 +25/10/2020 02:06:10;U086.TC430_PV.F_CV;85.199996948;100.0 +25/10/2020 02:06:20;U086.TC430_PV.F_CV;85.300003052;100.0 +25/10/2020 02:06:30;U086.TC430_PV.F_CV;85.400001526;100.0 +25/10/2020 02:06:50;U086.TC430_PV.F_CV;85.500000000;100.0 +25/10/2020 02:06:10;U086.TC430_SP.F_CV;85.000000000;100.0 +25/10/2020 02:06:00;U086.TC431_OP.F_CV;15.208935738;100.0 +25/10/2020 02:06:10;U086.TC431_OP.F_CV;15.027904510;100.0 +25/10/2020 02:06:50;U086.TC431_OP.F_CV;14.793174744;100.0 +25/10/2020 02:06:10;U086.TC431_PV.F_CV;79.800003052;100.0 +25/10/2020 02:06:50;U086.TC431_PV.F_CV;80.199996948;100.0 +25/10/2020 02:06:10;U086.TC431_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:00;U086.TC432_OP.F_CV;38.739902496;100.0 +25/10/2020 02:06:40;U086.TC432_OP.F_CV;38.912067413;100.0 +25/10/2020 02:06:50;U086.TC432_OP.F_CV;38.791366577;100.0 +25/10/2020 02:06:00;U086.TC432_PV.F_CV;80.199996948;100.0 +25/10/2020 02:06:30;U086.TC432_PV.F_CV;80.099998474;100.0 +25/10/2020 02:06:50;U086.TC432_PV.F_CV;80.199996948;100.0 +25/10/2020 02:06:10;U086.TC432_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:20;U086.TC433_OP.F_CV;24.795137405;100.0 +25/10/2020 02:06:40;U086.TC433_OP.F_CV;24.998735428;100.0 +25/10/2020 02:06:50;U086.TC433_OP.F_CV;24.801736832;100.0 +25/10/2020 02:06:50;U086.TC433_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:10;U086.TC433_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:10;U086.TC434_OP.F_CV;23.718618393;100.0 +25/10/2020 02:06:20;U086.TC434_OP.F_CV;23.298757553;100.0 +25/10/2020 02:06:30;U086.TC434_OP.F_CV;24.126478195;100.0 +25/10/2020 02:06:40;U086.TC434_OP.F_CV;23.721151352;100.0 +25/10/2020 02:06:00;U086.TC434_PV.F_CV;80.099998474;100.0 +25/10/2020 02:06:10;U086.TC434_PV.F_CV;80.199996948;100.0 +25/10/2020 02:06:30;U086.TC434_PV.F_CV;80.000000000;100.0 +25/10/2020 02:06:10;U086.TC434_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:00;U086.TI002.F_CV;84.400001526;100.0 +25/10/2020 02:06:22;U086.TI002.F_CV;84.400001526;100.0 +25/10/2020 02:06:23;U086.TI002.F_CV;84.300003052;100.0 +25/10/2020 02:06:25;U086.TI002.F_CV;84.400001526;100.0 +25/10/2020 02:06:29;U086.TI002.F_CV;84.500000000;100.0 +25/10/2020 02:06:30;U086.TI002.F_CV;84.400001526;100.0 +25/10/2020 02:06:32;U086.TI002.F_CV;84.300003052;100.0 +25/10/2020 02:06:33;U086.TI002.F_CV;84.400001526;100.0 +25/10/2020 02:06:55;U086.TI002.F_CV;84.400001526;100.0 +25/10/2020 02:06:56;U086.TI002.F_CV;84.300003052;100.0 +25/10/2020 02:06:57;U086.TI002.F_CV;84.400001526;100.0 +25/10/2020 02:06:00;U086.TI003.F_CV;22.600000381;100.0 +25/10/2020 02:06:04;U086.TI003.F_CV;22.600000381;100.0 +25/10/2020 02:06:05;U086.TI003.F_CV;22.399999619;100.0 +25/10/2020 02:06:06;U086.TI003.F_CV;22.600000381;100.0 +25/10/2020 02:06:07;U086.TI003.F_CV;22.500000000;100.0 +25/10/2020 02:06:08;U086.TI003.F_CV;22.700000763;100.0 +25/10/2020 02:06:09;U086.TI003.F_CV;22.399999619;100.0 +25/10/2020 02:06:10;U086.TI003.F_CV;22.200000763;100.0 +25/10/2020 02:06:11;U086.TI003.F_CV;22.299999237;100.0 +25/10/2020 02:06:12;U086.TI003.F_CV;22.600000381;100.0 +25/10/2020 02:06:13;U086.TI003.F_CV;22.299999237;100.0 +25/10/2020 02:06:14;U086.TI003.F_CV;22.600000381;100.0 +25/10/2020 02:06:15;U086.TI003.F_CV;22.299999237;100.0 +25/10/2020 02:06:17;U086.TI003.F_CV;22.399999619;100.0 +25/10/2020 02:06:19;U086.TI003.F_CV;22.299999237;100.0 +25/10/2020 02:06:20;U086.TI003.F_CV;22.399999619;100.0 +25/10/2020 02:06:23;U086.TI003.F_CV;22.299999237;100.0 +25/10/2020 02:06:24;U086.TI003.F_CV;22.399999619;100.0 +25/10/2020 02:06:25;U086.TI003.F_CV;22.600000381;100.0 +25/10/2020 02:06:27;U086.TI003.F_CV;22.399999619;100.0 +25/10/2020 02:06:28;U086.TI003.F_CV;22.500000000;100.0 +25/10/2020 02:06:29;U086.TI003.F_CV;22.399999619;100.0 +25/10/2020 02:06:33;U086.TI003.F_CV;22.399999619;100.0 +25/10/2020 02:06:34;U086.TI003.F_CV;22.299999237;100.0 +25/10/2020 02:06:35;U086.TI003.F_CV;22.600000381;100.0 +25/10/2020 02:06:36;U086.TI003.F_CV;22.399999619;100.0 +25/10/2020 02:06:40;U086.TI003.F_CV;22.399999619;100.0 +25/10/2020 02:06:41;U086.TI003.F_CV;22.299999237;100.0 +25/10/2020 02:06:42;U086.TI003.F_CV;22.399999619;100.0 +25/10/2020 02:06:44;U086.TI003.F_CV;22.500000000;100.0 +25/10/2020 02:06:45;U086.TI003.F_CV;22.399999619;100.0 +25/10/2020 02:06:46;U086.TI003.F_CV;22.600000381;100.0 +25/10/2020 02:06:47;U086.TI003.F_CV;22.299999237;100.0 +25/10/2020 02:06:48;U086.TI003.F_CV;22.399999619;100.0 +25/10/2020 02:06:51;U086.TI003.F_CV;22.600000381;100.0 +25/10/2020 02:06:52;U086.TI003.F_CV;22.399999619;100.0 +25/10/2020 02:06:54;U086.TI003.F_CV;22.200000763;100.0 +25/10/2020 02:06:56;U086.TI003.F_CV;22.500000000;100.0 +25/10/2020 02:06:57;U086.TI003.F_CV;22.399999619;100.0 +25/10/2020 02:06:59;U086.TI003.F_CV;22.500000000;100.0 +25/10/2020 02:06:01;U086.TI004.F_CV;21.100000381;100.0 +25/10/2020 02:06:02;U086.TI004.F_CV;21.200000763;100.0 +25/10/2020 02:06:04;U086.TI004.F_CV;21.100000381;100.0 +25/10/2020 02:06:05;U086.TI004.F_CV;21.200000763;100.0 +25/10/2020 02:06:18;U086.TI004.F_CV;21.200000763;100.0 +25/10/2020 02:06:19;U086.TI004.F_CV;21.100000381;100.0 +25/10/2020 02:06:20;U086.TI004.F_CV;21.200000763;100.0 +25/10/2020 02:06:35;U086.TI004.F_CV;21.200000763;100.0 +25/10/2020 02:06:36;U086.TI004.F_CV;21.100000381;100.0 +25/10/2020 02:06:37;U086.TI004.F_CV;21.200000763;100.0 +25/10/2020 02:06:41;U086.TI004.F_CV;21.100000381;100.0 +25/10/2020 02:06:43;U086.TI004.F_CV;21.200000763;100.0 +25/10/2020 02:06:46;U086.TI004.F_CV;21.100000381;100.0 +25/10/2020 02:06:47;U086.TI004.F_CV;21.200000763;100.0 +25/10/2020 02:06:57;U086.TI004.F_CV;21.200000763;100.0 +25/10/2020 02:06:58;U086.TI004.F_CV;21.100000381;100.0 +25/10/2020 02:06:59;U086.TI004.F_CV;21.200000763;100.0 +25/10/2020 02:06:31;U086.TI101.F_CV;25.520999908;100.0 +25/10/2020 02:06:37;U086.TI101.F_CV;25.520999908;100.0 +25/10/2020 02:06:38;U086.TI101.F_CV;25.621000290;100.0 +25/10/2020 02:06:39;U086.TI101.F_CV;25.520999908;100.0 +25/10/2020 02:06:55;U086.TI101.F_CV;25.520999908;100.0 +25/10/2020 02:06:56;U086.TI101.F_CV;25.421001434;100.0 +25/10/2020 02:06:57;U086.TI101.F_CV;25.520999908;100.0 +25/10/2020 02:06:58;U086.TI101.F_CV;25.421001434;100.0 +25/10/2020 02:06:59;U086.TI101.F_CV;25.520999908;100.0 +25/10/2020 02:06:13;U086.TI101_GAIN.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U086.TI101_OFFSET.F_CV;-0.279000014;100.0 +25/10/2020 02:06:08;U086.TI102.F_CV;24.916999817;100.0 +25/10/2020 02:06:09;U086.TI102.F_CV;24.816999435;100.0 +25/10/2020 02:06:10;U086.TI102.F_CV;24.916999817;100.0 +25/10/2020 02:06:19;U086.TI102.F_CV;24.916999817;100.0 +25/10/2020 02:06:20;U086.TI102.F_CV;24.816999435;100.0 +25/10/2020 02:06:21;U086.TI102.F_CV;24.916999817;100.0 +25/10/2020 02:06:54;U086.TI102.F_CV;24.916999817;100.0 +25/10/2020 02:06:55;U086.TI102.F_CV;24.816999435;100.0 +25/10/2020 02:06:57;U086.TI102.F_CV;24.916999817;100.0 +25/10/2020 02:06:13;U086.TI102_GAIN.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U086.TI102_OFFSET.F_CV;0.216999993;100.0 +25/10/2020 02:06:00;U086.TI103.F_CV;24.603399277;100.0 +25/10/2020 02:06:01;U086.TI103.F_CV;24.503101349;100.0 +25/10/2020 02:06:02;U086.TI103.F_CV;24.603399277;100.0 +25/10/2020 02:06:04;U086.TI103.F_CV;24.503101349;100.0 +25/10/2020 02:06:06;U086.TI103.F_CV;24.603399277;100.0 +25/10/2020 02:06:09;U086.TI103.F_CV;24.503101349;100.0 +25/10/2020 02:06:10;U086.TI103.F_CV;24.402801514;100.0 +25/10/2020 02:06:11;U086.TI103.F_CV;24.503101349;100.0 +25/10/2020 02:06:14;U086.TI103.F_CV;24.603399277;100.0 +25/10/2020 02:06:15;U086.TI103.F_CV;24.503101349;100.0 +25/10/2020 02:06:16;U086.TI103.F_CV;24.603399277;100.0 +25/10/2020 02:06:17;U086.TI103.F_CV;24.503101349;100.0 +25/10/2020 02:06:19;U086.TI103.F_CV;24.603399277;100.0 +25/10/2020 02:06:21;U086.TI103.F_CV;24.503101349;100.0 +25/10/2020 02:06:22;U086.TI103.F_CV;24.603399277;100.0 +25/10/2020 02:06:23;U086.TI103.F_CV;24.503101349;100.0 +25/10/2020 02:06:24;U086.TI103.F_CV;24.603399277;100.0 +25/10/2020 02:06:26;U086.TI103.F_CV;24.503101349;100.0 +25/10/2020 02:06:29;U086.TI103.F_CV;24.603399277;100.0 +25/10/2020 02:06:30;U086.TI103.F_CV;24.503101349;100.0 +25/10/2020 02:06:32;U086.TI103.F_CV;24.603399277;100.0 +25/10/2020 02:06:33;U086.TI103.F_CV;24.503101349;100.0 +25/10/2020 02:06:35;U086.TI103.F_CV;24.603399277;100.0 +25/10/2020 02:06:36;U086.TI103.F_CV;24.503101349;100.0 +25/10/2020 02:06:37;U086.TI103.F_CV;24.603399277;100.0 +25/10/2020 02:06:38;U086.TI103.F_CV;24.503101349;100.0 +25/10/2020 02:06:39;U086.TI103.F_CV;24.603399277;100.0 +25/10/2020 02:06:40;U086.TI103.F_CV;24.503101349;100.0 +25/10/2020 02:06:44;U086.TI103.F_CV;24.603399277;100.0 +25/10/2020 02:06:45;U086.TI103.F_CV;24.402801514;100.0 +25/10/2020 02:06:46;U086.TI103.F_CV;24.503101349;100.0 +25/10/2020 02:06:50;U086.TI103.F_CV;24.503101349;100.0 +25/10/2020 02:06:51;U086.TI103.F_CV;24.603399277;100.0 +25/10/2020 02:06:55;U086.TI103.F_CV;24.503101349;100.0 +25/10/2020 02:06:58;U086.TI103.F_CV;24.603399277;100.0 +25/10/2020 02:06:13;U086.TI103_GAIN.F_CV;1.003000021;100.0 +25/10/2020 02:06:13;U086.TI103_OFFSET.F_CV;-1.274000049;100.0 +25/10/2020 02:06:03;U086.TI111.F_CV;24.711997986;100.0 +25/10/2020 02:06:04;U086.TI111.F_CV;24.611797333;100.0 +25/10/2020 02:06:05;U086.TI111.F_CV;24.711997986;100.0 +25/10/2020 02:06:06;U086.TI111.F_CV;24.611797333;100.0 +25/10/2020 02:06:07;U086.TI111.F_CV;24.711997986;100.0 +25/10/2020 02:06:10;U086.TI111.F_CV;24.611797333;100.0 +25/10/2020 02:06:11;U086.TI111.F_CV;24.711997986;100.0 +25/10/2020 02:06:26;U086.TI111.F_CV;24.711997986;100.0 +25/10/2020 02:06:27;U086.TI111.F_CV;24.611797333;100.0 +25/10/2020 02:06:28;U086.TI111.F_CV;24.711997986;100.0 +25/10/2020 02:06:31;U086.TI111.F_CV;24.611797333;100.0 +25/10/2020 02:06:32;U086.TI111.F_CV;24.711997986;100.0 +25/10/2020 02:06:34;U086.TI111.F_CV;24.611797333;100.0 +25/10/2020 02:06:35;U086.TI111.F_CV;24.711997986;100.0 +25/10/2020 02:06:40;U086.TI111.F_CV;24.711997986;100.0 +25/10/2020 02:06:41;U086.TI111.F_CV;24.611797333;100.0 +25/10/2020 02:06:42;U086.TI111.F_CV;24.711997986;100.0 +25/10/2020 02:06:44;U086.TI111.F_CV;24.611797333;100.0 +25/10/2020 02:06:45;U086.TI111.F_CV;24.711997986;100.0 +25/10/2020 02:06:47;U086.TI111.F_CV;24.611797333;100.0 +25/10/2020 02:06:48;U086.TI111.F_CV;24.711997986;100.0 +25/10/2020 02:06:49;U086.TI111.F_CV;24.611797333;100.0 +25/10/2020 02:06:50;U086.TI111.F_CV;24.711997986;100.0 +25/10/2020 02:06:51;U086.TI111.F_CV;24.611797333;100.0 +25/10/2020 02:06:53;U086.TI111.F_CV;24.711997986;100.0 +25/10/2020 02:06:13;U086.TI111_GAIN.F_CV;1.001999974;100.0 +25/10/2020 02:06:13;U086.TI111_OFFSET.F_CV;-0.838999987;100.0 +25/10/2020 02:06:00;U086.TI112.F_CV;22.694101334;100.0 +25/10/2020 02:06:01;U086.TI112.F_CV;22.593801498;100.0 +25/10/2020 02:06:02;U086.TI112.F_CV;22.694101334;100.0 +25/10/2020 02:06:04;U086.TI112.F_CV;22.593801498;100.0 +25/10/2020 02:06:05;U086.TI112.F_CV;22.493499756;100.0 +25/10/2020 02:06:07;U086.TI112.F_CV;22.593801498;100.0 +25/10/2020 02:06:08;U086.TI112.F_CV;22.694101334;100.0 +25/10/2020 02:06:09;U086.TI112.F_CV;22.493499756;100.0 +25/10/2020 02:06:10;U086.TI112.F_CV;22.593801498;100.0 +25/10/2020 02:06:11;U086.TI112.F_CV;22.694101334;100.0 +25/10/2020 02:06:14;U086.TI112.F_CV;22.593801498;100.0 +25/10/2020 02:06:15;U086.TI112.F_CV;22.694101334;100.0 +25/10/2020 02:06:19;U086.TI112.F_CV;22.593801498;100.0 +25/10/2020 02:06:20;U086.TI112.F_CV;22.493499756;100.0 +25/10/2020 02:06:21;U086.TI112.F_CV;22.694101334;100.0 +25/10/2020 02:06:22;U086.TI112.F_CV;22.593801498;100.0 +25/10/2020 02:06:28;U086.TI112.F_CV;22.593801498;100.0 +25/10/2020 02:06:29;U086.TI112.F_CV;22.493499756;100.0 +25/10/2020 02:06:30;U086.TI112.F_CV;22.694101334;100.0 +25/10/2020 02:06:33;U086.TI112.F_CV;22.493499756;100.0 +25/10/2020 02:06:34;U086.TI112.F_CV;22.593801498;100.0 +25/10/2020 02:06:40;U086.TI112.F_CV;22.593801498;100.0 +25/10/2020 02:06:41;U086.TI112.F_CV;22.493499756;100.0 +25/10/2020 02:06:42;U086.TI112.F_CV;22.593801498;100.0 +25/10/2020 02:06:44;U086.TI112.F_CV;22.694101334;100.0 +25/10/2020 02:06:45;U086.TI112.F_CV;22.593801498;100.0 +25/10/2020 02:06:46;U086.TI112.F_CV;22.694101334;100.0 +25/10/2020 02:06:48;U086.TI112.F_CV;22.493499756;100.0 +25/10/2020 02:06:49;U086.TI112.F_CV;22.593801498;100.0 +25/10/2020 02:06:53;U086.TI112.F_CV;22.493499756;100.0 +25/10/2020 02:06:54;U086.TI112.F_CV;22.593801498;100.0 +25/10/2020 02:06:55;U086.TI112.F_CV;22.694101334;100.0 +25/10/2020 02:06:57;U086.TI112.F_CV;22.493499756;100.0 +25/10/2020 02:06:58;U086.TI112.F_CV;22.593801498;100.0 +25/10/2020 02:06:59;U086.TI112.F_CV;22.694101334;100.0 +25/10/2020 02:06:13;U086.TI112_GAIN.F_CV;1.003000021;100.0 +25/10/2020 02:06:13;U086.TI112_OFFSET.F_CV;-2.079999924;100.0 +25/10/2020 02:06:01;U086.TI113.F_CV;24.722999573;100.0 +25/10/2020 02:06:02;U086.TI113.F_CV;24.823200226;100.0 +25/10/2020 02:06:05;U086.TI113.F_CV;24.722999573;100.0 +25/10/2020 02:06:07;U086.TI113.F_CV;24.823200226;100.0 +25/10/2020 02:06:10;U086.TI113.F_CV;24.722999573;100.0 +25/10/2020 02:06:11;U086.TI113.F_CV;24.823200226;100.0 +25/10/2020 02:06:13;U086.TI113.F_CV;24.923400879;100.0 +25/10/2020 02:06:14;U086.TI113.F_CV;24.823200226;100.0 +25/10/2020 02:06:18;U086.TI113.F_CV;24.823200226;100.0 +25/10/2020 02:06:19;U086.TI113.F_CV;24.722999573;100.0 +25/10/2020 02:06:21;U086.TI113.F_CV;24.823200226;100.0 +25/10/2020 02:06:22;U086.TI113.F_CV;24.722999573;100.0 +25/10/2020 02:06:27;U086.TI113.F_CV;24.722999573;100.0 +25/10/2020 02:06:28;U086.TI113.F_CV;24.823200226;100.0 +25/10/2020 02:06:29;U086.TI113.F_CV;24.722999573;100.0 +25/10/2020 02:06:31;U086.TI113.F_CV;24.622798920;100.0 +25/10/2020 02:06:32;U086.TI113.F_CV;24.722999573;100.0 +25/10/2020 02:06:33;U086.TI113.F_CV;24.622798920;100.0 +25/10/2020 02:06:34;U086.TI113.F_CV;24.722999573;100.0 +25/10/2020 02:06:43;U086.TI113.F_CV;24.722999573;100.0 +25/10/2020 02:06:44;U086.TI113.F_CV;24.823200226;100.0 +25/10/2020 02:06:45;U086.TI113.F_CV;24.722999573;100.0 +25/10/2020 02:06:48;U086.TI113.F_CV;24.622798920;100.0 +25/10/2020 02:06:49;U086.TI113.F_CV;24.722999573;100.0 +25/10/2020 02:06:52;U086.TI113.F_CV;24.823200226;100.0 +25/10/2020 02:06:53;U086.TI113.F_CV;24.722999573;100.0 +25/10/2020 02:06:55;U086.TI113.F_CV;24.923400879;100.0 +25/10/2020 02:06:57;U086.TI113.F_CV;24.722999573;100.0 +25/10/2020 02:06:59;U086.TI113.F_CV;24.823200226;100.0 +25/10/2020 02:06:13;U086.TI113_GAIN.F_CV;1.001999974;100.0 +25/10/2020 02:06:13;U086.TI113_OFFSET.F_CV;-0.828000009;100.0 +25/10/2020 02:06:01;U086.TI120.F_CV;69.500000000;100.0 +25/10/2020 02:06:05;U086.TI120.F_CV;69.400001526;100.0 +25/10/2020 02:06:08;U086.TI120.F_CV;69.500000000;100.0 +25/10/2020 02:06:09;U086.TI120.F_CV;69.400001526;100.0 +25/10/2020 02:06:10;U086.TI120.F_CV;69.500000000;100.0 +25/10/2020 02:06:11;U086.TI120.F_CV;69.300003052;100.0 +25/10/2020 02:06:12;U086.TI120.F_CV;69.500000000;100.0 +25/10/2020 02:06:14;U086.TI120.F_CV;69.400001526;100.0 +25/10/2020 02:06:19;U086.TI120.F_CV;69.400001526;100.0 +25/10/2020 02:06:20;U086.TI120.F_CV;69.500000000;100.0 +25/10/2020 02:06:21;U086.TI120.F_CV;69.400001526;100.0 +25/10/2020 02:06:29;U086.TI120.F_CV;69.400001526;100.0 +25/10/2020 02:06:30;U086.TI120.F_CV;69.300003052;100.0 +25/10/2020 02:06:31;U086.TI120.F_CV;69.400001526;100.0 +25/10/2020 02:06:35;U086.TI120.F_CV;69.300003052;100.0 +25/10/2020 02:06:43;U086.TI120.F_CV;69.300003052;100.0 +25/10/2020 02:06:44;U086.TI120.F_CV;69.400001526;100.0 +25/10/2020 02:06:46;U086.TI120.F_CV;69.300003052;100.0 +25/10/2020 02:06:49;U086.TI120.F_CV;69.400001526;100.0 +25/10/2020 02:06:50;U086.TI120.F_CV;69.300003052;100.0 +25/10/2020 02:06:00;U086.TI125.F_CV;94.099998474;100.0 +25/10/2020 02:06:06;U086.TI125.F_CV;94.099998474;100.0 +25/10/2020 02:06:07;U086.TI125.F_CV;94.199996948;100.0 +25/10/2020 02:06:09;U086.TI125.F_CV;94.099998474;100.0 +25/10/2020 02:06:13;U086.TI125.F_CV;94.199996948;100.0 +25/10/2020 02:06:14;U086.TI125.F_CV;94.099998474;100.0 +25/10/2020 02:06:15;U086.TI125.F_CV;94.199996948;100.0 +25/10/2020 02:06:16;U086.TI125.F_CV;94.099998474;100.0 +25/10/2020 02:06:41;U086.TI125.F_CV;94.099998474;100.0 +25/10/2020 02:06:42;U086.TI125.F_CV;94.000000000;100.0 +25/10/2020 02:06:44;U086.TI125.F_CV;94.099998474;100.0 +25/10/2020 02:06:51;U086.TI125.F_CV;94.099998474;100.0 +25/10/2020 02:06:52;U086.TI125.F_CV;94.000000000;100.0 +25/10/2020 02:06:53;U086.TI125.F_CV;94.099998474;100.0 +25/10/2020 02:06:57;U086.TI125.F_CV;94.099998474;100.0 +25/10/2020 02:06:58;U086.TI125.F_CV;94.000000000;100.0 +25/10/2020 02:06:59;U086.TI125.F_CV;94.099998474;100.0 +25/10/2020 02:06:02;U086.TI201.F_CV;26.600801468;100.0 +25/10/2020 02:06:03;U086.TI201.F_CV;26.500999451;100.0 +25/10/2020 02:06:04;U086.TI201.F_CV;26.600801468;100.0 +25/10/2020 02:06:05;U086.TI201.F_CV;26.500999451;100.0 +25/10/2020 02:06:06;U086.TI201.F_CV;26.600801468;100.0 +25/10/2020 02:06:15;U086.TI201.F_CV;26.600801468;100.0 +25/10/2020 02:06:16;U086.TI201.F_CV;26.500999451;100.0 +25/10/2020 02:06:17;U086.TI201.F_CV;26.600801468;100.0 +25/10/2020 02:06:19;U086.TI201.F_CV;26.500999451;100.0 +25/10/2020 02:06:20;U086.TI201.F_CV;26.600801468;100.0 +25/10/2020 02:06:24;U086.TI201.F_CV;26.500999451;100.0 +25/10/2020 02:06:25;U086.TI201.F_CV;26.600801468;100.0 +25/10/2020 02:06:26;U086.TI201.F_CV;26.500999451;100.0 +25/10/2020 02:06:27;U086.TI201.F_CV;26.600801468;100.0 +25/10/2020 02:06:30;U086.TI201.F_CV;26.500999451;100.0 +25/10/2020 02:06:31;U086.TI201.F_CV;26.600801468;100.0 +25/10/2020 02:06:34;U086.TI201.F_CV;26.500999451;100.0 +25/10/2020 02:06:36;U086.TI201.F_CV;26.600801468;100.0 +25/10/2020 02:06:42;U086.TI201.F_CV;26.600801468;100.0 +25/10/2020 02:06:43;U086.TI201.F_CV;26.500999451;100.0 +25/10/2020 02:06:46;U086.TI201.F_CV;26.600801468;100.0 +25/10/2020 02:06:49;U086.TI201.F_CV;26.500999451;100.0 +25/10/2020 02:06:50;U086.TI201.F_CV;26.600801468;100.0 +25/10/2020 02:06:51;U086.TI201.F_CV;26.500999451;100.0 +25/10/2020 02:06:53;U086.TI201.F_CV;26.600801468;100.0 +25/10/2020 02:06:57;U086.TI201.F_CV;26.500999451;100.0 +25/10/2020 02:06:59;U086.TI201.F_CV;26.600801468;100.0 +25/10/2020 02:06:13;U086.TI201_GAIN.F_CV;0.998000026;100.0 +25/10/2020 02:06:13;U086.TI201_OFFSET.F_CV;0.552999973;100.0 +25/10/2020 02:06:00;U086.TI202.F_CV;25.151998520;100.0 +25/10/2020 02:06:01;U086.TI202.F_CV;25.052000046;100.0 +25/10/2020 02:06:02;U086.TI202.F_CV;25.251998901;100.0 +25/10/2020 02:06:03;U086.TI202.F_CV;25.151998520;100.0 +25/10/2020 02:06:07;U086.TI202.F_CV;25.151998520;100.0 +25/10/2020 02:06:08;U086.TI202.F_CV;25.251998901;100.0 +25/10/2020 02:06:09;U086.TI202.F_CV;25.151998520;100.0 +25/10/2020 02:06:13;U086.TI202.F_CV;25.052000046;100.0 +25/10/2020 02:06:14;U086.TI202.F_CV;25.151998520;100.0 +25/10/2020 02:06:30;U086.TI202.F_CV;25.151998520;100.0 +25/10/2020 02:06:31;U086.TI202.F_CV;25.251998901;100.0 +25/10/2020 02:06:32;U086.TI202.F_CV;25.151998520;100.0 +25/10/2020 02:06:40;U086.TI202.F_CV;25.151998520;100.0 +25/10/2020 02:06:41;U086.TI202.F_CV;25.251998901;100.0 +25/10/2020 02:06:42;U086.TI202.F_CV;25.151998520;100.0 +25/10/2020 02:06:49;U086.TI202.F_CV;25.151998520;100.0 +25/10/2020 02:06:50;U086.TI202.F_CV;25.251998901;100.0 +25/10/2020 02:06:51;U086.TI202.F_CV;25.151998520;100.0 +25/10/2020 02:06:55;U086.TI202.F_CV;25.151998520;100.0 +25/10/2020 02:06:56;U086.TI202.F_CV;25.251998901;100.0 +25/10/2020 02:06:57;U086.TI202.F_CV;25.151998520;100.0 +25/10/2020 02:06:13;U086.TI202_GAIN.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U086.TI202_OFFSET.F_CV;-0.148000002;100.0 +25/10/2020 02:06:00;U086.TI203.F_CV;26.759601593;100.0 +25/10/2020 02:06:02;U086.TI203.F_CV;26.859399796;100.0 +25/10/2020 02:06:04;U086.TI203.F_CV;26.759601593;100.0 +25/10/2020 02:06:06;U086.TI203.F_CV;26.859399796;100.0 +25/10/2020 02:06:07;U086.TI203.F_CV;26.759601593;100.0 +25/10/2020 02:06:08;U086.TI203.F_CV;26.859399796;100.0 +25/10/2020 02:06:09;U086.TI203.F_CV;26.759601593;100.0 +25/10/2020 02:06:16;U086.TI203.F_CV;26.759601593;100.0 +25/10/2020 02:06:17;U086.TI203.F_CV;26.859399796;100.0 +25/10/2020 02:06:18;U086.TI203.F_CV;26.759601593;100.0 +25/10/2020 02:06:22;U086.TI203.F_CV;26.859399796;100.0 +25/10/2020 02:06:23;U086.TI203.F_CV;26.759601593;100.0 +25/10/2020 02:06:26;U086.TI203.F_CV;26.859399796;100.0 +25/10/2020 02:06:27;U086.TI203.F_CV;26.759601593;100.0 +25/10/2020 02:06:34;U086.TI203.F_CV;26.759601593;100.0 +25/10/2020 02:06:35;U086.TI203.F_CV;26.859399796;100.0 +25/10/2020 02:06:36;U086.TI203.F_CV;26.759601593;100.0 +25/10/2020 02:06:39;U086.TI203.F_CV;26.859399796;100.0 +25/10/2020 02:06:40;U086.TI203.F_CV;26.759601593;100.0 +25/10/2020 02:06:49;U086.TI203.F_CV;26.759601593;100.0 +25/10/2020 02:06:50;U086.TI203.F_CV;26.859399796;100.0 +25/10/2020 02:06:51;U086.TI203.F_CV;26.759601593;100.0 +25/10/2020 02:06:53;U086.TI203.F_CV;26.859399796;100.0 +25/10/2020 02:06:54;U086.TI203.F_CV;26.759601593;100.0 +25/10/2020 02:06:13;U086.TI203_GAIN.F_CV;0.998000026;100.0 +25/10/2020 02:06:13;U086.TI203_OFFSET.F_CV;0.611999989;100.0 +25/10/2020 02:06:03;U086.TI211.F_CV;25.526901245;100.0 +25/10/2020 02:06:04;U086.TI211.F_CV;25.426601410;100.0 +25/10/2020 02:06:05;U086.TI211.F_CV;25.526901245;100.0 +25/10/2020 02:06:07;U086.TI211.F_CV;25.426601410;100.0 +25/10/2020 02:06:08;U086.TI211.F_CV;25.526901245;100.0 +25/10/2020 02:06:10;U086.TI211.F_CV;25.426601410;100.0 +25/10/2020 02:06:11;U086.TI211.F_CV;25.526901245;100.0 +25/10/2020 02:06:14;U086.TI211.F_CV;25.426601410;100.0 +25/10/2020 02:06:16;U086.TI211.F_CV;25.526901245;100.0 +25/10/2020 02:06:19;U086.TI211.F_CV;25.426601410;100.0 +25/10/2020 02:06:20;U086.TI211.F_CV;25.526901245;100.0 +25/10/2020 02:06:23;U086.TI211.F_CV;25.426601410;100.0 +25/10/2020 02:06:25;U086.TI211.F_CV;25.526901245;100.0 +25/10/2020 02:06:29;U086.TI211.F_CV;25.526901245;100.0 +25/10/2020 02:06:30;U086.TI211.F_CV;25.426601410;100.0 +25/10/2020 02:06:31;U086.TI211.F_CV;25.526901245;100.0 +25/10/2020 02:06:32;U086.TI211.F_CV;25.426601410;100.0 +25/10/2020 02:06:33;U086.TI211.F_CV;25.526901245;100.0 +25/10/2020 02:06:45;U086.TI211.F_CV;25.526901245;100.0 +25/10/2020 02:06:46;U086.TI211.F_CV;25.426601410;100.0 +25/10/2020 02:06:47;U086.TI211.F_CV;25.526901245;100.0 +25/10/2020 02:06:49;U086.TI211.F_CV;25.426601410;100.0 +25/10/2020 02:06:50;U086.TI211.F_CV;25.526901245;100.0 +25/10/2020 02:06:54;U086.TI211.F_CV;25.426601410;100.0 +25/10/2020 02:06:55;U086.TI211.F_CV;25.526901245;100.0 +25/10/2020 02:06:56;U086.TI211.F_CV;25.426601410;100.0 +25/10/2020 02:06:57;U086.TI211.F_CV;25.526901245;100.0 +25/10/2020 02:06:13;U086.TI211_GAIN.F_CV;1.003000021;100.0 +25/10/2020 02:06:13;U086.TI211_OFFSET.F_CV;-0.851999998;100.0 +25/10/2020 02:06:00;U086.TI212.F_CV;25.489999771;100.0 +25/10/2020 02:06:03;U086.TI212.F_CV;25.390001297;100.0 +25/10/2020 02:06:04;U086.TI212.F_CV;25.489999771;100.0 +25/10/2020 02:06:06;U086.TI212.F_CV;25.390001297;100.0 +25/10/2020 02:06:07;U086.TI212.F_CV;25.489999771;100.0 +25/10/2020 02:06:09;U086.TI212.F_CV;25.390001297;100.0 +25/10/2020 02:06:15;U086.TI212.F_CV;25.390001297;100.0 +25/10/2020 02:06:16;U086.TI212.F_CV;25.489999771;100.0 +25/10/2020 02:06:17;U086.TI212.F_CV;25.390001297;100.0 +25/10/2020 02:06:21;U086.TI212.F_CV;25.390001297;100.0 +25/10/2020 02:06:22;U086.TI212.F_CV;25.489999771;100.0 +25/10/2020 02:06:23;U086.TI212.F_CV;25.390001297;100.0 +25/10/2020 02:06:24;U086.TI212.F_CV;25.489999771;100.0 +25/10/2020 02:06:25;U086.TI212.F_CV;25.390001297;100.0 +25/10/2020 02:06:29;U086.TI212.F_CV;25.489999771;100.0 +25/10/2020 02:06:30;U086.TI212.F_CV;25.390001297;100.0 +25/10/2020 02:06:39;U086.TI212.F_CV;25.390001297;100.0 +25/10/2020 02:06:40;U086.TI212.F_CV;25.489999771;100.0 +25/10/2020 02:06:41;U086.TI212.F_CV;25.390001297;100.0 +25/10/2020 02:06:43;U086.TI212.F_CV;25.489999771;100.0 +25/10/2020 02:06:44;U086.TI212.F_CV;25.390001297;100.0 +25/10/2020 02:06:52;U086.TI212.F_CV;25.390001297;100.0 +25/10/2020 02:06:53;U086.TI212.F_CV;25.489999771;100.0 +25/10/2020 02:06:56;U086.TI212.F_CV;25.390001297;100.0 +25/10/2020 02:06:57;U086.TI212.F_CV;25.489999771;100.0 +25/10/2020 02:06:58;U086.TI212.F_CV;25.390001297;100.0 +25/10/2020 02:06:13;U086.TI212_GAIN.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U086.TI212_OFFSET.F_CV;0.189999998;100.0 +25/10/2020 02:06:01;U086.TI213.F_CV;25.768402100;100.0 +25/10/2020 02:06:02;U086.TI213.F_CV;25.668300629;100.0 +25/10/2020 02:06:16;U086.TI213.F_CV;25.668300629;100.0 +25/10/2020 02:06:17;U086.TI213.F_CV;25.568202972;100.0 +25/10/2020 02:06:18;U086.TI213.F_CV;25.668300629;100.0 +25/10/2020 02:06:19;U086.TI213.F_CV;25.768402100;100.0 +25/10/2020 02:06:20;U086.TI213.F_CV;25.668300629;100.0 +25/10/2020 02:06:49;U086.TI213.F_CV;25.668300629;100.0 +25/10/2020 02:06:50;U086.TI213.F_CV;25.568202972;100.0 +25/10/2020 02:06:51;U086.TI213.F_CV;25.668300629;100.0 +25/10/2020 02:06:54;U086.TI213.F_CV;25.568202972;100.0 +25/10/2020 02:06:55;U086.TI213.F_CV;25.668300629;100.0 +25/10/2020 02:06:59;U086.TI213.F_CV;25.668300629;100.0 +25/10/2020 02:06:13;U086.TI213_GAIN.F_CV;1.001000047;100.0 +25/10/2020 02:06:13;U086.TI213_OFFSET.F_CV;-0.657999992;100.0 +25/10/2020 02:06:02;U086.TI220.F_CV;69.900001526;100.0 +25/10/2020 02:06:03;U086.TI220.F_CV;69.800003052;100.0 +25/10/2020 02:06:04;U086.TI220.F_CV;69.900001526;100.0 +25/10/2020 02:06:08;U086.TI220.F_CV;69.800003052;100.0 +25/10/2020 02:06:12;U086.TI220.F_CV;69.800003052;100.0 +25/10/2020 02:06:13;U086.TI220.F_CV;69.900001526;100.0 +25/10/2020 02:06:18;U086.TI220.F_CV;69.900001526;100.0 +25/10/2020 02:06:19;U086.TI220.F_CV;69.800003052;100.0 +25/10/2020 02:06:20;U086.TI220.F_CV;69.900001526;100.0 +25/10/2020 02:06:23;U086.TI220.F_CV;69.800003052;100.0 +25/10/2020 02:06:27;U086.TI220.F_CV;69.900001526;100.0 +25/10/2020 02:06:31;U086.TI220.F_CV;69.800003052;100.0 +25/10/2020 02:06:32;U086.TI220.F_CV;69.900001526;100.0 +25/10/2020 02:06:33;U086.TI220.F_CV;69.800003052;100.0 +25/10/2020 02:06:35;U086.TI220.F_CV;69.900001526;100.0 +25/10/2020 02:06:36;U086.TI220.F_CV;69.800003052;100.0 +25/10/2020 02:06:37;U086.TI220.F_CV;69.900001526;100.0 +25/10/2020 02:06:39;U086.TI220.F_CV;69.800003052;100.0 +25/10/2020 02:06:41;U086.TI220.F_CV;69.900001526;100.0 +25/10/2020 02:06:45;U086.TI220.F_CV;69.800003052;100.0 +25/10/2020 02:06:46;U086.TI220.F_CV;69.900001526;100.0 +25/10/2020 02:06:50;U086.TI220.F_CV;69.800003052;100.0 +25/10/2020 02:06:51;U086.TI220.F_CV;69.900001526;100.0 +25/10/2020 02:06:53;U086.TI220.F_CV;69.800003052;100.0 +25/10/2020 02:06:55;U086.TI220.F_CV;69.900001526;100.0 +25/10/2020 02:06:59;U086.TI220.F_CV;69.900001526;100.0 +25/10/2020 02:06:25;U086.TI225.F_CV;98.800003052;100.0 +25/10/2020 02:06:26;U086.TI225.F_CV;98.900001526;100.0 +25/10/2020 02:06:27;U086.TI225.F_CV;98.800003052;100.0 +25/10/2020 02:06:28;U086.TI225.F_CV;98.900001526;100.0 +25/10/2020 02:06:29;U086.TI225.F_CV;98.800003052;100.0 +25/10/2020 02:06:30;U086.TI225.F_CV;98.900001526;100.0 +25/10/2020 02:06:31;U086.TI225.F_CV;98.800003052;100.0 +25/10/2020 02:06:48;U086.TI225.F_CV;98.800003052;100.0 +25/10/2020 02:06:49;U086.TI225.F_CV;98.900001526;100.0 +25/10/2020 02:06:50;U086.TI225.F_CV;98.800003052;100.0 +25/10/2020 02:06:51;U086.TI225.F_CV;98.900001526;100.0 +25/10/2020 02:06:52;U086.TI225.F_CV;98.800003052;100.0 +25/10/2020 02:06:58;U086.TI225.F_CV;98.800003052;100.0 +25/10/2020 02:06:59;U086.TI225.F_CV;98.699996948;100.0 +25/10/2020 02:06:01;U086.TI301.F_CV;23.074798584;100.0 +25/10/2020 02:06:03;U086.TI301.F_CV;23.175197601;100.0 +25/10/2020 02:06:04;U086.TI301.F_CV;23.074798584;100.0 +25/10/2020 02:06:06;U086.TI301.F_CV;23.275596619;100.0 +25/10/2020 02:06:07;U086.TI301.F_CV;23.175197601;100.0 +25/10/2020 02:06:11;U086.TI301.F_CV;23.074798584;100.0 +25/10/2020 02:06:12;U086.TI301.F_CV;23.275596619;100.0 +25/10/2020 02:06:13;U086.TI301.F_CV;23.074798584;100.0 +25/10/2020 02:06:14;U086.TI301.F_CV;23.175197601;100.0 +25/10/2020 02:06:15;U086.TI301.F_CV;23.074798584;100.0 +25/10/2020 02:06:16;U086.TI301.F_CV;23.275596619;100.0 +25/10/2020 02:06:17;U086.TI301.F_CV;23.175197601;100.0 +25/10/2020 02:06:21;U086.TI301.F_CV;23.175197601;100.0 +25/10/2020 02:06:22;U086.TI301.F_CV;23.074798584;100.0 +25/10/2020 02:06:23;U086.TI301.F_CV;23.275596619;100.0 +25/10/2020 02:06:24;U086.TI301.F_CV;23.074798584;100.0 +25/10/2020 02:06:27;U086.TI301.F_CV;23.175197601;100.0 +25/10/2020 02:06:29;U086.TI301.F_CV;23.074798584;100.0 +25/10/2020 02:06:30;U086.TI301.F_CV;23.175197601;100.0 +25/10/2020 02:06:31;U086.TI301.F_CV;23.074798584;100.0 +25/10/2020 02:06:32;U086.TI301.F_CV;23.175197601;100.0 +25/10/2020 02:06:36;U086.TI301.F_CV;23.074798584;100.0 +25/10/2020 02:06:40;U086.TI301.F_CV;23.175197601;100.0 +25/10/2020 02:06:43;U086.TI301.F_CV;23.074798584;100.0 +25/10/2020 02:06:44;U086.TI301.F_CV;23.175197601;100.0 +25/10/2020 02:06:47;U086.TI301.F_CV;23.074798584;100.0 +25/10/2020 02:06:48;U086.TI301.F_CV;23.175197601;100.0 +25/10/2020 02:06:50;U086.TI301.F_CV;23.074798584;100.0 +25/10/2020 02:06:51;U086.TI301.F_CV;23.175197601;100.0 +25/10/2020 02:06:52;U086.TI301.F_CV;23.074798584;100.0 +25/10/2020 02:06:53;U086.TI301.F_CV;23.175197601;100.0 +25/10/2020 02:06:54;U086.TI301.F_CV;23.074798584;100.0 +25/10/2020 02:06:56;U086.TI301.F_CV;23.175197601;100.0 +25/10/2020 02:06:57;U086.TI301.F_CV;23.275596619;100.0 +25/10/2020 02:06:58;U086.TI301.F_CV;23.074798584;100.0 +25/10/2020 02:06:59;U086.TI301.F_CV;23.175197601;100.0 +25/10/2020 02:06:13;U086.TI301_GAIN.F_CV;1.003999949;100.0 +25/10/2020 02:06:13;U086.TI301_OFFSET.F_CV;-1.723999977;100.0 +25/10/2020 02:06:00;U086.TI302.F_CV;23.215900421;100.0 +25/10/2020 02:06:01;U086.TI302.F_CV;23.115602493;100.0 +25/10/2020 02:06:04;U086.TI302.F_CV;23.215900421;100.0 +25/10/2020 02:06:05;U086.TI302.F_CV;23.115602493;100.0 +25/10/2020 02:06:06;U086.TI302.F_CV;23.316200256;100.0 +25/10/2020 02:06:07;U086.TI302.F_CV;23.215900421;100.0 +25/10/2020 02:06:10;U086.TI302.F_CV;23.115602493;100.0 +25/10/2020 02:06:11;U086.TI302.F_CV;23.215900421;100.0 +25/10/2020 02:06:12;U086.TI302.F_CV;23.316200256;100.0 +25/10/2020 02:06:13;U086.TI302.F_CV;23.115602493;100.0 +25/10/2020 02:06:14;U086.TI302.F_CV;23.215900421;100.0 +25/10/2020 02:06:16;U086.TI302.F_CV;23.316200256;100.0 +25/10/2020 02:06:17;U086.TI302.F_CV;23.115602493;100.0 +25/10/2020 02:06:18;U086.TI302.F_CV;23.215900421;100.0 +25/10/2020 02:06:19;U086.TI302.F_CV;23.115602493;100.0 +25/10/2020 02:06:20;U086.TI302.F_CV;23.215900421;100.0 +25/10/2020 02:06:21;U086.TI302.F_CV;23.115602493;100.0 +25/10/2020 02:06:22;U086.TI302.F_CV;23.215900421;100.0 +25/10/2020 02:06:23;U086.TI302.F_CV;23.316200256;100.0 +25/10/2020 02:06:24;U086.TI302.F_CV;23.215900421;100.0 +25/10/2020 02:06:27;U086.TI302.F_CV;23.115602493;100.0 +25/10/2020 02:06:30;U086.TI302.F_CV;23.215900421;100.0 +25/10/2020 02:06:31;U086.TI302.F_CV;23.115602493;100.0 +25/10/2020 02:06:33;U086.TI302.F_CV;23.215900421;100.0 +25/10/2020 02:06:37;U086.TI302.F_CV;23.115602493;100.0 +25/10/2020 02:06:39;U086.TI302.F_CV;23.215900421;100.0 +25/10/2020 02:06:42;U086.TI302.F_CV;23.316200256;100.0 +25/10/2020 02:06:43;U086.TI302.F_CV;23.115602493;100.0 +25/10/2020 02:06:44;U086.TI302.F_CV;23.215900421;100.0 +25/10/2020 02:06:46;U086.TI302.F_CV;23.115602493;100.0 +25/10/2020 02:06:47;U086.TI302.F_CV;23.215900421;100.0 +25/10/2020 02:06:51;U086.TI302.F_CV;23.115602493;100.0 +25/10/2020 02:06:56;U086.TI302.F_CV;23.115602493;100.0 +25/10/2020 02:06:57;U086.TI302.F_CV;23.316200256;100.0 +25/10/2020 02:06:58;U086.TI302.F_CV;23.115602493;100.0 +25/10/2020 02:06:59;U086.TI302.F_CV;23.215900421;100.0 +25/10/2020 02:06:13;U086.TI302_GAIN.F_CV;1.003000021;100.0 +25/10/2020 02:06:13;U086.TI302_OFFSET.F_CV;-1.156999946;100.0 +25/10/2020 02:06:01;U086.TI303.F_CV;23.371799469;100.0 +25/10/2020 02:06:03;U086.TI303.F_CV;23.472196579;100.0 +25/10/2020 02:06:05;U086.TI303.F_CV;23.371799469;100.0 +25/10/2020 02:06:09;U086.TI303.F_CV;23.472196579;100.0 +25/10/2020 02:06:11;U086.TI303.F_CV;23.371799469;100.0 +25/10/2020 02:06:13;U086.TI303.F_CV;23.472196579;100.0 +25/10/2020 02:06:14;U086.TI303.F_CV;23.371799469;100.0 +25/10/2020 02:06:15;U086.TI303.F_CV;23.472196579;100.0 +25/10/2020 02:06:16;U086.TI303.F_CV;23.371799469;100.0 +25/10/2020 02:06:25;U086.TI303.F_CV;23.371799469;100.0 +25/10/2020 02:06:26;U086.TI303.F_CV;23.572597504;100.0 +25/10/2020 02:06:27;U086.TI303.F_CV;23.371799469;100.0 +25/10/2020 02:06:31;U086.TI303.F_CV;23.371799469;100.0 +25/10/2020 02:06:32;U086.TI303.F_CV;23.472196579;100.0 +25/10/2020 02:06:33;U086.TI303.F_CV;23.371799469;100.0 +25/10/2020 02:06:35;U086.TI303.F_CV;23.472196579;100.0 +25/10/2020 02:06:37;U086.TI303.F_CV;23.371799469;100.0 +25/10/2020 02:06:38;U086.TI303.F_CV;23.472196579;100.0 +25/10/2020 02:06:39;U086.TI303.F_CV;23.371799469;100.0 +25/10/2020 02:06:42;U086.TI303.F_CV;23.472196579;100.0 +25/10/2020 02:06:43;U086.TI303.F_CV;23.371799469;100.0 +25/10/2020 02:06:48;U086.TI303.F_CV;23.371799469;100.0 +25/10/2020 02:06:49;U086.TI303.F_CV;23.572597504;100.0 +25/10/2020 02:06:50;U086.TI303.F_CV;23.371799469;100.0 +25/10/2020 02:06:51;U086.TI303.F_CV;23.472196579;100.0 +25/10/2020 02:06:55;U086.TI303.F_CV;23.371799469;100.0 +25/10/2020 02:06:13;U086.TI303_GAIN.F_CV;1.003999949;100.0 +25/10/2020 02:06:13;U086.TI303_OFFSET.F_CV;-1.929000020;100.0 +25/10/2020 02:06:29;U086.TI311.F_CV;23.122596741;100.0 +25/10/2020 02:06:30;U086.TI311.F_CV;23.222997665;100.0 +25/10/2020 02:06:31;U086.TI311.F_CV;23.122596741;100.0 +25/10/2020 02:06:57;U086.TI311.F_CV;23.122596741;100.0 +25/10/2020 02:06:58;U086.TI311.F_CV;23.222997665;100.0 +25/10/2020 02:06:59;U086.TI311.F_CV;23.122596741;100.0 +25/10/2020 02:06:13;U086.TI311_GAIN.F_CV;1.003999949;100.0 +25/10/2020 02:06:13;U086.TI311_OFFSET.F_CV;-1.876999974;100.0 +25/10/2020 02:06:00;U086.TI312.F_CV;24.124597549;100.0 +25/10/2020 02:06:02;U086.TI312.F_CV;24.024398804;100.0 +25/10/2020 02:06:04;U086.TI312.F_CV;24.124597549;100.0 +25/10/2020 02:06:06;U086.TI312.F_CV;24.024398804;100.0 +25/10/2020 02:06:07;U086.TI312.F_CV;24.124597549;100.0 +25/10/2020 02:06:09;U086.TI312.F_CV;24.024398804;100.0 +25/10/2020 02:06:10;U086.TI312.F_CV;24.124597549;100.0 +25/10/2020 02:06:11;U086.TI312.F_CV;24.024398804;100.0 +25/10/2020 02:06:12;U086.TI312.F_CV;24.124597549;100.0 +25/10/2020 02:06:15;U086.TI312.F_CV;24.024398804;100.0 +25/10/2020 02:06:16;U086.TI312.F_CV;24.124597549;100.0 +25/10/2020 02:06:17;U086.TI312.F_CV;24.024398804;100.0 +25/10/2020 02:06:18;U086.TI312.F_CV;24.124597549;100.0 +25/10/2020 02:06:22;U086.TI312.F_CV;24.124597549;100.0 +25/10/2020 02:06:23;U086.TI312.F_CV;24.024398804;100.0 +25/10/2020 02:06:26;U086.TI312.F_CV;24.124597549;100.0 +25/10/2020 02:06:29;U086.TI312.F_CV;24.024398804;100.0 +25/10/2020 02:06:33;U086.TI312.F_CV;24.024398804;100.0 +25/10/2020 02:06:34;U086.TI312.F_CV;24.124597549;100.0 +25/10/2020 02:06:36;U086.TI312.F_CV;24.024398804;100.0 +25/10/2020 02:06:41;U086.TI312.F_CV;24.024398804;100.0 +25/10/2020 02:06:42;U086.TI312.F_CV;24.124597549;100.0 +25/10/2020 02:06:43;U086.TI312.F_CV;24.024398804;100.0 +25/10/2020 02:06:45;U086.TI312.F_CV;24.124597549;100.0 +25/10/2020 02:06:47;U086.TI312.F_CV;24.024398804;100.0 +25/10/2020 02:06:48;U086.TI312.F_CV;24.124597549;100.0 +25/10/2020 02:06:49;U086.TI312.F_CV;24.024398804;100.0 +25/10/2020 02:06:51;U086.TI312.F_CV;24.124597549;100.0 +25/10/2020 02:06:53;U086.TI312.F_CV;24.024398804;100.0 +25/10/2020 02:06:55;U086.TI312.F_CV;24.124597549;100.0 +25/10/2020 02:06:56;U086.TI312.F_CV;24.024398804;100.0 +25/10/2020 02:06:58;U086.TI312.F_CV;24.124597549;100.0 +25/10/2020 02:06:13;U086.TI312_GAIN.F_CV;1.001999974;100.0 +25/10/2020 02:06:13;U086.TI312_OFFSET.F_CV;-0.725000024;100.0 +25/10/2020 02:06:00;U086.TI313.F_CV;23.640197754;100.0 +25/10/2020 02:06:03;U086.TI313.F_CV;23.539800644;100.0 +25/10/2020 02:06:08;U086.TI313.F_CV;23.539800644;100.0 +25/10/2020 02:06:09;U086.TI313.F_CV;23.640197754;100.0 +25/10/2020 02:06:11;U086.TI313.F_CV;23.439399719;100.0 +25/10/2020 02:06:12;U086.TI313.F_CV;23.640197754;100.0 +25/10/2020 02:06:13;U086.TI313.F_CV;23.539800644;100.0 +25/10/2020 02:06:14;U086.TI313.F_CV;23.640197754;100.0 +25/10/2020 02:06:18;U086.TI313.F_CV;23.539800644;100.0 +25/10/2020 02:06:20;U086.TI313.F_CV;23.640197754;100.0 +25/10/2020 02:06:22;U086.TI313.F_CV;23.539800644;100.0 +25/10/2020 02:06:27;U086.TI313.F_CV;23.539800644;100.0 +25/10/2020 02:06:28;U086.TI313.F_CV;23.640197754;100.0 +25/10/2020 02:06:30;U086.TI313.F_CV;23.439399719;100.0 +25/10/2020 02:06:31;U086.TI313.F_CV;23.539800644;100.0 +25/10/2020 02:06:32;U086.TI313.F_CV;23.439399719;100.0 +25/10/2020 02:06:33;U086.TI313.F_CV;23.539800644;100.0 +25/10/2020 02:06:37;U086.TI313.F_CV;23.439399719;100.0 +25/10/2020 02:06:38;U086.TI313.F_CV;23.640197754;100.0 +25/10/2020 02:06:39;U086.TI313.F_CV;23.539800644;100.0 +25/10/2020 02:06:41;U086.TI313.F_CV;23.640197754;100.0 +25/10/2020 02:06:45;U086.TI313.F_CV;23.539800644;100.0 +25/10/2020 02:06:52;U086.TI313.F_CV;23.539800644;100.0 +25/10/2020 02:06:53;U086.TI313.F_CV;23.640197754;100.0 +25/10/2020 02:06:55;U086.TI313.F_CV;23.539800644;100.0 +25/10/2020 02:06:57;U086.TI313.F_CV;23.439399719;100.0 +25/10/2020 02:06:58;U086.TI313.F_CV;23.640197754;100.0 +25/10/2020 02:06:13;U086.TI313_GAIN.F_CV;1.003999949;100.0 +25/10/2020 02:06:13;U086.TI313_OFFSET.F_CV;-1.761000037;100.0 +25/10/2020 02:06:00;U086.TI320.F_CV;66.800003052;100.0 +25/10/2020 02:06:02;U086.TI320.F_CV;66.900001526;100.0 +25/10/2020 02:06:03;U086.TI320.F_CV;66.800003052;100.0 +25/10/2020 02:06:05;U086.TI320.F_CV;67.000000000;100.0 +25/10/2020 02:06:06;U086.TI320.F_CV;66.900001526;100.0 +25/10/2020 02:06:07;U086.TI320.F_CV;66.699996948;100.0 +25/10/2020 02:06:09;U086.TI320.F_CV;66.599998474;100.0 +25/10/2020 02:06:13;U086.TI320.F_CV;66.599998474;100.0 +25/10/2020 02:06:14;U086.TI320.F_CV;66.800003052;100.0 +25/10/2020 02:06:15;U086.TI320.F_CV;66.500000000;100.0 +25/10/2020 02:06:16;U086.TI320.F_CV;66.800003052;100.0 +25/10/2020 02:06:17;U086.TI320.F_CV;66.599998474;100.0 +25/10/2020 02:06:18;U086.TI320.F_CV;66.800003052;100.0 +25/10/2020 02:06:19;U086.TI320.F_CV;66.699996948;100.0 +25/10/2020 02:06:20;U086.TI320.F_CV;66.599998474;100.0 +25/10/2020 02:06:21;U086.TI320.F_CV;66.800003052;100.0 +25/10/2020 02:06:23;U086.TI320.F_CV;66.599998474;100.0 +25/10/2020 02:06:24;U086.TI320.F_CV;66.800003052;100.0 +25/10/2020 02:06:25;U086.TI320.F_CV;66.500000000;100.0 +25/10/2020 02:06:26;U086.TI320.F_CV;66.800003052;100.0 +25/10/2020 02:06:27;U086.TI320.F_CV;66.699996948;100.0 +25/10/2020 02:06:28;U086.TI320.F_CV;66.800003052;100.0 +25/10/2020 02:06:29;U086.TI320.F_CV;66.599998474;100.0 +25/10/2020 02:06:30;U086.TI320.F_CV;66.800003052;100.0 +25/10/2020 02:06:31;U086.TI320.F_CV;66.699996948;100.0 +25/10/2020 02:06:35;U086.TI320.F_CV;66.599998474;100.0 +25/10/2020 02:06:36;U086.TI320.F_CV;66.800003052;100.0 +25/10/2020 02:06:37;U086.TI320.F_CV;66.599998474;100.0 +25/10/2020 02:06:38;U086.TI320.F_CV;66.800003052;100.0 +25/10/2020 02:06:40;U086.TI320.F_CV;66.699996948;100.0 +25/10/2020 02:06:41;U086.TI320.F_CV;66.800003052;100.0 +25/10/2020 02:06:42;U086.TI320.F_CV;66.500000000;100.0 +25/10/2020 02:06:43;U086.TI320.F_CV;66.800003052;100.0 +25/10/2020 02:06:44;U086.TI320.F_CV;66.599998474;100.0 +25/10/2020 02:06:45;U086.TI320.F_CV;66.800003052;100.0 +25/10/2020 02:06:46;U086.TI320.F_CV;66.500000000;100.0 +25/10/2020 02:06:47;U086.TI320.F_CV;66.800003052;100.0 +25/10/2020 02:06:49;U086.TI320.F_CV;66.500000000;100.0 +25/10/2020 02:06:51;U086.TI320.F_CV;66.800003052;100.0 +25/10/2020 02:06:53;U086.TI320.F_CV;66.599998474;100.0 +25/10/2020 02:06:56;U086.TI320.F_CV;66.800003052;100.0 +25/10/2020 02:06:57;U086.TI320.F_CV;66.599998474;100.0 +25/10/2020 02:06:58;U086.TI320.F_CV;66.800003052;100.0 +25/10/2020 02:06:59;U086.TI320.F_CV;66.599998474;100.0 +25/10/2020 02:06:01;U086.TI325.F_CV;92.599998474;100.0 +25/10/2020 02:06:02;U086.TI325.F_CV;92.699996948;100.0 +25/10/2020 02:06:05;U086.TI325.F_CV;92.599998474;100.0 +25/10/2020 02:06:07;U086.TI325.F_CV;92.400001526;100.0 +25/10/2020 02:06:13;U086.TI325.F_CV;92.400001526;100.0 +25/10/2020 02:06:14;U086.TI325.F_CV;92.599998474;100.0 +25/10/2020 02:06:15;U086.TI325.F_CV;92.400001526;100.0 +25/10/2020 02:06:16;U086.TI325.F_CV;92.500000000;100.0 +25/10/2020 02:06:17;U086.TI325.F_CV;92.400001526;100.0 +25/10/2020 02:06:18;U086.TI325.F_CV;92.699996948;100.0 +25/10/2020 02:06:19;U086.TI325.F_CV;92.400001526;100.0 +25/10/2020 02:06:21;U086.TI325.F_CV;92.599998474;100.0 +25/10/2020 02:06:23;U086.TI325.F_CV;92.400001526;100.0 +25/10/2020 02:06:24;U086.TI325.F_CV;92.599998474;100.0 +25/10/2020 02:06:25;U086.TI325.F_CV;92.400001526;100.0 +25/10/2020 02:06:27;U086.TI325.F_CV;92.599998474;100.0 +25/10/2020 02:06:28;U086.TI325.F_CV;92.500000000;100.0 +25/10/2020 02:06:29;U086.TI325.F_CV;92.300003052;100.0 +25/10/2020 02:06:30;U086.TI325.F_CV;92.599998474;100.0 +25/10/2020 02:06:31;U086.TI325.F_CV;92.400001526;100.0 +25/10/2020 02:06:33;U086.TI325.F_CV;92.599998474;100.0 +25/10/2020 02:06:34;U086.TI325.F_CV;92.500000000;100.0 +25/10/2020 02:06:35;U086.TI325.F_CV;92.300003052;100.0 +25/10/2020 02:06:36;U086.TI325.F_CV;92.500000000;100.0 +25/10/2020 02:06:37;U086.TI325.F_CV;92.400001526;100.0 +25/10/2020 02:06:38;U086.TI325.F_CV;92.599998474;100.0 +25/10/2020 02:06:39;U086.TI325.F_CV;92.500000000;100.0 +25/10/2020 02:06:40;U086.TI325.F_CV;92.599998474;100.0 +25/10/2020 02:06:42;U086.TI325.F_CV;92.400001526;100.0 +25/10/2020 02:06:43;U086.TI325.F_CV;92.500000000;100.0 +25/10/2020 02:06:44;U086.TI325.F_CV;92.300003052;100.0 +25/10/2020 02:06:45;U086.TI325.F_CV;92.500000000;100.0 +25/10/2020 02:06:46;U086.TI325.F_CV;92.400001526;100.0 +25/10/2020 02:06:47;U086.TI325.F_CV;92.599998474;100.0 +25/10/2020 02:06:49;U086.TI325.F_CV;92.400001526;100.0 +25/10/2020 02:06:51;U086.TI325.F_CV;92.500000000;100.0 +25/10/2020 02:06:52;U086.TI325.F_CV;92.599998474;100.0 +25/10/2020 02:06:53;U086.TI325.F_CV;92.300003052;100.0 +25/10/2020 02:06:56;U086.TI325.F_CV;92.500000000;100.0 +25/10/2020 02:06:57;U086.TI325.F_CV;92.400001526;100.0 +25/10/2020 02:06:58;U086.TI325.F_CV;92.500000000;100.0 +25/10/2020 02:06:59;U086.TI325.F_CV;92.300003052;100.0 +25/10/2020 02:06:00;U086.TI401.F_CV;25.090999603;100.0 +25/10/2020 02:06:01;U086.TI401.F_CV;25.190999985;100.0 +25/10/2020 02:06:02;U086.TI401.F_CV;25.090999603;100.0 +25/10/2020 02:06:03;U086.TI401.F_CV;25.190999985;100.0 +25/10/2020 02:06:04;U086.TI401.F_CV;25.090999603;100.0 +25/10/2020 02:06:06;U086.TI401.F_CV;25.190999985;100.0 +25/10/2020 02:06:09;U086.TI401.F_CV;25.090999603;100.0 +25/10/2020 02:06:10;U086.TI401.F_CV;25.190999985;100.0 +25/10/2020 02:06:12;U086.TI401.F_CV;25.090999603;100.0 +25/10/2020 02:06:13;U086.TI401.F_CV;25.190999985;100.0 +25/10/2020 02:06:15;U086.TI401.F_CV;25.090999603;100.0 +25/10/2020 02:06:17;U086.TI401.F_CV;25.190999985;100.0 +25/10/2020 02:06:19;U086.TI401.F_CV;24.991001129;100.0 +25/10/2020 02:06:20;U086.TI401.F_CV;25.090999603;100.0 +25/10/2020 02:06:21;U086.TI401.F_CV;25.190999985;100.0 +25/10/2020 02:06:25;U086.TI401.F_CV;25.090999603;100.0 +25/10/2020 02:06:27;U086.TI401.F_CV;25.190999985;100.0 +25/10/2020 02:06:28;U086.TI401.F_CV;25.090999603;100.0 +25/10/2020 02:06:30;U086.TI401.F_CV;25.190999985;100.0 +25/10/2020 02:06:31;U086.TI401.F_CV;25.090999603;100.0 +25/10/2020 02:06:32;U086.TI401.F_CV;25.190999985;100.0 +25/10/2020 02:06:34;U086.TI401.F_CV;25.090999603;100.0 +25/10/2020 02:06:35;U086.TI401.F_CV;25.190999985;100.0 +25/10/2020 02:06:38;U086.TI401.F_CV;25.090999603;100.0 +25/10/2020 02:06:42;U086.TI401.F_CV;25.190999985;100.0 +25/10/2020 02:06:44;U086.TI401.F_CV;25.090999603;100.0 +25/10/2020 02:06:48;U086.TI401.F_CV;25.090999603;100.0 +25/10/2020 02:06:49;U086.TI401.F_CV;25.190999985;100.0 +25/10/2020 02:06:51;U086.TI401.F_CV;25.090999603;100.0 +25/10/2020 02:06:54;U086.TI401.F_CV;25.190999985;100.0 +25/10/2020 02:06:13;U086.TI401_GAIN.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U086.TI401_OFFSET.F_CV;-0.209000006;100.0 +25/10/2020 02:06:00;U086.TI402.F_CV;25.127300262;100.0 +25/10/2020 02:06:01;U086.TI402.F_CV;25.027400970;100.0 +25/10/2020 02:06:03;U086.TI402.F_CV;25.127300262;100.0 +25/10/2020 02:06:07;U086.TI402.F_CV;25.127300262;100.0 +25/10/2020 02:06:08;U086.TI402.F_CV;25.027400970;100.0 +25/10/2020 02:06:09;U086.TI402.F_CV;25.127300262;100.0 +25/10/2020 02:06:11;U086.TI402.F_CV;25.027400970;100.0 +25/10/2020 02:06:15;U086.TI402.F_CV;24.927499771;100.0 +25/10/2020 02:06:16;U086.TI402.F_CV;25.127300262;100.0 +25/10/2020 02:06:17;U086.TI402.F_CV;25.027400970;100.0 +25/10/2020 02:06:19;U086.TI402.F_CV;24.827600479;100.0 +25/10/2020 02:06:20;U086.TI402.F_CV;25.127300262;100.0 +25/10/2020 02:06:23;U086.TI402.F_CV;25.027400970;100.0 +25/10/2020 02:06:24;U086.TI402.F_CV;25.127300262;100.0 +25/10/2020 02:06:25;U086.TI402.F_CV;25.027400970;100.0 +25/10/2020 02:06:26;U086.TI402.F_CV;25.127300262;100.0 +25/10/2020 02:06:31;U086.TI402.F_CV;25.127300262;100.0 +25/10/2020 02:06:32;U086.TI402.F_CV;25.027400970;100.0 +25/10/2020 02:06:35;U086.TI402.F_CV;25.127300262;100.0 +25/10/2020 02:06:37;U086.TI402.F_CV;25.027400970;100.0 +25/10/2020 02:06:38;U086.TI402.F_CV;25.127300262;100.0 +25/10/2020 02:06:39;U086.TI402.F_CV;25.027400970;100.0 +25/10/2020 02:06:42;U086.TI402.F_CV;25.127300262;100.0 +25/10/2020 02:06:44;U086.TI402.F_CV;25.027400970;100.0 +25/10/2020 02:06:46;U086.TI402.F_CV;25.127300262;100.0 +25/10/2020 02:06:49;U086.TI402.F_CV;25.027400970;100.0 +25/10/2020 02:06:53;U086.TI402.F_CV;25.127300262;100.0 +25/10/2020 02:06:54;U086.TI402.F_CV;25.027400970;100.0 +25/10/2020 02:06:55;U086.TI402.F_CV;25.127300262;100.0 +25/10/2020 02:06:57;U086.TI402.F_CV;25.027400970;100.0 +25/10/2020 02:06:58;U086.TI402.F_CV;25.127300262;100.0 +25/10/2020 02:06:59;U086.TI402.F_CV;25.027400970;100.0 +25/10/2020 02:06:13;U086.TI402_GAIN.F_CV;0.999000013;100.0 +25/10/2020 02:06:13;U086.TI402_OFFSET.F_CV;0.451999992;100.0 +25/10/2020 02:06:01;U086.TI403.F_CV;24.808801651;100.0 +25/10/2020 02:06:02;U086.TI403.F_CV;24.908700943;100.0 +25/10/2020 02:06:04;U086.TI403.F_CV;24.808801651;100.0 +25/10/2020 02:06:09;U086.TI403.F_CV;24.808801651;100.0 +25/10/2020 02:06:10;U086.TI403.F_CV;24.908700943;100.0 +25/10/2020 02:06:11;U086.TI403.F_CV;24.808801651;100.0 +25/10/2020 02:06:14;U086.TI403.F_CV;24.908700943;100.0 +25/10/2020 02:06:15;U086.TI403.F_CV;24.808801651;100.0 +25/10/2020 02:06:18;U086.TI403.F_CV;24.908700943;100.0 +25/10/2020 02:06:20;U086.TI403.F_CV;24.808801651;100.0 +25/10/2020 02:06:30;U086.TI403.F_CV;24.808801651;100.0 +25/10/2020 02:06:31;U086.TI403.F_CV;24.908700943;100.0 +25/10/2020 02:06:32;U086.TI403.F_CV;24.808801651;100.0 +25/10/2020 02:06:35;U086.TI403.F_CV;24.908700943;100.0 +25/10/2020 02:06:36;U086.TI403.F_CV;24.808801651;100.0 +25/10/2020 02:06:37;U086.TI403.F_CV;24.908700943;100.0 +25/10/2020 02:06:38;U086.TI403.F_CV;24.808801651;100.0 +25/10/2020 02:06:39;U086.TI403.F_CV;24.908700943;100.0 +25/10/2020 02:06:40;U086.TI403.F_CV;24.808801651;100.0 +25/10/2020 02:06:42;U086.TI403.F_CV;24.908700943;100.0 +25/10/2020 02:06:43;U086.TI403.F_CV;24.808801651;100.0 +25/10/2020 02:06:47;U086.TI403.F_CV;24.908700943;100.0 +25/10/2020 02:06:48;U086.TI403.F_CV;24.808801651;100.0 +25/10/2020 02:06:55;U086.TI403.F_CV;24.808801651;100.0 +25/10/2020 02:06:56;U086.TI403.F_CV;24.908700943;100.0 +25/10/2020 02:06:57;U086.TI403.F_CV;24.808801651;100.0 +25/10/2020 02:06:59;U086.TI403.F_CV;24.908700943;100.0 +25/10/2020 02:06:13;U086.TI403_GAIN.F_CV;0.999000013;100.0 +25/10/2020 02:06:13;U086.TI403_OFFSET.F_CV;-0.365999997;100.0 +25/10/2020 02:06:00;U086.TI411.F_CV;25.293401718;100.0 +25/10/2020 02:06:03;U086.TI411.F_CV;25.393501282;100.0 +25/10/2020 02:06:04;U086.TI411.F_CV;25.293401718;100.0 +25/10/2020 02:06:06;U086.TI411.F_CV;25.393501282;100.0 +25/10/2020 02:06:08;U086.TI411.F_CV;25.293401718;100.0 +25/10/2020 02:06:09;U086.TI411.F_CV;25.393501282;100.0 +25/10/2020 02:06:10;U086.TI411.F_CV;25.293401718;100.0 +25/10/2020 02:06:11;U086.TI411.F_CV;25.393501282;100.0 +25/10/2020 02:06:14;U086.TI411.F_CV;25.293401718;100.0 +25/10/2020 02:06:15;U086.TI411.F_CV;25.393501282;100.0 +25/10/2020 02:06:16;U086.TI411.F_CV;25.293401718;100.0 +25/10/2020 02:06:18;U086.TI411.F_CV;25.193300247;100.0 +25/10/2020 02:06:19;U086.TI411.F_CV;25.293401718;100.0 +25/10/2020 02:06:20;U086.TI411.F_CV;25.393501282;100.0 +25/10/2020 02:06:22;U086.TI411.F_CV;25.293401718;100.0 +25/10/2020 02:06:24;U086.TI411.F_CV;25.393501282;100.0 +25/10/2020 02:06:25;U086.TI411.F_CV;25.293401718;100.0 +25/10/2020 02:06:27;U086.TI411.F_CV;25.393501282;100.0 +25/10/2020 02:06:28;U086.TI411.F_CV;25.293401718;100.0 +25/10/2020 02:06:29;U086.TI411.F_CV;25.393501282;100.0 +25/10/2020 02:06:30;U086.TI411.F_CV;25.293401718;100.0 +25/10/2020 02:06:32;U086.TI411.F_CV;25.393501282;100.0 +25/10/2020 02:06:33;U086.TI411.F_CV;25.293401718;100.0 +25/10/2020 02:06:36;U086.TI411.F_CV;25.393501282;100.0 +25/10/2020 02:06:37;U086.TI411.F_CV;25.293401718;100.0 +25/10/2020 02:06:38;U086.TI411.F_CV;25.393501282;100.0 +25/10/2020 02:06:40;U086.TI411.F_CV;25.293401718;100.0 +25/10/2020 02:06:42;U086.TI411.F_CV;25.393501282;100.0 +25/10/2020 02:06:43;U086.TI411.F_CV;25.293401718;100.0 +25/10/2020 02:06:45;U086.TI411.F_CV;25.393501282;100.0 +25/10/2020 02:06:46;U086.TI411.F_CV;25.293401718;100.0 +25/10/2020 02:06:47;U086.TI411.F_CV;25.393501282;100.0 +25/10/2020 02:06:48;U086.TI411.F_CV;25.293401718;100.0 +25/10/2020 02:06:52;U086.TI411.F_CV;25.393501282;100.0 +25/10/2020 02:06:54;U086.TI411.F_CV;25.293401718;100.0 +25/10/2020 02:06:58;U086.TI411.F_CV;25.393501282;100.0 +25/10/2020 02:06:59;U086.TI411.F_CV;25.293401718;100.0 +25/10/2020 02:06:13;U086.TI411_GAIN.F_CV;1.001000047;100.0 +25/10/2020 02:06:13;U086.TI411_OFFSET.F_CV;-0.131999999;100.0 +25/10/2020 02:06:00;U086.TI412.F_CV;23.988601685;100.0 +25/10/2020 02:06:03;U086.TI412.F_CV;23.888502121;100.0 +25/10/2020 02:06:04;U086.TI412.F_CV;23.988601685;100.0 +25/10/2020 02:06:08;U086.TI412.F_CV;23.888502121;100.0 +25/10/2020 02:06:09;U086.TI412.F_CV;23.988601685;100.0 +25/10/2020 02:06:17;U086.TI412.F_CV;23.988601685;100.0 +25/10/2020 02:06:18;U086.TI412.F_CV;23.888502121;100.0 +25/10/2020 02:06:19;U086.TI412.F_CV;23.988601685;100.0 +25/10/2020 02:06:21;U086.TI412.F_CV;23.888502121;100.0 +25/10/2020 02:06:22;U086.TI412.F_CV;24.088703156;100.0 +25/10/2020 02:06:23;U086.TI412.F_CV;23.988601685;100.0 +25/10/2020 02:06:24;U086.TI412.F_CV;23.888502121;100.0 +25/10/2020 02:06:25;U086.TI412.F_CV;23.988601685;100.0 +25/10/2020 02:06:30;U086.TI412.F_CV;23.988601685;100.0 +25/10/2020 02:06:31;U086.TI412.F_CV;23.888502121;100.0 +25/10/2020 02:06:32;U086.TI412.F_CV;23.988601685;100.0 +25/10/2020 02:06:36;U086.TI412.F_CV;23.888502121;100.0 +25/10/2020 02:06:37;U086.TI412.F_CV;23.988601685;100.0 +25/10/2020 02:06:38;U086.TI412.F_CV;23.888502121;100.0 +25/10/2020 02:06:39;U086.TI412.F_CV;23.988601685;100.0 +25/10/2020 02:06:41;U086.TI412.F_CV;24.088703156;100.0 +25/10/2020 02:06:42;U086.TI412.F_CV;23.988601685;100.0 +25/10/2020 02:06:44;U086.TI412.F_CV;23.888502121;100.0 +25/10/2020 02:06:45;U086.TI412.F_CV;23.988601685;100.0 +25/10/2020 02:06:47;U086.TI412.F_CV;23.888502121;100.0 +25/10/2020 02:06:48;U086.TI412.F_CV;23.988601685;100.0 +25/10/2020 02:06:49;U086.TI412.F_CV;24.088703156;100.0 +25/10/2020 02:06:50;U086.TI412.F_CV;23.988601685;100.0 +25/10/2020 02:06:13;U086.TI412_GAIN.F_CV;1.001000047;100.0 +25/10/2020 02:06:13;U086.TI412_OFFSET.F_CV;-0.635999978;100.0 +25/10/2020 02:06:01;U086.TI413.F_CV;24.505001068;100.0 +25/10/2020 02:06:02;U086.TI413.F_CV;24.605100632;100.0 +25/10/2020 02:06:05;U086.TI413.F_CV;24.705202103;100.0 +25/10/2020 02:06:06;U086.TI413.F_CV;24.505001068;100.0 +25/10/2020 02:06:07;U086.TI413.F_CV;24.605100632;100.0 +25/10/2020 02:06:15;U086.TI413.F_CV;24.605100632;100.0 +25/10/2020 02:06:16;U086.TI413.F_CV;24.505001068;100.0 +25/10/2020 02:06:17;U086.TI413.F_CV;24.605100632;100.0 +25/10/2020 02:06:24;U086.TI413.F_CV;24.605100632;100.0 +25/10/2020 02:06:25;U086.TI413.F_CV;24.505001068;100.0 +25/10/2020 02:06:26;U086.TI413.F_CV;24.605100632;100.0 +25/10/2020 02:06:29;U086.TI413.F_CV;24.505001068;100.0 +25/10/2020 02:06:30;U086.TI413.F_CV;24.605100632;100.0 +25/10/2020 02:06:36;U086.TI413.F_CV;24.605100632;100.0 +25/10/2020 02:06:37;U086.TI413.F_CV;24.505001068;100.0 +25/10/2020 02:06:39;U086.TI413.F_CV;24.605100632;100.0 +25/10/2020 02:06:46;U086.TI413.F_CV;24.605100632;100.0 +25/10/2020 02:06:47;U086.TI413.F_CV;24.505001068;100.0 +25/10/2020 02:06:48;U086.TI413.F_CV;24.605100632;100.0 +25/10/2020 02:06:13;U086.TI413_GAIN.F_CV;1.001000047;100.0 +25/10/2020 02:06:13;U086.TI413_OFFSET.F_CV;-0.519999981;100.0 +25/10/2020 02:06:00;U086.TI420.F_CV;77.000000000;100.0 +25/10/2020 02:06:04;U086.TI420.F_CV;77.099998474;100.0 +25/10/2020 02:06:07;U086.TI420.F_CV;77.000000000;100.0 +25/10/2020 02:06:15;U086.TI420.F_CV;77.000000000;100.0 +25/10/2020 02:06:16;U086.TI420.F_CV;77.099998474;100.0 +25/10/2020 02:06:17;U086.TI420.F_CV;77.000000000;100.0 +25/10/2020 02:06:35;U086.TI420.F_CV;77.000000000;100.0 +25/10/2020 02:06:36;U086.TI420.F_CV;77.099998474;100.0 +25/10/2020 02:06:37;U086.TI420.F_CV;77.000000000;100.0 +25/10/2020 02:06:45;U086.TI420.F_CV;77.000000000;100.0 +25/10/2020 02:06:46;U086.TI420.F_CV;77.099998474;100.0 +25/10/2020 02:06:47;U086.TI420.F_CV;77.000000000;100.0 +25/10/2020 02:06:48;U086.TI420.F_CV;77.099998474;100.0 +25/10/2020 02:06:49;U086.TI420.F_CV;77.000000000;100.0 +25/10/2020 02:06:50;U086.TI420.F_CV;77.099998474;100.0 +25/10/2020 02:06:51;U086.TI420.F_CV;77.000000000;100.0 +25/10/2020 02:06:52;U086.TI420.F_CV;77.099998474;100.0 +25/10/2020 02:06:53;U086.TI420.F_CV;77.000000000;100.0 +25/10/2020 02:06:54;U086.TI420.F_CV;77.099998474;100.0 +25/10/2020 02:06:55;U086.TI420.F_CV;77.000000000;100.0 +25/10/2020 02:06:56;U086.TI420.F_CV;77.099998474;100.0 +25/10/2020 02:06:57;U086.TI420.F_CV;77.000000000;100.0 +25/10/2020 02:06:58;U086.TI420.F_CV;77.099998474;100.0 +25/10/2020 02:06:59;U086.TI420.F_CV;77.000000000;100.0 +25/10/2020 02:06:01;U086.TI425.F_CV;94.699996948;100.0 +25/10/2020 02:06:03;U086.TI425.F_CV;94.599998474;100.0 +25/10/2020 02:06:08;U086.TI425.F_CV;94.599998474;100.0 +25/10/2020 02:06:09;U086.TI425.F_CV;94.500000000;100.0 +25/10/2020 02:06:11;U086.TI425.F_CV;94.599998474;100.0 +25/10/2020 02:06:13;U086.TI425.F_CV;94.400001526;100.0 +25/10/2020 02:06:14;U086.TI425.F_CV;94.599998474;100.0 +25/10/2020 02:06:20;U086.TI425.F_CV;94.599998474;100.0 +25/10/2020 02:06:21;U086.TI425.F_CV;94.699996948;100.0 +25/10/2020 02:06:22;U086.TI425.F_CV;94.500000000;100.0 +25/10/2020 02:06:23;U086.TI425.F_CV;94.699996948;100.0 +25/10/2020 02:06:24;U086.TI425.F_CV;94.599998474;100.0 +25/10/2020 02:06:35;U086.TI425.F_CV;94.599998474;100.0 +25/10/2020 02:06:36;U086.TI425.F_CV;94.500000000;100.0 +25/10/2020 02:06:38;U086.TI425.F_CV;94.599998474;100.0 +25/10/2020 02:06:39;U086.TI425.F_CV;94.500000000;100.0 +25/10/2020 02:06:40;U086.TI425.F_CV;94.599998474;100.0 +25/10/2020 02:06:42;U086.TI425.F_CV;94.500000000;100.0 +25/10/2020 02:06:43;U086.TI425.F_CV;94.599998474;100.0 +25/10/2020 02:06:45;U086.TI425.F_CV;94.500000000;100.0 +25/10/2020 02:06:46;U086.TI425.F_CV;94.599998474;100.0 +25/10/2020 02:06:53;U086.TI425.F_CV;94.599998474;100.0 +25/10/2020 02:06:54;U086.TI425.F_CV;94.699996948;100.0 +25/10/2020 02:06:55;U086.TI425.F_CV;94.500000000;100.0 +25/10/2020 02:06:56;U086.TI425.F_CV;94.599998474;100.0 +25/10/2020 02:06:13;U086.Z01_RDY.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U086.Z01_START.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U087.AI10.F_CV;84.403938293;100.0 +25/10/2020 02:06:19;U087.AI10.F_CV;84.259262085;100.0 +25/10/2020 02:06:20;U087.AI10.F_CV;84.317131042;100.0 +25/10/2020 02:06:21;U087.AI10.F_CV;84.259262085;100.0 +25/10/2020 02:06:28;U087.AI10.F_CV;84.317131042;100.0 +25/10/2020 02:06:29;U087.AI10.F_CV;84.259262085;100.0 +25/10/2020 02:06:35;U087.AI10.F_CV;84.461807251;100.0 +25/10/2020 02:06:47;U087.AI10.F_CV;84.346061707;100.0 +25/10/2020 02:06:53;U087.AI10.F_CV;84.403938293;100.0 +25/10/2020 02:06:59;U087.AI10.F_CV;84.346061707;100.0 +25/10/2020 02:06:03;U087.AI103.F_CV;0.812644660;100.0 +25/10/2020 02:06:04;U087.AI103.F_CV;0.812789381;100.0 +25/10/2020 02:06:07;U087.AI103.F_CV;0.812644660;100.0 +25/10/2020 02:06:16;U087.AI103.F_CV;0.812644660;100.0 +25/10/2020 02:06:17;U087.AI103.F_CV;0.812789381;100.0 +25/10/2020 02:06:18;U087.AI103.F_CV;0.812644660;100.0 +25/10/2020 02:06:34;U087.AI103.F_CV;0.812644660;100.0 +25/10/2020 02:06:35;U087.AI103.F_CV;0.812355340;100.0 +25/10/2020 02:06:36;U087.AI103.F_CV;0.812644660;100.0 +25/10/2020 02:06:39;U087.AI103.F_CV;0.812789381;100.0 +25/10/2020 02:06:40;U087.AI103.F_CV;0.812644660;100.0 +25/10/2020 02:06:45;U087.AI103.F_CV;0.812644660;100.0 +25/10/2020 02:06:46;U087.AI103.F_CV;0.812789381;100.0 +25/10/2020 02:06:47;U087.AI103.F_CV;0.812644660;100.0 +25/10/2020 02:06:51;U087.AI103.F_CV;0.812644660;100.0 +25/10/2020 02:06:52;U087.AI103.F_CV;0.812789381;100.0 +25/10/2020 02:06:53;U087.AI103.F_CV;0.812644660;100.0 +25/10/2020 02:06:54;U087.AI103.F_CV;0.812789381;100.0 +25/10/2020 02:06:56;U087.AI103.F_CV;0.812644660;100.0 +25/10/2020 02:06:17;U087.AI103E.F_CV;0.812664986;100.0 +25/10/2020 02:06:18;U087.AI103E.F_CV;0.812634468;100.0 +25/10/2020 02:06:37;U087.AI103E.F_CV;0.812634468;100.0 +25/10/2020 02:06:38;U087.AI103E.F_CV;0.812603951;100.0 +25/10/2020 02:06:47;U087.AI103E.F_CV;0.812603951;100.0 +25/10/2020 02:06:48;U087.AI103E.F_CV;0.812664986;100.0 +25/10/2020 02:06:00;U087.AI203.F_CV;0.813657403;100.0 +25/10/2020 02:06:01;U087.AI203.F_CV;0.813802063;100.0 +25/10/2020 02:06:04;U087.AI203.F_CV;0.813657403;100.0 +25/10/2020 02:06:05;U087.AI203.F_CV;0.813802063;100.0 +25/10/2020 02:06:16;U087.AI203.F_CV;0.813802063;100.0 +25/10/2020 02:06:17;U087.AI203.F_CV;0.813657403;100.0 +25/10/2020 02:06:21;U087.AI203.F_CV;0.813802063;100.0 +25/10/2020 02:06:23;U087.AI203.F_CV;0.813657403;100.0 +25/10/2020 02:06:26;U087.AI203.F_CV;0.813802063;100.0 +25/10/2020 02:06:27;U087.AI203.F_CV;0.813657403;100.0 +25/10/2020 02:06:28;U087.AI203.F_CV;0.813802063;100.0 +25/10/2020 02:06:58;U087.AI203.F_CV;0.813802063;100.0 +25/10/2020 02:06:59;U087.AI203.F_CV;0.813657403;100.0 +25/10/2020 02:06:07;U087.AI203E.F_CV;0.813733101;100.0 +25/10/2020 02:06:08;U087.AI203E.F_CV;0.813763618;100.0 +25/10/2020 02:06:27;U087.AI203E.F_CV;0.813763618;100.0 +25/10/2020 02:06:28;U087.AI203E.F_CV;0.813702583;100.0 +25/10/2020 02:06:37;U087.AI203E.F_CV;0.813702583;100.0 +25/10/2020 02:06:38;U087.AI203E.F_CV;0.813794136;100.0 +25/10/2020 02:06:58;U087.AI203E.F_CV;0.813794136;100.0 +25/10/2020 02:06:59;U087.AI203E.F_CV;0.813763618;100.0 +25/10/2020 02:06:03;U087.AI303.F_CV;0.805844903;100.0 +25/10/2020 02:06:05;U087.AI303.F_CV;0.806134284;100.0 +25/10/2020 02:06:06;U087.AI303.F_CV;0.806278944;100.0 +25/10/2020 02:06:07;U087.AI303.F_CV;0.806134284;100.0 +25/10/2020 02:06:08;U087.AI303.F_CV;0.806278944;100.0 +25/10/2020 02:06:09;U087.AI303.F_CV;0.805844903;100.0 +25/10/2020 02:06:10;U087.AI303.F_CV;0.805700243;100.0 +25/10/2020 02:06:12;U087.AI303.F_CV;0.805555582;100.0 +25/10/2020 02:06:13;U087.AI303.F_CV;0.805700243;100.0 +25/10/2020 02:06:15;U087.AI303.F_CV;0.805844903;100.0 +25/10/2020 02:06:16;U087.AI303.F_CV;0.806134284;100.0 +25/10/2020 02:06:17;U087.AI303.F_CV;0.806278944;100.0 +25/10/2020 02:06:18;U087.AI303.F_CV;0.806134284;100.0 +25/10/2020 02:06:20;U087.AI303.F_CV;0.805844903;100.0 +25/10/2020 02:06:22;U087.AI303.F_CV;0.805555582;100.0 +25/10/2020 02:06:25;U087.AI303.F_CV;0.805700243;100.0 +25/10/2020 02:06:26;U087.AI303.F_CV;0.805844903;100.0 +25/10/2020 02:06:27;U087.AI303.F_CV;0.806134284;100.0 +25/10/2020 02:06:31;U087.AI303.F_CV;0.806134284;100.0 +25/10/2020 02:06:32;U087.AI303.F_CV;0.805844903;100.0 +25/10/2020 02:06:34;U087.AI303.F_CV;0.805700243;100.0 +25/10/2020 02:06:38;U087.AI303.F_CV;0.805844903;100.0 +25/10/2020 02:06:39;U087.AI303.F_CV;0.806134284;100.0 +25/10/2020 02:06:41;U087.AI303.F_CV;0.806278944;100.0 +25/10/2020 02:06:42;U087.AI303.F_CV;0.806134284;100.0 +25/10/2020 02:06:44;U087.AI303.F_CV;0.805700243;100.0 +25/10/2020 02:06:48;U087.AI303.F_CV;0.805844903;100.0 +25/10/2020 02:06:49;U087.AI303.F_CV;0.806134284;100.0 +25/10/2020 02:06:51;U087.AI303.F_CV;0.806278944;100.0 +25/10/2020 02:06:55;U087.AI303.F_CV;0.806278944;100.0 +25/10/2020 02:06:56;U087.AI303.F_CV;0.806134284;100.0 +25/10/2020 02:06:57;U087.AI303.F_CV;0.805844903;100.0 +25/10/2020 02:06:59;U087.AI303.F_CV;0.805700243;100.0 +25/10/2020 02:06:07;U087.AI303E.F_CV;0.805950999;100.0 +25/10/2020 02:06:08;U087.AI303E.F_CV;0.805889964;100.0 +25/10/2020 02:06:17;U087.AI303E.F_CV;0.805889964;100.0 +25/10/2020 02:06:18;U087.AI303E.F_CV;0.805859447;100.0 +25/10/2020 02:06:27;U087.AI303E.F_CV;0.805859447;100.0 +25/10/2020 02:06:28;U087.AI303E.F_CV;0.805798411;100.0 +25/10/2020 02:06:37;U087.AI303E.F_CV;0.805798411;100.0 +25/10/2020 02:06:38;U087.AI303E.F_CV;0.805859447;100.0 +25/10/2020 02:06:47;U087.AI303E.F_CV;0.805859447;100.0 +25/10/2020 02:06:48;U087.AI303E.F_CV;0.805950999;100.0 +25/10/2020 02:06:58;U087.AI303E.F_CV;0.805950999;100.0 +25/10/2020 02:06:59;U087.AI303E.F_CV;0.806134105;100.0 +25/10/2020 02:06:01;U087.AI403.F_CV;0.809172451;100.0 +25/10/2020 02:06:13;U087.AI403.F_CV;0.809172451;100.0 +25/10/2020 02:06:14;U087.AI403.F_CV;0.809317112;100.0 +25/10/2020 02:06:15;U087.AI403.F_CV;0.809172451;100.0 +25/10/2020 02:06:16;U087.AI403.F_CV;0.809317112;100.0 +25/10/2020 02:06:17;U087.AI403.F_CV;0.809172451;100.0 +25/10/2020 02:06:18;U087.AI403.F_CV;0.809317112;100.0 +25/10/2020 02:06:19;U087.AI403.F_CV;0.809172451;100.0 +25/10/2020 02:06:20;U087.AI403.F_CV;0.809317112;100.0 +25/10/2020 02:06:23;U087.AI403.F_CV;0.809172451;100.0 +25/10/2020 02:06:25;U087.AI403.F_CV;0.809317112;100.0 +25/10/2020 02:06:26;U087.AI403.F_CV;0.809172451;100.0 +25/10/2020 02:06:32;U087.AI403.F_CV;0.809172451;100.0 +25/10/2020 02:06:33;U087.AI403.F_CV;0.809317112;100.0 +25/10/2020 02:06:35;U087.AI403.F_CV;0.809172451;100.0 +25/10/2020 02:06:50;U087.AI403.F_CV;0.809172451;100.0 +25/10/2020 02:06:51;U087.AI403.F_CV;0.809317112;100.0 +25/10/2020 02:06:52;U087.AI403.F_CV;0.809172451;100.0 +25/10/2020 02:06:53;U087.AI403.F_CV;0.809317112;100.0 +25/10/2020 02:06:54;U087.AI403.F_CV;0.809172451;100.0 +25/10/2020 02:06:55;U087.AI403.F_CV;0.809317112;100.0 +25/10/2020 02:06:59;U087.AI403.F_CV;0.809172451;100.0 +25/10/2020 02:06:07;U087.AI403E.F_CV;0.809246957;100.0 +25/10/2020 02:06:08;U087.AI403E.F_CV;0.809185922;100.0 +25/10/2020 02:06:17;U087.AI403E.F_CV;0.809185922;100.0 +25/10/2020 02:06:18;U087.AI403E.F_CV;0.809216440;100.0 +25/10/2020 02:06:37;U087.AI403E.F_CV;0.809216440;100.0 +25/10/2020 02:06:38;U087.AI403E.F_CV;0.809185922;100.0 +25/10/2020 02:06:58;U087.AI403E.F_CV;0.809185922;100.0 +25/10/2020 02:06:59;U087.AI403E.F_CV;0.809246957;100.0 +25/10/2020 02:06:43;U087.FC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U087.FC01E_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U087.FC01E_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U087.FC100_PV.F_CV;32.876976013;100.0 +25/10/2020 02:06:01;U087.FC100_PV.F_CV;33.126831055;100.0 +25/10/2020 02:06:02;U087.FC100_PV.F_CV;33.220699310;100.0 +25/10/2020 02:06:03;U087.FC100_PV.F_CV;32.905948639;100.0 +25/10/2020 02:06:04;U087.FC100_PV.F_CV;32.872802734;100.0 +25/10/2020 02:06:05;U087.FC100_PV.F_CV;33.082916260;100.0 +25/10/2020 02:06:06;U087.FC100_PV.F_CV;33.094425201;100.0 +25/10/2020 02:06:07;U087.FC100_PV.F_CV;33.036197662;100.0 +25/10/2020 02:06:08;U087.FC100_PV.F_CV;32.956222534;100.0 +25/10/2020 02:06:09;U087.FC100_PV.F_CV;32.931713104;100.0 +25/10/2020 02:06:10;U087.FC100_PV.F_CV;32.933952332;100.0 +25/10/2020 02:06:11;U087.FC100_PV.F_CV;32.898468018;100.0 +25/10/2020 02:06:12;U087.FC100_PV.F_CV;33.046813965;100.0 +25/10/2020 02:06:13;U087.FC100_PV.F_CV;33.084156036;100.0 +25/10/2020 02:06:14;U087.FC100_PV.F_CV;33.047466278;100.0 +25/10/2020 02:06:15;U087.FC100_PV.F_CV;32.867382050;100.0 +25/10/2020 02:06:16;U087.FC100_PV.F_CV;33.045307159;100.0 +25/10/2020 02:06:17;U087.FC100_PV.F_CV;33.081916809;100.0 +25/10/2020 02:06:18;U087.FC100_PV.F_CV;33.062095642;100.0 +25/10/2020 02:06:19;U087.FC100_PV.F_CV;32.788833618;100.0 +25/10/2020 02:06:20;U087.FC100_PV.F_CV;33.122180939;100.0 +25/10/2020 02:06:21;U087.FC100_PV.F_CV;33.042442322;100.0 +25/10/2020 02:06:22;U087.FC100_PV.F_CV;32.970077515;100.0 +25/10/2020 02:06:23;U087.FC100_PV.F_CV;32.787258148;100.0 +25/10/2020 02:06:24;U087.FC100_PV.F_CV;32.967052460;100.0 +25/10/2020 02:06:25;U087.FC100_PV.F_CV;33.073986053;100.0 +25/10/2020 02:06:26;U087.FC100_PV.F_CV;33.166198730;100.0 +25/10/2020 02:06:27;U087.FC100_PV.F_CV;32.904258728;100.0 +25/10/2020 02:06:28;U087.FC100_PV.F_CV;32.922138214;100.0 +25/10/2020 02:06:29;U087.FC100_PV.F_CV;33.116939545;100.0 +25/10/2020 02:06:30;U087.FC100_PV.F_CV;32.976005554;100.0 +25/10/2020 02:06:31;U087.FC100_PV.F_CV;33.009552002;100.0 +25/10/2020 02:06:32;U087.FC100_PV.F_CV;33.003299713;100.0 +25/10/2020 02:06:33;U087.FC100_PV.F_CV;32.952777863;100.0 +25/10/2020 02:06:34;U087.FC100_PV.F_CV;33.102405548;100.0 +25/10/2020 02:06:35;U087.FC100_PV.F_CV;33.015289307;100.0 +25/10/2020 02:06:36;U087.FC100_PV.F_CV;33.022789001;100.0 +25/10/2020 02:06:37;U087.FC100_PV.F_CV;32.980159760;100.0 +25/10/2020 02:06:38;U087.FC100_PV.F_CV;33.004432678;100.0 +25/10/2020 02:06:39;U087.FC100_PV.F_CV;32.916404724;100.0 +25/10/2020 02:06:40;U087.FC100_PV.F_CV;32.850845337;100.0 +25/10/2020 02:06:41;U087.FC100_PV.F_CV;33.120483398;100.0 +25/10/2020 02:06:42;U087.FC100_PV.F_CV;33.077323914;100.0 +25/10/2020 02:06:43;U087.FC100_PV.F_CV;32.874275208;100.0 +25/10/2020 02:06:44;U087.FC100_PV.F_CV;32.929164886;100.0 +25/10/2020 02:06:45;U087.FC100_PV.F_CV;33.053543091;100.0 +25/10/2020 02:06:46;U087.FC100_PV.F_CV;32.980846405;100.0 +25/10/2020 02:06:47;U087.FC100_PV.F_CV;33.025165558;100.0 +25/10/2020 02:06:48;U087.FC100_PV.F_CV;33.064720154;100.0 +25/10/2020 02:06:49;U087.FC100_PV.F_CV;32.965763092;100.0 +25/10/2020 02:06:50;U087.FC100_PV.F_CV;33.044681549;100.0 +25/10/2020 02:06:51;U087.FC100_PV.F_CV;32.925952911;100.0 +25/10/2020 02:06:52;U087.FC100_PV.F_CV;32.852771759;100.0 +25/10/2020 02:06:53;U087.FC100_PV.F_CV;33.093502045;100.0 +25/10/2020 02:06:54;U087.FC100_PV.F_CV;33.011386871;100.0 +25/10/2020 02:06:55;U087.FC100_PV.F_CV;33.086219788;100.0 +25/10/2020 02:06:56;U087.FC100_PV.F_CV;32.913642883;100.0 +25/10/2020 02:06:57;U087.FC100_PV.F_CV;33.076995850;100.0 +25/10/2020 02:06:59;U087.FC100_PV.F_CV;33.034252167;100.0 +25/10/2020 02:06:07;U087.FC100E_OP.F_CV;15.565728188;100.0 +25/10/2020 02:06:08;U087.FC100E_OP.F_CV;15.574883461;100.0 +25/10/2020 02:06:17;U087.FC100E_OP.F_CV;15.574883461;100.0 +25/10/2020 02:06:18;U087.FC100E_OP.F_CV;15.567254066;100.0 +25/10/2020 02:06:27;U087.FC100E_OP.F_CV;15.567254066;100.0 +25/10/2020 02:06:28;U087.FC100E_OP.F_CV;15.570305824;100.0 +25/10/2020 02:06:47;U087.FC100E_OP.F_CV;15.570305824;100.0 +25/10/2020 02:06:48;U087.FC100E_OP.F_CV;15.564202309;100.0 +25/10/2020 02:06:07;U087.FC100E_PV.F_CV;32.986953735;100.0 +25/10/2020 02:06:08;U087.FC100E_PV.F_CV;33.007095337;100.0 +25/10/2020 02:06:17;U087.FC100E_PV.F_CV;33.007095337;100.0 +25/10/2020 02:06:18;U087.FC100E_PV.F_CV;32.999771118;100.0 +25/10/2020 02:06:27;U087.FC100E_PV.F_CV;32.999771118;100.0 +25/10/2020 02:06:28;U087.FC100E_PV.F_CV;32.974136353;100.0 +25/10/2020 02:06:37;U087.FC100E_PV.F_CV;32.974136353;100.0 +25/10/2020 02:06:38;U087.FC100E_PV.F_CV;33.018081665;100.0 +25/10/2020 02:06:47;U087.FC100E_PV.F_CV;33.018081665;100.0 +25/10/2020 02:06:48;U087.FC100E_PV.F_CV;32.988784790;100.0 +25/10/2020 02:06:43;U087.FC100E_SP.F_CV;32.999771118;100.0 +25/10/2020 02:06:00;U087.FC101_PV.F_CV;0.076045498;100.0 +25/10/2020 02:06:01;U087.FC101_PV.F_CV;0.075000003;100.0 +25/10/2020 02:06:22;U087.FC101_PV.F_CV;0.075000003;100.0 +25/10/2020 02:06:23;U087.FC101_PV.F_CV;0.076008953;100.0 +25/10/2020 02:06:24;U087.FC101_PV.F_CV;0.075000003;100.0 +25/10/2020 02:06:57;U087.FC101E_OP.F_CV;3.118944168;100.0 +25/10/2020 02:06:38;U087.FC101E_PV.F_CV;0.075074390;100.0 +25/10/2020 02:06:43;U087.FC101E_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U087.FC102_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U087.FC102E_OP.F_CV;4.911879063;100.0 +25/10/2020 02:06:43;U087.FC102E_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U087.FC102E_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U087.FC103_PV.F_CV;169.328704834;100.0 +25/10/2020 02:06:01;U087.FC103_PV.F_CV;169.556564331;100.0 +25/10/2020 02:06:02;U087.FC103_PV.F_CV;169.227432251;100.0 +25/10/2020 02:06:03;U087.FC103_PV.F_CV;169.581893921;100.0 +25/10/2020 02:06:04;U087.FC103_PV.F_CV;169.455291748;100.0 +25/10/2020 02:06:05;U087.FC103_PV.F_CV;169.556564331;100.0 +25/10/2020 02:06:06;U087.FC103_PV.F_CV;168.543838501;100.0 +25/10/2020 02:06:07;U087.FC103_PV.F_CV;167.936203003;100.0 +25/10/2020 02:06:08;U087.FC103_PV.F_CV;167.151336670;100.0 +25/10/2020 02:06:09;U087.FC103_PV.F_CV;166.391784668;100.0 +25/10/2020 02:06:10;U087.FC103_PV.F_CV;166.670288086;100.0 +25/10/2020 02:06:11;U087.FC103_PV.F_CV;166.847518921;100.0 +25/10/2020 02:06:12;U087.FC103_PV.F_CV;168.189376831;100.0 +25/10/2020 02:06:13;U087.FC103_PV.F_CV;167.581741333;100.0 +25/10/2020 02:06:14;U087.FC103_PV.F_CV;168.569152832;100.0 +25/10/2020 02:06:15;U087.FC103_PV.F_CV;167.784286499;100.0 +25/10/2020 02:06:16;U087.FC103_PV.F_CV;168.721069336;100.0 +25/10/2020 02:06:17;U087.FC103_PV.F_CV;168.113418579;100.0 +25/10/2020 02:06:18;U087.FC103_PV.F_CV;167.581741333;100.0 +25/10/2020 02:06:19;U087.FC103_PV.F_CV;168.189376831;100.0 +25/10/2020 02:06:20;U087.FC103_PV.F_CV;168.594467163;100.0 +25/10/2020 02:06:21;U087.FC103_PV.F_CV;167.683013916;100.0 +25/10/2020 02:06:22;U087.FC103_PV.F_CV;167.353881836;100.0 +25/10/2020 02:06:23;U087.FC103_PV.F_CV;168.290649414;100.0 +25/10/2020 02:06:24;U087.FC103_PV.F_CV;169.961654663;100.0 +25/10/2020 02:06:26;U087.FC103_PV.F_CV;169.379333496;100.0 +25/10/2020 02:06:27;U087.FC103_PV.F_CV;169.505935669;100.0 +25/10/2020 02:06:28;U087.FC103_PV.F_CV;169.480606079;100.0 +25/10/2020 02:06:29;U087.FC103_PV.F_CV;169.202117920;100.0 +25/10/2020 02:06:30;U087.FC103_PV.F_CV;168.974243164;100.0 +25/10/2020 02:06:31;U087.FC103_PV.F_CV;169.303390503;100.0 +25/10/2020 02:06:32;U087.FC103_PV.F_CV;169.252746582;100.0 +25/10/2020 02:06:33;U087.FC103_PV.F_CV;168.923614502;100.0 +25/10/2020 02:06:34;U087.FC103_PV.F_CV;168.847656250;100.0 +25/10/2020 02:06:35;U087.FC103_PV.F_CV;167.556427002;100.0 +25/10/2020 02:06:36;U087.FC103_PV.F_CV;166.898147583;100.0 +25/10/2020 02:06:37;U087.FC103_PV.F_CV;166.467742920;100.0 +25/10/2020 02:06:38;U087.FC103_PV.F_CV;166.265197754;100.0 +25/10/2020 02:06:39;U087.FC103_PV.F_CV;166.796875000;100.0 +25/10/2020 02:06:41;U087.FC103_PV.F_CV;167.607055664;100.0 +25/10/2020 02:06:42;U087.FC103_PV.F_CV;167.708328247;100.0 +25/10/2020 02:06:43;U087.FC103_PV.F_CV;167.581741333;100.0 +25/10/2020 02:06:44;U087.FC103_PV.F_CV;167.809600830;100.0 +25/10/2020 02:06:45;U087.FC103_PV.F_CV;168.948928833;100.0 +25/10/2020 02:06:46;U087.FC103_PV.F_CV;169.429977417;100.0 +25/10/2020 02:06:47;U087.FC103_PV.F_CV;168.923614502;100.0 +25/10/2020 02:06:48;U087.FC103_PV.F_CV;168.493194580;100.0 +25/10/2020 02:06:49;U087.FC103_PV.F_CV;167.936203003;100.0 +25/10/2020 02:06:50;U087.FC103_PV.F_CV;167.277923584;100.0 +25/10/2020 02:06:51;U087.FC103_PV.F_CV;167.657699585;100.0 +25/10/2020 02:06:52;U087.FC103_PV.F_CV;168.493194580;100.0 +25/10/2020 02:06:53;U087.FC103_PV.F_CV;168.670425415;100.0 +25/10/2020 02:06:54;U087.FC103_PV.F_CV;168.164062500;100.0 +25/10/2020 02:06:55;U087.FC103_PV.F_CV;168.113418579;100.0 +25/10/2020 02:06:57;U087.FC103_PV.F_CV;168.467880249;100.0 +25/10/2020 02:06:59;U087.FC103_PV.F_CV;168.872970581;100.0 +25/10/2020 02:06:07;U087.FC103E_PV.F_CV;168.097198486;100.0 +25/10/2020 02:06:08;U087.FC103E_PV.F_CV;168.802169800;100.0 +25/10/2020 02:06:17;U087.FC103E_PV.F_CV;168.802169800;100.0 +25/10/2020 02:06:18;U087.FC103E_PV.F_CV;167.643249512;100.0 +25/10/2020 02:06:27;U087.FC103E_PV.F_CV;167.643249512;100.0 +25/10/2020 02:06:28;U087.FC103E_PV.F_CV;168.839553833;100.0 +25/10/2020 02:06:37;U087.FC103E_PV.F_CV;168.839553833;100.0 +25/10/2020 02:06:38;U087.FC103E_PV.F_CV;168.166625977;100.0 +25/10/2020 02:06:47;U087.FC103E_PV.F_CV;168.166625977;100.0 +25/10/2020 02:06:48;U087.FC103E_PV.F_CV;168.049133301;100.0 +25/10/2020 02:06:58;U087.FC103E_PV.F_CV;168.049133301;100.0 +25/10/2020 02:06:59;U087.FC103E_PV.F_CV;168.070495605;100.0 +25/10/2020 02:06:01;U087.FC103E_SP.F_CV;168.102539063;100.0 +25/10/2020 02:06:00;U087.FC200_PV.F_CV;33.008174896;100.0 +25/10/2020 02:06:01;U087.FC200_PV.F_CV;32.945541382;100.0 +25/10/2020 02:06:02;U087.FC200_PV.F_CV;33.060779572;100.0 +25/10/2020 02:06:03;U087.FC200_PV.F_CV;32.925647736;100.0 +25/10/2020 02:06:04;U087.FC200_PV.F_CV;33.027393341;100.0 +25/10/2020 02:06:05;U087.FC200_PV.F_CV;32.975673676;100.0 +25/10/2020 02:06:06;U087.FC200_PV.F_CV;33.041538239;100.0 +25/10/2020 02:06:07;U087.FC200_PV.F_CV;33.011386871;100.0 +25/10/2020 02:06:08;U087.FC200_PV.F_CV;33.027336121;100.0 +25/10/2020 02:06:09;U087.FC200_PV.F_CV;32.997905731;100.0 +25/10/2020 02:06:10;U087.FC200_PV.F_CV;32.982498169;100.0 +25/10/2020 02:06:11;U087.FC200_PV.F_CV;32.982624054;100.0 +25/10/2020 02:06:12;U087.FC200_PV.F_CV;33.009872437;100.0 +25/10/2020 02:06:13;U087.FC200_PV.F_CV;33.031162262;100.0 +25/10/2020 02:06:14;U087.FC200_PV.F_CV;32.997714996;100.0 +25/10/2020 02:06:15;U087.FC200_PV.F_CV;33.028709412;100.0 +25/10/2020 02:06:16;U087.FC200_PV.F_CV;32.877861023;100.0 +25/10/2020 02:06:17;U087.FC200_PV.F_CV;32.949230194;100.0 +25/10/2020 02:06:18;U087.FC200_PV.F_CV;33.072971344;100.0 +25/10/2020 02:06:19;U087.FC200_PV.F_CV;33.023532867;100.0 +25/10/2020 02:06:20;U087.FC200_PV.F_CV;33.052513123;100.0 +25/10/2020 02:06:21;U087.FC200_PV.F_CV;33.009872437;100.0 +25/10/2020 02:06:22;U087.FC200_PV.F_CV;32.934707642;100.0 +25/10/2020 02:06:23;U087.FC200_PV.F_CV;33.033260345;100.0 +25/10/2020 02:06:24;U087.FC200_PV.F_CV;33.005516052;100.0 +25/10/2020 02:06:25;U087.FC200_PV.F_CV;33.019290924;100.0 +25/10/2020 02:06:26;U087.FC200_PV.F_CV;33.032947540;100.0 +25/10/2020 02:06:27;U087.FC200_PV.F_CV;32.954288483;100.0 +25/10/2020 02:06:28;U087.FC200_PV.F_CV;33.037586212;100.0 +25/10/2020 02:06:29;U087.FC200_PV.F_CV;33.058319092;100.0 +25/10/2020 02:06:30;U087.FC200_PV.F_CV;32.940250397;100.0 +25/10/2020 02:06:31;U087.FC200_PV.F_CV;32.932872772;100.0 +25/10/2020 02:06:32;U087.FC200_PV.F_CV;33.059860229;100.0 +25/10/2020 02:06:33;U087.FC200_PV.F_CV;32.953529358;100.0 +25/10/2020 02:06:34;U087.FC200_PV.F_CV;33.034996033;100.0 +25/10/2020 02:06:35;U087.FC200_PV.F_CV;33.009769440;100.0 +25/10/2020 02:06:36;U087.FC200_PV.F_CV;32.995704651;100.0 +25/10/2020 02:06:37;U087.FC200_PV.F_CV;32.996219635;100.0 +25/10/2020 02:06:38;U087.FC200_PV.F_CV;32.990139008;100.0 +25/10/2020 02:06:39;U087.FC200_PV.F_CV;32.990749359;100.0 +25/10/2020 02:06:40;U087.FC200_PV.F_CV;33.017673492;100.0 +25/10/2020 02:06:41;U087.FC200_PV.F_CV;33.053417206;100.0 +25/10/2020 02:06:42;U087.FC200_PV.F_CV;33.031826019;100.0 +25/10/2020 02:06:43;U087.FC200_PV.F_CV;32.956634521;100.0 +25/10/2020 02:06:44;U087.FC200_PV.F_CV;33.021800995;100.0 +25/10/2020 02:06:45;U087.FC200_PV.F_CV;33.018226624;100.0 +25/10/2020 02:06:46;U087.FC200_PV.F_CV;32.977527618;100.0 +25/10/2020 02:06:47;U087.FC200_PV.F_CV;32.999645233;100.0 +25/10/2020 02:06:48;U087.FC200_PV.F_CV;33.040081024;100.0 +25/10/2020 02:06:49;U087.FC200_PV.F_CV;32.990016937;100.0 +25/10/2020 02:06:50;U087.FC200_PV.F_CV;33.002262115;100.0 +25/10/2020 02:06:51;U087.FC200_PV.F_CV;32.991855621;100.0 +25/10/2020 02:06:52;U087.FC200_PV.F_CV;33.039943695;100.0 +25/10/2020 02:06:53;U087.FC200_PV.F_CV;33.016117096;100.0 +25/10/2020 02:06:54;U087.FC200_PV.F_CV;32.918552399;100.0 +25/10/2020 02:06:55;U087.FC200_PV.F_CV;33.031642914;100.0 +25/10/2020 02:06:56;U087.FC200_PV.F_CV;33.006839752;100.0 +25/10/2020 02:06:57;U087.FC200_PV.F_CV;32.958744049;100.0 +25/10/2020 02:06:59;U087.FC200_PV.F_CV;33.004066467;100.0 +25/10/2020 02:06:17;U087.FC200E_OP.F_CV;16.852064133;100.0 +25/10/2020 02:06:18;U087.FC200E_OP.F_CV;16.849012375;100.0 +25/10/2020 02:06:27;U087.FC200E_OP.F_CV;16.849012375;100.0 +25/10/2020 02:06:28;U087.FC200E_OP.F_CV;16.853590012;100.0 +25/10/2020 02:06:37;U087.FC200E_OP.F_CV;16.853590012;100.0 +25/10/2020 02:06:38;U087.FC200E_OP.F_CV;16.852064133;100.0 +25/10/2020 02:06:47;U087.FC200E_OP.F_CV;16.852064133;100.0 +25/10/2020 02:06:48;U087.FC200E_OP.F_CV;16.849012375;100.0 +25/10/2020 02:06:58;U087.FC200E_OP.F_CV;16.849012375;100.0 +25/10/2020 02:06:59;U087.FC200E_OP.F_CV;16.852064133;100.0 +25/10/2020 02:06:07;U087.FC200E_PV.F_CV;32.999771118;100.0 +25/10/2020 02:06:08;U087.FC200E_PV.F_CV;33.001602173;100.0 +25/10/2020 02:06:17;U087.FC200E_PV.F_CV;33.001602173;100.0 +25/10/2020 02:06:18;U087.FC200E_PV.F_CV;32.992446899;100.0 +25/10/2020 02:06:27;U087.FC200E_PV.F_CV;32.992446899;100.0 +25/10/2020 02:06:28;U087.FC200E_PV.F_CV;33.008926392;100.0 +25/10/2020 02:06:37;U087.FC200E_PV.F_CV;33.008926392;100.0 +25/10/2020 02:06:38;U087.FC200E_PV.F_CV;32.996109009;100.0 +25/10/2020 02:06:47;U087.FC200E_PV.F_CV;32.996109009;100.0 +25/10/2020 02:06:48;U087.FC200E_PV.F_CV;33.010757446;100.0 +25/10/2020 02:06:58;U087.FC200E_PV.F_CV;33.010757446;100.0 +25/10/2020 02:06:59;U087.FC200E_PV.F_CV;32.996109009;100.0 +25/10/2020 02:06:43;U087.FC200E_SP.F_CV;32.999771118;100.0 +25/10/2020 02:06:10;U087.FC201_PV.F_CV;0.094599999;100.0 +25/10/2020 02:06:07;U087.FC201E_OP.F_CV;4.388494492;100.0 +25/10/2020 02:06:25;U087.FC201E_PV.F_CV;0.094605938;100.0 +25/10/2020 02:06:43;U087.FC201E_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U087.FC202_PV.F_CV;0.001190699;100.0 +25/10/2020 02:06:01;U087.FC202_PV.F_CV;0.002238553;100.0 +25/10/2020 02:06:02;U087.FC202_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U087.FC202E_OP.F_CV;6.694132805;100.0 +25/10/2020 02:06:18;U087.FC202E_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U087.FC202E_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U087.FC203_PV.F_CV;168.569152832;100.0 +25/10/2020 02:06:02;U087.FC203_PV.F_CV;167.480468750;100.0 +25/10/2020 02:06:03;U087.FC203_PV.F_CV;168.290649414;100.0 +25/10/2020 02:06:04;U087.FC203_PV.F_CV;168.872970581;100.0 +25/10/2020 02:06:05;U087.FC203_PV.F_CV;168.948928833;100.0 +25/10/2020 02:06:06;U087.FC203_PV.F_CV;169.176788330;100.0 +25/10/2020 02:06:07;U087.FC203_PV.F_CV;168.088104248;100.0 +25/10/2020 02:06:08;U087.FC203_PV.F_CV;168.442565918;100.0 +25/10/2020 02:06:09;U087.FC203_PV.F_CV;168.822341919;100.0 +25/10/2020 02:06:10;U087.FC203_PV.F_CV;168.797012329;100.0 +25/10/2020 02:06:11;U087.FC203_PV.F_CV;167.708328247;100.0 +25/10/2020 02:06:12;U087.FC203_PV.F_CV;167.429824829;100.0 +25/10/2020 02:06:13;U087.FC203_PV.F_CV;167.986831665;100.0 +25/10/2020 02:06:14;U087.FC203_PV.F_CV;168.417251587;100.0 +25/10/2020 02:06:15;U087.FC203_PV.F_CV;167.910873413;100.0 +25/10/2020 02:06:16;U087.FC203_PV.F_CV;167.556427002;100.0 +25/10/2020 02:06:17;U087.FC203_PV.F_CV;167.581741333;100.0 +25/10/2020 02:06:18;U087.FC203_PV.F_CV;168.923614502;100.0 +25/10/2020 02:06:19;U087.FC203_PV.F_CV;169.050201416;100.0 +25/10/2020 02:06:20;U087.FC203_PV.F_CV;168.240020752;100.0 +25/10/2020 02:06:21;U087.FC203_PV.F_CV;167.733657837;100.0 +25/10/2020 02:06:22;U087.FC203_PV.F_CV;167.784286499;100.0 +25/10/2020 02:06:23;U087.FC203_PV.F_CV;168.543838501;100.0 +25/10/2020 02:06:24;U087.FC203_PV.F_CV;168.366607666;100.0 +25/10/2020 02:06:25;U087.FC203_PV.F_CV;168.290649414;100.0 +25/10/2020 02:06:26;U087.FC203_PV.F_CV;167.277923584;100.0 +25/10/2020 02:06:27;U087.FC203_PV.F_CV;167.834930420;100.0 +25/10/2020 02:06:28;U087.FC203_PV.F_CV;168.417251587;100.0 +25/10/2020 02:06:29;U087.FC203_PV.F_CV;168.189376831;100.0 +25/10/2020 02:06:30;U087.FC203_PV.F_CV;167.683013916;100.0 +25/10/2020 02:06:31;U087.FC203_PV.F_CV;167.303237915;100.0 +25/10/2020 02:06:32;U087.FC203_PV.F_CV;168.290649414;100.0 +25/10/2020 02:06:33;U087.FC203_PV.F_CV;169.252746582;100.0 +25/10/2020 02:06:34;U087.FC203_PV.F_CV;169.303390503;100.0 +25/10/2020 02:06:35;U087.FC203_PV.F_CV;168.543838501;100.0 +25/10/2020 02:06:36;U087.FC203_PV.F_CV;167.480468750;100.0 +25/10/2020 02:06:37;U087.FC203_PV.F_CV;168.948928833;100.0 +25/10/2020 02:06:38;U087.FC203_PV.F_CV;168.543838501;100.0 +25/10/2020 02:06:39;U087.FC203_PV.F_CV;168.847656250;100.0 +25/10/2020 02:06:40;U087.FC203_PV.F_CV;167.657699585;100.0 +25/10/2020 02:06:41;U087.FC203_PV.F_CV;167.910873413;100.0 +25/10/2020 02:06:42;U087.FC203_PV.F_CV;167.986831665;100.0 +25/10/2020 02:06:43;U087.FC203_PV.F_CV;168.037475586;100.0 +25/10/2020 02:06:44;U087.FC203_PV.F_CV;167.303237915;100.0 +25/10/2020 02:06:45;U087.FC203_PV.F_CV;167.480468750;100.0 +25/10/2020 02:06:46;U087.FC203_PV.F_CV;168.594467163;100.0 +25/10/2020 02:06:47;U087.FC203_PV.F_CV;168.974243164;100.0 +25/10/2020 02:06:48;U087.FC203_PV.F_CV;168.037475586;100.0 +25/10/2020 02:06:49;U087.FC203_PV.F_CV;167.480468750;100.0 +25/10/2020 02:06:50;U087.FC203_PV.F_CV;168.113418579;100.0 +25/10/2020 02:06:51;U087.FC203_PV.F_CV;169.379333496;100.0 +25/10/2020 02:06:52;U087.FC203_PV.F_CV;168.670425415;100.0 +25/10/2020 02:06:53;U087.FC203_PV.F_CV;167.581741333;100.0 +25/10/2020 02:06:54;U087.FC203_PV.F_CV;167.151336670;100.0 +25/10/2020 02:06:55;U087.FC203_PV.F_CV;168.240020752;100.0 +25/10/2020 02:06:56;U087.FC203_PV.F_CV;169.075515747;100.0 +25/10/2020 02:06:57;U087.FC203_PV.F_CV;168.948928833;100.0 +25/10/2020 02:06:59;U087.FC203_PV.F_CV;167.303237915;100.0 +25/10/2020 02:06:07;U087.FC203E_PV.F_CV;168.054473877;100.0 +25/10/2020 02:06:08;U087.FC203E_PV.F_CV;168.519119263;100.0 +25/10/2020 02:06:17;U087.FC203E_PV.F_CV;168.519119263;100.0 +25/10/2020 02:06:18;U087.FC203E_PV.F_CV;168.113220215;100.0 +25/10/2020 02:06:27;U087.FC203E_PV.F_CV;168.113220215;100.0 +25/10/2020 02:06:28;U087.FC203E_PV.F_CV;168.150604248;100.0 +25/10/2020 02:06:37;U087.FC203E_PV.F_CV;168.150604248;100.0 +25/10/2020 02:06:38;U087.FC203E_PV.F_CV;168.353546143;100.0 +25/10/2020 02:06:47;U087.FC203E_PV.F_CV;168.353546143;100.0 +25/10/2020 02:06:48;U087.FC203E_PV.F_CV;168.081176758;100.0 +25/10/2020 02:06:58;U087.FC203E_PV.F_CV;168.081176758;100.0 +25/10/2020 02:06:59;U087.FC203E_PV.F_CV;168.305480957;100.0 +25/10/2020 02:06:31;U087.FC203E_SP.F_CV;168.102539063;100.0 +25/10/2020 02:06:00;U087.FC300_PV.F_CV;32.979003906;100.0 +25/10/2020 02:06:01;U087.FC300_PV.F_CV;33.032508850;100.0 +25/10/2020 02:06:02;U087.FC300_PV.F_CV;33.049961090;100.0 +25/10/2020 02:06:03;U087.FC300_PV.F_CV;32.943862915;100.0 +25/10/2020 02:06:04;U087.FC300_PV.F_CV;33.004516602;100.0 +25/10/2020 02:06:05;U087.FC300_PV.F_CV;32.968761444;100.0 +25/10/2020 02:06:06;U087.FC300_PV.F_CV;33.022853851;100.0 +25/10/2020 02:06:07;U087.FC300_PV.F_CV;32.917831421;100.0 +25/10/2020 02:06:08;U087.FC300_PV.F_CV;33.021549225;100.0 +25/10/2020 02:06:09;U087.FC300_PV.F_CV;33.041328430;100.0 +25/10/2020 02:06:10;U087.FC300_PV.F_CV;32.998317719;100.0 +25/10/2020 02:06:11;U087.FC300_PV.F_CV;32.928924561;100.0 +25/10/2020 02:06:12;U087.FC300_PV.F_CV;32.996158600;100.0 +25/10/2020 02:06:13;U087.FC300_PV.F_CV;33.037815094;100.0 +25/10/2020 02:06:14;U087.FC300_PV.F_CV;33.019046783;100.0 +25/10/2020 02:06:15;U087.FC300_PV.F_CV;32.964710236;100.0 +25/10/2020 02:06:16;U087.FC300_PV.F_CV;33.040138245;100.0 +25/10/2020 02:06:17;U087.FC300_PV.F_CV;33.013946533;100.0 +25/10/2020 02:06:18;U087.FC300_PV.F_CV;32.894676208;100.0 +25/10/2020 02:06:19;U087.FC300_PV.F_CV;33.044441223;100.0 +25/10/2020 02:06:20;U087.FC300_PV.F_CV;33.022743225;100.0 +25/10/2020 02:06:21;U087.FC300_PV.F_CV;32.979003906;100.0 +25/10/2020 02:06:22;U087.FC300_PV.F_CV;33.010799408;100.0 +25/10/2020 02:06:23;U087.FC300_PV.F_CV;32.956760406;100.0 +25/10/2020 02:06:24;U087.FC300_PV.F_CV;33.060855865;100.0 +25/10/2020 02:06:25;U087.FC300_PV.F_CV;33.018104553;100.0 +25/10/2020 02:06:26;U087.FC300_PV.F_CV;32.969684601;100.0 +25/10/2020 02:06:27;U087.FC300_PV.F_CV;32.959957123;100.0 +25/10/2020 02:06:28;U087.FC300_PV.F_CV;33.002086639;100.0 +25/10/2020 02:06:29;U087.FC300_PV.F_CV;32.989101410;100.0 +25/10/2020 02:06:30;U087.FC300_PV.F_CV;32.994121552;100.0 +25/10/2020 02:06:31;U087.FC300_PV.F_CV;33.009246826;100.0 +25/10/2020 02:06:32;U087.FC300_PV.F_CV;32.971515656;100.0 +25/10/2020 02:06:33;U087.FC300_PV.F_CV;33.034793854;100.0 +25/10/2020 02:06:34;U087.FC300_PV.F_CV;32.927425385;100.0 +25/10/2020 02:06:35;U087.FC300_PV.F_CV;33.075183868;100.0 +25/10/2020 02:06:36;U087.FC300_PV.F_CV;32.981670380;100.0 +25/10/2020 02:06:37;U087.FC300_PV.F_CV;32.991603851;100.0 +25/10/2020 02:06:38;U087.FC300_PV.F_CV;32.955356598;100.0 +25/10/2020 02:06:39;U087.FC300_PV.F_CV;32.970882416;100.0 +25/10/2020 02:06:40;U087.FC300_PV.F_CV;32.937587738;100.0 +25/10/2020 02:06:41;U087.FC300_PV.F_CV;33.008468628;100.0 +25/10/2020 02:06:42;U087.FC300_PV.F_CV;33.047355652;100.0 +25/10/2020 02:06:43;U087.FC300_PV.F_CV;33.019966125;100.0 +25/10/2020 02:06:44;U087.FC300_PV.F_CV;32.921207428;100.0 +25/10/2020 02:06:45;U087.FC300_PV.F_CV;32.998569489;100.0 +25/10/2020 02:06:46;U087.FC300_PV.F_CV;33.065673828;100.0 +25/10/2020 02:06:47;U087.FC300_PV.F_CV;32.998477936;100.0 +25/10/2020 02:06:48;U087.FC300_PV.F_CV;32.996475220;100.0 +25/10/2020 02:06:49;U087.FC300_PV.F_CV;32.947490692;100.0 +25/10/2020 02:06:50;U087.FC300_PV.F_CV;32.965461731;100.0 +25/10/2020 02:06:51;U087.FC300_PV.F_CV;33.003532410;100.0 +25/10/2020 02:06:52;U087.FC300_PV.F_CV;32.984855652;100.0 +25/10/2020 02:06:53;U087.FC300_PV.F_CV;32.976661682;100.0 +25/10/2020 02:06:54;U087.FC300_PV.F_CV;32.995479584;100.0 +25/10/2020 02:06:55;U087.FC300_PV.F_CV;32.984615326;100.0 +25/10/2020 02:06:56;U087.FC300_PV.F_CV;33.038688660;100.0 +25/10/2020 02:06:57;U087.FC300_PV.F_CV;32.993030548;100.0 +25/10/2020 02:06:59;U087.FC300_PV.F_CV;32.887924194;100.0 +25/10/2020 02:06:07;U087.FC300E_OP.F_CV;23.488212585;100.0 +25/10/2020 02:06:08;U087.FC300E_OP.F_CV;23.492790222;100.0 +25/10/2020 02:06:17;U087.FC300E_OP.F_CV;23.492790222;100.0 +25/10/2020 02:06:18;U087.FC300E_OP.F_CV;23.491264343;100.0 +25/10/2020 02:06:27;U087.FC300E_OP.F_CV;23.491264343;100.0 +25/10/2020 02:06:28;U087.FC300E_OP.F_CV;23.497367859;100.0 +25/10/2020 02:06:37;U087.FC300E_OP.F_CV;23.497367859;100.0 +25/10/2020 02:06:38;U087.FC300E_OP.F_CV;23.491264343;100.0 +25/10/2020 02:06:47;U087.FC300E_OP.F_CV;23.491264343;100.0 +25/10/2020 02:06:48;U087.FC300E_OP.F_CV;23.495841980;100.0 +25/10/2020 02:06:58;U087.FC300E_OP.F_CV;23.495841980;100.0 +25/10/2020 02:06:59;U087.FC300E_OP.F_CV;23.494316101;100.0 +25/10/2020 02:06:07;U087.FC300E_PV.F_CV;32.985122681;100.0 +25/10/2020 02:06:08;U087.FC300E_PV.F_CV;32.994277954;100.0 +25/10/2020 02:06:17;U087.FC300E_PV.F_CV;32.994277954;100.0 +25/10/2020 02:06:18;U087.FC300E_PV.F_CV;32.992446899;100.0 +25/10/2020 02:06:27;U087.FC300E_PV.F_CV;32.992446899;100.0 +25/10/2020 02:06:28;U087.FC300E_PV.F_CV;33.001602173;100.0 +25/10/2020 02:06:37;U087.FC300E_PV.F_CV;33.001602173;100.0 +25/10/2020 02:06:38;U087.FC300E_PV.F_CV;32.992446899;100.0 +25/10/2020 02:06:47;U087.FC300E_PV.F_CV;32.992446899;100.0 +25/10/2020 02:06:48;U087.FC300E_PV.F_CV;32.996109009;100.0 +25/10/2020 02:06:58;U087.FC300E_PV.F_CV;32.996109009;100.0 +25/10/2020 02:06:59;U087.FC300E_PV.F_CV;32.988784790;100.0 +25/10/2020 02:06:43;U087.FC300E_SP.F_CV;32.999771118;100.0 +25/10/2020 02:06:09;U087.FC301_PV.F_CV;0.083700001;100.0 +25/10/2020 02:06:43;U087.FC301E_OP.F_CV;2.565041542;100.0 +25/10/2020 02:06:18;U087.FC301E_PV.F_CV;0.083619438;100.0 +25/10/2020 02:06:43;U087.FC301E_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U087.FC302_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U087.FC302E_OP.F_CV;4.884412766;100.0 +25/10/2020 02:06:00;U087.FC302E_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U087.FC302E_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U087.FC303_PV.F_CV;168.721069336;100.0 +25/10/2020 02:06:01;U087.FC303_PV.F_CV;168.872970581;100.0 +25/10/2020 02:06:02;U087.FC303_PV.F_CV;168.290649414;100.0 +25/10/2020 02:06:03;U087.FC303_PV.F_CV;167.961517334;100.0 +25/10/2020 02:06:04;U087.FC303_PV.F_CV;168.315979004;100.0 +25/10/2020 02:06:05;U087.FC303_PV.F_CV;168.290649414;100.0 +25/10/2020 02:06:06;U087.FC303_PV.F_CV;168.847656250;100.0 +25/10/2020 02:06:07;U087.FC303_PV.F_CV;169.227432251;100.0 +25/10/2020 02:06:08;U087.FC303_PV.F_CV;168.670425415;100.0 +25/10/2020 02:06:09;U087.FC303_PV.F_CV;168.189376831;100.0 +25/10/2020 02:06:10;U087.FC303_PV.F_CV;168.290649414;100.0 +25/10/2020 02:06:11;U087.FC303_PV.F_CV;168.999572754;100.0 +25/10/2020 02:06:12;U087.FC303_PV.F_CV;169.581893921;100.0 +25/10/2020 02:06:13;U087.FC303_PV.F_CV;168.999572754;100.0 +25/10/2020 02:06:14;U087.FC303_PV.F_CV;169.176788330;100.0 +25/10/2020 02:06:15;U087.FC303_PV.F_CV;168.872970581;100.0 +25/10/2020 02:06:16;U087.FC303_PV.F_CV;169.100845337;100.0 +25/10/2020 02:06:17;U087.FC303_PV.F_CV;168.493194580;100.0 +25/10/2020 02:06:18;U087.FC303_PV.F_CV;169.354019165;100.0 +25/10/2020 02:06:19;U087.FC303_PV.F_CV;169.379333496;100.0 +25/10/2020 02:06:20;U087.FC303_PV.F_CV;169.202117920;100.0 +25/10/2020 02:06:21;U087.FC303_PV.F_CV;168.797012329;100.0 +25/10/2020 02:06:22;U087.FC303_PV.F_CV;169.126159668;100.0 +25/10/2020 02:06:23;U087.FC303_PV.F_CV;169.075515747;100.0 +25/10/2020 02:06:24;U087.FC303_PV.F_CV;169.050201416;100.0 +25/10/2020 02:06:25;U087.FC303_PV.F_CV;167.708328247;100.0 +25/10/2020 02:06:26;U087.FC303_PV.F_CV;168.366607666;100.0 +25/10/2020 02:06:27;U087.FC303_PV.F_CV;168.948928833;100.0 +25/10/2020 02:06:28;U087.FC303_PV.F_CV;168.872970581;100.0 +25/10/2020 02:06:29;U087.FC303_PV.F_CV;168.290649414;100.0 +25/10/2020 02:06:32;U087.FC303_PV.F_CV;168.240020752;100.0 +25/10/2020 02:06:34;U087.FC303_PV.F_CV;168.974243164;100.0 +25/10/2020 02:06:35;U087.FC303_PV.F_CV;168.872970581;100.0 +25/10/2020 02:06:36;U087.FC303_PV.F_CV;169.126159668;100.0 +25/10/2020 02:06:37;U087.FC303_PV.F_CV;168.695739746;100.0 +25/10/2020 02:06:38;U087.FC303_PV.F_CV;168.341293335;100.0 +25/10/2020 02:06:39;U087.FC303_PV.F_CV;169.050201416;100.0 +25/10/2020 02:06:41;U087.FC303_PV.F_CV;170.062927246;100.0 +25/10/2020 02:06:42;U087.FC303_PV.F_CV;169.126159668;100.0 +25/10/2020 02:06:43;U087.FC303_PV.F_CV;168.366607666;100.0 +25/10/2020 02:06:44;U087.FC303_PV.F_CV;169.202117920;100.0 +25/10/2020 02:06:45;U087.FC303_PV.F_CV;169.100845337;100.0 +25/10/2020 02:06:46;U087.FC303_PV.F_CV;168.366607666;100.0 +25/10/2020 02:06:47;U087.FC303_PV.F_CV;167.708328247;100.0 +25/10/2020 02:06:48;U087.FC303_PV.F_CV;166.569015503;100.0 +25/10/2020 02:06:49;U087.FC303_PV.F_CV;167.860244751;100.0 +25/10/2020 02:06:50;U087.FC303_PV.F_CV;168.290649414;100.0 +25/10/2020 02:06:51;U087.FC303_PV.F_CV;168.341293335;100.0 +25/10/2020 02:06:52;U087.FC303_PV.F_CV;169.075515747;100.0 +25/10/2020 02:06:53;U087.FC303_PV.F_CV;169.607208252;100.0 +25/10/2020 02:06:54;U087.FC303_PV.F_CV;169.860382080;100.0 +25/10/2020 02:06:55;U087.FC303_PV.F_CV;170.012298584;100.0 +25/10/2020 02:06:56;U087.FC303_PV.F_CV;169.607208252;100.0 +25/10/2020 02:06:57;U087.FC303_PV.F_CV;168.619796753;100.0 +25/10/2020 02:06:59;U087.FC303_PV.F_CV;168.847656250;100.0 +25/10/2020 02:06:07;U087.FC303E_PV.F_CV;168.545822144;100.0 +25/10/2020 02:06:08;U087.FC303E_PV.F_CV;168.663314819;100.0 +25/10/2020 02:06:17;U087.FC303E_PV.F_CV;168.663314819;100.0 +25/10/2020 02:06:18;U087.FC303E_PV.F_CV;168.903640747;100.0 +25/10/2020 02:06:27;U087.FC303E_PV.F_CV;168.903640747;100.0 +25/10/2020 02:06:28;U087.FC303E_PV.F_CV;168.850234985;100.0 +25/10/2020 02:06:37;U087.FC303E_PV.F_CV;168.850234985;100.0 +25/10/2020 02:06:38;U087.FC303E_PV.F_CV;168.535140991;100.0 +25/10/2020 02:06:47;U087.FC303E_PV.F_CV;168.535140991;100.0 +25/10/2020 02:06:48;U087.FC303E_PV.F_CV;168.706039429;100.0 +25/10/2020 02:06:58;U087.FC303E_PV.F_CV;168.706039429;100.0 +25/10/2020 02:06:59;U087.FC303E_PV.F_CV;168.967727661;100.0 +25/10/2020 02:06:41;U087.FC303E_SP.F_CV;168.102539063;100.0 +25/10/2020 02:06:00;U087.FC400_PV.F_CV;33.079383850;100.0 +25/10/2020 02:06:01;U087.FC400_PV.F_CV;33.013175964;100.0 +25/10/2020 02:06:02;U087.FC400_PV.F_CV;33.001789093;100.0 +25/10/2020 02:06:03;U087.FC400_PV.F_CV;33.014774323;100.0 +25/10/2020 02:06:04;U087.FC400_PV.F_CV;33.009872437;100.0 +25/10/2020 02:06:05;U087.FC400_PV.F_CV;32.993831635;100.0 +25/10/2020 02:06:06;U087.FC400_PV.F_CV;33.017288208;100.0 +25/10/2020 02:06:07;U087.FC400_PV.F_CV;32.978363037;100.0 +25/10/2020 02:06:08;U087.FC400_PV.F_CV;32.936500549;100.0 +25/10/2020 02:06:09;U087.FC400_PV.F_CV;32.983448029;100.0 +25/10/2020 02:06:10;U087.FC400_PV.F_CV;33.080135345;100.0 +25/10/2020 02:06:11;U087.FC400_PV.F_CV;32.966587067;100.0 +25/10/2020 02:06:12;U087.FC400_PV.F_CV;32.912643433;100.0 +25/10/2020 02:06:13;U087.FC400_PV.F_CV;33.069988251;100.0 +25/10/2020 02:06:14;U087.FC400_PV.F_CV;33.057201385;100.0 +25/10/2020 02:06:15;U087.FC400_PV.F_CV;32.990364075;100.0 +25/10/2020 02:06:16;U087.FC400_PV.F_CV;33.028949738;100.0 +25/10/2020 02:06:17;U087.FC400_PV.F_CV;33.059913635;100.0 +25/10/2020 02:06:18;U087.FC400_PV.F_CV;32.944362640;100.0 +25/10/2020 02:06:19;U087.FC400_PV.F_CV;32.859821320;100.0 +25/10/2020 02:06:20;U087.FC400_PV.F_CV;32.843276978;100.0 +25/10/2020 02:06:21;U087.FC400_PV.F_CV;33.148624420;100.0 +25/10/2020 02:06:22;U087.FC400_PV.F_CV;33.106559753;100.0 +25/10/2020 02:06:23;U087.FC400_PV.F_CV;32.948657990;100.0 +25/10/2020 02:06:24;U087.FC400_PV.F_CV;33.113689423;100.0 +25/10/2020 02:06:25;U087.FC400_PV.F_CV;33.020236969;100.0 +25/10/2020 02:06:26;U087.FC400_PV.F_CV;32.924022675;100.0 +25/10/2020 02:06:27;U087.FC400_PV.F_CV;32.978530884;100.0 +25/10/2020 02:06:28;U087.FC400_PV.F_CV;33.065139771;100.0 +25/10/2020 02:06:29;U087.FC400_PV.F_CV;33.086105347;100.0 +25/10/2020 02:06:30;U087.FC400_PV.F_CV;32.969985962;100.0 +25/10/2020 02:06:31;U087.FC400_PV.F_CV;33.001762390;100.0 +25/10/2020 02:06:32;U087.FC400_PV.F_CV;33.007499695;100.0 +25/10/2020 02:06:33;U087.FC400_PV.F_CV;32.948116302;100.0 +25/10/2020 02:06:34;U087.FC400_PV.F_CV;32.926124573;100.0 +25/10/2020 02:06:35;U087.FC400_PV.F_CV;33.029621124;100.0 +25/10/2020 02:06:36;U087.FC400_PV.F_CV;32.905242920;100.0 +25/10/2020 02:06:37;U087.FC400_PV.F_CV;32.966400146;100.0 +25/10/2020 02:06:38;U087.FC400_PV.F_CV;32.957172394;100.0 +25/10/2020 02:06:39;U087.FC400_PV.F_CV;33.083648682;100.0 +25/10/2020 02:06:40;U087.FC400_PV.F_CV;33.013053894;100.0 +25/10/2020 02:06:41;U087.FC400_PV.F_CV;33.006305695;100.0 +25/10/2020 02:06:42;U087.FC400_PV.F_CV;32.977275848;100.0 +25/10/2020 02:06:43;U087.FC400_PV.F_CV;33.046611786;100.0 +25/10/2020 02:06:44;U087.FC400_PV.F_CV;32.986408234;100.0 +25/10/2020 02:06:45;U087.FC400_PV.F_CV;32.950489044;100.0 +25/10/2020 02:06:46;U087.FC400_PV.F_CV;33.063945770;100.0 +25/10/2020 02:06:47;U087.FC400_PV.F_CV;33.023666382;100.0 +25/10/2020 02:06:48;U087.FC400_PV.F_CV;32.999149323;100.0 +25/10/2020 02:06:49;U087.FC400_PV.F_CV;33.010932922;100.0 +25/10/2020 02:06:50;U087.FC400_PV.F_CV;32.969833374;100.0 +25/10/2020 02:06:51;U087.FC400_PV.F_CV;33.042961121;100.0 +25/10/2020 02:06:52;U087.FC400_PV.F_CV;33.032585144;100.0 +25/10/2020 02:06:53;U087.FC400_PV.F_CV;32.972499847;100.0 +25/10/2020 02:06:54;U087.FC400_PV.F_CV;33.054656982;100.0 +25/10/2020 02:06:55;U087.FC400_PV.F_CV;32.982208252;100.0 +25/10/2020 02:06:56;U087.FC400_PV.F_CV;33.028709412;100.0 +25/10/2020 02:06:57;U087.FC400_PV.F_CV;32.977661133;100.0 +25/10/2020 02:06:59;U087.FC400_PV.F_CV;32.932182312;100.0 +25/10/2020 02:06:07;U087.FC400E_OP.F_CV;19.813840866;100.0 +25/10/2020 02:06:08;U087.FC400E_OP.F_CV;19.822996140;100.0 +25/10/2020 02:06:17;U087.FC400E_OP.F_CV;19.822996140;100.0 +25/10/2020 02:06:18;U087.FC400E_OP.F_CV;19.812313080;100.0 +25/10/2020 02:06:27;U087.FC400E_OP.F_CV;19.812313080;100.0 +25/10/2020 02:06:28;U087.FC400E_OP.F_CV;19.818418503;100.0 +25/10/2020 02:06:37;U087.FC400E_OP.F_CV;19.818418503;100.0 +25/10/2020 02:06:38;U087.FC400E_OP.F_CV;19.812313080;100.0 +25/10/2020 02:06:47;U087.FC400E_OP.F_CV;19.812313080;100.0 +25/10/2020 02:06:48;U087.FC400E_OP.F_CV;19.824522018;100.0 +25/10/2020 02:06:58;U087.FC400E_OP.F_CV;19.824522018;100.0 +25/10/2020 02:06:59;U087.FC400E_OP.F_CV;19.816892624;100.0 +25/10/2020 02:06:07;U087.FC400E_PV.F_CV;32.990615845;100.0 +25/10/2020 02:06:08;U087.FC400E_PV.F_CV;33.005264282;100.0 +25/10/2020 02:06:17;U087.FC400E_PV.F_CV;33.005264282;100.0 +25/10/2020 02:06:18;U087.FC400E_PV.F_CV;33.008926392;100.0 +25/10/2020 02:06:27;U087.FC400E_PV.F_CV;33.008926392;100.0 +25/10/2020 02:06:28;U087.FC400E_PV.F_CV;32.999771118;100.0 +25/10/2020 02:06:37;U087.FC400E_PV.F_CV;32.999771118;100.0 +25/10/2020 02:06:38;U087.FC400E_PV.F_CV;32.979629517;100.0 +25/10/2020 02:06:47;U087.FC400E_PV.F_CV;32.979629517;100.0 +25/10/2020 02:06:48;U087.FC400E_PV.F_CV;33.014419556;100.0 +25/10/2020 02:06:58;U087.FC400E_PV.F_CV;33.014419556;100.0 +25/10/2020 02:06:59;U087.FC400E_PV.F_CV;33.001602173;100.0 +25/10/2020 02:06:43;U087.FC400E_SP.F_CV;32.999771118;100.0 +25/10/2020 02:06:00;U087.FC401_PV.F_CV;-0.039729685;100.0 +25/10/2020 02:06:01;U087.FC401_PV.F_CV;-0.039715685;100.0 +25/10/2020 02:06:02;U087.FC401_PV.F_CV;-0.038562380;100.0 +25/10/2020 02:06:03;U087.FC401_PV.F_CV;-0.038716834;100.0 +25/10/2020 02:06:04;U087.FC401_PV.F_CV;-0.038532354;100.0 +25/10/2020 02:06:05;U087.FC401_PV.F_CV;-0.038032107;100.0 +25/10/2020 02:06:06;U087.FC401_PV.F_CV;-0.039281100;100.0 +25/10/2020 02:06:07;U087.FC401_PV.F_CV;-0.039400540;100.0 +25/10/2020 02:06:08;U087.FC401_PV.F_CV;-0.038946420;100.0 +25/10/2020 02:06:09;U087.FC401_PV.F_CV;-0.039264496;100.0 +25/10/2020 02:06:10;U087.FC401_PV.F_CV;-0.040195793;100.0 +25/10/2020 02:06:11;U087.FC401_PV.F_CV;-0.038991101;100.0 +25/10/2020 02:06:12;U087.FC401_PV.F_CV;-0.037033826;100.0 +25/10/2020 02:06:13;U087.FC401_PV.F_CV;-0.038815651;100.0 +25/10/2020 02:06:14;U087.FC401_PV.F_CV;-0.039948266;100.0 +25/10/2020 02:06:15;U087.FC401_PV.F_CV;-0.040031508;100.0 +25/10/2020 02:06:16;U087.FC401_PV.F_CV;-0.040171336;100.0 +25/10/2020 02:06:17;U087.FC401_PV.F_CV;-0.040290009;100.0 +25/10/2020 02:06:18;U087.FC401_PV.F_CV;-0.038561806;100.0 +25/10/2020 02:06:19;U087.FC401_PV.F_CV;-0.034499750;100.0 +25/10/2020 02:06:20;U087.FC401_PV.F_CV;-0.030192997;100.0 +25/10/2020 02:06:21;U087.FC401_PV.F_CV;-0.034760024;100.0 +25/10/2020 02:06:22;U087.FC401_PV.F_CV;-0.037000440;100.0 +25/10/2020 02:06:23;U087.FC401_PV.F_CV;-0.035513375;100.0 +25/10/2020 02:06:24;U087.FC401_PV.F_CV;-0.037986986;100.0 +25/10/2020 02:06:25;U087.FC401_PV.F_CV;-0.038695302;100.0 +25/10/2020 02:06:26;U087.FC401_PV.F_CV;-0.034810271;100.0 +25/10/2020 02:06:27;U087.FC401_PV.F_CV;-0.036789849;100.0 +25/10/2020 02:06:28;U087.FC401_PV.F_CV;-0.038727902;100.0 +25/10/2020 02:06:29;U087.FC401_PV.F_CV;-0.039418332;100.0 +25/10/2020 02:06:30;U087.FC401_PV.F_CV;-0.038758654;100.0 +25/10/2020 02:06:31;U087.FC401_PV.F_CV;-0.038830064;100.0 +25/10/2020 02:06:32;U087.FC401_PV.F_CV;-0.039747700;100.0 +25/10/2020 02:06:33;U087.FC401_PV.F_CV;-0.038663838;100.0 +25/10/2020 02:06:34;U087.FC401_PV.F_CV;-0.038012516;100.0 +25/10/2020 02:06:35;U087.FC401_PV.F_CV;-0.039493576;100.0 +25/10/2020 02:06:36;U087.FC401_PV.F_CV;-0.038176414;100.0 +25/10/2020 02:06:37;U087.FC401_PV.F_CV;-0.038985871;100.0 +25/10/2020 02:06:38;U087.FC401_PV.F_CV;-0.039071195;100.0 +25/10/2020 02:06:39;U087.FC401_PV.F_CV;-0.040144902;100.0 +25/10/2020 02:06:40;U087.FC401_PV.F_CV;-0.039221868;100.0 +25/10/2020 02:06:41;U087.FC401_PV.F_CV;-0.038280748;100.0 +25/10/2020 02:06:42;U087.FC401_PV.F_CV;-0.038390487;100.0 +25/10/2020 02:06:43;U087.FC401_PV.F_CV;-0.039349388;100.0 +25/10/2020 02:06:44;U087.FC401_PV.F_CV;-0.038647197;100.0 +25/10/2020 02:06:45;U087.FC401_PV.F_CV;-0.037715644;100.0 +25/10/2020 02:06:46;U087.FC401_PV.F_CV;-0.039156783;100.0 +25/10/2020 02:06:47;U087.FC401_PV.F_CV;-0.039496265;100.0 +25/10/2020 02:06:48;U087.FC401_PV.F_CV;-0.038593300;100.0 +25/10/2020 02:06:49;U087.FC401_PV.F_CV;-0.038516466;100.0 +25/10/2020 02:06:50;U087.FC401_PV.F_CV;-0.038551003;100.0 +25/10/2020 02:06:51;U087.FC401_PV.F_CV;-0.039326966;100.0 +25/10/2020 02:06:52;U087.FC401_PV.F_CV;-0.040281650;100.0 +25/10/2020 02:06:53;U087.FC401_PV.F_CV;-0.039639100;100.0 +25/10/2020 02:06:54;U087.FC401_PV.F_CV;-0.040489353;100.0 +25/10/2020 02:06:55;U087.FC401_PV.F_CV;-0.040181786;100.0 +25/10/2020 02:06:56;U087.FC401_PV.F_CV;-0.040689308;100.0 +25/10/2020 02:06:57;U087.FC401_PV.F_CV;-0.039957434;100.0 +25/10/2020 02:06:59;U087.FC401_PV.F_CV;-0.038024552;100.0 +25/10/2020 02:06:43;U087.FC401E_OP.F_CV;19.969482422;100.0 +25/10/2020 02:06:21;U087.FC401E_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U087.FC401E_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U087.FC402_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U087.FC402E_OP.F_CV;5.554284096;100.0 +25/10/2020 02:06:43;U087.FC402E_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U087.FC402E_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U087.FC403_PV.F_CV;170.493347168;100.0 +25/10/2020 02:06:01;U087.FC403_PV.F_CV;170.594619751;100.0 +25/10/2020 02:06:02;U087.FC403_PV.F_CV;170.771850586;100.0 +25/10/2020 02:06:03;U087.FC403_PV.F_CV;170.594619751;100.0 +25/10/2020 02:06:05;U087.FC403_PV.F_CV;170.113571167;100.0 +25/10/2020 02:06:06;U087.FC403_PV.F_CV;170.240158081;100.0 +25/10/2020 02:06:07;U087.FC403_PV.F_CV;170.341430664;100.0 +25/10/2020 02:06:08;U087.FC403_PV.F_CV;170.214843750;100.0 +25/10/2020 02:06:09;U087.FC403_PV.F_CV;169.683166504;100.0 +25/10/2020 02:06:10;U087.FC403_PV.F_CV;169.986984253;100.0 +25/10/2020 02:06:11;U087.FC403_PV.F_CV;170.240158081;100.0 +25/10/2020 02:06:12;U087.FC403_PV.F_CV;170.265487671;100.0 +25/10/2020 02:06:13;U087.FC403_PV.F_CV;170.316116333;100.0 +25/10/2020 02:06:14;U087.FC403_PV.F_CV;169.581893921;100.0 +25/10/2020 02:06:15;U087.FC403_PV.F_CV;169.505935669;100.0 +25/10/2020 02:06:16;U087.FC403_PV.F_CV;169.632522583;100.0 +25/10/2020 02:06:17;U087.FC403_PV.F_CV;169.480606079;100.0 +25/10/2020 02:06:18;U087.FC403_PV.F_CV;168.847656250;100.0 +25/10/2020 02:06:19;U087.FC403_PV.F_CV;168.619796753;100.0 +25/10/2020 02:06:20;U087.FC403_PV.F_CV;169.379333496;100.0 +25/10/2020 02:06:21;U087.FC403_PV.F_CV;170.062927246;100.0 +25/10/2020 02:06:22;U087.FC403_PV.F_CV;170.341430664;100.0 +25/10/2020 02:06:23;U087.FC403_PV.F_CV;170.240158081;100.0 +25/10/2020 02:06:24;U087.FC403_PV.F_CV;169.581893921;100.0 +25/10/2020 02:06:25;U087.FC403_PV.F_CV;169.632522583;100.0 +25/10/2020 02:06:26;U087.FC403_PV.F_CV;170.366760254;100.0 +25/10/2020 02:06:27;U087.FC403_PV.F_CV;170.088256836;100.0 +25/10/2020 02:06:28;U087.FC403_PV.F_CV;170.062927246;100.0 +25/10/2020 02:06:29;U087.FC403_PV.F_CV;169.632522583;100.0 +25/10/2020 02:06:30;U087.FC403_PV.F_CV;170.012298584;100.0 +25/10/2020 02:06:31;U087.FC403_PV.F_CV;169.936340332;100.0 +25/10/2020 02:06:32;U087.FC403_PV.F_CV;169.581893921;100.0 +25/10/2020 02:06:33;U087.FC403_PV.F_CV;169.379333496;100.0 +25/10/2020 02:06:34;U087.FC403_PV.F_CV;169.632522583;100.0 +25/10/2020 02:06:35;U087.FC403_PV.F_CV;169.936340332;100.0 +25/10/2020 02:06:36;U087.FC403_PV.F_CV;169.885711670;100.0 +25/10/2020 02:06:37;U087.FC403_PV.F_CV;169.961654663;100.0 +25/10/2020 02:06:38;U087.FC403_PV.F_CV;169.708480835;100.0 +25/10/2020 02:06:39;U087.FC403_PV.F_CV;170.113571167;100.0 +25/10/2020 02:06:40;U087.FC403_PV.F_CV;170.392074585;100.0 +25/10/2020 02:06:41;U087.FC403_PV.F_CV;170.316116333;100.0 +25/10/2020 02:06:42;U087.FC403_PV.F_CV;170.341430664;100.0 +25/10/2020 02:06:43;U087.FC403_PV.F_CV;169.885711670;100.0 +25/10/2020 02:06:44;U087.FC403_PV.F_CV;170.619934082;100.0 +25/10/2020 02:06:46;U087.FC403_PV.F_CV;170.240158081;100.0 +25/10/2020 02:06:47;U087.FC403_PV.F_CV;170.088256836;100.0 +25/10/2020 02:06:48;U087.FC403_PV.F_CV;170.468032837;100.0 +25/10/2020 02:06:49;U087.FC403_PV.F_CV;170.619934082;100.0 +25/10/2020 02:06:50;U087.FC403_PV.F_CV;170.214843750;100.0 +25/10/2020 02:06:51;U087.FC403_PV.F_CV;169.986984253;100.0 +25/10/2020 02:06:52;U087.FC403_PV.F_CV;169.607208252;100.0 +25/10/2020 02:06:53;U087.FC403_PV.F_CV;169.860382080;100.0 +25/10/2020 02:06:54;U087.FC403_PV.F_CV;169.809753418;100.0 +25/10/2020 02:06:55;U087.FC403_PV.F_CV;169.354019165;100.0 +25/10/2020 02:06:56;U087.FC403_PV.F_CV;168.721069336;100.0 +25/10/2020 02:06:57;U087.FC403_PV.F_CV;168.695739746;100.0 +25/10/2020 02:06:59;U087.FC403_PV.F_CV;168.923614502;100.0 +25/10/2020 02:06:07;U087.FC403E_PV.F_CV;170.233459473;100.0 +25/10/2020 02:06:08;U087.FC403E_PV.F_CV;170.452423096;100.0 +25/10/2020 02:06:17;U087.FC403E_PV.F_CV;170.452423096;100.0 +25/10/2020 02:06:18;U087.FC403E_PV.F_CV;169.752807617;100.0 +25/10/2020 02:06:27;U087.FC403E_PV.F_CV;169.752807617;100.0 +25/10/2020 02:06:28;U087.FC403E_PV.F_CV;169.832916260;100.0 +25/10/2020 02:06:37;U087.FC403E_PV.F_CV;169.832916260;100.0 +25/10/2020 02:06:38;U087.FC403E_PV.F_CV;169.763488770;100.0 +25/10/2020 02:06:47;U087.FC403E_PV.F_CV;169.763488770;100.0 +25/10/2020 02:06:48;U087.FC403E_PV.F_CV;170.308227539;100.0 +25/10/2020 02:06:58;U087.FC403E_PV.F_CV;170.308227539;100.0 +25/10/2020 02:06:59;U087.FC403E_PV.F_CV;169.603271484;100.0 +25/10/2020 02:06:12;U087.FC403E_SP.F_CV;168.102539063;100.0 +25/10/2020 02:06:43;U087.FI104.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U087.FI204.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U087.FQ104.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U087.FQ204.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U087.HEV10.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U087.HEV103_POS.F_CV;4.000000000;100.0 +25/10/2020 02:06:55;U087.HEV105.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U087.HEV20.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U087.HEV205.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U087.HEV305.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U087.HEV405.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U087.LI02.F_CV;60.532405853;100.0 +25/10/2020 02:06:01;U087.LI02.F_CV;60.590278625;100.0 +25/10/2020 02:06:03;U087.LI02.F_CV;60.532405853;100.0 +25/10/2020 02:06:04;U087.LI02.F_CV;60.590278625;100.0 +25/10/2020 02:06:06;U087.LI02.F_CV;60.532405853;100.0 +25/10/2020 02:06:07;U087.LI02.F_CV;60.590278625;100.0 +25/10/2020 02:06:10;U087.LI02.F_CV;60.532405853;100.0 +25/10/2020 02:06:11;U087.LI02.F_CV;60.590278625;100.0 +25/10/2020 02:06:13;U087.LI02.F_CV;60.532405853;100.0 +25/10/2020 02:06:14;U087.LI02.F_CV;60.590278625;100.0 +25/10/2020 02:06:20;U087.LI02.F_CV;60.532405853;100.0 +25/10/2020 02:06:21;U087.LI02.F_CV;60.590278625;100.0 +25/10/2020 02:06:23;U087.LI02.F_CV;60.532405853;100.0 +25/10/2020 02:06:24;U087.LI02.F_CV;60.590278625;100.0 +25/10/2020 02:06:26;U087.LI02.F_CV;60.532405853;100.0 +25/10/2020 02:06:27;U087.LI02.F_CV;60.590278625;100.0 +25/10/2020 02:06:28;U087.LI02.F_CV;60.532405853;100.0 +25/10/2020 02:06:30;U087.LI02.F_CV;60.590278625;100.0 +25/10/2020 02:06:32;U087.LI02.F_CV;60.387729645;100.0 +25/10/2020 02:06:35;U087.LI02.F_CV;60.590278625;100.0 +25/10/2020 02:06:36;U087.LI02.F_CV;60.358795166;100.0 +25/10/2020 02:06:37;U087.LI02.F_CV;60.503471375;100.0 +25/10/2020 02:06:38;U087.LI02.F_CV;60.358795166;100.0 +25/10/2020 02:06:41;U087.LI02.F_CV;60.532405853;100.0 +25/10/2020 02:06:43;U087.LI02.F_CV;60.474536896;100.0 +25/10/2020 02:06:44;U087.LI02.F_CV;60.532405853;100.0 +25/10/2020 02:06:46;U087.LI02.F_CV;60.387729645;100.0 +25/10/2020 02:06:54;U087.LI02.F_CV;60.445602417;100.0 +25/10/2020 02:06:55;U087.LI02.F_CV;60.358795166;100.0 +25/10/2020 02:06:38;U087.LI02E.F_CV;60.465400696;100.0 +25/10/2020 02:06:59;U087.LI02E.F_CV;60.366214752;100.0 +25/10/2020 02:06:11;U087.LI03.F_CV;7.725694656;100.0 +25/10/2020 02:06:13;U087.LI03.F_CV;7.523148060;100.0 +25/10/2020 02:06:15;U087.LI03.F_CV;7.841434956;100.0 +25/10/2020 02:06:16;U087.LI03.F_CV;7.667824268;100.0 +25/10/2020 02:06:17;U087.LI03.F_CV;7.841434956;100.0 +25/10/2020 02:06:20;U087.LI03.F_CV;7.581018448;100.0 +25/10/2020 02:06:21;U087.LI03.F_CV;7.841434956;100.0 +25/10/2020 02:06:25;U087.LI03.F_CV;7.667824268;100.0 +25/10/2020 02:06:26;U087.LI03.F_CV;7.841434956;100.0 +25/10/2020 02:06:45;U087.LI03.F_CV;7.841434956;100.0 +25/10/2020 02:06:46;U087.LI03.F_CV;7.552083492;100.0 +25/10/2020 02:06:47;U087.LI03.F_CV;8.101851463;100.0 +25/10/2020 02:06:48;U087.LI03.F_CV;7.841434956;100.0 +25/10/2020 02:06:28;U087.LI03E.F_CV;7.797360420;100.0 +25/10/2020 02:06:00;U087.LI104.F_CV;48.524307251;100.0 +25/10/2020 02:06:01;U087.LI104.F_CV;48.466434479;100.0 +25/10/2020 02:06:08;U087.LI104.F_CV;48.466434479;100.0 +25/10/2020 02:06:09;U087.LI104.F_CV;49.160881042;100.0 +25/10/2020 02:06:11;U087.LI104.F_CV;48.958332062;100.0 +25/10/2020 02:06:12;U087.LI104.F_CV;49.508102417;100.0 +25/10/2020 02:06:16;U087.LI104.F_CV;49.913192749;100.0 +25/10/2020 02:06:17;U087.LI104.F_CV;47.453704834;100.0 +25/10/2020 02:06:18;U087.LI104.F_CV;47.511573792;100.0 +25/10/2020 02:06:19;U087.LI104.F_CV;48.061344147;100.0 +25/10/2020 02:06:21;U087.LI104.F_CV;48.437500000;100.0 +25/10/2020 02:06:23;U087.LI104.F_CV;48.321758270;100.0 +25/10/2020 02:06:24;U087.LI104.F_CV;48.929397583;100.0 +25/10/2020 02:06:25;U087.LI104.F_CV;48.813655853;100.0 +25/10/2020 02:06:26;U087.LI104.F_CV;49.305557251;100.0 +25/10/2020 02:06:28;U087.LI104.F_CV;49.884258270;100.0 +25/10/2020 02:06:29;U087.LI104.F_CV;49.681713104;100.0 +25/10/2020 02:06:30;U087.LI104.F_CV;50.231479645;100.0 +25/10/2020 02:06:31;U087.LI104.F_CV;47.453704834;100.0 +25/10/2020 02:06:32;U087.LI104.F_CV;47.019676208;100.0 +25/10/2020 02:06:34;U087.LI104.F_CV;47.511573792;100.0 +25/10/2020 02:06:36;U087.LI104.F_CV;47.366897583;100.0 +25/10/2020 02:06:40;U087.LI104.F_CV;47.453704834;100.0 +25/10/2020 02:06:41;U087.LI104.F_CV;48.061344147;100.0 +25/10/2020 02:06:42;U087.LI104.F_CV;47.887729645;100.0 +25/10/2020 02:06:43;U087.LI104.F_CV;48.437500000;100.0 +25/10/2020 02:06:46;U087.LI104.F_CV;49.334491730;100.0 +25/10/2020 02:06:47;U087.LI104.F_CV;49.160881042;100.0 +25/10/2020 02:06:52;U087.LI104.F_CV;49.160881042;100.0 +25/10/2020 02:06:53;U087.LI104.F_CV;49.739582062;100.0 +25/10/2020 02:06:54;U087.LI104.F_CV;50.491897583;100.0 +25/10/2020 02:06:56;U087.LI104.F_CV;47.743057251;100.0 +25/10/2020 02:06:57;U087.LI104.F_CV;48.321758270;100.0 +25/10/2020 02:06:59;U087.LI104.F_CV;48.234954834;100.0 +25/10/2020 02:06:35;U087.LI12.F_CV;67.100692749;100.0 +25/10/2020 02:06:01;U087.LI204.F_CV;48.941204071;100.0 +25/10/2020 02:06:02;U087.LI204.F_CV;49.172683716;100.0 +25/10/2020 02:06:04;U087.LI204.F_CV;49.433101654;100.0 +25/10/2020 02:06:05;U087.LI204.F_CV;49.896064758;100.0 +25/10/2020 02:06:06;U087.LI204.F_CV;49.143749237;100.0 +25/10/2020 02:06:07;U087.LI204.F_CV;46.337036133;100.0 +25/10/2020 02:06:10;U087.LI204.F_CV;47.060417175;100.0 +25/10/2020 02:06:12;U087.LI204.F_CV;47.291896820;100.0 +25/10/2020 02:06:13;U087.LI204.F_CV;47.552314758;100.0 +25/10/2020 02:06:17;U087.LI204.F_CV;48.015277863;100.0 +25/10/2020 02:06:18;U087.LI204.F_CV;48.217823029;100.0 +25/10/2020 02:06:19;U087.LI204.F_CV;48.709720612;100.0 +25/10/2020 02:06:24;U087.LI204.F_CV;49.896064758;100.0 +25/10/2020 02:06:25;U087.LI204.F_CV;49.953933716;100.0 +25/10/2020 02:06:26;U087.LI204.F_CV;46.626388550;100.0 +25/10/2020 02:06:27;U087.LI204.F_CV;46.337036133;100.0 +25/10/2020 02:06:30;U087.LI204.F_CV;46.626388550;100.0 +25/10/2020 02:06:31;U087.LI204.F_CV;46.828933716;100.0 +25/10/2020 02:06:34;U087.LI204.F_CV;47.060417175;100.0 +25/10/2020 02:06:41;U087.LI204.F_CV;48.217823029;100.0 +25/10/2020 02:06:43;U087.LI204.F_CV;48.478240967;100.0 +25/10/2020 02:06:44;U087.LI204.F_CV;48.709720612;100.0 +25/10/2020 02:06:46;U087.LI204.F_CV;48.941204071;100.0 +25/10/2020 02:06:48;U087.LI204.F_CV;49.433101654;100.0 +25/10/2020 02:06:50;U087.LI204.F_CV;50.098609924;100.0 +25/10/2020 02:06:51;U087.LI204.F_CV;47.465507507;100.0 +25/10/2020 02:06:52;U087.LI204.F_CV;46.828933716;100.0 +25/10/2020 02:06:53;U087.LI204.F_CV;47.291896820;100.0 +25/10/2020 02:06:59;U087.LI204.F_CV;48.709720612;100.0 +25/10/2020 02:06:00;U087.LI304.F_CV;46.932868958;100.0 +25/10/2020 02:06:01;U087.LI304.F_CV;46.730323792;100.0 +25/10/2020 02:06:02;U087.LI304.F_CV;46.990741730;100.0 +25/10/2020 02:06:03;U087.LI304.F_CV;46.903934479;100.0 +25/10/2020 02:06:05;U087.LI304.F_CV;46.990741730;100.0 +25/10/2020 02:06:07;U087.LI304.F_CV;46.730323792;100.0 +25/10/2020 02:06:08;U087.LI304.F_CV;46.990741730;100.0 +25/10/2020 02:06:12;U087.LI304.F_CV;48.321758270;100.0 +25/10/2020 02:06:13;U087.LI304.F_CV;48.061344147;100.0 +25/10/2020 02:06:17;U087.LI304.F_CV;47.771991730;100.0 +25/10/2020 02:06:22;U087.LI304.F_CV;47.858795166;100.0 +25/10/2020 02:06:27;U087.LI304.F_CV;47.800926208;100.0 +25/10/2020 02:06:28;U087.LI304.F_CV;48.206020355;100.0 +25/10/2020 02:06:29;U087.LI304.F_CV;49.160881042;100.0 +25/10/2020 02:06:31;U087.LI304.F_CV;48.900463104;100.0 +25/10/2020 02:06:34;U087.LI304.F_CV;52.285881042;100.0 +25/10/2020 02:06:35;U087.LI304.F_CV;47.714118958;100.0 +25/10/2020 02:06:36;U087.LI304.F_CV;48.726852417;100.0 +25/10/2020 02:06:37;U087.LI304.F_CV;48.611110687;100.0 +25/10/2020 02:06:39;U087.LI304.F_CV;50.665508270;100.0 +25/10/2020 02:06:40;U087.LI304.F_CV;50.520832062;100.0 +25/10/2020 02:06:41;U087.LI304.F_CV;51.620368958;100.0 +25/10/2020 02:06:42;U087.LI304.F_CV;52.922454834;100.0 +25/10/2020 02:06:43;U087.LI304.F_CV;48.524307251;100.0 +25/10/2020 02:06:44;U087.LI304.F_CV;46.614582062;100.0 +25/10/2020 02:06:45;U087.LI304.F_CV;46.440971375;100.0 +25/10/2020 02:06:46;U087.LI304.F_CV;47.222221375;100.0 +25/10/2020 02:06:47;U087.LI304.F_CV;46.990741730;100.0 +25/10/2020 02:06:00;U087.LI404.F_CV;46.035881042;100.0 +25/10/2020 02:06:02;U087.LI404.F_CV;46.296295166;100.0 +25/10/2020 02:06:03;U087.LI404.F_CV;46.585647583;100.0 +25/10/2020 02:06:04;U087.LI404.F_CV;47.077545166;100.0 +25/10/2020 02:06:07;U087.LI404.F_CV;47.945602417;100.0 +25/10/2020 02:06:10;U087.LI404.F_CV;48.234954834;100.0 +25/10/2020 02:06:11;U087.LI404.F_CV;48.495368958;100.0 +25/10/2020 02:06:14;U087.LI404.F_CV;49.045139313;100.0 +25/10/2020 02:06:15;U087.LI404.F_CV;49.334491730;100.0 +25/10/2020 02:06:16;U087.LI404.F_CV;49.826389313;100.0 +25/10/2020 02:06:17;U087.LI404.F_CV;50.028934479;100.0 +25/10/2020 02:06:18;U087.LI404.F_CV;49.450229645;100.0 +25/10/2020 02:06:19;U087.LI404.F_CV;47.482639313;100.0 +25/10/2020 02:06:20;U087.LI404.F_CV;46.035881042;100.0 +25/10/2020 02:06:25;U087.LI404.F_CV;46.035881042;100.0 +25/10/2020 02:06:26;U087.LI404.F_CV;45.746528625;100.0 +25/10/2020 02:06:27;U087.LI404.F_CV;46.006942749;100.0 +25/10/2020 02:06:28;U087.LI404.F_CV;46.556713104;100.0 +25/10/2020 02:06:29;U087.LI404.F_CV;46.846065521;100.0 +25/10/2020 02:06:31;U087.LI404.F_CV;47.945602417;100.0 +25/10/2020 02:06:32;U087.LI404.F_CV;48.234954834;100.0 +25/10/2020 02:06:34;U087.LI404.F_CV;47.656250000;100.0 +25/10/2020 02:06:35;U087.LI404.F_CV;48.206020355;100.0 +25/10/2020 02:06:37;U087.LI404.F_CV;47.945602417;100.0 +25/10/2020 02:06:41;U087.LI404.F_CV;50.115741730;100.0 +25/10/2020 02:06:42;U087.LI404.F_CV;48.003471375;100.0 +25/10/2020 02:06:43;U087.LI404.F_CV;46.469905853;100.0 +25/10/2020 02:06:44;U087.LI404.F_CV;46.006942749;100.0 +25/10/2020 02:06:49;U087.LI404.F_CV;47.424770355;100.0 +25/10/2020 02:06:50;U087.LI404.F_CV;47.366897583;100.0 +25/10/2020 02:06:54;U087.LI404.F_CV;48.524307251;100.0 +25/10/2020 02:06:55;U087.LI404.F_CV;49.016204834;100.0 +25/10/2020 02:06:59;U087.LI404.F_CV;49.623844147;100.0 +25/10/2020 02:06:01;U087.PC100_PV.F_CV;24.768518448;100.0 +25/10/2020 02:06:04;U087.PC100_PV.F_CV;24.797452927;100.0 +25/10/2020 02:06:05;U087.PC100_PV.F_CV;24.855323792;100.0 +25/10/2020 02:06:06;U087.PC100_PV.F_CV;25.057870865;100.0 +25/10/2020 02:06:07;U087.PC100_PV.F_CV;25.202547073;100.0 +25/10/2020 02:06:08;U087.PC100_PV.F_CV;25.318286896;100.0 +25/10/2020 02:06:09;U087.PC100_PV.F_CV;25.231481552;100.0 +25/10/2020 02:06:10;U087.PC100_PV.F_CV;25.289352417;100.0 +25/10/2020 02:06:11;U087.PC100_PV.F_CV;25.028934479;100.0 +25/10/2020 02:06:12;U087.PC100_PV.F_CV;25.057870865;100.0 +25/10/2020 02:06:14;U087.PC100_PV.F_CV;25.202547073;100.0 +25/10/2020 02:06:15;U087.PC100_PV.F_CV;24.884260178;100.0 +25/10/2020 02:06:16;U087.PC100_PV.F_CV;25.086805344;100.0 +25/10/2020 02:06:17;U087.PC100_PV.F_CV;25.202547073;100.0 +25/10/2020 02:06:18;U087.PC100_PV.F_CV;25.144676208;100.0 +25/10/2020 02:06:19;U087.PC100_PV.F_CV;25.028934479;100.0 +25/10/2020 02:06:20;U087.PC100_PV.F_CV;25.173610687;100.0 +25/10/2020 02:06:21;U087.PC100_PV.F_CV;25.086805344;100.0 +25/10/2020 02:06:22;U087.PC100_PV.F_CV;25.173610687;100.0 +25/10/2020 02:06:23;U087.PC100_PV.F_CV;24.710647583;100.0 +25/10/2020 02:06:24;U087.PC100_PV.F_CV;24.739583969;100.0 +25/10/2020 02:06:25;U087.PC100_PV.F_CV;24.768518448;100.0 +25/10/2020 02:06:29;U087.PC100_PV.F_CV;24.768518448;100.0 +25/10/2020 02:06:30;U087.PC100_PV.F_CV;24.797452927;100.0 +25/10/2020 02:06:32;U087.PC100_PV.F_CV;24.855323792;100.0 +25/10/2020 02:06:33;U087.PC100_PV.F_CV;24.913194656;100.0 +25/10/2020 02:06:34;U087.PC100_PV.F_CV;25.028934479;100.0 +25/10/2020 02:06:36;U087.PC100_PV.F_CV;25.318286896;100.0 +25/10/2020 02:06:37;U087.PC100_PV.F_CV;25.347221375;100.0 +25/10/2020 02:06:38;U087.PC100_PV.F_CV;25.231481552;100.0 +25/10/2020 02:06:39;U087.PC100_PV.F_CV;25.202547073;100.0 +25/10/2020 02:06:40;U087.PC100_PV.F_CV;25.086805344;100.0 +25/10/2020 02:06:41;U087.PC100_PV.F_CV;25.000000000;100.0 +25/10/2020 02:06:42;U087.PC100_PV.F_CV;25.202547073;100.0 +25/10/2020 02:06:43;U087.PC100_PV.F_CV;25.057870865;100.0 +25/10/2020 02:06:44;U087.PC100_PV.F_CV;24.884260178;100.0 +25/10/2020 02:06:46;U087.PC100_PV.F_CV;24.913194656;100.0 +25/10/2020 02:06:47;U087.PC100_PV.F_CV;25.028934479;100.0 +25/10/2020 02:06:48;U087.PC100_PV.F_CV;25.202547073;100.0 +25/10/2020 02:06:49;U087.PC100_PV.F_CV;25.289352417;100.0 +25/10/2020 02:06:50;U087.PC100_PV.F_CV;25.173610687;100.0 +25/10/2020 02:06:51;U087.PC100_PV.F_CV;24.884260178;100.0 +25/10/2020 02:06:52;U087.PC100_PV.F_CV;25.028934479;100.0 +25/10/2020 02:06:53;U087.PC100_PV.F_CV;24.855323792;100.0 +25/10/2020 02:06:54;U087.PC100_PV.F_CV;25.086805344;100.0 +25/10/2020 02:06:55;U087.PC100_PV.F_CV;24.884260178;100.0 +25/10/2020 02:06:56;U087.PC100_PV.F_CV;25.028934479;100.0 +25/10/2020 02:06:57;U087.PC100_PV.F_CV;24.884260178;100.0 +25/10/2020 02:06:59;U087.PC100_PV.F_CV;24.855323792;100.0 +25/10/2020 02:06:07;U087.PC100E_OP.F_CV;87.370109558;100.0 +25/10/2020 02:06:08;U087.PC100E_OP.F_CV;86.923019409;100.0 +25/10/2020 02:06:17;U087.PC100E_OP.F_CV;86.923019409;100.0 +25/10/2020 02:06:18;U087.PC100E_OP.F_CV;87.496757507;100.0 +25/10/2020 02:06:27;U087.PC100E_OP.F_CV;87.496757507;100.0 +25/10/2020 02:06:28;U087.PC100E_OP.F_CV;87.049667358;100.0 +25/10/2020 02:06:47;U087.PC100E_OP.F_CV;86.959640503;100.0 +25/10/2020 02:06:48;U087.PC100E_OP.F_CV;87.290763855;100.0 +25/10/2020 02:06:07;U087.PC100E_PV.F_CV;25.098039627;100.0 +25/10/2020 02:06:08;U087.PC100E_PV.F_CV;24.901197433;100.0 +25/10/2020 02:06:17;U087.PC100E_PV.F_CV;24.901197433;100.0 +25/10/2020 02:06:18;U087.PC100E_PV.F_CV;25.117876053;100.0 +25/10/2020 02:06:27;U087.PC100E_PV.F_CV;25.117876053;100.0 +25/10/2020 02:06:28;U087.PC100E_PV.F_CV;24.898145676;100.0 +25/10/2020 02:06:37;U087.PC100E_PV.F_CV;24.898145676;100.0 +25/10/2020 02:06:38;U087.PC100E_PV.F_CV;25.021743774;100.0 +25/10/2020 02:06:47;U087.PC100E_PV.F_CV;25.021743774;100.0 +25/10/2020 02:06:48;U087.PC100E_PV.F_CV;25.046157837;100.0 +25/10/2020 02:06:58;U087.PC100E_PV.F_CV;25.046157837;100.0 +25/10/2020 02:06:59;U087.PC100E_PV.F_CV;24.998855591;100.0 +25/10/2020 02:06:43;U087.PC100E_SP.F_CV;25.000381470;100.0 +25/10/2020 02:06:00;U087.PC200_PV.F_CV;25.028934479;100.0 +25/10/2020 02:06:01;U087.PC200_PV.F_CV;25.173610687;100.0 +25/10/2020 02:06:02;U087.PC200_PV.F_CV;24.942129135;100.0 +25/10/2020 02:06:03;U087.PC200_PV.F_CV;25.057870865;100.0 +25/10/2020 02:06:04;U087.PC200_PV.F_CV;25.144676208;100.0 +25/10/2020 02:06:05;U087.PC200_PV.F_CV;24.710647583;100.0 +25/10/2020 02:06:07;U087.PC200_PV.F_CV;24.739583969;100.0 +25/10/2020 02:06:08;U087.PC200_PV.F_CV;24.855323792;100.0 +25/10/2020 02:06:09;U087.PC200_PV.F_CV;24.797452927;100.0 +25/10/2020 02:06:10;U087.PC200_PV.F_CV;25.000000000;100.0 +25/10/2020 02:06:11;U087.PC200_PV.F_CV;25.086805344;100.0 +25/10/2020 02:06:12;U087.PC200_PV.F_CV;25.202547073;100.0 +25/10/2020 02:06:13;U087.PC200_PV.F_CV;25.289352417;100.0 +25/10/2020 02:06:14;U087.PC200_PV.F_CV;25.347221375;100.0 +25/10/2020 02:06:15;U087.PC200_PV.F_CV;25.028934479;100.0 +25/10/2020 02:06:16;U087.PC200_PV.F_CV;24.855323792;100.0 +25/10/2020 02:06:18;U087.PC200_PV.F_CV;24.884260178;100.0 +25/10/2020 02:06:19;U087.PC200_PV.F_CV;25.000000000;100.0 +25/10/2020 02:06:20;U087.PC200_PV.F_CV;24.942129135;100.0 +25/10/2020 02:06:21;U087.PC200_PV.F_CV;24.913194656;100.0 +25/10/2020 02:06:22;U087.PC200_PV.F_CV;25.000000000;100.0 +25/10/2020 02:06:23;U087.PC200_PV.F_CV;24.942129135;100.0 +25/10/2020 02:06:24;U087.PC200_PV.F_CV;25.000000000;100.0 +25/10/2020 02:06:25;U087.PC200_PV.F_CV;25.028934479;100.0 +25/10/2020 02:06:26;U087.PC200_PV.F_CV;25.000000000;100.0 +25/10/2020 02:06:28;U087.PC200_PV.F_CV;25.144676208;100.0 +25/10/2020 02:06:29;U087.PC200_PV.F_CV;25.231481552;100.0 +25/10/2020 02:06:30;U087.PC200_PV.F_CV;24.913194656;100.0 +25/10/2020 02:06:31;U087.PC200_PV.F_CV;25.086805344;100.0 +25/10/2020 02:06:32;U087.PC200_PV.F_CV;24.797452927;100.0 +25/10/2020 02:06:34;U087.PC200_PV.F_CV;24.942129135;100.0 +25/10/2020 02:06:35;U087.PC200_PV.F_CV;25.057870865;100.0 +25/10/2020 02:06:36;U087.PC200_PV.F_CV;24.884260178;100.0 +25/10/2020 02:06:37;U087.PC200_PV.F_CV;24.942129135;100.0 +25/10/2020 02:06:38;U087.PC200_PV.F_CV;25.000000000;100.0 +25/10/2020 02:06:40;U087.PC200_PV.F_CV;25.144676208;100.0 +25/10/2020 02:06:41;U087.PC200_PV.F_CV;25.202547073;100.0 +25/10/2020 02:06:42;U087.PC200_PV.F_CV;25.289352417;100.0 +25/10/2020 02:06:43;U087.PC200_PV.F_CV;25.347221375;100.0 +25/10/2020 02:06:44;U087.PC200_PV.F_CV;25.202547073;100.0 +25/10/2020 02:06:45;U087.PC200_PV.F_CV;24.942129135;100.0 +25/10/2020 02:06:46;U087.PC200_PV.F_CV;24.884260178;100.0 +25/10/2020 02:06:47;U087.PC200_PV.F_CV;24.942129135;100.0 +25/10/2020 02:06:48;U087.PC200_PV.F_CV;24.797452927;100.0 +25/10/2020 02:06:49;U087.PC200_PV.F_CV;24.884260178;100.0 +25/10/2020 02:06:50;U087.PC200_PV.F_CV;24.855323792;100.0 +25/10/2020 02:06:51;U087.PC200_PV.F_CV;25.028934479;100.0 +25/10/2020 02:06:52;U087.PC200_PV.F_CV;25.144676208;100.0 +25/10/2020 02:06:53;U087.PC200_PV.F_CV;25.028934479;100.0 +25/10/2020 02:06:54;U087.PC200_PV.F_CV;25.057870865;100.0 +25/10/2020 02:06:55;U087.PC200_PV.F_CV;25.173610687;100.0 +25/10/2020 02:06:56;U087.PC200_PV.F_CV;24.855323792;100.0 +25/10/2020 02:06:57;U087.PC200_PV.F_CV;24.913194656;100.0 +25/10/2020 02:06:59;U087.PC200_PV.F_CV;24.855323792;100.0 +25/10/2020 02:06:07;U087.PC200E_OP.F_CV;85.288780212;100.0 +25/10/2020 02:06:08;U087.PC200E_OP.F_CV;85.049209595;100.0 +25/10/2020 02:06:18;U087.PC200E_OP.F_CV;85.235366821;100.0 +25/10/2020 02:06:58;U087.PC200E_OP.F_CV;85.412376404;100.0 +25/10/2020 02:06:59;U087.PC200E_OP.F_CV;85.174331665;100.0 +25/10/2020 02:06:07;U087.PC200E_PV.F_CV;25.040054321;100.0 +25/10/2020 02:06:08;U087.PC200E_PV.F_CV;24.942398071;100.0 +25/10/2020 02:06:17;U087.PC200E_PV.F_CV;24.942398071;100.0 +25/10/2020 02:06:18;U087.PC200E_PV.F_CV;25.033950806;100.0 +25/10/2020 02:06:27;U087.PC200E_PV.F_CV;25.033950806;100.0 +25/10/2020 02:06:28;U087.PC200E_PV.F_CV;24.997329712;100.0 +25/10/2020 02:06:37;U087.PC200E_PV.F_CV;24.997329712;100.0 +25/10/2020 02:06:38;U087.PC200E_PV.F_CV;24.965286255;100.0 +25/10/2020 02:06:47;U087.PC200E_PV.F_CV;24.965286255;100.0 +25/10/2020 02:06:48;U087.PC200E_PV.F_CV;25.075151443;100.0 +25/10/2020 02:06:58;U087.PC200E_PV.F_CV;25.075151443;100.0 +25/10/2020 02:06:59;U087.PC200E_PV.F_CV;24.997329712;100.0 +25/10/2020 02:06:00;U087.PC200E_SP.F_CV;25.000381470;100.0 +25/10/2020 02:06:00;U087.PC300_PV.F_CV;24.884260178;100.0 +25/10/2020 02:06:01;U087.PC300_PV.F_CV;24.855323792;100.0 +25/10/2020 02:06:02;U087.PC300_PV.F_CV;24.710647583;100.0 +25/10/2020 02:06:03;U087.PC300_PV.F_CV;24.942129135;100.0 +25/10/2020 02:06:04;U087.PC300_PV.F_CV;24.797452927;100.0 +25/10/2020 02:06:05;U087.PC300_PV.F_CV;24.855323792;100.0 +25/10/2020 02:06:06;U087.PC300_PV.F_CV;25.173610687;100.0 +25/10/2020 02:06:07;U087.PC300_PV.F_CV;24.913194656;100.0 +25/10/2020 02:06:08;U087.PC300_PV.F_CV;24.942129135;100.0 +25/10/2020 02:06:09;U087.PC300_PV.F_CV;24.884260178;100.0 +25/10/2020 02:06:10;U087.PC300_PV.F_CV;25.202547073;100.0 +25/10/2020 02:06:11;U087.PC300_PV.F_CV;25.144676208;100.0 +25/10/2020 02:06:12;U087.PC300_PV.F_CV;25.491897583;100.0 +25/10/2020 02:06:13;U087.PC300_PV.F_CV;25.289352417;100.0 +25/10/2020 02:06:14;U087.PC300_PV.F_CV;25.462963104;100.0 +25/10/2020 02:06:15;U087.PC300_PV.F_CV;25.086805344;100.0 +25/10/2020 02:06:16;U087.PC300_PV.F_CV;24.479166031;100.0 +25/10/2020 02:06:17;U087.PC300_PV.F_CV;24.797452927;100.0 +25/10/2020 02:06:18;U087.PC300_PV.F_CV;25.057870865;100.0 +25/10/2020 02:06:19;U087.PC300_PV.F_CV;24.884260178;100.0 +25/10/2020 02:06:20;U087.PC300_PV.F_CV;24.710647583;100.0 +25/10/2020 02:06:21;U087.PC300_PV.F_CV;24.884260178;100.0 +25/10/2020 02:06:22;U087.PC300_PV.F_CV;25.028934479;100.0 +25/10/2020 02:06:23;U087.PC300_PV.F_CV;24.942129135;100.0 +25/10/2020 02:06:24;U087.PC300_PV.F_CV;24.652778625;100.0 +25/10/2020 02:06:25;U087.PC300_PV.F_CV;24.913194656;100.0 +25/10/2020 02:06:26;U087.PC300_PV.F_CV;25.144676208;100.0 +25/10/2020 02:06:27;U087.PC300_PV.F_CV;25.173610687;100.0 +25/10/2020 02:06:28;U087.PC300_PV.F_CV;25.000000000;100.0 +25/10/2020 02:06:29;U087.PC300_PV.F_CV;25.318286896;100.0 +25/10/2020 02:06:30;U087.PC300_PV.F_CV;25.491897583;100.0 +25/10/2020 02:06:32;U087.PC300_PV.F_CV;25.318286896;100.0 +25/10/2020 02:06:33;U087.PC300_PV.F_CV;25.086805344;100.0 +25/10/2020 02:06:34;U087.PC300_PV.F_CV;25.376157761;100.0 +25/10/2020 02:06:35;U087.PC300_PV.F_CV;24.739583969;100.0 +25/10/2020 02:06:36;U087.PC300_PV.F_CV;25.086805344;100.0 +25/10/2020 02:06:37;U087.PC300_PV.F_CV;24.739583969;100.0 +25/10/2020 02:06:38;U087.PC300_PV.F_CV;24.913194656;100.0 +25/10/2020 02:06:39;U087.PC300_PV.F_CV;25.057870865;100.0 +25/10/2020 02:06:40;U087.PC300_PV.F_CV;24.942129135;100.0 +25/10/2020 02:06:41;U087.PC300_PV.F_CV;24.652778625;100.0 +25/10/2020 02:06:42;U087.PC300_PV.F_CV;24.479166031;100.0 +25/10/2020 02:06:43;U087.PC300_PV.F_CV;24.768518448;100.0 +25/10/2020 02:06:44;U087.PC300_PV.F_CV;25.086805344;100.0 +25/10/2020 02:06:45;U087.PC300_PV.F_CV;25.318286896;100.0 +25/10/2020 02:06:46;U087.PC300_PV.F_CV;25.434028625;100.0 +25/10/2020 02:06:47;U087.PC300_PV.F_CV;25.173610687;100.0 +25/10/2020 02:06:48;U087.PC300_PV.F_CV;24.739583969;100.0 +25/10/2020 02:06:49;U087.PC300_PV.F_CV;25.231481552;100.0 +25/10/2020 02:06:50;U087.PC300_PV.F_CV;25.434028625;100.0 +25/10/2020 02:06:51;U087.PC300_PV.F_CV;25.231481552;100.0 +25/10/2020 02:06:52;U087.PC300_PV.F_CV;25.086805344;100.0 +25/10/2020 02:06:53;U087.PC300_PV.F_CV;25.173610687;100.0 +25/10/2020 02:06:54;U087.PC300_PV.F_CV;24.797452927;100.0 +25/10/2020 02:06:55;U087.PC300_PV.F_CV;24.652778625;100.0 +25/10/2020 02:06:56;U087.PC300_PV.F_CV;24.739583969;100.0 +25/10/2020 02:06:57;U087.PC300_PV.F_CV;24.594907761;100.0 +25/10/2020 02:06:59;U087.PC300_PV.F_CV;25.028934479;100.0 +25/10/2020 02:06:07;U087.PC300E_OP.F_CV;85.703819275;100.0 +25/10/2020 02:06:08;U087.PC300E_OP.F_CV;85.098037720;100.0 +25/10/2020 02:06:17;U087.PC300E_OP.F_CV;85.098037720;100.0 +25/10/2020 02:06:18;U087.PC300E_OP.F_CV;85.348289490;100.0 +25/10/2020 02:06:27;U087.PC300E_OP.F_CV;85.348289490;100.0 +25/10/2020 02:06:28;U087.PC300E_OP.F_CV;85.023269653;100.0 +25/10/2020 02:06:37;U087.PC300E_OP.F_CV;85.023269653;100.0 +25/10/2020 02:06:38;U087.PC300E_OP.F_CV;85.694664001;100.0 +25/10/2020 02:06:47;U087.PC300E_OP.F_CV;85.694664001;100.0 +25/10/2020 02:06:48;U087.PC300E_OP.F_CV;85.223159790;100.0 +25/10/2020 02:06:07;U087.PC300E_PV.F_CV;25.160600662;100.0 +25/10/2020 02:06:08;U087.PC300E_PV.F_CV;24.856946945;100.0 +25/10/2020 02:06:17;U087.PC300E_PV.F_CV;24.856946945;100.0 +25/10/2020 02:06:18;U087.PC300E_PV.F_CV;25.088884354;100.0 +25/10/2020 02:06:27;U087.PC300E_PV.F_CV;25.088884354;100.0 +25/10/2020 02:06:28;U087.PC300E_PV.F_CV;24.933240891;100.0 +25/10/2020 02:06:37;U087.PC300E_PV.F_CV;24.933240891;100.0 +25/10/2020 02:06:38;U087.PC300E_PV.F_CV;25.156023026;100.0 +25/10/2020 02:06:47;U087.PC300E_PV.F_CV;25.156023026;100.0 +25/10/2020 02:06:48;U087.PC300E_PV.F_CV;24.965286255;100.0 +25/10/2020 02:06:58;U087.PC300E_PV.F_CV;24.965286255;100.0 +25/10/2020 02:06:59;U087.PC300E_PV.F_CV;24.969863892;100.0 +25/10/2020 02:06:54;U087.PC300E_SP.F_CV;25.000381470;100.0 +25/10/2020 02:06:01;U087.PC400_PV.F_CV;24.797452927;100.0 +25/10/2020 02:06:03;U087.PC400_PV.F_CV;24.855323792;100.0 +25/10/2020 02:06:04;U087.PC400_PV.F_CV;24.884260178;100.0 +25/10/2020 02:06:05;U087.PC400_PV.F_CV;24.942129135;100.0 +25/10/2020 02:06:06;U087.PC400_PV.F_CV;25.028934479;100.0 +25/10/2020 02:06:07;U087.PC400_PV.F_CV;25.000000000;100.0 +25/10/2020 02:06:11;U087.PC400_PV.F_CV;25.000000000;100.0 +25/10/2020 02:06:12;U087.PC400_PV.F_CV;24.942129135;100.0 +25/10/2020 02:06:13;U087.PC400_PV.F_CV;25.057870865;100.0 +25/10/2020 02:06:14;U087.PC400_PV.F_CV;25.173610687;100.0 +25/10/2020 02:06:15;U087.PC400_PV.F_CV;25.231481552;100.0 +25/10/2020 02:06:16;U087.PC400_PV.F_CV;25.318286896;100.0 +25/10/2020 02:06:17;U087.PC400_PV.F_CV;25.376157761;100.0 +25/10/2020 02:06:19;U087.PC400_PV.F_CV;24.913194656;100.0 +25/10/2020 02:06:20;U087.PC400_PV.F_CV;24.855323792;100.0 +25/10/2020 02:06:23;U087.PC400_PV.F_CV;25.000000000;100.0 +25/10/2020 02:06:24;U087.PC400_PV.F_CV;25.057870865;100.0 +25/10/2020 02:06:25;U087.PC400_PV.F_CV;24.884260178;100.0 +25/10/2020 02:06:27;U087.PC400_PV.F_CV;24.942129135;100.0 +25/10/2020 02:06:28;U087.PC400_PV.F_CV;25.000000000;100.0 +25/10/2020 02:06:29;U087.PC400_PV.F_CV;25.144676208;100.0 +25/10/2020 02:06:31;U087.PC400_PV.F_CV;25.318286896;100.0 +25/10/2020 02:06:32;U087.PC400_PV.F_CV;25.086805344;100.0 +25/10/2020 02:06:34;U087.PC400_PV.F_CV;25.289352417;100.0 +25/10/2020 02:06:35;U087.PC400_PV.F_CV;25.144676208;100.0 +25/10/2020 02:06:36;U087.PC400_PV.F_CV;24.942129135;100.0 +25/10/2020 02:06:37;U087.PC400_PV.F_CV;24.913194656;100.0 +25/10/2020 02:06:38;U087.PC400_PV.F_CV;24.855323792;100.0 +25/10/2020 02:06:41;U087.PC400_PV.F_CV;24.797452927;100.0 +25/10/2020 02:06:42;U087.PC400_PV.F_CV;24.855323792;100.0 +25/10/2020 02:06:43;U087.PC400_PV.F_CV;24.797452927;100.0 +25/10/2020 02:06:44;U087.PC400_PV.F_CV;24.768518448;100.0 +25/10/2020 02:06:45;U087.PC400_PV.F_CV;24.797452927;100.0 +25/10/2020 02:06:49;U087.PC400_PV.F_CV;24.855323792;100.0 +25/10/2020 02:06:50;U087.PC400_PV.F_CV;24.797452927;100.0 +25/10/2020 02:06:51;U087.PC400_PV.F_CV;24.913194656;100.0 +25/10/2020 02:06:52;U087.PC400_PV.F_CV;24.942129135;100.0 +25/10/2020 02:06:53;U087.PC400_PV.F_CV;25.086805344;100.0 +25/10/2020 02:06:54;U087.PC400_PV.F_CV;25.202547073;100.0 +25/10/2020 02:06:55;U087.PC400_PV.F_CV;25.289352417;100.0 +25/10/2020 02:06:56;U087.PC400_PV.F_CV;25.347221375;100.0 +25/10/2020 02:06:57;U087.PC400_PV.F_CV;25.434028625;100.0 +25/10/2020 02:06:59;U087.PC400_PV.F_CV;25.144676208;100.0 +25/10/2020 02:06:07;U087.PC400E_OP.F_CV;85.719078064;100.0 +25/10/2020 02:06:08;U087.PC400E_OP.F_CV;85.012588501;100.0 +25/10/2020 02:06:17;U087.PC400E_OP.F_CV;85.012588501;100.0 +25/10/2020 02:06:18;U087.PC400E_OP.F_CV;85.542076111;100.0 +25/10/2020 02:06:28;U087.PC400E_OP.F_CV;85.406272888;100.0 +25/10/2020 02:06:37;U087.PC400E_OP.F_CV;85.406272888;100.0 +25/10/2020 02:06:38;U087.PC400E_OP.F_CV;85.804534912;100.0 +25/10/2020 02:06:47;U087.PC400E_OP.F_CV;85.804534912;100.0 +25/10/2020 02:06:48;U087.PC400E_OP.F_CV;85.076675415;100.0 +25/10/2020 02:06:58;U087.PC400E_OP.F_CV;85.076675415;100.0 +25/10/2020 02:06:59;U087.PC400E_OP.F_CV;85.300987244;100.0 +25/10/2020 02:06:07;U087.PC400E_PV.F_CV;25.001907349;100.0 +25/10/2020 02:06:08;U087.PC400E_PV.F_CV;24.878309250;100.0 +25/10/2020 02:06:17;U087.PC400E_PV.F_CV;24.878309250;100.0 +25/10/2020 02:06:18;U087.PC400E_PV.F_CV;25.146867752;100.0 +25/10/2020 02:06:27;U087.PC400E_PV.F_CV;25.146867752;100.0 +25/10/2020 02:06:28;U087.PC400E_PV.F_CV;24.924085617;100.0 +25/10/2020 02:06:37;U087.PC400E_PV.F_CV;24.924085617;100.0 +25/10/2020 02:06:38;U087.PC400E_PV.F_CV;25.101091385;100.0 +25/10/2020 02:06:47;U087.PC400E_PV.F_CV;25.101091385;100.0 +25/10/2020 02:06:48;U087.PC400E_PV.F_CV;24.811168671;100.0 +25/10/2020 02:06:58;U087.PC400E_PV.F_CV;24.811168671;100.0 +25/10/2020 02:06:59;U087.PC400E_PV.F_CV;25.130083084;100.0 +25/10/2020 02:06:04;U087.PC400E_SP.F_CV;25.000381470;100.0 +25/10/2020 02:06:00;U087.PI101.F_CV;25.665510178;100.0 +25/10/2020 02:06:01;U087.PI101.F_CV;25.723379135;100.0 +25/10/2020 02:06:05;U087.PI101.F_CV;25.752315521;100.0 +25/10/2020 02:06:06;U087.PI101.F_CV;25.810184479;100.0 +25/10/2020 02:06:07;U087.PI101.F_CV;25.954860687;100.0 +25/10/2020 02:06:08;U087.PI101.F_CV;26.070602417;100.0 +25/10/2020 02:06:09;U087.PI101.F_CV;26.186342239;100.0 +25/10/2020 02:06:10;U087.PI101.F_CV;26.157407761;100.0 +25/10/2020 02:06:11;U087.PI101.F_CV;25.896989822;100.0 +25/10/2020 02:06:12;U087.PI101.F_CV;26.012731552;100.0 +25/10/2020 02:06:13;U087.PI101.F_CV;25.896989822;100.0 +25/10/2020 02:06:14;U087.PI101.F_CV;26.012731552;100.0 +25/10/2020 02:06:15;U087.PI101.F_CV;25.810184479;100.0 +25/10/2020 02:06:16;U087.PI101.F_CV;25.925926208;100.0 +25/10/2020 02:06:17;U087.PI101.F_CV;26.041666031;100.0 +25/10/2020 02:06:18;U087.PI101.F_CV;26.099536896;100.0 +25/10/2020 02:06:19;U087.PI101.F_CV;25.896989822;100.0 +25/10/2020 02:06:20;U087.PI101.F_CV;25.954860687;100.0 +25/10/2020 02:06:21;U087.PI101.F_CV;26.070602417;100.0 +25/10/2020 02:06:22;U087.PI101.F_CV;26.041666031;100.0 +25/10/2020 02:06:23;U087.PI101.F_CV;25.665510178;100.0 +25/10/2020 02:06:26;U087.PI101.F_CV;25.723379135;100.0 +25/10/2020 02:06:29;U087.PI101.F_CV;25.752315521;100.0 +25/10/2020 02:06:33;U087.PI101.F_CV;25.781250000;100.0 +25/10/2020 02:06:35;U087.PI101.F_CV;25.954860687;100.0 +25/10/2020 02:06:36;U087.PI101.F_CV;26.099536896;100.0 +25/10/2020 02:06:37;U087.PI101.F_CV;26.215278625;100.0 +25/10/2020 02:06:39;U087.PI101.F_CV;26.186342239;100.0 +25/10/2020 02:06:40;U087.PI101.F_CV;25.954860687;100.0 +25/10/2020 02:06:41;U087.PI101.F_CV;26.041666031;100.0 +25/10/2020 02:06:43;U087.PI101.F_CV;25.954860687;100.0 +25/10/2020 02:06:44;U087.PI101.F_CV;25.868055344;100.0 +25/10/2020 02:06:45;U087.PI101.F_CV;25.810184479;100.0 +25/10/2020 02:06:47;U087.PI101.F_CV;25.896989822;100.0 +25/10/2020 02:06:48;U087.PI101.F_CV;26.012731552;100.0 +25/10/2020 02:06:49;U087.PI101.F_CV;26.099536896;100.0 +25/10/2020 02:06:50;U087.PI101.F_CV;26.157407761;100.0 +25/10/2020 02:06:52;U087.PI101.F_CV;25.868055344;100.0 +25/10/2020 02:06:53;U087.PI101.F_CV;25.925926208;100.0 +25/10/2020 02:06:55;U087.PI101.F_CV;26.041666031;100.0 +25/10/2020 02:06:56;U087.PI101.F_CV;25.868055344;100.0 +25/10/2020 02:06:57;U087.PI101.F_CV;25.954860687;100.0 +25/10/2020 02:06:59;U087.PI101.F_CV;25.810184479;100.0 +25/10/2020 02:06:07;U087.PI101E.F_CV;25.980010986;100.0 +25/10/2020 02:06:08;U087.PI101E.F_CV;25.789272308;100.0 +25/10/2020 02:06:17;U087.PI101E.F_CV;25.789272308;100.0 +25/10/2020 02:06:18;U087.PI101E.F_CV;26.002899170;100.0 +25/10/2020 02:06:27;U087.PI101E.F_CV;26.002899170;100.0 +25/10/2020 02:06:28;U087.PI101E.F_CV;25.812160492;100.0 +25/10/2020 02:06:37;U087.PI101E.F_CV;25.812160492;100.0 +25/10/2020 02:06:38;U087.PI101E.F_CV;25.914396286;100.0 +25/10/2020 02:06:47;U087.PI101E.F_CV;25.914396286;100.0 +25/10/2020 02:06:48;U087.PI101E.F_CV;25.957122803;100.0 +25/10/2020 02:06:58;U087.PI101E.F_CV;25.957122803;100.0 +25/10/2020 02:06:59;U087.PI101E.F_CV;25.966278076;100.0 +25/10/2020 02:06:00;U087.PI102.F_CV;24.797452927;100.0 +25/10/2020 02:06:01;U087.PI102.F_CV;24.855323792;100.0 +25/10/2020 02:06:05;U087.PI102.F_CV;24.913194656;100.0 +25/10/2020 02:06:06;U087.PI102.F_CV;25.086805344;100.0 +25/10/2020 02:06:07;U087.PI102.F_CV;25.231481552;100.0 +25/10/2020 02:06:08;U087.PI102.F_CV;25.347221375;100.0 +25/10/2020 02:06:09;U087.PI102.F_CV;25.318286896;100.0 +25/10/2020 02:06:11;U087.PI102.F_CV;25.057870865;100.0 +25/10/2020 02:06:12;U087.PI102.F_CV;25.144676208;100.0 +25/10/2020 02:06:13;U087.PI102.F_CV;25.086805344;100.0 +25/10/2020 02:06:14;U087.PI102.F_CV;25.231481552;100.0 +25/10/2020 02:06:15;U087.PI102.F_CV;24.942129135;100.0 +25/10/2020 02:06:16;U087.PI102.F_CV;25.144676208;100.0 +25/10/2020 02:06:17;U087.PI102.F_CV;25.289352417;100.0 +25/10/2020 02:06:18;U087.PI102.F_CV;25.202547073;100.0 +25/10/2020 02:06:19;U087.PI102.F_CV;25.057870865;100.0 +25/10/2020 02:06:20;U087.PI102.F_CV;25.202547073;100.0 +25/10/2020 02:06:22;U087.PI102.F_CV;25.231481552;100.0 +25/10/2020 02:06:23;U087.PI102.F_CV;24.797452927;100.0 +25/10/2020 02:06:26;U087.PI102.F_CV;24.855323792;100.0 +25/10/2020 02:06:30;U087.PI102.F_CV;24.884260178;100.0 +25/10/2020 02:06:33;U087.PI102.F_CV;24.942129135;100.0 +25/10/2020 02:06:34;U087.PI102.F_CV;25.057870865;100.0 +25/10/2020 02:06:35;U087.PI102.F_CV;25.231481552;100.0 +25/10/2020 02:06:36;U087.PI102.F_CV;25.347221375;100.0 +25/10/2020 02:06:37;U087.PI102.F_CV;25.434028625;100.0 +25/10/2020 02:06:38;U087.PI102.F_CV;25.318286896;100.0 +25/10/2020 02:06:39;U087.PI102.F_CV;25.289352417;100.0 +25/10/2020 02:06:40;U087.PI102.F_CV;25.173610687;100.0 +25/10/2020 02:06:41;U087.PI102.F_CV;25.086805344;100.0 +25/10/2020 02:06:42;U087.PI102.F_CV;25.231481552;100.0 +25/10/2020 02:06:44;U087.PI102.F_CV;24.942129135;100.0 +25/10/2020 02:06:46;U087.PI102.F_CV;25.000000000;100.0 +25/10/2020 02:06:47;U087.PI102.F_CV;25.086805344;100.0 +25/10/2020 02:06:48;U087.PI102.F_CV;25.231481552;100.0 +25/10/2020 02:06:49;U087.PI102.F_CV;25.318286896;100.0 +25/10/2020 02:06:51;U087.PI102.F_CV;25.144676208;100.0 +25/10/2020 02:06:53;U087.PI102.F_CV;25.028934479;100.0 +25/10/2020 02:06:54;U087.PI102.F_CV;25.144676208;100.0 +25/10/2020 02:06:55;U087.PI102.F_CV;25.231481552;100.0 +25/10/2020 02:06:56;U087.PI102.F_CV;25.057870865;100.0 +25/10/2020 02:06:57;U087.PI102.F_CV;25.028934479;100.0 +25/10/2020 02:06:59;U087.PI102.F_CV;24.942129135;100.0 +25/10/2020 02:06:07;U087.PI102E.F_CV;25.146867752;100.0 +25/10/2020 02:06:08;U087.PI102E.F_CV;24.965286255;100.0 +25/10/2020 02:06:17;U087.PI102E.F_CV;24.965286255;100.0 +25/10/2020 02:06:18;U087.PI102E.F_CV;25.172807693;100.0 +25/10/2020 02:06:27;U087.PI102E.F_CV;25.172807693;100.0 +25/10/2020 02:06:28;U087.PI102E.F_CV;24.963760376;100.0 +25/10/2020 02:06:37;U087.PI102E.F_CV;24.963760376;100.0 +25/10/2020 02:06:38;U087.PI102E.F_CV;25.082780838;100.0 +25/10/2020 02:06:47;U087.PI102E.F_CV;25.082780838;100.0 +25/10/2020 02:06:48;U087.PI102E.F_CV;25.107194901;100.0 +25/10/2020 02:06:58;U087.PI102E.F_CV;25.107194901;100.0 +25/10/2020 02:06:59;U087.PI102E.F_CV;25.120927811;100.0 +25/10/2020 02:06:53;U087.PI107.F_CV;0.997916698;100.0 +25/10/2020 02:06:00;U087.PI201.F_CV;26.041666031;100.0 +25/10/2020 02:06:01;U087.PI201.F_CV;26.070602417;100.0 +25/10/2020 02:06:02;U087.PI201.F_CV;26.041666031;100.0 +25/10/2020 02:06:03;U087.PI201.F_CV;25.925926208;100.0 +25/10/2020 02:06:04;U087.PI201.F_CV;26.041666031;100.0 +25/10/2020 02:06:05;U087.PI201.F_CV;25.752315521;100.0 +25/10/2020 02:06:06;U087.PI201.F_CV;25.607639313;100.0 +25/10/2020 02:06:07;U087.PI201.F_CV;25.723379135;100.0 +25/10/2020 02:06:08;U087.PI201.F_CV;25.752315521;100.0 +25/10/2020 02:06:09;U087.PI201.F_CV;25.781250000;100.0 +25/10/2020 02:06:11;U087.PI201.F_CV;25.954860687;100.0 +25/10/2020 02:06:12;U087.PI201.F_CV;26.099536896;100.0 +25/10/2020 02:06:13;U087.PI201.F_CV;26.215278625;100.0 +25/10/2020 02:06:14;U087.PI201.F_CV;26.302083969;100.0 +25/10/2020 02:06:15;U087.PI201.F_CV;26.215278625;100.0 +25/10/2020 02:06:16;U087.PI201.F_CV;25.954860687;100.0 +25/10/2020 02:06:17;U087.PI201.F_CV;25.810184479;100.0 +25/10/2020 02:06:19;U087.PI201.F_CV;25.896989822;100.0 +25/10/2020 02:06:20;U087.PI201.F_CV;25.954860687;100.0 +25/10/2020 02:06:21;U087.PI201.F_CV;25.925926208;100.0 +25/10/2020 02:06:22;U087.PI201.F_CV;25.954860687;100.0 +25/10/2020 02:06:23;U087.PI201.F_CV;25.925926208;100.0 +25/10/2020 02:06:24;U087.PI201.F_CV;25.896989822;100.0 +25/10/2020 02:06:26;U087.PI201.F_CV;26.012731552;100.0 +25/10/2020 02:06:27;U087.PI201.F_CV;25.925926208;100.0 +25/10/2020 02:06:28;U087.PI201.F_CV;26.041666031;100.0 +25/10/2020 02:06:29;U087.PI201.F_CV;26.099536896;100.0 +25/10/2020 02:06:30;U087.PI201.F_CV;25.868055344;100.0 +25/10/2020 02:06:31;U087.PI201.F_CV;25.954860687;100.0 +25/10/2020 02:06:32;U087.PI201.F_CV;25.925926208;100.0 +25/10/2020 02:06:33;U087.PI201.F_CV;25.752315521;100.0 +25/10/2020 02:06:34;U087.PI201.F_CV;25.810184479;100.0 +25/10/2020 02:06:35;U087.PI201.F_CV;25.925926208;100.0 +25/10/2020 02:06:37;U087.PI201.F_CV;25.896989822;100.0 +25/10/2020 02:06:38;U087.PI201.F_CV;25.925926208;100.0 +25/10/2020 02:06:39;U087.PI201.F_CV;25.896989822;100.0 +25/10/2020 02:06:40;U087.PI201.F_CV;26.012731552;100.0 +25/10/2020 02:06:41;U087.PI201.F_CV;26.099536896;100.0 +25/10/2020 02:06:42;U087.PI201.F_CV;26.215278625;100.0 +25/10/2020 02:06:43;U087.PI201.F_CV;26.302083969;100.0 +25/10/2020 02:06:44;U087.PI201.F_CV;26.070602417;100.0 +25/10/2020 02:06:45;U087.PI201.F_CV;25.868055344;100.0 +25/10/2020 02:06:46;U087.PI201.F_CV;25.925926208;100.0 +25/10/2020 02:06:47;U087.PI201.F_CV;25.954860687;100.0 +25/10/2020 02:06:48;U087.PI201.F_CV;25.896989822;100.0 +25/10/2020 02:06:49;U087.PI201.F_CV;25.810184479;100.0 +25/10/2020 02:06:50;U087.PI201.F_CV;25.868055344;100.0 +25/10/2020 02:06:51;U087.PI201.F_CV;25.896989822;100.0 +25/10/2020 02:06:52;U087.PI201.F_CV;26.012731552;100.0 +25/10/2020 02:06:53;U087.PI201.F_CV;26.070602417;100.0 +25/10/2020 02:06:54;U087.PI201.F_CV;25.954860687;100.0 +25/10/2020 02:06:55;U087.PI201.F_CV;26.070602417;100.0 +25/10/2020 02:06:56;U087.PI201.F_CV;25.810184479;100.0 +25/10/2020 02:06:57;U087.PI201.F_CV;25.781250000;100.0 +25/10/2020 02:06:07;U087.PI201E.F_CV;25.972381592;100.0 +25/10/2020 02:06:08;U087.PI201E.F_CV;25.902189255;100.0 +25/10/2020 02:06:17;U087.PI201E.F_CV;25.902189255;100.0 +25/10/2020 02:06:18;U087.PI201E.F_CV;26.001373291;100.0 +25/10/2020 02:06:27;U087.PI201E.F_CV;26.001373291;100.0 +25/10/2020 02:06:28;U087.PI201E.F_CV;25.949493408;100.0 +25/10/2020 02:06:37;U087.PI201E.F_CV;25.949493408;100.0 +25/10/2020 02:06:38;U087.PI201E.F_CV;25.908292770;100.0 +25/10/2020 02:06:47;U087.PI201E.F_CV;25.908292770;100.0 +25/10/2020 02:06:48;U087.PI201E.F_CV;26.024261475;100.0 +25/10/2020 02:06:58;U087.PI201E.F_CV;26.024261475;100.0 +25/10/2020 02:06:59;U087.PI201E.F_CV;25.917448044;100.0 +25/10/2020 02:06:00;U087.PI202.F_CV;25.231481552;100.0 +25/10/2020 02:06:01;U087.PI202.F_CV;25.347221375;100.0 +25/10/2020 02:06:02;U087.PI202.F_CV;25.289352417;100.0 +25/10/2020 02:06:03;U087.PI202.F_CV;25.202547073;100.0 +25/10/2020 02:06:04;U087.PI202.F_CV;25.347221375;100.0 +25/10/2020 02:06:05;U087.PI202.F_CV;25.000000000;100.0 +25/10/2020 02:06:06;U087.PI202.F_CV;24.855323792;100.0 +25/10/2020 02:06:08;U087.PI202.F_CV;25.028934479;100.0 +25/10/2020 02:06:10;U087.PI202.F_CV;25.173610687;100.0 +25/10/2020 02:06:11;U087.PI202.F_CV;25.289352417;100.0 +25/10/2020 02:06:13;U087.PI202.F_CV;25.462963104;100.0 +25/10/2020 02:06:14;U087.PI202.F_CV;25.520833969;100.0 +25/10/2020 02:06:15;U087.PI202.F_CV;25.434028625;100.0 +25/10/2020 02:06:16;U087.PI202.F_CV;25.202547073;100.0 +25/10/2020 02:06:17;U087.PI202.F_CV;25.057870865;100.0 +25/10/2020 02:06:18;U087.PI202.F_CV;25.086805344;100.0 +25/10/2020 02:06:19;U087.PI202.F_CV;25.173610687;100.0 +25/10/2020 02:06:21;U087.PI202.F_CV;25.144676208;100.0 +25/10/2020 02:06:22;U087.PI202.F_CV;25.202547073;100.0 +25/10/2020 02:06:23;U087.PI202.F_CV;25.144676208;100.0 +25/10/2020 02:06:24;U087.PI202.F_CV;25.173610687;100.0 +25/10/2020 02:06:25;U087.PI202.F_CV;25.202547073;100.0 +25/10/2020 02:06:27;U087.PI202.F_CV;25.173610687;100.0 +25/10/2020 02:06:28;U087.PI202.F_CV;25.318286896;100.0 +25/10/2020 02:06:29;U087.PI202.F_CV;25.434028625;100.0 +25/10/2020 02:06:30;U087.PI202.F_CV;25.086805344;100.0 +25/10/2020 02:06:31;U087.PI202.F_CV;25.231481552;100.0 +25/10/2020 02:06:32;U087.PI202.F_CV;25.173610687;100.0 +25/10/2020 02:06:33;U087.PI202.F_CV;25.028934479;100.0 +25/10/2020 02:06:34;U087.PI202.F_CV;25.144676208;100.0 +25/10/2020 02:06:35;U087.PI202.F_CV;25.231481552;100.0 +25/10/2020 02:06:36;U087.PI202.F_CV;25.144676208;100.0 +25/10/2020 02:06:38;U087.PI202.F_CV;25.173610687;100.0 +25/10/2020 02:06:40;U087.PI202.F_CV;25.289352417;100.0 +25/10/2020 02:06:42;U087.PI202.F_CV;25.462963104;100.0 +25/10/2020 02:06:43;U087.PI202.F_CV;25.520833969;100.0 +25/10/2020 02:06:44;U087.PI202.F_CV;25.376157761;100.0 +25/10/2020 02:06:45;U087.PI202.F_CV;25.144676208;100.0 +25/10/2020 02:06:47;U087.PI202.F_CV;25.173610687;100.0 +25/10/2020 02:06:48;U087.PI202.F_CV;25.086805344;100.0 +25/10/2020 02:06:50;U087.PI202.F_CV;25.057870865;100.0 +25/10/2020 02:06:51;U087.PI202.F_CV;25.173610687;100.0 +25/10/2020 02:06:52;U087.PI202.F_CV;25.289352417;100.0 +25/10/2020 02:06:54;U087.PI202.F_CV;25.202547073;100.0 +25/10/2020 02:06:55;U087.PI202.F_CV;25.347221375;100.0 +25/10/2020 02:06:56;U087.PI202.F_CV;25.057870865;100.0 +25/10/2020 02:06:07;U087.PI202E.F_CV;25.233844757;100.0 +25/10/2020 02:06:08;U087.PI202E.F_CV;25.152971268;100.0 +25/10/2020 02:06:17;U087.PI202E.F_CV;25.152971268;100.0 +25/10/2020 02:06:18;U087.PI202E.F_CV;25.262836456;100.0 +25/10/2020 02:06:27;U087.PI202E.F_CV;25.262836456;100.0 +25/10/2020 02:06:28;U087.PI202E.F_CV;25.191120148;100.0 +25/10/2020 02:06:37;U087.PI202E.F_CV;25.191120148;100.0 +25/10/2020 02:06:38;U087.PI202E.F_CV;25.178911209;100.0 +25/10/2020 02:06:47;U087.PI202E.F_CV;25.178911209;100.0 +25/10/2020 02:06:48;U087.PI202E.F_CV;25.275043488;100.0 +25/10/2020 02:06:58;U087.PI202E.F_CV;25.275043488;100.0 +25/10/2020 02:06:59;U087.PI202E.F_CV;25.175859451;100.0 +25/10/2020 02:06:16;U087.PI207.F_CV;1.003125072;100.0 +25/10/2020 02:06:27;U087.PI207.F_CV;1.001736164;100.0 +25/10/2020 02:06:45;U087.PI207.F_CV;1.003125072;100.0 +25/10/2020 02:06:59;U087.PI207.F_CV;1.002430558;100.0 +25/10/2020 02:06:00;U087.PI301.F_CV;26.302083969;100.0 +25/10/2020 02:06:01;U087.PI301.F_CV;26.331018448;100.0 +25/10/2020 02:06:02;U087.PI301.F_CV;26.446760178;100.0 +25/10/2020 02:06:03;U087.PI301.F_CV;26.359952927;100.0 +25/10/2020 02:06:04;U087.PI301.F_CV;26.446760178;100.0 +25/10/2020 02:06:05;U087.PI301.F_CV;26.475694656;100.0 +25/10/2020 02:06:06;U087.PI301.F_CV;26.359952927;100.0 +25/10/2020 02:06:08;U087.PI301.F_CV;26.388889313;100.0 +25/10/2020 02:06:09;U087.PI301.F_CV;26.504629135;100.0 +25/10/2020 02:06:10;U087.PI301.F_CV;26.388889313;100.0 +25/10/2020 02:06:11;U087.PI301.F_CV;26.359952927;100.0 +25/10/2020 02:06:13;U087.PI301.F_CV;26.302083969;100.0 +25/10/2020 02:06:16;U087.PI301.F_CV;26.388889313;100.0 +25/10/2020 02:06:17;U087.PI301.F_CV;26.331018448;100.0 +25/10/2020 02:06:18;U087.PI301.F_CV;26.215278625;100.0 +25/10/2020 02:06:19;U087.PI301.F_CV;26.186342239;100.0 +25/10/2020 02:06:20;U087.PI301.F_CV;26.215278625;100.0 +25/10/2020 02:06:22;U087.PI301.F_CV;26.186342239;100.0 +25/10/2020 02:06:23;U087.PI301.F_CV;26.157407761;100.0 +25/10/2020 02:06:24;U087.PI301.F_CV;26.244213104;100.0 +25/10/2020 02:06:25;U087.PI301.F_CV;26.302083969;100.0 +25/10/2020 02:06:26;U087.PI301.F_CV;26.215278625;100.0 +25/10/2020 02:06:28;U087.PI301.F_CV;26.331018448;100.0 +25/10/2020 02:06:29;U087.PI301.F_CV;26.359952927;100.0 +25/10/2020 02:06:30;U087.PI301.F_CV;26.388889313;100.0 +25/10/2020 02:06:31;U087.PI301.F_CV;26.446760178;100.0 +25/10/2020 02:06:32;U087.PI301.F_CV;26.475694656;100.0 +25/10/2020 02:06:33;U087.PI301.F_CV;26.388889313;100.0 +25/10/2020 02:06:34;U087.PI301.F_CV;26.359952927;100.0 +25/10/2020 02:06:36;U087.PI301.F_CV;26.331018448;100.0 +25/10/2020 02:06:37;U087.PI301.F_CV;26.446760178;100.0 +25/10/2020 02:06:38;U087.PI301.F_CV;26.359952927;100.0 +25/10/2020 02:06:39;U087.PI301.F_CV;26.215278625;100.0 +25/10/2020 02:06:40;U087.PI301.F_CV;26.157407761;100.0 +25/10/2020 02:06:41;U087.PI301.F_CV;26.186342239;100.0 +25/10/2020 02:06:42;U087.PI301.F_CV;26.302083969;100.0 +25/10/2020 02:06:44;U087.PI301.F_CV;26.215278625;100.0 +25/10/2020 02:06:45;U087.PI301.F_CV;26.244213104;100.0 +25/10/2020 02:06:46;U087.PI301.F_CV;26.331018448;100.0 +25/10/2020 02:06:47;U087.PI301.F_CV;26.475694656;100.0 +25/10/2020 02:06:48;U087.PI301.F_CV;26.591434479;100.0 +25/10/2020 02:06:49;U087.PI301.F_CV;26.504629135;100.0 +25/10/2020 02:06:51;U087.PI301.F_CV;26.359952927;100.0 +25/10/2020 02:06:53;U087.PI301.F_CV;26.215278625;100.0 +25/10/2020 02:06:54;U087.PI301.F_CV;26.157407761;100.0 +25/10/2020 02:06:57;U087.PI301.F_CV;26.215278625;100.0 +25/10/2020 02:06:59;U087.PI301.F_CV;26.157407761;100.0 +25/10/2020 02:06:07;U087.PI301E.F_CV;26.446937561;100.0 +25/10/2020 02:06:08;U087.PI301E.F_CV;26.370641708;100.0 +25/10/2020 02:06:17;U087.PI301E.F_CV;26.370641708;100.0 +25/10/2020 02:06:18;U087.PI301E.F_CV;26.341650009;100.0 +25/10/2020 02:06:27;U087.PI301E.F_CV;26.341650009;100.0 +25/10/2020 02:06:28;U087.PI301E.F_CV;26.225681305;100.0 +25/10/2020 02:06:37;U087.PI301E.F_CV;26.225681305;100.0 +25/10/2020 02:06:38;U087.PI301E.F_CV;26.390478134;100.0 +25/10/2020 02:06:47;U087.PI301E.F_CV;26.390478134;100.0 +25/10/2020 02:06:48;U087.PI301E.F_CV;26.301975250;100.0 +25/10/2020 02:06:58;U087.PI301E.F_CV;26.301975250;100.0 +25/10/2020 02:06:59;U087.PI301E.F_CV;26.283664703;100.0 +25/10/2020 02:06:00;U087.PI302.F_CV;25.752315521;100.0 +25/10/2020 02:06:01;U087.PI302.F_CV;26.012731552;100.0 +25/10/2020 02:06:02;U087.PI302.F_CV;26.041666031;100.0 +25/10/2020 02:06:03;U087.PI302.F_CV;25.868055344;100.0 +25/10/2020 02:06:04;U087.PI302.F_CV;26.070602417;100.0 +25/10/2020 02:06:05;U087.PI302.F_CV;25.868055344;100.0 +25/10/2020 02:06:06;U087.PI302.F_CV;25.810184479;100.0 +25/10/2020 02:06:07;U087.PI302.F_CV;25.925926208;100.0 +25/10/2020 02:06:08;U087.PI302.F_CV;26.041666031;100.0 +25/10/2020 02:06:09;U087.PI302.F_CV;25.954860687;100.0 +25/10/2020 02:06:10;U087.PI302.F_CV;25.896989822;100.0 +25/10/2020 02:06:11;U087.PI302.F_CV;25.810184479;100.0 +25/10/2020 02:06:12;U087.PI302.F_CV;25.896989822;100.0 +25/10/2020 02:06:13;U087.PI302.F_CV;25.752315521;100.0 +25/10/2020 02:06:14;U087.PI302.F_CV;25.868055344;100.0 +25/10/2020 02:06:15;U087.PI302.F_CV;25.925926208;100.0 +25/10/2020 02:06:16;U087.PI302.F_CV;26.012731552;100.0 +25/10/2020 02:06:17;U087.PI302.F_CV;25.723379135;100.0 +25/10/2020 02:06:20;U087.PI302.F_CV;25.752315521;100.0 +25/10/2020 02:06:21;U087.PI302.F_CV;25.723379135;100.0 +25/10/2020 02:06:22;U087.PI302.F_CV;25.665510178;100.0 +25/10/2020 02:06:23;U087.PI302.F_CV;25.752315521;100.0 +25/10/2020 02:06:24;U087.PI302.F_CV;25.896989822;100.0 +25/10/2020 02:06:25;U087.PI302.F_CV;25.723379135;100.0 +25/10/2020 02:06:26;U087.PI302.F_CV;25.752315521;100.0 +25/10/2020 02:06:27;U087.PI302.F_CV;25.781250000;100.0 +25/10/2020 02:06:28;U087.PI302.F_CV;25.896989822;100.0 +25/10/2020 02:06:30;U087.PI302.F_CV;25.954860687;100.0 +25/10/2020 02:06:31;U087.PI302.F_CV;26.012731552;100.0 +25/10/2020 02:06:32;U087.PI302.F_CV;26.041666031;100.0 +25/10/2020 02:06:33;U087.PI302.F_CV;25.810184479;100.0 +25/10/2020 02:06:34;U087.PI302.F_CV;25.925926208;100.0 +25/10/2020 02:06:35;U087.PI302.F_CV;25.810184479;100.0 +25/10/2020 02:06:36;U087.PI302.F_CV;25.925926208;100.0 +25/10/2020 02:06:37;U087.PI302.F_CV;25.954860687;100.0 +25/10/2020 02:06:38;U087.PI302.F_CV;25.752315521;100.0 +25/10/2020 02:06:39;U087.PI302.F_CV;25.723379135;100.0 +25/10/2020 02:06:40;U087.PI302.F_CV;25.636573792;100.0 +25/10/2020 02:06:41;U087.PI302.F_CV;25.868055344;100.0 +25/10/2020 02:06:42;U087.PI302.F_CV;25.954860687;100.0 +25/10/2020 02:06:43;U087.PI302.F_CV;25.752315521;100.0 +25/10/2020 02:06:44;U087.PI302.F_CV;25.781250000;100.0 +25/10/2020 02:06:46;U087.PI302.F_CV;25.954860687;100.0 +25/10/2020 02:06:47;U087.PI302.F_CV;26.157407761;100.0 +25/10/2020 02:06:48;U087.PI302.F_CV;25.896989822;100.0 +25/10/2020 02:06:49;U087.PI302.F_CV;26.012731552;100.0 +25/10/2020 02:06:50;U087.PI302.F_CV;26.041666031;100.0 +25/10/2020 02:06:51;U087.PI302.F_CV;25.810184479;100.0 +25/10/2020 02:06:52;U087.PI302.F_CV;25.868055344;100.0 +25/10/2020 02:06:53;U087.PI302.F_CV;25.723379135;100.0 +25/10/2020 02:06:54;U087.PI302.F_CV;25.636573792;100.0 +25/10/2020 02:06:56;U087.PI302.F_CV;25.752315521;100.0 +25/10/2020 02:06:59;U087.PI302.F_CV;25.636573792;100.0 +25/10/2020 02:06:07;U087.PI302E.F_CV;25.947967529;100.0 +25/10/2020 02:06:08;U087.PI302E.F_CV;25.915922165;100.0 +25/10/2020 02:06:17;U087.PI302E.F_CV;25.915922165;100.0 +25/10/2020 02:06:18;U087.PI302E.F_CV;25.856412888;100.0 +25/10/2020 02:06:27;U087.PI302E.F_CV;25.856412888;100.0 +25/10/2020 02:06:28;U087.PI302E.F_CV;25.766384125;100.0 +25/10/2020 02:06:37;U087.PI302E.F_CV;25.766384125;100.0 +25/10/2020 02:06:38;U087.PI302E.F_CV;25.908292770;100.0 +25/10/2020 02:06:47;U087.PI302E.F_CV;25.908292770;100.0 +25/10/2020 02:06:48;U087.PI302E.F_CV;25.859464645;100.0 +25/10/2020 02:06:58;U087.PI302E.F_CV;25.859464645;100.0 +25/10/2020 02:06:59;U087.PI302E.F_CV;25.795375824;100.0 +25/10/2020 02:06:01;U087.PI401.F_CV;25.607639313;100.0 +25/10/2020 02:06:03;U087.PI401.F_CV;25.636573792;100.0 +25/10/2020 02:06:04;U087.PI401.F_CV;25.665510178;100.0 +25/10/2020 02:06:05;U087.PI401.F_CV;25.752315521;100.0 +25/10/2020 02:06:06;U087.PI401.F_CV;25.781250000;100.0 +25/10/2020 02:06:07;U087.PI401.F_CV;25.868055344;100.0 +25/10/2020 02:06:09;U087.PI401.F_CV;25.810184479;100.0 +25/10/2020 02:06:10;U087.PI401.F_CV;25.868055344;100.0 +25/10/2020 02:06:14;U087.PI401.F_CV;25.896989822;100.0 +25/10/2020 02:06:15;U087.PI401.F_CV;26.012731552;100.0 +25/10/2020 02:06:16;U087.PI401.F_CV;26.070602417;100.0 +25/10/2020 02:06:17;U087.PI401.F_CV;26.157407761;100.0 +25/10/2020 02:06:18;U087.PI401.F_CV;26.215278625;100.0 +25/10/2020 02:06:19;U087.PI401.F_CV;25.925926208;100.0 +25/10/2020 02:06:20;U087.PI401.F_CV;25.723379135;100.0 +25/10/2020 02:06:21;U087.PI401.F_CV;25.665510178;100.0 +25/10/2020 02:06:22;U087.PI401.F_CV;25.636573792;100.0 +25/10/2020 02:06:23;U087.PI401.F_CV;25.723379135;100.0 +25/10/2020 02:06:24;U087.PI401.F_CV;25.781250000;100.0 +25/10/2020 02:06:26;U087.PI401.F_CV;25.752315521;100.0 +25/10/2020 02:06:28;U087.PI401.F_CV;25.781250000;100.0 +25/10/2020 02:06:31;U087.PI401.F_CV;26.041666031;100.0 +25/10/2020 02:06:32;U087.PI401.F_CV;26.070602417;100.0 +25/10/2020 02:06:33;U087.PI401.F_CV;25.954860687;100.0 +25/10/2020 02:06:34;U087.PI401.F_CV;26.012731552;100.0 +25/10/2020 02:06:35;U087.PI401.F_CV;26.041666031;100.0 +25/10/2020 02:06:36;U087.PI401.F_CV;25.868055344;100.0 +25/10/2020 02:06:37;U087.PI401.F_CV;25.781250000;100.0 +25/10/2020 02:06:38;U087.PI401.F_CV;25.723379135;100.0 +25/10/2020 02:06:39;U087.PI401.F_CV;25.636573792;100.0 +25/10/2020 02:06:40;U087.PI401.F_CV;25.665510178;100.0 +25/10/2020 02:06:44;U087.PI401.F_CV;25.636573792;100.0 +25/10/2020 02:06:51;U087.PI401.F_CV;25.636573792;100.0 +25/10/2020 02:06:53;U087.PI401.F_CV;25.810184479;100.0 +25/10/2020 02:06:54;U087.PI401.F_CV;25.925926208;100.0 +25/10/2020 02:06:57;U087.PI401.F_CV;26.186342239;100.0 +25/10/2020 02:06:59;U087.PI401.F_CV;26.244213104;100.0 +25/10/2020 02:06:07;U087.PI401E.F_CV;25.867094040;100.0 +25/10/2020 02:06:08;U087.PI401E.F_CV;25.694667816;100.0 +25/10/2020 02:06:17;U087.PI401E.F_CV;25.694667816;100.0 +25/10/2020 02:06:18;U087.PI401E.F_CV;25.963226318;100.0 +25/10/2020 02:06:27;U087.PI401E.F_CV;25.963226318;100.0 +25/10/2020 02:06:28;U087.PI401E.F_CV;25.752651215;100.0 +25/10/2020 02:06:37;U087.PI401E.F_CV;25.752651215;100.0 +25/10/2020 02:06:38;U087.PI401E.F_CV;25.931180954;100.0 +25/10/2020 02:06:47;U087.PI401E.F_CV;25.931180954;100.0 +25/10/2020 02:06:48;U087.PI401E.F_CV;25.647363663;100.0 +25/10/2020 02:06:58;U087.PI401E.F_CV;25.647363663;100.0 +25/10/2020 02:06:59;U087.PI401E.F_CV;25.889982224;100.0 +25/10/2020 02:06:01;U087.PI402.F_CV;25.057870865;100.0 +25/10/2020 02:06:03;U087.PI402.F_CV;25.086805344;100.0 +25/10/2020 02:06:05;U087.PI402.F_CV;25.202547073;100.0 +25/10/2020 02:06:06;U087.PI402.F_CV;25.289352417;100.0 +25/10/2020 02:06:07;U087.PI402.F_CV;25.231481552;100.0 +25/10/2020 02:06:12;U087.PI402.F_CV;25.231481552;100.0 +25/10/2020 02:06:13;U087.PI402.F_CV;25.347221375;100.0 +25/10/2020 02:06:14;U087.PI402.F_CV;25.376157761;100.0 +25/10/2020 02:06:15;U087.PI402.F_CV;25.491897583;100.0 +25/10/2020 02:06:16;U087.PI402.F_CV;25.578702927;100.0 +25/10/2020 02:06:17;U087.PI402.F_CV;25.607639313;100.0 +25/10/2020 02:06:18;U087.PI402.F_CV;25.636573792;100.0 +25/10/2020 02:06:19;U087.PI402.F_CV;25.231481552;100.0 +25/10/2020 02:06:20;U087.PI402.F_CV;25.144676208;100.0 +25/10/2020 02:06:22;U087.PI402.F_CV;25.028934479;100.0 +25/10/2020 02:06:23;U087.PI402.F_CV;25.231481552;100.0 +25/10/2020 02:06:24;U087.PI402.F_CV;25.347221375;100.0 +25/10/2020 02:06:25;U087.PI402.F_CV;25.144676208;100.0 +25/10/2020 02:06:27;U087.PI402.F_CV;25.202547073;100.0 +25/10/2020 02:06:28;U087.PI402.F_CV;25.231481552;100.0 +25/10/2020 02:06:29;U087.PI402.F_CV;25.376157761;100.0 +25/10/2020 02:06:30;U087.PI402.F_CV;25.462963104;100.0 +25/10/2020 02:06:31;U087.PI402.F_CV;25.578702927;100.0 +25/10/2020 02:06:32;U087.PI402.F_CV;25.376157761;100.0 +25/10/2020 02:06:33;U087.PI402.F_CV;25.347221375;100.0 +25/10/2020 02:06:34;U087.PI402.F_CV;25.491897583;100.0 +25/10/2020 02:06:35;U087.PI402.F_CV;25.347221375;100.0 +25/10/2020 02:06:36;U087.PI402.F_CV;25.231481552;100.0 +25/10/2020 02:06:37;U087.PI402.F_CV;25.202547073;100.0 +25/10/2020 02:06:38;U087.PI402.F_CV;25.086805344;100.0 +25/10/2020 02:06:43;U087.PI402.F_CV;25.086805344;100.0 +25/10/2020 02:06:44;U087.PI402.F_CV;25.057870865;100.0 +25/10/2020 02:06:47;U087.PI402.F_CV;25.086805344;100.0 +25/10/2020 02:06:50;U087.PI402.F_CV;25.057870865;100.0 +25/10/2020 02:06:51;U087.PI402.F_CV;25.144676208;100.0 +25/10/2020 02:06:52;U087.PI402.F_CV;25.202547073;100.0 +25/10/2020 02:06:53;U087.PI402.F_CV;25.347221375;100.0 +25/10/2020 02:06:54;U087.PI402.F_CV;25.462963104;100.0 +25/10/2020 02:06:55;U087.PI402.F_CV;25.520833969;100.0 +25/10/2020 02:06:56;U087.PI402.F_CV;25.636573792;100.0 +25/10/2020 02:06:57;U087.PI402.F_CV;25.665510178;100.0 +25/10/2020 02:06:59;U087.PI402.F_CV;25.607639313;100.0 +25/10/2020 02:06:07;U087.PI402E.F_CV;25.275043488;100.0 +25/10/2020 02:06:08;U087.PI402E.F_CV;25.134660721;100.0 +25/10/2020 02:06:17;U087.PI402E.F_CV;25.134660721;100.0 +25/10/2020 02:06:18;U087.PI402E.F_CV;25.395589828;100.0 +25/10/2020 02:06:27;U087.PI402E.F_CV;25.395589828;100.0 +25/10/2020 02:06:28;U087.PI402E.F_CV;25.185014725;100.0 +25/10/2020 02:06:37;U087.PI402E.F_CV;25.185014725;100.0 +25/10/2020 02:06:38;U087.PI402E.F_CV;25.349813461;100.0 +25/10/2020 02:06:47;U087.PI402E.F_CV;25.349813461;100.0 +25/10/2020 02:06:48;U087.PI402E.F_CV;25.078203201;100.0 +25/10/2020 02:06:58;U087.PI402E.F_CV;25.078203201;100.0 +25/10/2020 02:06:59;U087.PI402E.F_CV;25.384908676;100.0 +25/10/2020 02:06:01;U087.TC100_PV.F_CV;55.043949127;100.0 +25/10/2020 02:06:02;U087.TC100_PV.F_CV;54.944602966;100.0 +25/10/2020 02:06:04;U087.TC100_PV.F_CV;55.043949127;100.0 +25/10/2020 02:06:06;U087.TC100_PV.F_CV;54.944602966;100.0 +25/10/2020 02:06:07;U087.TC100_PV.F_CV;55.043949127;100.0 +25/10/2020 02:06:10;U087.TC100_PV.F_CV;54.944602966;100.0 +25/10/2020 02:06:13;U087.TC100_PV.F_CV;55.043949127;100.0 +25/10/2020 02:06:15;U087.TC100_PV.F_CV;54.944602966;100.0 +25/10/2020 02:06:16;U087.TC100_PV.F_CV;55.043949127;100.0 +25/10/2020 02:06:21;U087.TC100_PV.F_CV;55.043949127;100.0 +25/10/2020 02:06:22;U087.TC100_PV.F_CV;54.944602966;100.0 +25/10/2020 02:06:23;U087.TC100_PV.F_CV;55.043949127;100.0 +25/10/2020 02:06:24;U087.TC100_PV.F_CV;54.944602966;100.0 +25/10/2020 02:06:25;U087.TC100_PV.F_CV;55.043949127;100.0 +25/10/2020 02:06:27;U087.TC100_PV.F_CV;54.944602966;100.0 +25/10/2020 02:06:29;U087.TC100_PV.F_CV;55.043949127;100.0 +25/10/2020 02:06:33;U087.TC100_PV.F_CV;54.944602966;100.0 +25/10/2020 02:06:34;U087.TC100_PV.F_CV;55.043949127;100.0 +25/10/2020 02:06:36;U087.TC100_PV.F_CV;54.944602966;100.0 +25/10/2020 02:06:39;U087.TC100_PV.F_CV;55.043949127;100.0 +25/10/2020 02:06:42;U087.TC100_PV.F_CV;54.944602966;100.0 +25/10/2020 02:06:43;U087.TC100_PV.F_CV;55.043949127;100.0 +25/10/2020 02:06:50;U087.TC100_PV.F_CV;55.043949127;100.0 +25/10/2020 02:06:51;U087.TC100_PV.F_CV;54.944602966;100.0 +25/10/2020 02:06:52;U087.TC100_PV.F_CV;55.043949127;100.0 +25/10/2020 02:06:36;U087.TC100E_OP.F_CV;22.214084625;100.0 +25/10/2020 02:06:17;U087.TC100E_PV.F_CV;55.012588501;100.0 +25/10/2020 02:06:18;U087.TC100E_PV.F_CV;55.001144409;100.0 +25/10/2020 02:06:47;U087.TC100E_PV.F_CV;55.001144409;100.0 +25/10/2020 02:06:48;U087.TC100E_PV.F_CV;55.031661987;100.0 +25/10/2020 02:06:16;U087.TC100E_SP.F_CV;55.001144409;100.0 +25/10/2020 02:06:11;U087.TC1100_PV.F_CV;55.529998779;100.0 +25/10/2020 02:06:30;U087.TC1200_PV.F_CV;50.150001526;100.0 +25/10/2020 02:06:12;U087.TC1300_PV.F_CV;65.510002136;100.0 +25/10/2020 02:06:02;U087.TC1400_PV.F_CV;65.360000610;100.0 +25/10/2020 02:06:00;U087.TC200_PV.F_CV;50.051673889;100.0 +25/10/2020 02:06:01;U087.TC200_PV.F_CV;49.950939178;100.0 +25/10/2020 02:06:02;U087.TC200_PV.F_CV;50.051673889;100.0 +25/10/2020 02:06:03;U087.TC200_PV.F_CV;49.950939178;100.0 +25/10/2020 02:06:07;U087.TC200_PV.F_CV;50.051673889;100.0 +25/10/2020 02:06:09;U087.TC200_PV.F_CV;49.950939178;100.0 +25/10/2020 02:06:10;U087.TC200_PV.F_CV;50.051673889;100.0 +25/10/2020 02:06:14;U087.TC200_PV.F_CV;49.950939178;100.0 +25/10/2020 02:06:16;U087.TC200_PV.F_CV;50.051673889;100.0 +25/10/2020 02:06:20;U087.TC200_PV.F_CV;49.950939178;100.0 +25/10/2020 02:06:21;U087.TC200_PV.F_CV;50.051673889;100.0 +25/10/2020 02:06:23;U087.TC200_PV.F_CV;49.950939178;100.0 +25/10/2020 02:06:24;U087.TC200_PV.F_CV;50.051673889;100.0 +25/10/2020 02:06:26;U087.TC200_PV.F_CV;49.950939178;100.0 +25/10/2020 02:06:27;U087.TC200_PV.F_CV;50.051673889;100.0 +25/10/2020 02:06:38;U087.TC200_PV.F_CV;50.051673889;100.0 +25/10/2020 02:06:39;U087.TC200_PV.F_CV;49.950939178;100.0 +25/10/2020 02:06:40;U087.TC200_PV.F_CV;50.051673889;100.0 +25/10/2020 02:06:49;U087.TC200_PV.F_CV;50.051673889;100.0 +25/10/2020 02:06:50;U087.TC200_PV.F_CV;49.950939178;100.0 +25/10/2020 02:06:53;U087.TC200_PV.F_CV;50.051673889;100.0 +25/10/2020 02:06:54;U087.TC200_PV.F_CV;49.950939178;100.0 +25/10/2020 02:06:56;U087.TC200_PV.F_CV;50.051673889;100.0 +25/10/2020 02:06:57;U087.TC200_PV.F_CV;49.950939178;100.0 +25/10/2020 02:06:59;U087.TC200_PV.F_CV;50.051673889;100.0 +25/10/2020 02:06:43;U087.TC200E_OP.F_CV;20.061035156;100.0 +25/10/2020 02:06:17;U087.TC200E_PV.F_CV;49.988555908;100.0 +25/10/2020 02:06:18;U087.TC200E_PV.F_CV;50.019073486;100.0 +25/10/2020 02:06:37;U087.TC200E_PV.F_CV;50.019073486;100.0 +25/10/2020 02:06:38;U087.TC200E_PV.F_CV;50.053405762;100.0 +25/10/2020 02:06:47;U087.TC200E_PV.F_CV;50.053405762;100.0 +25/10/2020 02:06:48;U087.TC200E_PV.F_CV;50.041961670;100.0 +25/10/2020 02:06:58;U087.TC200E_PV.F_CV;50.041961670;100.0 +25/10/2020 02:06:59;U087.TC200E_PV.F_CV;49.988555908;100.0 +25/10/2020 02:06:43;U087.TC200E_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:02;U087.TC300_PV.F_CV;64.853675842;100.0 +25/10/2020 02:06:03;U087.TC300_PV.F_CV;64.953140259;100.0 +25/10/2020 02:06:06;U087.TC300_PV.F_CV;65.052597046;100.0 +25/10/2020 02:06:07;U087.TC300_PV.F_CV;64.953140259;100.0 +25/10/2020 02:06:09;U087.TC300_PV.F_CV;64.853675842;100.0 +25/10/2020 02:06:11;U087.TC300_PV.F_CV;64.953140259;100.0 +25/10/2020 02:06:35;U087.TC300_PV.F_CV;64.953140259;100.0 +25/10/2020 02:06:36;U087.TC300_PV.F_CV;64.853675842;100.0 +25/10/2020 02:06:37;U087.TC300_PV.F_CV;64.953140259;100.0 +25/10/2020 02:06:42;U087.TC300_PV.F_CV;64.953140259;100.0 +25/10/2020 02:06:43;U087.TC300_PV.F_CV;64.853675842;100.0 +25/10/2020 02:06:44;U087.TC300_PV.F_CV;64.953140259;100.0 +25/10/2020 02:06:46;U087.TC300_PV.F_CV;65.052597046;100.0 +25/10/2020 02:06:47;U087.TC300_PV.F_CV;64.953140259;100.0 +25/10/2020 02:06:59;U087.TC300_PV.F_CV;64.953140259;100.0 +25/10/2020 02:06:09;U087.TC300E_OP.F_CV;26.207370758;100.0 +25/10/2020 02:06:07;U087.TC300E_PV.F_CV;64.930953979;100.0 +25/10/2020 02:06:08;U087.TC300E_PV.F_CV;64.953842163;100.0 +25/10/2020 02:06:17;U087.TC300E_PV.F_CV;64.953842163;100.0 +25/10/2020 02:06:18;U087.TC300E_PV.F_CV;64.930953979;100.0 +25/10/2020 02:06:27;U087.TC300E_PV.F_CV;64.930953979;100.0 +25/10/2020 02:06:28;U087.TC300E_PV.F_CV;64.953842163;100.0 +25/10/2020 02:06:37;U087.TC300E_PV.F_CV;64.953842163;100.0 +25/10/2020 02:06:38;U087.TC300E_PV.F_CV;64.942398071;100.0 +25/10/2020 02:06:47;U087.TC300E_PV.F_CV;64.942398071;100.0 +25/10/2020 02:06:48;U087.TC300E_PV.F_CV;64.953842163;100.0 +25/10/2020 02:06:58;U087.TC300E_SP.F_CV;64.999618530;100.0 +25/10/2020 02:06:02;U087.TC400_PV.F_CV;64.986099243;100.0 +25/10/2020 02:06:03;U087.TC400_PV.F_CV;64.886604309;100.0 +25/10/2020 02:06:04;U087.TC400_PV.F_CV;65.085594177;100.0 +25/10/2020 02:06:05;U087.TC400_PV.F_CV;64.986099243;100.0 +25/10/2020 02:06:21;U087.TC400_PV.F_CV;64.986099243;100.0 +25/10/2020 02:06:22;U087.TC400_PV.F_CV;64.886604309;100.0 +25/10/2020 02:06:23;U087.TC400_PV.F_CV;64.986099243;100.0 +25/10/2020 02:06:25;U087.TC400_PV.F_CV;65.085594177;100.0 +25/10/2020 02:06:26;U087.TC400_PV.F_CV;64.986099243;100.0 +25/10/2020 02:06:33;U087.TC400_PV.F_CV;64.986099243;100.0 +25/10/2020 02:06:34;U087.TC400_PV.F_CV;65.085594177;100.0 +25/10/2020 02:06:35;U087.TC400_PV.F_CV;64.986099243;100.0 +25/10/2020 02:06:38;U087.TC400_PV.F_CV;65.085594177;100.0 +25/10/2020 02:06:39;U087.TC400_PV.F_CV;64.986099243;100.0 +25/10/2020 02:06:47;U087.TC400_PV.F_CV;64.986099243;100.0 +25/10/2020 02:06:48;U087.TC400_PV.F_CV;65.085594177;100.0 +25/10/2020 02:06:49;U087.TC400_PV.F_CV;64.986099243;100.0 +25/10/2020 02:06:56;U087.TC400_PV.F_CV;64.986099243;100.0 +25/10/2020 02:06:57;U087.TC400_PV.F_CV;65.085594177;100.0 +25/10/2020 02:06:29;U087.TC400E_OP.F_CV;26.149385452;100.0 +25/10/2020 02:06:07;U087.TC400E_PV.F_CV;64.972915649;100.0 +25/10/2020 02:06:08;U087.TC400E_PV.F_CV;64.984359741;100.0 +25/10/2020 02:06:37;U087.TC400E_PV.F_CV;64.984359741;100.0 +25/10/2020 02:06:38;U087.TC400E_PV.F_CV;65.003433228;100.0 +25/10/2020 02:06:47;U087.TC400E_PV.F_CV;65.003433228;100.0 +25/10/2020 02:06:48;U087.TC400E_PV.F_CV;64.991989136;100.0 +25/10/2020 02:06:48;U087.TC400E_SP.F_CV;64.999618530;100.0 +25/10/2020 02:06:02;U087.TI104.F_CV;22.299999237;100.0 +25/10/2020 02:06:03;U087.TI104.F_CV;22.200000763;100.0 +25/10/2020 02:06:05;U087.TI104.F_CV;22.399999619;100.0 +25/10/2020 02:06:06;U087.TI104.F_CV;22.200000763;100.0 +25/10/2020 02:06:07;U087.TI104.F_CV;22.299999237;100.0 +25/10/2020 02:06:08;U087.TI104.F_CV;22.200000763;100.0 +25/10/2020 02:06:09;U087.TI104.F_CV;22.299999237;100.0 +25/10/2020 02:06:11;U087.TI104.F_CV;22.200000763;100.0 +25/10/2020 02:06:12;U087.TI104.F_CV;22.399999619;100.0 +25/10/2020 02:06:14;U087.TI104.F_CV;22.299999237;100.0 +25/10/2020 02:06:15;U087.TI104.F_CV;22.200000763;100.0 +25/10/2020 02:06:17;U087.TI104.F_CV;22.500000000;100.0 +25/10/2020 02:06:18;U087.TI104.F_CV;22.200000763;100.0 +25/10/2020 02:06:21;U087.TI104.F_CV;22.299999237;100.0 +25/10/2020 02:06:24;U087.TI104.F_CV;22.200000763;100.0 +25/10/2020 02:06:28;U087.TI104.F_CV;22.299999237;100.0 +25/10/2020 02:06:30;U087.TI104.F_CV;22.200000763;100.0 +25/10/2020 02:06:02;U087.TI204.F_CV;21.000000000;100.0 +25/10/2020 02:06:03;U087.TI204.F_CV;20.899999619;100.0 +25/10/2020 02:06:04;U087.TI204.F_CV;21.000000000;100.0 +25/10/2020 02:06:08;U087.TI204.F_CV;21.000000000;100.0 +25/10/2020 02:06:09;U087.TI204.F_CV;20.899999619;100.0 +25/10/2020 02:06:12;U087.TI204.F_CV;21.000000000;100.0 +25/10/2020 02:06:14;U087.TI204.F_CV;20.899999619;100.0 +25/10/2020 02:06:16;U087.TI204.F_CV;21.000000000;100.0 +25/10/2020 02:06:20;U087.TI204.F_CV;20.899999619;100.0 +25/10/2020 02:06:21;U087.TI204.F_CV;21.100000381;100.0 +25/10/2020 02:06:22;U087.TI204.F_CV;21.000000000;100.0 +25/10/2020 02:06:25;U087.TI204.F_CV;20.899999619;100.0 +25/10/2020 02:06:26;U087.TI204.F_CV;21.000000000;100.0 +25/10/2020 02:06:27;U087.TI204.F_CV;20.899999619;100.0 +25/10/2020 02:06:29;U087.TI204.F_CV;21.000000000;100.0 +25/10/2020 02:06:30;U087.TI204.F_CV;20.899999619;100.0 +25/10/2020 02:06:31;U087.TI204.F_CV;21.000000000;100.0 +25/10/2020 02:06:33;U087.TI204.F_CV;20.899999619;100.0 +25/10/2020 02:06:35;U087.TI204.F_CV;21.000000000;100.0 +25/10/2020 02:06:36;U087.TI204.F_CV;20.899999619;100.0 +25/10/2020 02:06:38;U087.TI204.F_CV;21.000000000;100.0 +25/10/2020 02:06:50;U087.TI204.F_CV;21.000000000;100.0 +25/10/2020 02:06:51;U087.TI204.F_CV;20.899999619;100.0 +25/10/2020 02:06:53;U087.TI204.F_CV;21.000000000;100.0 +25/10/2020 02:06:01;U087.TI2101.F_CV;43.799999237;100.0 +25/10/2020 02:06:03;U087.TI2101.F_CV;44.000000000;100.0 +25/10/2020 02:06:15;U087.TI2101.F_CV;43.799999237;100.0 +25/10/2020 02:06:17;U087.TI2101.F_CV;44.000000000;100.0 +25/10/2020 02:06:19;U087.TI2101.F_CV;43.799999237;100.0 +25/10/2020 02:06:20;U087.TI2101.F_CV;44.099998474;100.0 +25/10/2020 02:06:22;U087.TI2101.F_CV;43.900001526;100.0 +25/10/2020 02:06:31;U087.TI2101.F_CV;44.099998474;100.0 +25/10/2020 02:06:33;U087.TI2101.F_CV;43.900001526;100.0 +25/10/2020 02:06:21;U087.TI2201.F_CV;44.000000000;100.0 +25/10/2020 02:06:22;U087.TI2201.F_CV;43.700000763;100.0 +25/10/2020 02:06:26;U087.TI2201.F_CV;43.900001526;100.0 +25/10/2020 02:06:01;U087.TI2301.F_CV;51.700000763;100.0 +25/10/2020 02:06:04;U087.TI2301.F_CV;51.500000000;100.0 +25/10/2020 02:06:07;U087.TI2301.F_CV;51.700000763;100.0 +25/10/2020 02:06:10;U087.TI2301.F_CV;51.500000000;100.0 +25/10/2020 02:06:11;U087.TI2301.F_CV;51.700000763;100.0 +25/10/2020 02:06:14;U087.TI2301.F_CV;51.500000000;100.0 +25/10/2020 02:06:15;U087.TI2301.F_CV;51.700000763;100.0 +25/10/2020 02:06:17;U087.TI2301.F_CV;51.500000000;100.0 +25/10/2020 02:06:34;U087.TI2301.F_CV;51.700000763;100.0 +25/10/2020 02:06:36;U087.TI2301.F_CV;51.500000000;100.0 +25/10/2020 02:06:37;U087.TI2301.F_CV;51.700000763;100.0 +25/10/2020 02:06:39;U087.TI2301.F_CV;51.500000000;100.0 +25/10/2020 02:06:47;U087.TI2301.F_CV;51.700000763;100.0 +25/10/2020 02:06:51;U087.TI2301.F_CV;51.500000000;100.0 +25/10/2020 02:06:53;U087.TI2301.F_CV;51.700000763;100.0 +25/10/2020 02:06:54;U087.TI2301.F_CV;51.500000000;100.0 +25/10/2020 02:06:55;U087.TI2301.F_CV;51.700000763;100.0 +25/10/2020 02:06:57;U087.TI2301.F_CV;51.500000000;100.0 +25/10/2020 02:06:29;U087.TI2401.F_CV;51.400001526;100.0 +25/10/2020 02:06:34;U087.WI300.F_CV;585.539978027;100.0 +25/10/2020 02:06:35;U087.WI300.F_CV;585.549987793;100.0 +25/10/2020 02:06:40;U087.WI300.F_CV;585.549987793;100.0 +25/10/2020 02:06:41;U087.WI300.F_CV;585.539978027;100.0 +25/10/2020 02:06:58;U087.WI300E.F_CV;585.519165039;100.0 +25/10/2020 02:06:00;U087.WI400.F_CV;588.500000000;100.0 +25/10/2020 02:06:01;U087.WI400.F_CV;588.510009766;100.0 +25/10/2020 02:06:02;U087.WI400.F_CV;588.450012207;100.0 +25/10/2020 02:06:03;U087.WI400.F_CV;588.469970703;100.0 +25/10/2020 02:06:04;U087.WI400.F_CV;588.429992676;100.0 +25/10/2020 02:06:05;U087.WI400.F_CV;588.409973145;100.0 +25/10/2020 02:06:06;U087.WI400.F_CV;588.489990234;100.0 +25/10/2020 02:06:07;U087.WI400.F_CV;588.450012207;100.0 +25/10/2020 02:06:08;U087.WI400.F_CV;588.530029297;100.0 +25/10/2020 02:06:09;U087.WI400.F_CV;588.510009766;100.0 +25/10/2020 02:06:10;U087.WI400.F_CV;588.440002441;100.0 +25/10/2020 02:06:11;U087.WI400.F_CV;588.469970703;100.0 +25/10/2020 02:06:12;U087.WI400.F_CV;588.409973145;100.0 +25/10/2020 02:06:13;U087.WI400.F_CV;588.450012207;100.0 +25/10/2020 02:06:14;U087.WI400.F_CV;588.510009766;100.0 +25/10/2020 02:06:15;U087.WI400.F_CV;588.580017090;100.0 +25/10/2020 02:06:16;U087.WI400.F_CV;588.539978027;100.0 +25/10/2020 02:06:17;U087.WI400.F_CV;588.570007324;100.0 +25/10/2020 02:06:18;U087.WI400.F_CV;588.520019531;100.0 +25/10/2020 02:06:19;U087.WI400.F_CV;588.539978027;100.0 +25/10/2020 02:06:20;U087.WI400.F_CV;588.570007324;100.0 +25/10/2020 02:06:21;U087.WI400.F_CV;588.559997559;100.0 +25/10/2020 02:06:22;U087.WI400.F_CV;588.580017090;100.0 +25/10/2020 02:06:23;U087.WI400.F_CV;588.619995117;100.0 +25/10/2020 02:06:24;U087.WI400.F_CV;588.669982910;100.0 +25/10/2020 02:06:25;U087.WI400.F_CV;588.710021973;100.0 +25/10/2020 02:06:26;U087.WI400.F_CV;588.599975586;100.0 +25/10/2020 02:06:27;U087.WI400.F_CV;588.580017090;100.0 +25/10/2020 02:06:28;U087.WI400.F_CV;588.460021973;100.0 +25/10/2020 02:06:29;U087.WI400.F_CV;588.469970703;100.0 +25/10/2020 02:06:30;U087.WI400.F_CV;588.549987793;100.0 +25/10/2020 02:06:31;U087.WI400.F_CV;588.580017090;100.0 +25/10/2020 02:06:32;U087.WI400.F_CV;588.599975586;100.0 +25/10/2020 02:06:33;U087.WI400.F_CV;588.570007324;100.0 +25/10/2020 02:06:34;U087.WI400.F_CV;588.530029297;100.0 +25/10/2020 02:06:36;U087.WI400.F_CV;588.609985352;100.0 +25/10/2020 02:06:37;U087.WI400.F_CV;588.580017090;100.0 +25/10/2020 02:06:38;U087.WI400.F_CV;588.619995117;100.0 +25/10/2020 02:06:40;U087.WI400.F_CV;588.659973145;100.0 +25/10/2020 02:06:44;U087.WI400.F_CV;588.619995117;100.0 +25/10/2020 02:06:45;U087.WI400.F_CV;588.609985352;100.0 +25/10/2020 02:06:46;U087.WI400.F_CV;588.650024414;100.0 +25/10/2020 02:06:47;U087.WI400.F_CV;588.599975586;100.0 +25/10/2020 02:06:48;U087.WI400.F_CV;588.539978027;100.0 +25/10/2020 02:06:49;U087.WI400.F_CV;588.590026855;100.0 +25/10/2020 02:06:50;U087.WI400.F_CV;588.500000000;100.0 +25/10/2020 02:06:51;U087.WI400.F_CV;588.469970703;100.0 +25/10/2020 02:06:52;U087.WI400.F_CV;588.479980469;100.0 +25/10/2020 02:06:53;U087.WI400.F_CV;588.469970703;100.0 +25/10/2020 02:06:54;U087.WI400.F_CV;588.460021973;100.0 +25/10/2020 02:06:56;U087.WI400.F_CV;588.489990234;100.0 +25/10/2020 02:06:59;U087.WI400.F_CV;588.450012207;100.0 +25/10/2020 02:06:07;U087.WI400E.F_CV;588.509948730;100.0 +25/10/2020 02:06:08;U087.WI400E.F_CV;588.448913574;100.0 +25/10/2020 02:06:27;U087.WI400E.F_CV;588.448913574;100.0 +25/10/2020 02:06:28;U087.WI400E.F_CV;588.570983887;100.0 +25/10/2020 02:06:37;U087.WI400E.F_CV;588.570983887;100.0 +25/10/2020 02:06:38;U087.WI400E.F_CV;588.509948730;100.0 +25/10/2020 02:06:47;U087.WI400E.F_CV;588.509948730;100.0 +25/10/2020 02:06:48;U087.WI400E.F_CV;588.570983887;100.0 +25/10/2020 02:06:58;U087.WI400E.F_CV;588.570983887;100.0 +25/10/2020 02:06:59;U087.WI400E.F_CV;588.448913574;100.0 +25/10/2020 02:06:05;U102.AT201_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:05;U102.PI101_PV.F_CV;-0.009033203;100.0 +25/10/2020 02:06:05;U102.PI201_PV.F_CV;0.000096321;100.0 +25/10/2020 02:06:05;U102.R101_COMPTEUR_PRESSION.F_CV;4.000000000;100.0 +25/10/2020 02:06:05;U102.TC102_PV.F_CV;18.549999237;100.0 +25/10/2020 02:06:05;U102.TC202_PV.F_CV;27.360000610;100.0 +25/10/2020 02:06:05;U102.TC202_SP.F_CV;25.000000000;100.0 +25/10/2020 02:06:05;U102.TI101_PV.F_CV;18.577636719;100.0 +25/10/2020 02:06:05;U102.TI201_PV.F_CV;17.295837402;100.0 +25/10/2020 02:06:05;U102.TI203_PV.F_CV;16.908971786;100.0 +25/10/2020 02:06:04;U103.AI01_PV.F_CV;21.050346375;100.0 +25/10/2020 02:06:16;U103.DI04_PV.F_CV;0.000047020;100.0 +25/10/2020 02:06:11;U103.DI07_PV.F_CV;-0.000094039;100.0 +25/10/2020 02:06:15;U103.DI08_PV.F_CV;0.061172597;100.0 +25/10/2020 02:06:23;U103.DI08_PV.F_CV;0.060984518;100.0 +25/10/2020 02:06:46;U103.DI08_PV.F_CV;0.061407693;100.0 +25/10/2020 02:06:59;U103.DI08_PV.F_CV;0.061219618;100.0 +25/10/2020 02:06:16;U103.FI01_PV.F_CV;-38.782550812;100.0 +25/10/2020 02:06:57;U103.FI04_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U103.FI07_PV.F_CV;-0.010850694;100.0 +25/10/2020 02:06:11;U103.FI08_PV.F_CV;-0.014467592;100.0 +25/10/2020 02:06:57;U103.FI09_PV.F_CV;-0.009765625;100.0 +25/10/2020 02:06:00;U103.FI13_PV.F_CV;1.551649332;100.0 +25/10/2020 02:06:01;U103.FI13_PV.F_CV;2.148437500;100.0 +25/10/2020 02:06:13;U103.FI13_PV.F_CV;2.625868082;100.0 +25/10/2020 02:06:19;U103.FI13_PV.F_CV;1.551649332;100.0 +25/10/2020 02:06:21;U103.FI13_PV.F_CV;2.745225668;100.0 +25/10/2020 02:06:22;U103.FI13_PV.F_CV;1.790364623;100.0 +25/10/2020 02:06:24;U103.FI13_PV.F_CV;2.387152672;100.0 +25/10/2020 02:06:26;U103.FI13_PV.F_CV;1.432291627;100.0 +25/10/2020 02:06:28;U103.FI13_PV.F_CV;2.387152672;100.0 +25/10/2020 02:06:30;U103.FI13_PV.F_CV;1.551649332;100.0 +25/10/2020 02:06:31;U103.FI13_PV.F_CV;2.387152672;100.0 +25/10/2020 02:06:34;U103.FI13_PV.F_CV;1.432291627;100.0 +25/10/2020 02:06:35;U103.FI13_PV.F_CV;2.148437500;100.0 +25/10/2020 02:06:38;U103.FI13_PV.F_CV;1.432291627;100.0 +25/10/2020 02:06:39;U103.FI13_PV.F_CV;2.267795086;100.0 +25/10/2020 02:06:42;U103.FI13_PV.F_CV;1.790364623;100.0 +25/10/2020 02:06:43;U103.FI13_PV.F_CV;2.267795086;100.0 +25/10/2020 02:06:46;U103.FI13_PV.F_CV;1.790364623;100.0 +25/10/2020 02:06:47;U103.FI13_PV.F_CV;2.267795086;100.0 +25/10/2020 02:06:49;U103.FI13_PV.F_CV;1.790364623;100.0 +25/10/2020 02:06:50;U103.FI13_PV.F_CV;2.267795086;100.0 +25/10/2020 02:06:53;U103.FI13_PV.F_CV;1.551649332;100.0 +25/10/2020 02:06:54;U103.FI13_PV.F_CV;2.267795086;100.0 +25/10/2020 02:06:57;U103.FI13_PV.F_CV;1.551649332;100.0 +25/10/2020 02:06:58;U103.FI13_PV.F_CV;2.625868082;100.0 +25/10/2020 02:06:49;U103.FI15_PV.F_CV;0.002604167;100.0 +25/10/2020 02:06:00;U103.FI16_PV.F_CV;0.596788168;100.0 +25/10/2020 02:06:01;U103.FI16_PV.F_CV;0.608506918;100.0 +25/10/2020 02:06:03;U103.FI16_PV.F_CV;0.516493082;100.0 +25/10/2020 02:06:04;U103.FI16_PV.F_CV;0.490451396;100.0 +25/10/2020 02:06:05;U103.FI16_PV.F_CV;0.266927093;100.0 +25/10/2020 02:06:06;U103.FI16_PV.F_CV;0.211371526;100.0 +25/10/2020 02:06:07;U103.FI16_PV.F_CV;0.250000000;100.0 +25/10/2020 02:06:08;U103.FI16_PV.F_CV;0.343750000;100.0 +25/10/2020 02:06:09;U103.FI16_PV.F_CV;0.400607646;100.0 +25/10/2020 02:06:10;U103.FI16_PV.F_CV;0.493923604;100.0 +25/10/2020 02:06:11;U103.FI16_PV.F_CV;0.518229187;100.0 +25/10/2020 02:06:14;U103.FI16_PV.F_CV;0.510850668;100.0 +25/10/2020 02:06:15;U103.FI16_PV.F_CV;0.414496541;100.0 +25/10/2020 02:06:16;U103.FI16_PV.F_CV;0.350694448;100.0 +25/10/2020 02:06:17;U103.FI16_PV.F_CV;0.365451396;100.0 +25/10/2020 02:06:21;U103.FI16_PV.F_CV;0.484809041;100.0 +25/10/2020 02:06:23;U103.FI16_PV.F_CV;0.514322937;100.0 +25/10/2020 02:06:24;U103.FI16_PV.F_CV;0.502604187;100.0 +25/10/2020 02:06:25;U103.FI16_PV.F_CV;0.565104187;100.0 +25/10/2020 02:06:27;U103.FI16_PV.F_CV;0.545138896;100.0 +25/10/2020 02:06:29;U103.FI16_PV.F_CV;0.479600698;100.0 +25/10/2020 02:06:31;U103.FI16_PV.F_CV;0.486979157;100.0 +25/10/2020 02:06:35;U103.FI16_PV.F_CV;0.367187500;100.0 +25/10/2020 02:06:36;U103.FI16_PV.F_CV;0.329427093;100.0 +25/10/2020 02:06:39;U103.FI16_PV.F_CV;0.449652791;100.0 +25/10/2020 02:06:41;U103.FI16_PV.F_CV;0.463541657;100.0 +25/10/2020 02:06:43;U103.FI16_PV.F_CV;0.457465291;100.0 +25/10/2020 02:06:44;U103.FI16_PV.F_CV;0.470052093;100.0 +25/10/2020 02:06:45;U103.FI16_PV.F_CV;0.442274302;100.0 +25/10/2020 02:06:46;U103.FI16_PV.F_CV;0.399739593;100.0 +25/10/2020 02:06:50;U103.FI16_PV.F_CV;0.462239593;100.0 +25/10/2020 02:06:51;U103.FI16_PV.F_CV;0.487847209;100.0 +25/10/2020 02:06:55;U103.FI16_PV.F_CV;0.464409709;100.0 +25/10/2020 02:06:58;U103.FI16_PV.F_CV;0.493923604;100.0 +25/10/2020 02:06:11;U103.FI17_PV.F_CV;0.005570023;100.0 +25/10/2020 02:06:11;U103.LC02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U103.MI01_PV.F_CV;0.895471632;100.0 +25/10/2020 02:06:35;U103.MI15_PV.F_CV;6.588867188;100.0 +25/10/2020 02:06:19;U103.MI16_PV.F_CV;7.290943146;100.0 +25/10/2020 02:06:44;U103.PC07_PV.F_CV;0.003616898;100.0 +25/10/2020 02:06:13;U103.PC09_PV.F_CV;-0.124782987;100.0 +25/10/2020 02:06:11;U103.PC12_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U103.PC13_PV.F_CV;-0.242332458;100.0 +25/10/2020 02:06:44;U103.PC24_PV.F_CV;0.061489105;100.0 +25/10/2020 02:06:13;U103.PI04_PV.F_CV;-0.162037030;100.0 +25/10/2020 02:06:19;U103.PI04_PV.F_CV;-0.118634261;100.0 +25/10/2020 02:06:21;U103.PI04_PV.F_CV;-0.159143522;100.0 +25/10/2020 02:06:28;U103.PI04_PV.F_CV;-0.118634261;100.0 +25/10/2020 02:06:36;U103.PI04_PV.F_CV;-0.162037030;100.0 +25/10/2020 02:06:40;U103.PI04_PV.F_CV;-0.121527776;100.0 +25/10/2020 02:06:54;U103.PI04_PV.F_CV;-0.162037030;100.0 +25/10/2020 02:06:11;U103.PI08_PV.F_CV;0.066912614;100.0 +25/10/2020 02:06:11;U103.PI10_PV.F_CV;-0.005787037;100.0 +25/10/2020 02:06:21;U103.PI28_PV.F_CV;-0.535300910;100.0 +25/10/2020 02:06:36;U103.PI31_PV.F_CV;-0.047019958;100.0 +25/10/2020 02:06:25;U103.PI32_PV.F_CV;-0.007232666;100.0 +25/10/2020 02:06:52;U103.TC103_PV.F_CV;17.028356552;100.0 +25/10/2020 02:06:05;U103.TC105_PV.F_CV;17.361110687;100.0 +25/10/2020 02:06:08;U103.TC18_PV.F_CV;16.362846375;100.0 +25/10/2020 02:06:11;U103.TI01_PV.F_CV;-5.314127445;100.0 +25/10/2020 02:06:01;U103.TI03_PV.F_CV;17.267072678;100.0 +25/10/2020 02:06:11;U103.TI04_PV.F_CV;16.992187500;100.0 +25/10/2020 02:06:11;U103.TI06_PV.F_CV;17.198350906;100.0 +25/10/2020 02:06:58;U103.TI104_PV.F_CV;17.013889313;100.0 +25/10/2020 02:06:00;U103.TI106_PV.F_CV;16.691984177;100.0 +25/10/2020 02:06:51;U103.TI15_PV.F_CV;17.222583771;100.0 +25/10/2020 02:06:14;U103.TI16_PV.F_CV;17.380641937;100.0 +25/10/2020 02:06:51;U103.TI17_PV.F_CV;16.724536896;100.0 +25/10/2020 02:06:55;U103.TI20_PV.F_CV;16.153066635;100.0 +25/10/2020 02:06:59;U169.AI02_PV.F_CV;0.058774594;100.0 +25/10/2020 02:06:21;U169.AI03_PV.F_CV;0.007233796;100.0 +25/10/2020 02:06:04;U169.AI04_PV.F_CV;20.109952927;100.0 +25/10/2020 02:06:58;U169.AI05_PV.F_CV;0.045301650;100.0 +25/10/2020 02:06:39;U169.AI06_PV.F_CV;0.002893518;100.0 +25/10/2020 02:06:14;U169.AI07_PV.F_CV;20.348669052;100.0 +25/10/2020 02:06:12;U169.AI101_PV.F_CV;0.043402776;100.0 +25/10/2020 02:06:03;U169.AI30_PV.F_CV;-0.859013319;100.0 +25/10/2020 02:06:12;U169.AI30_PV.F_CV;-1.931423545;100.0 +25/10/2020 02:06:20;U169.AI30_PV.F_CV;-1.338252306;100.0 +25/10/2020 02:06:21;U169.AI30_PV.F_CV;-0.651041687;100.0 +25/10/2020 02:06:27;U169.AI30_PV.F_CV;-2.061631918;100.0 +25/10/2020 02:06:39;U169.AI30_PV.F_CV;-0.434027791;100.0 +25/10/2020 02:06:41;U169.AI30_PV.F_CV;-1.193576336;100.0 +25/10/2020 02:06:44;U169.AI30_PV.F_CV;-0.629340291;100.0 +25/10/2020 02:06:59;U169.AI30_PV.F_CV;-2.658420086;100.0 +25/10/2020 02:06:12;U169.Coke_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U169.DPC10_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U169.DPC10_PV.F_CV;-11.100000381;100.0 +25/10/2020 02:06:12;U169.DPC10_PV_V2.F_CV;0.000000000;0.0 +25/10/2020 02:06:42;U169.DPC40_OP.F_CV;0.000337952;100.0 +25/10/2020 02:06:03;U169.DPC40_PV.F_CV;-0.202546299;100.0 +25/10/2020 02:06:06;U169.DPC40_PV.F_CV;-0.426793993;100.0 +25/10/2020 02:06:16;U169.DPC40_PV.F_CV;-0.137442127;100.0 +25/10/2020 02:06:19;U169.DPC40_PV.F_CV;0.057870369;100.0 +25/10/2020 02:06:22;U169.DPC40_PV.F_CV;-0.065104164;100.0 +25/10/2020 02:06:23;U169.DPC40_PV.F_CV;-0.289351851;100.0 +25/10/2020 02:06:26;U169.DPC40_PV.F_CV;-0.470196754;100.0 +25/10/2020 02:06:33;U169.DPC40_PV.F_CV;-0.108506948;100.0 +25/10/2020 02:06:40;U169.DPC40_PV.F_CV;-0.267650455;100.0 +25/10/2020 02:06:41;U169.DPC40_PV.F_CV;-0.426793993;100.0 +25/10/2020 02:06:46;U169.DPC40_PV.F_CV;-0.528067112;100.0 +25/10/2020 02:06:48;U169.DPC40_PV.F_CV;-0.745081007;100.0 +25/10/2020 02:06:55;U169.DPC40_PV.F_CV;-0.491898149;100.0 +25/10/2020 02:06:12;U169.FC01_OP.F_CV;10.000000000;100.0 +25/10/2020 02:06:12;U169.FC01_PV.F_CV;-0.174696177;100.0 +25/10/2020 02:06:12;U169.FC02_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U169.FC02_PV.F_CV;-0.014829283;100.0 +25/10/2020 02:06:12;U169.FC03_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U169.FC03_PV.F_CV;64.274085999;100.0 +25/10/2020 02:06:01;U169.FC03_PV.F_CV;26.426866531;100.0 +25/10/2020 02:06:02;U169.FC03_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:11;U169.FC03_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:12;U169.FC03_PV.F_CV;152.783203125;100.0 +25/10/2020 02:06:13;U169.FC03_PV.F_CV;157.085510254;100.0 +25/10/2020 02:06:14;U169.FC03_PV.F_CV;131.038406372;100.0 +25/10/2020 02:06:15;U169.FC03_PV.F_CV;50.113933563;100.0 +25/10/2020 02:06:16;U169.FC03_PV.F_CV;15.511067390;100.0 +25/10/2020 02:06:17;U169.FC03_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:25;U169.FC03_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:26;U169.FC03_PV.F_CV;79.687500000;100.0 +25/10/2020 02:06:27;U169.FC03_PV.F_CV;154.991317749;100.0 +25/10/2020 02:06:28;U169.FC03_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:29;U169.FC03_PV.F_CV;57.899307251;100.0 +25/10/2020 02:06:30;U169.FC03_PV.F_CV;38.585067749;100.0 +25/10/2020 02:06:31;U169.FC03_PV.F_CV;5.094400883;100.0 +25/10/2020 02:06:32;U169.FC03_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:40;U169.FC03_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:41;U169.FC03_PV.F_CV;141.346572876;100.0 +25/10/2020 02:06:42;U169.FC03_PV.F_CV;155.859375000;100.0 +25/10/2020 02:06:43;U169.FC03_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:44;U169.FC03_PV.F_CV;43.283420563;100.0 +25/10/2020 02:06:45;U169.FC03_PV.F_CV;9.651692390;100.0 +25/10/2020 02:06:46;U169.FC03_PV.F_CV;-6.011284828;100.0 +25/10/2020 02:06:47;U169.FC03_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:55;U169.FC03_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:56;U169.FC03_PV.F_CV;155.566406250;100.0 +25/10/2020 02:06:57;U169.FC03_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:58;U169.FC03_PV.F_CV;110.677085876;100.0 +25/10/2020 02:06:59;U169.FC03_PV.F_CV;30.034721375;100.0 +25/10/2020 02:06:12;U169.FC07_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U169.FC07_PV.F_CV;0.596788168;100.0 +25/10/2020 02:06:09;U169.FC07_PV.F_CV;-0.108506948;100.0 +25/10/2020 02:06:15;U169.FC07_PV.F_CV;0.618489563;100.0 +25/10/2020 02:06:17;U169.FC07_PV.F_CV;-1.801215291;100.0 +25/10/2020 02:06:20;U169.FC07_PV.F_CV;0.238715276;100.0 +25/10/2020 02:06:23;U169.FC07_PV.F_CV;-0.509982646;100.0 +25/10/2020 02:06:34;U169.FC07_PV.F_CV;0.108506948;100.0 +25/10/2020 02:06:41;U169.FC07_PV.F_CV;-0.857204854;100.0 +25/10/2020 02:06:43;U169.FC07_PV.F_CV;-0.032552082;100.0 +25/10/2020 02:06:51;U169.FC07_PV.F_CV;-0.759548604;100.0 +25/10/2020 02:06:53;U169.FC07_PV.F_CV;0.303819448;100.0 +25/10/2020 02:06:55;U169.FC07_PV.F_CV;-0.629340291;100.0 +25/10/2020 02:06:56;U169.FC07_PV.F_CV;0.021701388;100.0 +25/10/2020 02:06:12;U169.FC101_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U169.FC101_PV.F_CV;0.034722224;100.0 +25/10/2020 02:06:41;U169.FC10_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U169.FC10_PV.F_CV;-0.009259259;100.0 +25/10/2020 02:06:01;U169.FC20_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U169.FC20_PV.F_CV;0.016999422;100.0 +25/10/2020 02:06:16;U169.FC20_PV.F_CV;0.018084491;100.0 +25/10/2020 02:06:17;U169.FC20_PV.F_CV;0.016999422;100.0 +25/10/2020 02:06:32;U169.FC30_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U169.FC30_PV.F_CV;0.053168401;100.0 +25/10/2020 02:06:12;U169.FC31_OP.F_CV;35.000000000;100.0 +25/10/2020 02:06:12;U169.FC31_PV.F_CV;-0.143590853;100.0 +25/10/2020 02:06:32;U169.FC40_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U169.FC40_PV.F_CV;0.006944444;100.0 +25/10/2020 02:06:04;U169.FC50_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U169.FC50_PV.F_CV;-0.000217014;100.0 +25/10/2020 02:06:12;U169.FC51_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U169.FC51_PV.F_CV;0.079861112;100.0 +25/10/2020 02:06:57;U169.FI04_PV.F_CV;-0.061631944;100.0 +25/10/2020 02:06:12;U169.FI60_PV.F_CV;0.013964844;100.0 +25/10/2020 02:06:11;U169.FI75_PV.F_CV;0.727187932;100.0 +25/10/2020 02:06:13;U169.FI75_PV.F_CV;0.734491229;100.0 +25/10/2020 02:06:20;U169.FI75_PV.F_CV;0.738773227;100.0 +25/10/2020 02:06:30;U169.FI75_PV.F_CV;0.733003378;100.0 +25/10/2020 02:06:36;U169.FI75_PV.F_CV;0.727187932;100.0 +25/10/2020 02:06:42;U169.FI75_PV.F_CV;0.729210854;100.0 +25/10/2020 02:06:45;U169.FI75_PV.F_CV;0.726756990;100.0 +25/10/2020 02:06:50;U169.FI75_PV.F_CV;0.728778601;100.0 +25/10/2020 02:06:57;U169.FI75_PV.F_CV;0.721538842;100.0 +25/10/2020 02:06:12;U169.FI80_PV.F_CV;0.000658275;100.0 +25/10/2020 02:06:12;U169.FI85_PV.F_CV;0.352699637;100.0 +25/10/2020 02:06:29;U169.FI95_PV.F_CV;0.767297506;100.0 +25/10/2020 02:06:37;U169.FI_Cata1_PV.F_CV;-0.000741003;100.0 +25/10/2020 02:06:03;U169.FI_Cata2_PV.F_CV;-0.003086260;100.0 +25/10/2020 02:06:12;U169.FIA101_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:12;U169.FIA102_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:12;U169.H2_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U169.LC20_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U169.LC20_PV.F_CV;-0.538917840;100.0 +25/10/2020 02:06:12;U169.LC50_OP.F_CV;0.994936347;100.0 +25/10/2020 02:06:11;U169.LC50_PV.F_CV;-0.235098377;100.0 +25/10/2020 02:06:12;U169.LC51_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U169.LC51_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:12;U169.LC70A_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U169.LC70A_PV.F_CV;18.377458572;100.0 +25/10/2020 02:06:12;U169.LC70B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U169.LC70B_PV.F_CV;18.417245865;100.0 +25/10/2020 02:06:37;U169.LC70B_PV.F_CV;18.362991333;100.0 +25/10/2020 02:06:45;U169.LC70B_PV.F_CV;18.417245865;100.0 +25/10/2020 02:06:01;U169.LI01_PV.F_CV;-1.699942112;100.0 +25/10/2020 02:06:02;U169.LI01_PV.F_CV;-1.859085679;100.0 +25/10/2020 02:06:05;U169.LI01_PV.F_CV;-1.714409709;100.0 +25/10/2020 02:06:07;U169.LI01_PV.F_CV;-1.859085679;100.0 +25/10/2020 02:06:09;U169.LI01_PV.F_CV;-1.566116929;100.0 +25/10/2020 02:06:12;U169.LI01_PV.F_CV;-1.862702489;100.0 +25/10/2020 02:06:13;U169.LI01_PV.F_CV;-1.576967597;100.0 +25/10/2020 02:06:14;U169.LI01_PV.F_CV;-1.862702489;100.0 +25/10/2020 02:06:17;U169.LI01_PV.F_CV;-1.710792780;100.0 +25/10/2020 02:06:20;U169.LI01_PV.F_CV;-1.862702489;100.0 +25/10/2020 02:06:21;U169.LI01_PV.F_CV;-1.714409709;100.0 +25/10/2020 02:06:24;U169.LI01_PV.F_CV;-1.862702489;100.0 +25/10/2020 02:06:25;U169.LI01_PV.F_CV;-1.627604127;100.0 +25/10/2020 02:06:26;U169.LI01_PV.F_CV;-1.862702489;100.0 +25/10/2020 02:06:29;U169.LI01_PV.F_CV;-1.714409709;100.0 +25/10/2020 02:06:30;U169.LI01_PV.F_CV;-1.855468750;100.0 +25/10/2020 02:06:33;U169.LI01_PV.F_CV;-1.714409709;100.0 +25/10/2020 02:06:34;U169.LI01_PV.F_CV;-1.862702489;100.0 +25/10/2020 02:06:35;U169.LI01_PV.F_CV;-1.801215291;100.0 +25/10/2020 02:06:36;U169.LI01_PV.F_CV;-1.862702489;100.0 +25/10/2020 02:06:37;U169.LI01_PV.F_CV;-1.710792780;100.0 +25/10/2020 02:06:38;U169.LI01_PV.F_CV;-1.859085679;100.0 +25/10/2020 02:06:39;U169.LI01_PV.F_CV;-1.725260377;100.0 +25/10/2020 02:06:41;U169.LI01_PV.F_CV;-1.613136530;100.0 +25/10/2020 02:06:44;U169.LI01_PV.F_CV;-1.859085679;100.0 +25/10/2020 02:06:46;U169.LI01_PV.F_CV;-1.573350668;100.0 +25/10/2020 02:06:47;U169.LI01_PV.F_CV;-1.862702489;100.0 +25/10/2020 02:06:51;U169.LI01_PV.F_CV;-1.591435194;100.0 +25/10/2020 02:06:52;U169.LI01_PV.F_CV;-1.862702489;100.0 +25/10/2020 02:06:53;U169.LI01_PV.F_CV;-1.576967597;100.0 +25/10/2020 02:06:54;U169.LI01_PV.F_CV;-1.862702489;100.0 +25/10/2020 02:06:55;U169.LI01_PV.F_CV;-1.739727974;100.0 +25/10/2020 02:06:56;U169.LI01_PV.F_CV;-1.859085679;100.0 +25/10/2020 02:06:58;U169.LI01_PV.F_CV;-1.580584526;100.0 +25/10/2020 02:06:59;U169.LI01_PV.F_CV;-1.862702489;100.0 +25/10/2020 02:06:02;U169.LI02_PV.F_CV;29.014757156;100.0 +25/10/2020 02:06:04;U169.LI02_PV.F_CV;28.899015427;100.0 +25/10/2020 02:06:11;U169.LI02_PV.F_CV;29.003906250;100.0 +25/10/2020 02:06:12;U169.LI02_PV.F_CV;28.862846375;100.0 +25/10/2020 02:06:23;U169.LI02_PV.F_CV;28.971353531;100.0 +25/10/2020 02:06:24;U169.LI02_PV.F_CV;28.862846375;100.0 +25/10/2020 02:06:39;U169.LI02_PV.F_CV;28.927951813;100.0 +25/10/2020 02:06:40;U169.LI02_PV.F_CV;28.862846375;100.0 +25/10/2020 02:06:43;U169.LI02_PV.F_CV;29.011140823;100.0 +25/10/2020 02:06:44;U169.LI02_PV.F_CV;28.873697281;100.0 +25/10/2020 02:06:47;U169.LI02_PV.F_CV;29.007522583;100.0 +25/10/2020 02:06:48;U169.LI02_PV.F_CV;28.859230042;100.0 +25/10/2020 02:06:53;U169.LI03_PV.F_CV;14.322916985;100.0 +25/10/2020 02:06:52;U169.LI20_PV.F_CV;-0.538917840;100.0 +25/10/2020 02:06:12;U169.LI21_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:08;U169.LI30_PV.F_CV;-0.097656250;100.0 +25/10/2020 02:06:08;U169.PC20_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U169.PC20_PV.F_CV;1.150607586;100.0 +25/10/2020 02:06:32;U169.PC30_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U169.PC30_PV.F_CV;1.170862317;100.0 +25/10/2020 02:06:32;U169.PC50_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U169.PC50_PV.F_CV;1.164641261;100.0 +25/10/2020 02:06:37;U169.PDI11_PV.F_CV;113.100402832;100.0 +25/10/2020 02:06:51;U169.PDI21_PV.F_CV;0.171802655;100.0 +25/10/2020 02:06:40;U169.PDI23_PV.F_CV;-2.821180582;100.0 +25/10/2020 02:06:05;U169.PDI24_PV.F_CV;-18.247251511;100.0 +25/10/2020 02:06:18;U169.PDI24_PV.F_CV;-17.596208572;100.0 +25/10/2020 02:06:26;U169.PDI24_PV.F_CV;-18.319589615;100.0 +25/10/2020 02:06:36;U169.PDI24_PV.F_CV;-17.632377625;100.0 +25/10/2020 02:06:46;U169.PDI24_PV.F_CV;-18.265335083;100.0 +25/10/2020 02:06:04;U169.PDI31_PV.F_CV;-1.739727974;100.0 +25/10/2020 02:06:17;U169.PDI31_PV.F_CV;-1.804832220;100.0 +25/10/2020 02:06:25;U169.PDI31_PV.F_CV;-1.699942112;100.0 +25/10/2020 02:06:28;U169.PDI31_PV.F_CV;-1.757812500;100.0 +25/10/2020 02:06:46;U169.PDI31_PV.F_CV;-1.699942112;100.0 +25/10/2020 02:06:25;U169.PDI51_PV.F_CV;-3.935185194;100.0 +25/10/2020 02:06:36;U169.PDI60_PV.F_CV;-3.020109892;100.0 +25/10/2020 02:06:09;U169.PDI71_PV.F_CV;0.370732069;100.0 +25/10/2020 02:06:12;U169.PI100_PV.F_CV;61.848957062;100.0 +25/10/2020 02:06:31;U169.PI70_PV.F_CV;1.145399332;100.0 +25/10/2020 02:06:01;U169.TC01_OP.F_CV;5.570306778;100.0 +25/10/2020 02:06:02;U169.TC01_OP.F_CV;5.430335045;100.0 +25/10/2020 02:06:07;U169.TC01_OP.F_CV;5.550374508;100.0 +25/10/2020 02:06:08;U169.TC01_OP.F_CV;5.690468311;100.0 +25/10/2020 02:06:13;U169.TC01_OP.F_CV;5.490793705;100.0 +25/10/2020 02:06:16;U169.TC01_OP.F_CV;5.750912666;100.0 +25/10/2020 02:06:17;U169.TC01_OP.F_CV;5.551019192;100.0 +25/10/2020 02:06:20;U169.TC01_OP.F_CV;5.451104164;100.0 +25/10/2020 02:06:22;U169.TC01_OP.F_CV;5.291063309;100.0 +25/10/2020 02:06:23;U169.TC01_OP.F_CV;5.431013107;100.0 +25/10/2020 02:06:31;U169.TC01_OP.F_CV;5.651101112;100.0 +25/10/2020 02:06:34;U169.TC01_OP.F_CV;5.531294823;100.0 +25/10/2020 02:06:35;U169.TC01_OP.F_CV;5.631365299;100.0 +25/10/2020 02:06:41;U169.TC01_OP.F_CV;5.511707306;100.0 +25/10/2020 02:06:43;U169.TC01_OP.F_CV;5.391712189;100.0 +25/10/2020 02:06:46;U169.TC01_OP.F_CV;5.451670647;100.0 +25/10/2020 02:06:47;U169.TC01_OP.F_CV;5.551696777;100.0 +25/10/2020 02:06:52;U169.TC01_OP.F_CV;5.391778469;100.0 +25/10/2020 02:06:00;U169.TC01_PV.F_CV;80.000000000;100.0 +25/10/2020 02:06:02;U169.TC01_PV.F_CV;79.800003052;100.0 +25/10/2020 02:06:03;U169.TC01_PV.F_CV;80.000000000;100.0 +25/10/2020 02:06:05;U169.TC01_PV.F_CV;79.699996948;100.0 +25/10/2020 02:06:08;U169.TC01_PV.F_CV;79.900001526;100.0 +25/10/2020 02:06:10;U169.TC01_PV.F_CV;79.599998474;100.0 +25/10/2020 02:06:12;U169.TC01_PV.F_CV;80.000000000;100.0 +25/10/2020 02:06:15;U169.TC01_PV.F_CV;79.599998474;100.0 +25/10/2020 02:06:16;U169.TC01_PV.F_CV;80.000000000;100.0 +25/10/2020 02:06:17;U169.TC01_PV.F_CV;79.800003052;100.0 +25/10/2020 02:06:18;U169.TC01_PV.F_CV;80.099998474;100.0 +25/10/2020 02:06:19;U169.TC01_PV.F_CV;79.900001526;100.0 +25/10/2020 02:06:20;U169.TC01_PV.F_CV;80.400001526;100.0 +25/10/2020 02:06:29;U169.TC01_PV.F_CV;79.599998474;100.0 +25/10/2020 02:06:33;U169.TC01_PV.F_CV;80.199996948;100.0 +25/10/2020 02:06:34;U169.TC01_PV.F_CV;79.599998474;100.0 +25/10/2020 02:06:35;U169.TC01_PV.F_CV;79.900001526;100.0 +25/10/2020 02:06:36;U169.TC01_PV.F_CV;79.500000000;100.0 +25/10/2020 02:06:37;U169.TC01_PV.F_CV;79.900001526;100.0 +25/10/2020 02:06:40;U169.TC01_PV.F_CV;80.099998474;100.0 +25/10/2020 02:06:43;U169.TC01_PV.F_CV;79.800003052;100.0 +25/10/2020 02:06:44;U169.TC01_PV.F_CV;80.000000000;100.0 +25/10/2020 02:06:57;U169.TC01_PV.F_CV;79.800003052;100.0 +25/10/2020 02:06:58;U169.TC01_PV.F_CV;79.599998474;100.0 +25/10/2020 02:06:12;U169.TC02_OP.F_CV;6.106495857;100.0 +25/10/2020 02:06:25;U169.TC02_PV.F_CV;21.899999619;100.0 +25/10/2020 02:06:12;U169.TC06_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U169.TC06_PV.F_CV;22.299999237;100.0 +25/10/2020 02:06:12;U169.TC07_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U169.TC07_PV.F_CV;21.390335083;100.0 +25/10/2020 02:06:01;U169.TC09_OP.F_CV;10.149465561;100.0 +25/10/2020 02:06:02;U169.TC09_OP.F_CV;9.249102592;100.0 +25/10/2020 02:06:04;U169.TC09_OP.F_CV;10.288781166;100.0 +25/10/2020 02:06:07;U169.TC09_OP.F_CV;11.129121780;100.0 +25/10/2020 02:06:08;U169.TC09_OP.F_CV;9.729165077;100.0 +25/10/2020 02:06:10;U169.TC09_OP.F_CV;11.049194336;100.0 +25/10/2020 02:06:11;U169.TC09_OP.F_CV;9.869247437;100.0 +25/10/2020 02:06:13;U169.TC09_OP.F_CV;11.609469414;100.0 +25/10/2020 02:06:14;U169.TC09_OP.F_CV;9.129477501;100.0 +25/10/2020 02:06:16;U169.TC09_OP.F_CV;9.989039421;100.0 +25/10/2020 02:06:17;U169.TC09_OP.F_CV;11.129155159;100.0 +25/10/2020 02:06:19;U169.TC09_OP.F_CV;10.669462204;100.0 +25/10/2020 02:06:20;U169.TC09_OP.F_CV;11.749941826;100.0 +25/10/2020 02:06:22;U169.TC09_OP.F_CV;10.130266190;100.0 +25/10/2020 02:06:23;U169.TC09_OP.F_CV;9.549981117;100.0 +25/10/2020 02:06:26;U169.TC09_OP.F_CV;9.769221306;100.0 +25/10/2020 02:06:28;U169.TC09_OP.F_CV;10.189014435;100.0 +25/10/2020 02:06:29;U169.TC09_OP.F_CV;9.688786507;100.0 +25/10/2020 02:06:31;U169.TC09_OP.F_CV;11.268859863;100.0 +25/10/2020 02:06:32;U169.TC09_OP.F_CV;10.489155769;100.0 +25/10/2020 02:06:34;U169.TC09_OP.F_CV;8.608714104;100.0 +25/10/2020 02:06:35;U169.TC09_OP.F_CV;11.288492203;100.0 +25/10/2020 02:06:37;U169.TC09_OP.F_CV;9.828601837;100.0 +25/10/2020 02:06:38;U169.TC09_OP.F_CV;9.288169861;100.0 +25/10/2020 02:06:40;U169.TC09_OP.F_CV;10.767988205;100.0 +25/10/2020 02:06:41;U169.TC09_OP.F_CV;9.807955742;100.0 +25/10/2020 02:06:43;U169.TC09_OP.F_CV;10.587870598;100.0 +25/10/2020 02:06:44;U169.TC09_OP.F_CV;9.707762718;100.0 +25/10/2020 02:06:46;U169.TC09_OP.F_CV;12.148079872;100.0 +25/10/2020 02:06:47;U169.TC09_OP.F_CV;9.928469658;100.0 +25/10/2020 02:06:49;U169.TC09_OP.F_CV;8.867936134;100.0 +25/10/2020 02:06:50;U169.TC09_OP.F_CV;11.247779846;100.0 +25/10/2020 02:06:52;U169.TC09_OP.F_CV;10.368030548;100.0 +25/10/2020 02:06:55;U169.TC09_OP.F_CV;9.387784958;100.0 +25/10/2020 02:06:56;U169.TC09_OP.F_CV;10.167467117;100.0 +25/10/2020 02:06:58;U169.TC09_OP.F_CV;10.047330856;100.0 +25/10/2020 02:06:59;U169.TC09_OP.F_CV;10.947416306;100.0 +25/10/2020 02:06:01;U169.TC09_PV.F_CV;79.699996948;100.0 +25/10/2020 02:06:03;U169.TC09_PV.F_CV;85.300003052;100.0 +25/10/2020 02:06:04;U169.TC09_PV.F_CV;79.900001526;100.0 +25/10/2020 02:06:05;U169.TC09_PV.F_CV;79.500000000;100.0 +25/10/2020 02:06:10;U169.TC09_PV.F_CV;79.900001526;100.0 +25/10/2020 02:06:11;U169.TC09_PV.F_CV;75.300003052;100.0 +25/10/2020 02:06:12;U169.TC09_PV.F_CV;79.300003052;100.0 +25/10/2020 02:06:13;U169.TC09_PV.F_CV;85.400001526;100.0 +25/10/2020 02:06:15;U169.TC09_PV.F_CV;80.000000000;100.0 +25/10/2020 02:06:20;U169.TC09_PV.F_CV;79.300003052;100.0 +25/10/2020 02:06:21;U169.TC09_PV.F_CV;82.199996948;100.0 +25/10/2020 02:06:22;U169.TC09_PV.F_CV;80.300003052;100.0 +25/10/2020 02:06:24;U169.TC09_PV.F_CV;80.800003052;100.0 +25/10/2020 02:06:25;U169.TC09_PV.F_CV;78.599998474;100.0 +25/10/2020 02:06:26;U169.TC09_PV.F_CV;79.900001526;100.0 +25/10/2020 02:06:27;U169.TC09_PV.F_CV;80.400001526;100.0 +25/10/2020 02:06:29;U169.TC09_PV.F_CV;79.400001526;100.0 +25/10/2020 02:06:33;U169.TC09_PV.F_CV;80.800003052;100.0 +25/10/2020 02:06:34;U169.TC09_PV.F_CV;79.599998474;100.0 +25/10/2020 02:06:36;U169.TC09_PV.F_CV;79.099998474;100.0 +25/10/2020 02:06:37;U169.TC09_PV.F_CV;81.099998474;100.0 +25/10/2020 02:06:38;U169.TC09_PV.F_CV;74.300003052;100.0 +25/10/2020 02:06:39;U169.TC09_PV.F_CV;79.900001526;100.0 +25/10/2020 02:06:40;U169.TC09_PV.F_CV;83.699996948;100.0 +25/10/2020 02:06:41;U169.TC09_PV.F_CV;80.099998474;100.0 +25/10/2020 02:06:43;U169.TC09_PV.F_CV;79.400001526;100.0 +25/10/2020 02:06:44;U169.TC09_PV.F_CV;80.900001526;100.0 +25/10/2020 02:06:45;U169.TC09_PV.F_CV;79.400001526;100.0 +25/10/2020 02:06:46;U169.TC09_PV.F_CV;80.699996948;100.0 +25/10/2020 02:06:47;U169.TC09_PV.F_CV;81.099998474;100.0 +25/10/2020 02:06:48;U169.TC09_PV.F_CV;79.099998474;100.0 +25/10/2020 02:06:49;U169.TC09_PV.F_CV;79.900001526;100.0 +25/10/2020 02:06:52;U169.TC09_PV.F_CV;80.300003052;100.0 +25/10/2020 02:06:53;U169.TC09_PV.F_CV;79.900001526;100.0 +25/10/2020 02:06:56;U169.TC09_PV.F_CV;81.500000000;100.0 +25/10/2020 02:06:57;U169.TC09_PV.F_CV;80.099998474;100.0 +25/10/2020 02:06:58;U169.TC09_PV.F_CV;79.500000000;100.0 +25/10/2020 02:06:10;U169.TC10_OP.F_CV;50.000000000;100.0 +25/10/2020 02:06:06;U169.TC10_PV.F_CV;18.399999619;100.0 +25/10/2020 02:06:01;U169.TC11_OP.F_CV;39.734153748;100.0 +25/10/2020 02:06:02;U169.TC11_OP.F_CV;39.254531860;100.0 +25/10/2020 02:06:04;U169.TC11_OP.F_CV;39.382045746;100.0 +25/10/2020 02:06:05;U169.TC11_OP.F_CV;39.622005463;100.0 +25/10/2020 02:06:07;U169.TC11_OP.F_CV;39.381870270;100.0 +25/10/2020 02:06:08;U169.TC11_OP.F_CV;39.739337921;100.0 +25/10/2020 02:06:10;U169.TC11_OP.F_CV;39.259460449;100.0 +25/10/2020 02:06:11;U169.TC11_OP.F_CV;39.739414215;100.0 +25/10/2020 02:06:13;U169.TC11_OP.F_CV;39.612220764;100.0 +25/10/2020 02:06:16;U169.TC11_OP.F_CV;39.838668823;100.0 +25/10/2020 02:06:17;U169.TC11_OP.F_CV;39.119571686;100.0 +25/10/2020 02:06:19;U169.TC11_OP.F_CV;39.370353699;100.0 +25/10/2020 02:06:20;U169.TC11_OP.F_CV;39.140510559;100.0 +25/10/2020 02:06:23;U169.TC11_OP.F_CV;39.855510712;100.0 +25/10/2020 02:06:25;U169.TC11_OP.F_CV;39.605957031;100.0 +25/10/2020 02:06:26;U169.TC11_OP.F_CV;39.719284058;100.0 +25/10/2020 02:06:28;U169.TC11_OP.F_CV;39.357883453;100.0 +25/10/2020 02:06:29;U169.TC11_OP.F_CV;39.834201813;100.0 +25/10/2020 02:06:31;U169.TC11_OP.F_CV;39.350498199;100.0 +25/10/2020 02:06:32;U169.TC11_OP.F_CV;40.062362671;100.0 +25/10/2020 02:06:34;U169.TC11_OP.F_CV;39.569511414;100.0 +25/10/2020 02:06:37;U169.TC11_OP.F_CV;39.329650879;100.0 +25/10/2020 02:06:38;U169.TC11_OP.F_CV;39.454662323;100.0 +25/10/2020 02:06:40;U169.TC11_OP.F_CV;39.221694946;100.0 +25/10/2020 02:06:41;U169.TC11_OP.F_CV;39.585983276;100.0 +25/10/2020 02:06:46;U169.TC11_OP.F_CV;39.350906372;100.0 +25/10/2020 02:06:47;U169.TC11_OP.F_CV;39.239685059;100.0 +25/10/2020 02:06:50;U169.TC11_OP.F_CV;39.613288879;100.0 +25/10/2020 02:06:52;U169.TC11_OP.F_CV;39.961437225;100.0 +25/10/2020 02:06:53;U169.TC11_OP.F_CV;39.355003357;100.0 +25/10/2020 02:06:55;U169.TC11_OP.F_CV;39.125904083;100.0 +25/10/2020 02:06:59;U169.TC11_OP.F_CV;39.851577759;100.0 +25/10/2020 02:06:43;U169.TC11_PV.F_CV;499.899993896;100.0 +25/10/2020 02:06:26;U169.TC12_OP.F_CV;6.414228439;100.0 +25/10/2020 02:06:26;U169.TC12_PV.F_CV;490.000000000;100.0 +25/10/2020 02:06:05;U169.TC15_OP.F_CV;21.659545898;100.0 +25/10/2020 02:06:07;U169.TC15_OP.F_CV;21.739540100;100.0 +25/10/2020 02:06:10;U169.TC15_OP.F_CV;21.659511566;100.0 +25/10/2020 02:06:11;U169.TC15_OP.F_CV;21.719512939;100.0 +25/10/2020 02:06:32;U169.TC15_OP.F_CV;21.779514313;100.0 +25/10/2020 02:06:40;U169.TC15_OP.F_CV;21.679626465;100.0 +25/10/2020 02:06:41;U169.TC15_OP.F_CV;21.759601593;100.0 +25/10/2020 02:06:43;U169.TC15_OP.F_CV;21.679603577;100.0 +25/10/2020 02:06:47;U169.TC15_OP.F_CV;21.799598694;100.0 +25/10/2020 02:06:55;U169.TC15_OP.F_CV;21.739728928;100.0 +25/10/2020 02:06:56;U169.TC15_OP.F_CV;21.819768906;100.0 +25/10/2020 02:06:58;U169.TC15_OP.F_CV;21.699752808;100.0 +25/10/2020 02:06:59;U169.TC15_OP.F_CV;21.759744644;100.0 +25/10/2020 02:06:46;U169.TC15_PV.F_CV;499.899993896;100.0 +25/10/2020 02:06:01;U169.TC16_OP.F_CV;15.237997055;100.0 +25/10/2020 02:06:02;U169.TC16_OP.F_CV;15.297977448;100.0 +25/10/2020 02:06:05;U169.TC16_OP.F_CV;15.217926979;100.0 +25/10/2020 02:06:07;U169.TC16_OP.F_CV;15.317916870;100.0 +25/10/2020 02:06:10;U169.TC16_OP.F_CV;15.257935524;100.0 +25/10/2020 02:06:20;U169.TC16_OP.F_CV;15.317883492;100.0 +25/10/2020 02:06:22;U169.TC16_OP.F_CV;15.257880211;100.0 +25/10/2020 02:06:23;U169.TC16_OP.F_CV;15.337897301;100.0 +25/10/2020 02:06:29;U169.TC16_OP.F_CV;15.257913589;100.0 +25/10/2020 02:06:31;U169.TC16_OP.F_CV;15.317905426;100.0 +25/10/2020 02:06:40;U169.TC16_OP.F_CV;15.257968903;100.0 +25/10/2020 02:06:41;U169.TC16_OP.F_CV;15.317960739;100.0 +25/10/2020 02:06:58;U169.TC16_OP.F_CV;15.217993736;100.0 +25/10/2020 02:06:59;U169.TC16_OP.F_CV;15.297988892;100.0 +25/10/2020 02:06:32;U169.TC16_PV.F_CV;500.000000000;100.0 +25/10/2020 02:06:05;U169.TC17_OP.F_CV;14.999626160;100.0 +25/10/2020 02:06:07;U169.TC17_OP.F_CV;15.079620361;100.0 +25/10/2020 02:06:16;U169.TC17_OP.F_CV;15.139579773;100.0 +25/10/2020 02:06:17;U169.TC17_OP.F_CV;15.079598427;100.0 +25/10/2020 02:06:32;U169.TC17_OP.F_CV;15.139657021;100.0 +25/10/2020 02:06:40;U169.TC17_OP.F_CV;15.019706726;100.0 +25/10/2020 02:06:41;U169.TC17_OP.F_CV;15.099681854;100.0 +25/10/2020 02:06:43;U169.TC17_OP.F_CV;15.019683838;100.0 +25/10/2020 02:06:44;U169.TC17_OP.F_CV;15.099659920;100.0 +25/10/2020 02:06:58;U169.TC17_OP.F_CV;15.019695282;100.0 +25/10/2020 02:06:59;U169.TC17_OP.F_CV;15.099670410;100.0 +25/10/2020 02:06:32;U169.TC17_PV.F_CV;499.899993896;100.0 +25/10/2020 02:06:05;U169.TC18_OP.F_CV;14.412660599;100.0 +25/10/2020 02:06:08;U169.TC18_OP.F_CV;14.472652435;100.0 +25/10/2020 02:06:22;U169.TC18_OP.F_CV;14.412749290;100.0 +25/10/2020 02:06:23;U169.TC18_OP.F_CV;14.472741127;100.0 +25/10/2020 02:06:29;U169.TC18_OP.F_CV;14.412759781;100.0 +25/10/2020 02:06:31;U169.TC18_OP.F_CV;14.512771606;100.0 +25/10/2020 02:06:32;U169.TC18_PV.F_CV;500.000000000;100.0 +25/10/2020 02:06:32;U169.TC19_PV.F_CV;530.665466309;100.0 +25/10/2020 02:06:41;U169.TC21_OP.F_CV;17.414735794;100.0 +25/10/2020 02:06:58;U169.TC21_OP.F_CV;17.574270248;100.0 +25/10/2020 02:06:59;U169.TC21_OP.F_CV;17.514266968;100.0 +25/10/2020 02:06:27;U169.TC21_PV.F_CV;520.200012207;100.0 +25/10/2020 02:06:02;U169.TC22_OP.F_CV;11.004796028;100.0 +25/10/2020 02:06:14;U169.TC22_OP.F_CV;10.884690285;100.0 +25/10/2020 02:06:20;U169.TC22_OP.F_CV;10.964479446;100.0 +25/10/2020 02:06:22;U169.TC22_OP.F_CV;10.904515266;100.0 +25/10/2020 02:06:40;U169.TC22_OP.F_CV;11.064161301;100.0 +25/10/2020 02:06:41;U169.TC22_OP.F_CV;10.984227180;100.0 +25/10/2020 02:06:50;U169.TC22_OP.F_CV;10.924168587;100.0 +25/10/2020 02:06:58;U169.TC22_OP.F_CV;11.044197083;100.0 +25/10/2020 02:06:59;U169.TC22_PV.F_CV;520.000000000;100.0 +25/10/2020 02:06:07;U169.TC23_OP.F_CV;11.804741859;100.0 +25/10/2020 02:06:13;U169.TC23_OP.F_CV;11.884647369;100.0 +25/10/2020 02:06:19;U169.TC23_OP.F_CV;11.764596939;100.0 +25/10/2020 02:06:20;U169.TC23_OP.F_CV;11.824555397;100.0 +25/10/2020 02:06:25;U169.TC23_OP.F_CV;11.764430046;100.0 +25/10/2020 02:06:31;U169.TC23_OP.F_CV;11.844220161;100.0 +25/10/2020 02:06:32;U169.TC23_OP.F_CV;11.784255981;100.0 +25/10/2020 02:06:22;U169.TC23_PV.F_CV;520.099975586;100.0 +25/10/2020 02:06:23;U169.TC24_OP.F_CV;21.316305161;100.0 +25/10/2020 02:06:27;U169.TC24_OP.F_CV;21.216707230;100.0 +25/10/2020 02:06:40;U169.TC24_OP.F_CV;21.317926407;100.0 +25/10/2020 02:06:44;U169.TC24_OP.F_CV;21.258411407;100.0 +25/10/2020 02:06:06;U169.TC24_PV.F_CV;519.799987793;100.0 +25/10/2020 02:06:10;U169.TC25_OP.F_CV;55.000000000;100.0 +25/10/2020 02:06:54;U169.TC25_PV.F_CV;512.900024414;100.0 +25/10/2020 02:06:05;U169.TC27_OP.F_CV;40.000000000;100.0 +25/10/2020 02:06:39;U169.TC27_PV.F_CV;443.600006104;100.0 +25/10/2020 02:06:12;U169.TC28_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U169.TC28_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:13;U169.TC29_OP.F_CV;5.738377571;100.0 +25/10/2020 02:06:59;U169.TC29_PV.F_CV;24.500000000;100.0 +25/10/2020 02:06:19;U169.TC30_OP.F_CV;43.133701324;100.0 +25/10/2020 02:06:38;U169.TC30_OP.F_CV;43.073986053;100.0 +25/10/2020 02:06:40;U169.TC30_OP.F_CV;43.133998871;100.0 +25/10/2020 02:06:59;U169.TC30_OP.F_CV;43.074230194;100.0 +25/10/2020 02:06:43;U169.TC30_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:29;U169.TC31_OP.F_CV;16.872665405;100.0 +25/10/2020 02:06:32;U169.TC31_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:00;U169.TC32_OP.F_CV;35.000000000;100.0 +25/10/2020 02:06:12;U169.TC32_PV.F_CV;560.299987793;100.0 +25/10/2020 02:06:13;U169.TC33_OP.F_CV;12.225336075;100.0 +25/10/2020 02:06:15;U169.TC33_OP.F_CV;12.285316467;100.0 +25/10/2020 02:06:52;U169.TC33_OP.F_CV;12.225124359;100.0 +25/10/2020 02:06:54;U169.TC33_OP.F_CV;12.285105705;100.0 +25/10/2020 02:06:32;U169.TC33_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:07;U169.TC34_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:37;U169.TC34_PV.F_CV;384.399993896;100.0 +25/10/2020 02:06:12;U169.TC35_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U169.TC35_PV.F_CV;22.600000381;100.0 +25/10/2020 02:06:32;U169.TC36_OP.F_CV;20.000000000;100.0 +25/10/2020 02:06:23;U169.TC36_PV.F_CV;126.699996948;100.0 +25/10/2020 02:06:17;U169.TC37_OP.F_CV;61.420879364;100.0 +25/10/2020 02:06:19;U169.TC37_OP.F_CV;61.480861664;100.0 +25/10/2020 02:06:22;U169.TC37_OP.F_CV;61.380805969;100.0 +25/10/2020 02:06:29;U169.TC37_OP.F_CV;61.320522308;100.0 +25/10/2020 02:06:38;U169.TC37_OP.F_CV;61.380062103;100.0 +25/10/2020 02:06:46;U169.TC37_OP.F_CV;61.279697418;100.0 +25/10/2020 02:06:47;U169.TC37_OP.F_CV;61.339599609;100.0 +25/10/2020 02:06:28;U169.TC37_PV.F_CV;180.199996948;100.0 +25/10/2020 02:06:53;U169.TC38_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:02;U169.TC38_PV.F_CV;128.899993896;100.0 +25/10/2020 02:06:41;U169.TC39_OP.F_CV;30.000000000;100.0 +25/10/2020 02:06:17;U169.TC39_PV.F_CV;50.200000763;100.0 +25/10/2020 02:06:08;U169.TC41_OP.F_CV;40.000000000;100.0 +25/10/2020 02:06:15;U169.TC41_PV.F_CV;21.100000381;100.0 +25/10/2020 02:06:09;U169.TC42_OP.F_CV;40.000000000;100.0 +25/10/2020 02:06:08;U169.TC42_PV.F_CV;564.099975586;100.0 +25/10/2020 02:06:02;U169.TC43_OP.F_CV;28.609846115;100.0 +25/10/2020 02:06:03;U169.TC43_OP.F_CV;28.509897232;100.0 +25/10/2020 02:06:10;U169.TC43_OP.F_CV;28.449882507;100.0 +25/10/2020 02:06:11;U169.TC43_OP.F_CV;28.529890060;100.0 +25/10/2020 02:06:22;U169.TC43_OP.F_CV;28.470041275;100.0 +25/10/2020 02:06:48;U169.TC43_OP.F_CV;28.610166550;100.0 +25/10/2020 02:06:50;U169.TC43_OP.F_CV;28.510297775;100.0 +25/10/2020 02:06:51;U169.TC43_OP.F_CV;28.610300064;100.0 +25/10/2020 02:06:53;U169.TC43_OP.F_CV;28.530445099;100.0 +25/10/2020 02:06:32;U169.TC43_PV.F_CV;620.000000000;100.0 +25/10/2020 02:06:53;U169.TC49_OP.F_CV;30.000000000;100.0 +25/10/2020 02:06:19;U169.TC49_PV.F_CV;23.899999619;100.0 +25/10/2020 02:06:31;U169.TC50_OP.F_CV;43.247791290;100.0 +25/10/2020 02:06:47;U169.TC50_PV.F_CV;160.300003052;100.0 +25/10/2020 02:06:08;U169.TC51_OP.F_CV;31.831869125;100.0 +25/10/2020 02:06:30;U169.TC51_PV.F_CV;102.900001526;100.0 +25/10/2020 02:06:14;U169.TC52_OP.F_CV;26.756990433;100.0 +25/10/2020 02:06:51;U169.TC52_PV.F_CV;62.000000000;100.0 +25/10/2020 02:06:18;U169.TC53_OP.F_CV;24.346502304;100.0 +25/10/2020 02:06:46;U169.TC53_PV.F_CV;45.400001526;100.0 +25/10/2020 02:06:58;U169.TC54_OP.F_CV;35.000000000;100.0 +25/10/2020 02:06:34;U169.TC54_PV.F_CV;128.100006104;100.0 +25/10/2020 02:06:00;U169.TC55_OP.F_CV;40.000000000;100.0 +25/10/2020 02:06:29;U169.TC55_PV.F_CV;157.300003052;100.0 +25/10/2020 02:06:06;U169.TC56_OP.F_CV;50.000000000;100.0 +25/10/2020 02:06:12;U169.TC56_PV.F_CV;134.300003052;100.0 +25/10/2020 02:06:47;U169.TC56_PV.F_CV;134.500000000;100.0 +25/10/2020 02:06:37;U169.TC59_OP.F_CV;22.751873016;100.0 +25/10/2020 02:06:44;U169.TC59_PV.F_CV;31.399999619;100.0 +25/10/2020 02:06:11;U169.TC61_OP.F_CV;56.399387360;100.0 +25/10/2020 02:06:22;U169.TC61_OP.F_CV;56.280403137;100.0 +25/10/2020 02:06:24;U169.TC61_OP.F_CV;56.340461731;100.0 +25/10/2020 02:06:27;U169.TC61_OP.F_CV;56.260662079;100.0 +25/10/2020 02:06:28;U169.TC61_OP.F_CV;56.340705872;100.0 +25/10/2020 02:06:34;U169.TC61_OP.F_CV;56.401252747;100.0 +25/10/2020 02:06:36;U169.TC61_OP.F_CV;56.341396332;100.0 +25/10/2020 02:06:37;U169.TC61_OP.F_CV;56.401542664;100.0 +25/10/2020 02:06:49;U169.TC61_OP.F_CV;56.262504578;100.0 +25/10/2020 02:06:13;U169.TC61_PV.F_CV;649.799987793;100.0 +25/10/2020 02:06:01;U169.TC62_OP.F_CV;51.684177399;100.0 +25/10/2020 02:06:02;U169.TC62_OP.F_CV;51.604217529;100.0 +25/10/2020 02:06:09;U169.TC62_OP.F_CV;51.704586029;100.0 +25/10/2020 02:06:15;U169.TC62_OP.F_CV;51.524990082;100.0 +25/10/2020 02:06:26;U169.TC62_OP.F_CV;51.645317078;100.0 +25/10/2020 02:06:27;U169.TC62_OP.F_CV;51.585357666;100.0 +25/10/2020 02:06:30;U169.TC62_OP.F_CV;51.665531158;100.0 +25/10/2020 02:06:36;U169.TC62_OP.F_CV;51.545837402;100.0 +25/10/2020 02:06:37;U169.TC62_OP.F_CV;51.605827332;100.0 +25/10/2020 02:06:40;U169.TC62_OP.F_CV;51.545902252;100.0 +25/10/2020 02:06:42;U169.TC62_OP.F_CV;51.605915070;100.0 +25/10/2020 02:06:45;U169.TC62_OP.F_CV;51.545989990;100.0 +25/10/2020 02:06:48;U169.TC62_OP.F_CV;51.606006622;100.0 +25/10/2020 02:06:51;U169.TC62_OP.F_CV;51.546169281;100.0 +25/10/2020 02:06:53;U169.TC62_OP.F_CV;51.646228790;100.0 +25/10/2020 02:06:55;U169.TC62_OP.F_CV;51.586334229;100.0 +25/10/2020 02:06:56;U169.TC62_OP.F_CV;51.666397095;100.0 +25/10/2020 02:06:57;U169.TC62_OP.F_CV;51.606449127;100.0 +25/10/2020 02:06:32;U169.TC62_PV.F_CV;649.900024414;100.0 +25/10/2020 02:06:04;U169.TC63_OP.F_CV;43.315734863;100.0 +25/10/2020 02:06:07;U169.TC63_OP.F_CV;43.475566864;100.0 +25/10/2020 02:06:09;U169.TC63_OP.F_CV;43.415489197;100.0 +25/10/2020 02:06:15;U169.TC63_OP.F_CV;43.575195313;100.0 +25/10/2020 02:06:16;U169.TC63_OP.F_CV;43.515247345;100.0 +25/10/2020 02:06:19;U169.TC63_OP.F_CV;43.715404510;100.0 +25/10/2020 02:06:21;U169.TC63_OP.F_CV;43.515579224;100.0 +25/10/2020 02:06:22;U169.TC63_OP.F_CV;43.675685883;100.0 +25/10/2020 02:06:25;U169.TC63_OP.F_CV;43.555881500;100.0 +25/10/2020 02:06:26;U169.TC63_OP.F_CV;43.635940552;100.0 +25/10/2020 02:06:27;U169.TC63_OP.F_CV;43.375926971;100.0 +25/10/2020 02:06:29;U169.TC63_OP.F_CV;43.435806274;100.0 +25/10/2020 02:06:33;U169.TC63_OP.F_CV;43.375595093;100.0 +25/10/2020 02:06:34;U169.TC63_OP.F_CV;43.275432587;100.0 +25/10/2020 02:06:35;U169.TC63_OP.F_CV;43.435317993;100.0 +25/10/2020 02:06:39;U169.TC63_OP.F_CV;43.555103302;100.0 +25/10/2020 02:06:40;U169.TC63_OP.F_CV;43.475109100;100.0 +25/10/2020 02:06:41;U169.TC63_OP.F_CV;43.595115662;100.0 +25/10/2020 02:06:44;U169.TC63_OP.F_CV;43.675354004;100.0 +25/10/2020 02:06:45;U169.TC63_OP.F_CV;43.595401764;100.0 +25/10/2020 02:06:50;U169.TC63_OP.F_CV;43.735843658;100.0 +25/10/2020 02:06:52;U169.TC63_OP.F_CV;43.476036072;100.0 +25/10/2020 02:06:57;U169.TC63_OP.F_CV;43.575927734;100.0 +25/10/2020 02:06:59;U169.TC63_OP.F_CV;43.235740662;100.0 +25/10/2020 02:06:52;U169.TC63_PV.F_CV;650.200012207;100.0 +25/10/2020 02:06:12;U169.TC72_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U169.TC72_PV.F_CV;21.799999237;100.0 +25/10/2020 02:06:17;U169.TC72_PV.F_CV;21.600000381;100.0 +25/10/2020 02:06:18;U169.TC72_PV.F_CV;21.700000763;100.0 +25/10/2020 02:06:19;U169.TC72_PV.F_CV;21.600000381;100.0 +25/10/2020 02:06:21;U169.TC72_PV.F_CV;21.700000763;100.0 +25/10/2020 02:06:22;U169.TC72_PV.F_CV;21.600000381;100.0 +25/10/2020 02:06:35;U169.TC72_PV.F_CV;21.700000763;100.0 +25/10/2020 02:06:42;U169.TC72_PV.F_CV;21.600000381;100.0 +25/10/2020 02:06:43;U169.TC72_PV.F_CV;21.700000763;100.0 +25/10/2020 02:06:45;U169.TC72_PV.F_CV;21.600000381;100.0 +25/10/2020 02:06:46;U169.TC72_PV.F_CV;21.700000763;100.0 +25/10/2020 02:06:49;U169.TC72_PV.F_CV;21.600000381;100.0 +25/10/2020 02:06:50;U169.TC72_PV.F_CV;21.700000763;100.0 +25/10/2020 02:06:53;U169.TC72_PV.F_CV;21.600000381;100.0 +25/10/2020 02:06:54;U169.TC72_PV.F_CV;21.799999237;100.0 +25/10/2020 02:06:01;U169.TC78_OP.F_CV;10.027102470;100.0 +25/10/2020 02:06:02;U169.TC78_OP.F_CV;9.907052040;100.0 +25/10/2020 02:06:04;U169.TC78_OP.F_CV;10.026991844;100.0 +25/10/2020 02:06:08;U169.TC78_OP.F_CV;9.926906586;100.0 +25/10/2020 02:06:10;U169.TC78_OP.F_CV;10.086876869;100.0 +25/10/2020 02:06:11;U169.TC78_OP.F_CV;10.006863594;100.0 +25/10/2020 02:06:19;U169.TC78_OP.F_CV;10.166867256;100.0 +25/10/2020 02:06:23;U169.TC78_OP.F_CV;10.027007103;100.0 +25/10/2020 02:06:25;U169.TC78_OP.F_CV;10.167022705;100.0 +25/10/2020 02:06:28;U169.TC78_OP.F_CV;10.227148056;100.0 +25/10/2020 02:06:29;U169.TC78_OP.F_CV;10.147212982;100.0 +25/10/2020 02:06:40;U169.TC78_OP.F_CV;10.067444801;100.0 +25/10/2020 02:06:41;U169.TC78_OP.F_CV;10.227493286;100.0 +25/10/2020 02:06:44;U169.TC78_OP.F_CV;10.007519722;100.0 +25/10/2020 02:06:46;U169.TC78_OP.F_CV;10.107504845;100.0 +25/10/2020 02:06:47;U169.TC78_OP.F_CV;9.967488289;100.0 +25/10/2020 02:06:53;U169.TC78_OP.F_CV;10.067334175;100.0 +25/10/2020 02:06:58;U169.TC78_OP.F_CV;9.927272797;100.0 +25/10/2020 02:06:59;U169.TC78_OP.F_CV;10.067234039;100.0 +25/10/2020 02:06:04;U169.TC78_PV.F_CV;199.800003052;100.0 +25/10/2020 02:06:05;U169.TC78_PV.F_CV;200.100006104;100.0 +25/10/2020 02:06:25;U169.TC78_PV.F_CV;199.399993896;100.0 +25/10/2020 02:06:27;U169.TC78_PV.F_CV;199.899993896;100.0 +25/10/2020 02:06:00;U169.TI04_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:00;U169.TI116_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:01;U169.TI116_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:02;U169.TI116_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:03;U169.TI116_PV.F_CV;20.100000381;100.0 +25/10/2020 02:06:04;U169.TI116_PV.F_CV;16.799999237;100.0 +25/10/2020 02:06:05;U169.TI116_PV.F_CV;19.799999237;100.0 +25/10/2020 02:06:06;U169.TI116_PV.F_CV;19.399999619;100.0 +25/10/2020 02:06:07;U169.TI116_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:08;U169.TI116_PV.F_CV;23.700000763;100.0 +25/10/2020 02:06:09;U169.TI116_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:10;U169.TI116_PV.F_CV;20.000000000;100.0 +25/10/2020 02:06:11;U169.TI116_PV.F_CV;19.700000763;100.0 +25/10/2020 02:06:12;U169.TI116_PV.F_CV;19.600000381;100.0 +25/10/2020 02:06:13;U169.TI116_PV.F_CV;19.200000763;100.0 +25/10/2020 02:06:14;U169.TI116_PV.F_CV;20.600000381;100.0 +25/10/2020 02:06:15;U169.TI116_PV.F_CV;21.700000763;100.0 +25/10/2020 02:06:16;U169.TI116_PV.F_CV;17.299999237;100.0 +25/10/2020 02:06:17;U169.TI116_PV.F_CV;19.799999237;100.0 +25/10/2020 02:06:18;U169.TI116_PV.F_CV;17.700000763;100.0 +25/10/2020 02:06:19;U169.TI116_PV.F_CV;19.799999237;100.0 +25/10/2020 02:06:20;U169.TI116_PV.F_CV;21.299999237;100.0 +25/10/2020 02:06:21;U169.TI116_PV.F_CV;19.899999619;100.0 +25/10/2020 02:06:22;U169.TI116_PV.F_CV;18.600000381;100.0 +25/10/2020 02:06:23;U169.TI116_PV.F_CV;20.000000000;100.0 +25/10/2020 02:06:25;U169.TI116_PV.F_CV;19.799999237;100.0 +25/10/2020 02:06:26;U169.TI116_PV.F_CV;22.899999619;100.0 +25/10/2020 02:06:27;U169.TI116_PV.F_CV;20.000000000;100.0 +25/10/2020 02:06:28;U169.TI116_PV.F_CV;17.899999619;100.0 +25/10/2020 02:06:29;U169.TI116_PV.F_CV;19.899999619;100.0 +25/10/2020 02:06:30;U169.TI116_PV.F_CV;19.500000000;100.0 +25/10/2020 02:06:31;U169.TI116_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:32;U169.TI116_PV.F_CV;19.799999237;100.0 +25/10/2020 02:06:33;U169.TI116_PV.F_CV;20.100000381;100.0 +25/10/2020 02:06:34;U169.TI116_PV.F_CV;19.600000381;100.0 +25/10/2020 02:06:35;U169.TI116_PV.F_CV;19.700000763;100.0 +25/10/2020 02:06:36;U169.TI116_PV.F_CV;21.100000381;100.0 +25/10/2020 02:06:37;U169.TI116_PV.F_CV;20.100000381;100.0 +25/10/2020 02:06:38;U169.TI116_PV.F_CV;20.500000000;100.0 +25/10/2020 02:06:39;U169.TI116_PV.F_CV;20.299999237;100.0 +25/10/2020 02:06:40;U169.TI116_PV.F_CV;19.799999237;100.0 +25/10/2020 02:06:41;U169.TI116_PV.F_CV;20.500000000;100.0 +25/10/2020 02:06:42;U169.TI116_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:43;U169.TI116_PV.F_CV;19.700000763;100.0 +25/10/2020 02:06:44;U169.TI116_PV.F_CV;19.600000381;100.0 +25/10/2020 02:06:45;U169.TI116_PV.F_CV;22.700000763;100.0 +25/10/2020 02:06:46;U169.TI116_PV.F_CV;18.500000000;100.0 +25/10/2020 02:06:47;U169.TI116_PV.F_CV;20.100000381;100.0 +25/10/2020 02:06:48;U169.TI116_PV.F_CV;20.000000000;100.0 +25/10/2020 02:06:49;U169.TI116_PV.F_CV;19.700000763;100.0 +25/10/2020 02:06:50;U169.TI116_PV.F_CV;22.000000000;100.0 +25/10/2020 02:06:51;U169.TI116_PV.F_CV;20.000000000;100.0 +25/10/2020 02:06:53;U169.TI116_PV.F_CV;20.500000000;100.0 +25/10/2020 02:06:54;U169.TI116_PV.F_CV;16.200000763;100.0 +25/10/2020 02:06:55;U169.TI116_PV.F_CV;23.299999237;100.0 +25/10/2020 02:06:56;U169.TI116_PV.F_CV;20.000000000;100.0 +25/10/2020 02:06:57;U169.TI116_PV.F_CV;23.600000381;100.0 +25/10/2020 02:06:58;U169.TI116_PV.F_CV;19.700000763;100.0 +25/10/2020 02:06:59;U169.TI116_PV.F_CV;19.600000381;100.0 +25/10/2020 02:06:12;U169.TI11A_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;U169.TI11A_PV.F_CV;499.899993896;100.0 +25/10/2020 02:06:12;U169.TI11B_PV.F_CV;601.099975586;100.0 +25/10/2020 02:06:42;U169.TI11B_PV.F_CV;601.400024414;100.0 +25/10/2020 02:06:39;U169.TI12A_PV.F_CV;486.799987793;100.0 +25/10/2020 02:06:26;U169.TI12B_PV.F_CV;490.000000000;100.0 +25/10/2020 02:06:59;U169.TI13A_PV.F_CV;399.000000000;100.0 +25/10/2020 02:06:02;U169.TI13B_PV.F_CV;202.500000000;100.0 +25/10/2020 02:06:45;U169.TI14A_PV.F_CV;389.399993896;100.0 +25/10/2020 02:06:33;U169.TI14B_PV.F_CV;279.500000000;100.0 +25/10/2020 02:06:11;U169.TI15A_PV.F_CV;514.299987793;100.0 +25/10/2020 02:06:46;U169.TI15B_PV.F_CV;499.899993896;100.0 +25/10/2020 02:06:45;U169.TI16A_PV.F_CV;313.399993896;100.0 +25/10/2020 02:06:32;U169.TI16B_PV.F_CV;500.000000000;100.0 +25/10/2020 02:06:32;U169.TI17A_PV.F_CV;513.250488281;100.0 +25/10/2020 02:06:32;U169.TI17B_PV.F_CV;499.899993896;100.0 +25/10/2020 02:06:49;U169.TI18A_PV.F_CV;514.122009277;100.0 +25/10/2020 02:06:32;U169.TI18B_PV.F_CV;500.000000000;100.0 +25/10/2020 02:06:40;U169.TI21A_PV.F_CV;505.838500977;100.0 +25/10/2020 02:06:05;U169.TI21B_PV.F_CV;520.099975586;100.0 +25/10/2020 02:06:32;U169.TI22A_PV.F_CV;521.363830566;100.0 +25/10/2020 02:06:59;U169.TI22B_PV.F_CV;520.000000000;100.0 +25/10/2020 02:06:51;U169.TI23A_PV.F_CV;509.944519043;100.0 +25/10/2020 02:06:22;U169.TI23B_PV.F_CV;520.099975586;100.0 +25/10/2020 02:06:35;U169.TI24A_PV.F_CV;401.799987793;100.0 +25/10/2020 02:06:06;U169.TI24B_PV.F_CV;519.799987793;100.0 +25/10/2020 02:06:08;U169.TI25A_PV.F_CV;512.799987793;100.0 +25/10/2020 02:06:32;U169.TI25B_PV.F_CV;470.100006104;100.0 +25/10/2020 02:06:32;U169.TI26_PV.F_CV;22.500000000;100.0 +25/10/2020 02:06:12;U169.TI27B_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:24;U169.TI27B_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:26;U169.TI31A_PV.F_CV;593.965393066;100.0 +25/10/2020 02:06:09;U169.TI31B_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:34;U169.TI32A_PV.F_CV;619.565551758;100.0 +25/10/2020 02:06:43;U169.TI32B_PV.F_CV;560.299987793;100.0 +25/10/2020 02:06:32;U169.TI33A_PV.F_CV;612.138244629;100.0 +25/10/2020 02:06:08;U169.TI33B_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:52;U169.TI34A_PV.F_CV;405.000000000;100.0 +25/10/2020 02:06:29;U169.TI34B_PV.F_CV;384.399993896;100.0 +25/10/2020 02:06:44;U169.TI41A_PV.F_CV;26.299999237;100.0 +25/10/2020 02:06:22;U169.TI41B_PV.F_CV;21.100000381;100.0 +25/10/2020 02:06:10;U169.TI42A_PV.F_CV;562.900024414;100.0 +25/10/2020 02:06:20;U169.TI42A_PV.F_CV;562.299987793;100.0 +25/10/2020 02:06:26;U169.TI42A_PV.F_CV;562.900024414;100.0 +25/10/2020 02:06:08;U169.TI42B_PV.F_CV;564.099975586;100.0 +25/10/2020 02:06:20;U169.TI43A_PV.F_CV;246.100006104;100.0 +25/10/2020 02:06:27;U169.TI43A_PV.F_CV;245.699996948;100.0 +25/10/2020 02:06:07;U169.TI43B_PV.F_CV;620.000000000;100.0 +25/10/2020 02:06:33;U169.TI51A_PV.F_CV;92.807769775;100.0 +25/10/2020 02:06:30;U169.TI51B_PV.F_CV;102.900001526;100.0 +25/10/2020 02:06:23;U169.TI52A_PV.F_CV;66.530731201;100.0 +25/10/2020 02:06:51;U169.TI52B_PV.F_CV;62.000000000;100.0 +25/10/2020 02:06:22;U169.TI53A_PV.F_CV;48.883308411;100.0 +25/10/2020 02:06:46;U169.TI53B_PV.F_CV;45.400001526;100.0 +25/10/2020 02:06:21;U169.TI61A_PV.F_CV;576.400024414;100.0 +25/10/2020 02:06:13;U169.TI61B_PV.F_CV;649.799987793;100.0 +25/10/2020 02:06:25;U169.TI62A_PV.F_CV;559.000000000;100.0 +25/10/2020 02:06:32;U169.TI62B_PV.F_CV;649.900024414;100.0 +25/10/2020 02:06:57;U169.TI63A_PV.F_CV;610.799987793;100.0 +25/10/2020 02:06:52;U169.TI63B_PV.F_CV;650.200012207;100.0 +25/10/2020 02:06:00;U169.TI70_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:01;U169.TI70_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:02;U169.TI70_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:03;U169.TI70_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:04;U169.TI70_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:05;U169.TI70_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:08;U169.TI70_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:10;U169.TI70_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:11;U169.TI70_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:13;U169.TI70_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:15;U169.TI70_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:17;U169.TI70_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:33;U169.TI70_PV.F_CV;20.799999237;100.0 +25/10/2020 02:06:34;U169.TI70_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:42;U169.TI70_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:43;U169.TI70_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:44;U169.TI70_PV.F_CV;20.799999237;100.0 +25/10/2020 02:06:45;U169.TI70_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:47;U169.TI70_PV.F_CV;20.799999237;100.0 +25/10/2020 02:06:48;U169.TI70_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:49;U169.TI70_PV.F_CV;20.799999237;100.0 +25/10/2020 02:06:52;U169.TI70_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:57;U169.TI70_PV.F_CV;20.799999237;100.0 +25/10/2020 02:06:58;U169.TI70_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:59;U169.TI70_PV.F_CV;20.799999237;100.0 +25/10/2020 02:06:00;U169.TI71_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:03;U169.TI71_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:06;U169.TI71_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:08;U169.TI71_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:13;U169.TI71_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:15;U169.TI71_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:17;U169.TI71_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:19;U169.TI71_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:24;U169.TI71_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:25;U169.TI71_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:26;U169.TI71_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:27;U169.TI71_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:29;U169.TI71_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:30;U169.TI71_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:34;U169.TI71_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:35;U169.TI71_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:36;U169.TI71_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:37;U169.TI71_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:44;U169.TI71_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:45;U169.TI71_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:47;U169.TI71_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:51;U169.TI71_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:16;U169.TI72B_PV.F_CV;21.299999237;100.0 +25/10/2020 02:06:30;U169.TI72B_PV.F_CV;21.700000763;100.0 +25/10/2020 02:06:35;U169.TI72B_PV.F_CV;21.299999237;100.0 +25/10/2020 02:06:38;U169.TI72B_PV.F_CV;21.700000763;100.0 +25/10/2020 02:06:39;U169.TI72B_PV.F_CV;21.299999237;100.0 +25/10/2020 02:06:40;U169.TI72B_PV.F_CV;21.700000763;100.0 +25/10/2020 02:06:50;U169.TI72B_PV.F_CV;21.299999237;100.0 +25/10/2020 02:06:00;U169.TI73_PV.F_CV;21.500000000;100.0 +25/10/2020 02:06:01;U169.TI73_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:03;U169.TI73_PV.F_CV;21.600000381;100.0 +25/10/2020 02:06:09;U169.TI73_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:10;U169.TI73_PV.F_CV;21.700000763;100.0 +25/10/2020 02:06:11;U169.TI73_PV.F_CV;21.200000763;100.0 +25/10/2020 02:06:13;U169.TI73_PV.F_CV;21.700000763;100.0 +25/10/2020 02:06:14;U169.TI73_PV.F_CV;21.600000381;100.0 +25/10/2020 02:06:15;U169.TI73_PV.F_CV;21.200000763;100.0 +25/10/2020 02:06:16;U169.TI73_PV.F_CV;21.500000000;100.0 +25/10/2020 02:06:17;U169.TI73_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:19;U169.TI73_PV.F_CV;21.500000000;100.0 +25/10/2020 02:06:21;U169.TI73_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:22;U169.TI73_PV.F_CV;21.700000763;100.0 +25/10/2020 02:06:23;U169.TI73_PV.F_CV;21.500000000;100.0 +25/10/2020 02:06:24;U169.TI73_PV.F_CV;21.600000381;100.0 +25/10/2020 02:06:26;U169.TI73_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:30;U169.TI73_PV.F_CV;21.500000000;100.0 +25/10/2020 02:06:31;U169.TI73_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:32;U169.TI73_PV.F_CV;21.500000000;100.0 +25/10/2020 02:06:33;U169.TI73_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:35;U169.TI73_PV.F_CV;21.600000381;100.0 +25/10/2020 02:06:36;U169.TI73_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:37;U169.TI73_PV.F_CV;21.799999237;100.0 +25/10/2020 02:06:38;U169.TI73_PV.F_CV;21.500000000;100.0 +25/10/2020 02:06:40;U169.TI73_PV.F_CV;21.600000381;100.0 +25/10/2020 02:06:42;U169.TI73_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:44;U169.TI73_PV.F_CV;21.500000000;100.0 +25/10/2020 02:06:45;U169.TI73_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:49;U169.TI73_PV.F_CV;21.600000381;100.0 +25/10/2020 02:06:51;U169.TI73_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:52;U169.TI73_PV.F_CV;21.600000381;100.0 +25/10/2020 02:06:55;U169.TI73_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:56;U169.TI73_PV.F_CV;21.600000381;100.0 +25/10/2020 02:06:57;U169.TI73_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:58;U169.TI73_PV.F_CV;21.500000000;100.0 +25/10/2020 02:06:01;U169.TI74_PV.F_CV;16.299999237;100.0 +25/10/2020 02:06:02;U169.TI74_PV.F_CV;16.200000763;100.0 +25/10/2020 02:06:04;U169.TI74_PV.F_CV;16.399999619;100.0 +25/10/2020 02:06:05;U169.TI74_PV.F_CV;16.299999237;100.0 +25/10/2020 02:06:08;U169.TI74_PV.F_CV;16.399999619;100.0 +25/10/2020 02:06:10;U169.TI74_PV.F_CV;16.200000763;100.0 +25/10/2020 02:06:11;U169.TI74_PV.F_CV;16.600000381;100.0 +25/10/2020 02:06:13;U169.TI74_PV.F_CV;16.200000763;100.0 +25/10/2020 02:06:14;U169.TI74_PV.F_CV;16.399999619;100.0 +25/10/2020 02:06:17;U169.TI74_PV.F_CV;16.299999237;100.0 +25/10/2020 02:06:18;U169.TI74_PV.F_CV;16.600000381;100.0 +25/10/2020 02:06:20;U169.TI74_PV.F_CV;16.100000381;100.0 +25/10/2020 02:06:21;U169.TI74_PV.F_CV;16.500000000;100.0 +25/10/2020 02:06:24;U169.TI74_PV.F_CV;16.100000381;100.0 +25/10/2020 02:06:25;U169.TI74_PV.F_CV;16.600000381;100.0 +25/10/2020 02:06:26;U169.TI74_PV.F_CV;16.299999237;100.0 +25/10/2020 02:06:27;U169.TI74_PV.F_CV;16.500000000;100.0 +25/10/2020 02:06:28;U169.TI74_PV.F_CV;16.299999237;100.0 +25/10/2020 02:06:29;U169.TI74_PV.F_CV;16.399999619;100.0 +25/10/2020 02:06:30;U169.TI74_PV.F_CV;16.600000381;100.0 +25/10/2020 02:06:33;U169.TI74_PV.F_CV;16.000000000;100.0 +25/10/2020 02:06:34;U169.TI74_PV.F_CV;16.200000763;100.0 +25/10/2020 02:06:35;U169.TI74_PV.F_CV;16.299999237;100.0 +25/10/2020 02:06:36;U169.TI74_PV.F_CV;16.500000000;100.0 +25/10/2020 02:06:37;U169.TI74_PV.F_CV;16.100000381;100.0 +25/10/2020 02:06:38;U169.TI74_PV.F_CV;16.299999237;100.0 +25/10/2020 02:06:40;U169.TI74_PV.F_CV;16.100000381;100.0 +25/10/2020 02:06:42;U169.TI74_PV.F_CV;16.399999619;100.0 +25/10/2020 02:06:43;U169.TI74_PV.F_CV;16.200000763;100.0 +25/10/2020 02:06:44;U169.TI74_PV.F_CV;16.299999237;100.0 +25/10/2020 02:06:47;U169.TI74_PV.F_CV;16.100000381;100.0 +25/10/2020 02:06:48;U169.TI74_PV.F_CV;16.399999619;100.0 +25/10/2020 02:06:49;U169.TI74_PV.F_CV;16.200000763;100.0 +25/10/2020 02:06:50;U169.TI74_PV.F_CV;16.600000381;100.0 +25/10/2020 02:06:51;U169.TI74_PV.F_CV;16.299999237;100.0 +25/10/2020 02:06:52;U169.TI74_PV.F_CV;16.100000381;100.0 +25/10/2020 02:06:53;U169.TI74_PV.F_CV;16.200000763;100.0 +25/10/2020 02:06:55;U169.TI74_PV.F_CV;16.000000000;100.0 +25/10/2020 02:06:56;U169.TI74_PV.F_CV;16.399999619;100.0 +25/10/2020 02:06:58;U169.TI74_PV.F_CV;16.299999237;100.0 +25/10/2020 02:06:59;U169.TI74_PV.F_CV;16.500000000;100.0 +25/10/2020 02:06:41;U169.TI75_PV.F_CV;33.799999237;100.0 +25/10/2020 02:06:42;U169.TI75_PV.F_CV;33.900001526;100.0 +25/10/2020 02:06:48;U169.TI75_PV.F_CV;33.799999237;100.0 +25/10/2020 02:06:56;U169.TI75_PV.F_CV;33.900001526;100.0 +25/10/2020 02:06:58;U169.TI75_PV.F_CV;33.700000763;100.0 +25/10/2020 02:06:00;U169.TI76_PV.F_CV;20.799999237;100.0 +25/10/2020 02:06:02;U169.TI76_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:03;U169.TI76_PV.F_CV;20.799999237;100.0 +25/10/2020 02:06:04;U169.TI76_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:05;U169.TI76_PV.F_CV;20.799999237;100.0 +25/10/2020 02:06:06;U169.TI76_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:09;U169.TI76_PV.F_CV;20.799999237;100.0 +25/10/2020 02:06:11;U169.TI76_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:13;U169.TI76_PV.F_CV;20.799999237;100.0 +25/10/2020 02:06:14;U169.TI76_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:15;U169.TI76_PV.F_CV;20.799999237;100.0 +25/10/2020 02:06:17;U169.TI76_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:18;U169.TI76_PV.F_CV;20.799999237;100.0 +25/10/2020 02:06:20;U169.TI76_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:21;U169.TI76_PV.F_CV;20.799999237;100.0 +25/10/2020 02:06:24;U169.TI76_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:26;U169.TI76_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:27;U169.TI76_PV.F_CV;20.799999237;100.0 +25/10/2020 02:06:31;U169.TI76_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:32;U169.TI76_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:33;U169.TI76_PV.F_CV;20.799999237;100.0 +25/10/2020 02:06:35;U169.TI76_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:36;U169.TI76_PV.F_CV;20.799999237;100.0 +25/10/2020 02:06:39;U169.TI76_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:42;U169.TI76_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:44;U169.TI76_PV.F_CV;20.799999237;100.0 +25/10/2020 02:06:45;U169.TI76_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:46;U169.TI76_PV.F_CV;20.799999237;100.0 +25/10/2020 02:06:56;U169.TI76_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:57;U169.TI76_PV.F_CV;20.799999237;100.0 +25/10/2020 02:06:04;U169.TI80_PV.F_CV;28.799999237;100.0 +25/10/2020 02:06:09;U169.TI80_PV.F_CV;29.000000000;100.0 +25/10/2020 02:06:11;U169.TI80_PV.F_CV;28.899999619;100.0 +25/10/2020 02:06:16;U169.TI80_PV.F_CV;29.000000000;100.0 +25/10/2020 02:06:17;U169.TI80_PV.F_CV;28.899999619;100.0 +25/10/2020 02:06:38;U169.TI80_PV.F_CV;29.000000000;100.0 +25/10/2020 02:06:39;U169.TI80_PV.F_CV;28.899999619;100.0 +25/10/2020 02:06:48;U169.TI80_PV.F_CV;29.000000000;100.0 +25/10/2020 02:06:49;U169.TI80_PV.F_CV;28.899999619;100.0 +25/10/2020 02:06:54;U169.TI80_PV.F_CV;29.000000000;100.0 +25/10/2020 02:06:55;U169.TI80_PV.F_CV;28.899999619;100.0 +25/10/2020 02:06:56;U169.TI80_PV.F_CV;29.000000000;100.0 +25/10/2020 02:06:57;U169.TI80_PV.F_CV;28.899999619;100.0 +25/10/2020 02:06:58;U169.TI80_PV.F_CV;29.000000000;100.0 +25/10/2020 02:06:59;U169.TI80_PV.F_CV;28.899999619;100.0 +25/10/2020 02:06:00;U169.TI81_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:07;U169.TI81_PV.F_CV;19.399999619;100.0 +25/10/2020 02:06:08;U169.TI81_PV.F_CV;19.500000000;100.0 +25/10/2020 02:06:09;U169.TI81_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:14;U169.TI81_PV.F_CV;19.399999619;100.0 +25/10/2020 02:06:15;U169.TI81_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:16;U169.TI81_PV.F_CV;19.399999619;100.0 +25/10/2020 02:06:17;U169.TI81_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:23;U169.TI81_PV.F_CV;19.500000000;100.0 +25/10/2020 02:06:26;U169.TI81_PV.F_CV;19.200000763;100.0 +25/10/2020 02:06:27;U169.TI81_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:31;U169.TI81_PV.F_CV;19.399999619;100.0 +25/10/2020 02:06:33;U169.TI81_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:36;U169.TI81_PV.F_CV;19.500000000;100.0 +25/10/2020 02:06:37;U169.TI81_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:39;U169.TI81_PV.F_CV;19.399999619;100.0 +25/10/2020 02:06:40;U169.TI81_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:45;U169.TI81_PV.F_CV;19.399999619;100.0 +25/10/2020 02:06:48;U169.TI81_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:51;U169.TI81_PV.F_CV;19.500000000;100.0 +25/10/2020 02:06:52;U169.TI81_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:04;U169.TI90_PV.F_CV;43.099998474;100.0 +25/10/2020 02:06:05;U169.TI90_PV.F_CV;43.200000763;100.0 +25/10/2020 02:06:07;U169.TI90_PV.F_CV;43.099998474;100.0 +25/10/2020 02:06:08;U169.TI90_PV.F_CV;43.200000763;100.0 +25/10/2020 02:06:09;U169.TI90_PV.F_CV;43.099998474;100.0 +25/10/2020 02:06:44;U169.TI90_PV.F_CV;43.200000763;100.0 +25/10/2020 02:06:45;U169.TI90_PV.F_CV;43.099998474;100.0 +25/10/2020 02:06:47;U169.TI90_PV.F_CV;43.200000763;100.0 +25/10/2020 02:06:48;U169.TI90_PV.F_CV;43.099998474;100.0 +25/10/2020 02:06:00;U169.TI91_PV.F_CV;19.899999619;100.0 +25/10/2020 02:06:01;U169.TI91_PV.F_CV;22.000000000;100.0 +25/10/2020 02:06:02;U169.TI91_PV.F_CV;19.000000000;100.0 +25/10/2020 02:06:03;U169.TI91_PV.F_CV;19.899999619;100.0 +25/10/2020 02:06:04;U169.TI91_PV.F_CV;19.200000763;100.0 +25/10/2020 02:06:05;U169.TI91_PV.F_CV;19.100000381;100.0 +25/10/2020 02:06:06;U169.TI91_PV.F_CV;19.899999619;100.0 +25/10/2020 02:06:07;U169.TI91_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:08;U169.TI91_PV.F_CV;19.399999619;100.0 +25/10/2020 02:06:10;U169.TI91_PV.F_CV;19.100000381;100.0 +25/10/2020 02:06:11;U169.TI91_PV.F_CV;18.500000000;100.0 +25/10/2020 02:06:12;U169.TI91_PV.F_CV;20.600000381;100.0 +25/10/2020 02:06:13;U169.TI91_PV.F_CV;22.500000000;100.0 +25/10/2020 02:06:14;U169.TI91_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:15;U169.TI91_PV.F_CV;18.399999619;100.0 +25/10/2020 02:06:16;U169.TI91_PV.F_CV;19.399999619;100.0 +25/10/2020 02:06:17;U169.TI91_PV.F_CV;16.799999237;100.0 +25/10/2020 02:06:18;U169.TI91_PV.F_CV;20.100000381;100.0 +25/10/2020 02:06:19;U169.TI91_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:20;U169.TI91_PV.F_CV;19.700000763;100.0 +25/10/2020 02:06:21;U169.TI91_PV.F_CV;19.100000381;100.0 +25/10/2020 02:06:22;U169.TI91_PV.F_CV;19.500000000;100.0 +25/10/2020 02:06:23;U169.TI91_PV.F_CV;19.700000763;100.0 +25/10/2020 02:06:24;U169.TI91_PV.F_CV;19.100000381;100.0 +25/10/2020 02:06:25;U169.TI91_PV.F_CV;18.799999237;100.0 +25/10/2020 02:06:27;U169.TI91_PV.F_CV;19.700000763;100.0 +25/10/2020 02:06:28;U169.TI91_PV.F_CV;19.200000763;100.0 +25/10/2020 02:06:29;U169.TI91_PV.F_CV;19.100000381;100.0 +25/10/2020 02:06:30;U169.TI91_PV.F_CV;19.899999619;100.0 +25/10/2020 02:06:31;U169.TI91_PV.F_CV;16.600000381;100.0 +25/10/2020 02:06:32;U169.TI91_PV.F_CV;19.600000381;100.0 +25/10/2020 02:06:33;U169.TI91_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:34;U169.TI91_PV.F_CV;19.100000381;100.0 +25/10/2020 02:06:35;U169.TI91_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:36;U169.TI91_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:37;U169.TI91_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:38;U169.TI91_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:39;U169.TI91_PV.F_CV;22.600000381;100.0 +25/10/2020 02:06:40;U169.TI91_PV.F_CV;19.399999619;100.0 +25/10/2020 02:06:41;U169.TI91_PV.F_CV;19.799999237;100.0 +25/10/2020 02:06:42;U169.TI91_PV.F_CV;19.100000381;100.0 +25/10/2020 02:06:43;U169.TI91_PV.F_CV;18.799999237;100.0 +25/10/2020 02:06:44;U169.TI91_PV.F_CV;21.600000381;100.0 +25/10/2020 02:06:45;U169.TI91_PV.F_CV;15.500000000;100.0 +25/10/2020 02:06:46;U169.TI91_PV.F_CV;19.700000763;100.0 +25/10/2020 02:06:47;U169.TI91_PV.F_CV;20.000000000;100.0 +25/10/2020 02:06:48;U169.TI91_PV.F_CV;19.100000381;100.0 +25/10/2020 02:06:49;U169.TI91_PV.F_CV;18.600000381;100.0 +25/10/2020 02:06:50;U169.TI91_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:51;U169.TI91_PV.F_CV;19.500000000;100.0 +25/10/2020 02:06:52;U169.TI91_PV.F_CV;19.100000381;100.0 +25/10/2020 02:06:53;U169.TI91_PV.F_CV;15.800000191;100.0 +25/10/2020 02:06:54;U169.TI91_PV.F_CV;22.700000763;100.0 +25/10/2020 02:06:55;U169.TI91_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:56;U169.TI91_PV.F_CV;21.299999237;100.0 +25/10/2020 02:06:57;U169.TI91_PV.F_CV;19.399999619;100.0 +25/10/2020 02:06:58;U169.TI91_PV.F_CV;19.200000763;100.0 +25/10/2020 02:06:59;U169.TI91_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:32;U169.WI01_PV.F_CV;0.349999994;100.0 +25/10/2020 02:06:12;U169.WI02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U169.WI03_PV.F_CV;4.369999886;100.0 +25/10/2020 02:06:02;U169.ZY20_PV.F_CV;5.580873966;100.0 +25/10/2020 02:06:03;U169.ZY20_PV.F_CV;5.523003578;100.0 +25/10/2020 02:06:09;U169.ZY20_PV.F_CV;5.667679310;100.0 +25/10/2020 02:06:10;U169.ZY20_PV.F_CV;5.544704914;100.0 +25/10/2020 02:06:44;U169.ZY20_PV.F_CV;5.645977974;100.0 +25/10/2020 02:06:45;U169.ZY20_PV.F_CV;5.537471294;100.0 +25/10/2020 02:06:32;U204.FC02CALC.F_CV;12.825349808;100.0 +25/10/2020 02:06:33;U204.FC02CALC.F_CV;13.343110085;100.0 +25/10/2020 02:06:11;U204.FC103_OP.F_CV;49.217201233;100.0 +25/10/2020 02:06:14;U204.FC103_OP.F_CV;49.339275360;100.0 +25/10/2020 02:06:20;U204.FC103_OP.F_CV;49.339275360;100.0 +25/10/2020 02:06:21;U204.FC103_OP.F_CV;49.559005737;100.0 +25/10/2020 02:06:30;U204.FC103_OP.F_CV;49.754325867;100.0 +25/10/2020 02:06:35;U204.FC103_OP.F_CV;49.949645996;100.0 +25/10/2020 02:06:38;U204.FC103_OP.F_CV;49.851985931;100.0 +25/10/2020 02:06:42;U204.FC103_OP.F_CV;49.925228119;100.0 +25/10/2020 02:06:51;U204.FC103_OP.F_CV;49.705497742;100.0 +25/10/2020 02:06:56;U204.FC103_OP.F_CV;49.559005737;100.0 +25/10/2020 02:06:02;U204.FC103_PV.F_CV;263.263580322;100.0 +25/10/2020 02:06:14;U204.FC103_PV.F_CV;263.767425537;100.0 +25/10/2020 02:06:41;U204.FC103_PV.F_CV;262.613983154;100.0 +25/10/2020 02:06:20;U204.FC103_SP.F_CV;400.000000000;100.0 +25/10/2020 02:06:02;U204.FI03A.F_CV;263.263580322;100.0 +25/10/2020 02:06:14;U204.FI03A.F_CV;263.767425537;100.0 +25/10/2020 02:06:41;U204.FI03A.F_CV;262.613983154;100.0 +25/10/2020 02:06:01;U204.FI03B.F_CV;284.096160889;100.0 +25/10/2020 02:06:07;U204.FI03B.F_CV;281.897369385;100.0 +25/10/2020 02:06:12;U204.FI03B.F_CV;280.584930420;100.0 +25/10/2020 02:06:26;U204.FI03B.F_CV;277.254608154;100.0 +25/10/2020 02:06:33;U204.FI03B.F_CV;274.386779785;100.0 +25/10/2020 02:06:36;U204.FI03B.F_CV;272.506317139;100.0 +25/10/2020 02:06:37;U204.FI03B.F_CV;270.879913330;100.0 +25/10/2020 02:06:38;U204.FI03B.F_CV;267.293731689;100.0 +25/10/2020 02:06:41;U204.FI03B.F_CV;264.266143799;100.0 +25/10/2020 02:06:42;U204.FI03B.F_CV;262.798156738;100.0 +25/10/2020 02:06:46;U204.FI03B.F_CV;259.368621826;100.0 +25/10/2020 02:06:50;U204.FI03B.F_CV;258.003723145;100.0 +25/10/2020 02:06:20;U204.U024_COEF_A_FI02.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U204.U204_AI01.F_CV;0.834172428;100.0 +25/10/2020 02:06:20;U204.U204_AI03.F_CV;0.830394506;100.0 +25/10/2020 02:06:20;U204.U204_COEF_A_FI03.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U204.U204_COEF_A_FI11.F_CV;1.151499987;100.0 +25/10/2020 02:06:20;U204.U204_COEF_A_FI14.F_CV;0.927999973;100.0 +25/10/2020 02:06:20;U204.U204_COEF_A_FI17.F_CV;0.999499977;100.0 +25/10/2020 02:06:20;U204.U204_COEF_A_FQ08.F_CV;1.052299976;100.0 +25/10/2020 02:06:20;U204.U204_COEF_A_FQ13.F_CV;1.028100014;100.0 +25/10/2020 02:06:20;U204.U204_COEF_A_TI02.F_CV;0.995500028;100.0 +25/10/2020 02:06:20;U204.U204_COEF_A_TI03.F_CV;0.995800018;100.0 +25/10/2020 02:06:20;U204.U204_COEF_A_TI04.F_CV;0.994300008;100.0 +25/10/2020 02:06:20;U204.U204_COEF_A_TI05.F_CV;0.994300008;100.0 +25/10/2020 02:06:20;U204.U204_COEF_A_TI06.F_CV;0.993200004;100.0 +25/10/2020 02:06:20;U204.U204_COEF_A_TI07.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U204.U204_COEF_A_TI22.F_CV;0.985899985;100.0 +25/10/2020 02:06:20;U204.U204_COEF_A_TI23.F_CV;0.987299979;100.0 +25/10/2020 02:06:20;U204.U204_COEF_A_TI24.F_CV;0.985800028;100.0 +25/10/2020 02:06:20;U204.U204_COEF_A_TI25.F_CV;0.985099971;100.0 +25/10/2020 02:06:20;U204.U204_COEF_A_TI26.F_CV;0.994000018;100.0 +25/10/2020 02:06:20;U204.U204_COEF_A_TI27.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U204.U204_COEF_B_FI02.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U204.U204_COEF_B_FI03.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U204.U204_COEF_B_FI11.F_CV;0.557799995;100.0 +25/10/2020 02:06:20;U204.U204_COEF_B_FI14.F_CV;1.115399957;100.0 +25/10/2020 02:06:20;U204.U204_COEF_B_FI17.F_CV;-1.386000037;100.0 +25/10/2020 02:06:20;U204.U204_COEF_B_TI02.F_CV;0.139200002;100.0 +25/10/2020 02:06:20;U204.U204_COEF_B_TI03.F_CV;0.022500001;100.0 +25/10/2020 02:06:20;U204.U204_COEF_B_TI04.F_CV;0.706200004;100.0 +25/10/2020 02:06:20;U204.U204_COEF_B_TI05.F_CV;0.503099978;100.0 +25/10/2020 02:06:20;U204.U204_COEF_B_TI06.F_CV;0.603399992;100.0 +25/10/2020 02:06:20;U204.U204_COEF_B_TI07.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U204.U204_COEF_B_TI22.F_CV;4.197000027;100.0 +25/10/2020 02:06:20;U204.U204_COEF_B_TI23.F_CV;3.822499990;100.0 +25/10/2020 02:06:20;U204.U204_COEF_B_TI24.F_CV;4.471899986;100.0 +25/10/2020 02:06:20;U204.U204_COEF_B_TI25.F_CV;4.109899998;100.0 +25/10/2020 02:06:20;U204.U204_COEF_B_TI26.F_CV;0.940699995;100.0 +25/10/2020 02:06:20;U204.U204_COEF_B_TI27.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U204.U204_DT10.F_CV;0.850469410;100.0 +25/10/2020 02:06:42;U204.U204_DT10.F_CV;0.850574076;100.0 +25/10/2020 02:06:51;U204.U204_DT10.F_CV;0.850426257;100.0 +25/10/2020 02:06:15;U204.U204_FC02_OP.F_CV;31.003753662;100.0 +25/10/2020 02:06:44;U204.U204_FC02_OP.F_CV;30.857265472;100.0 +25/10/2020 02:06:45;U204.U204_FC02_PV.F_CV;8.671582222;100.0 +25/10/2020 02:06:20;U204.U204_FC02_SP.F_CV;8.539999962;100.0 +25/10/2020 02:06:11;U204.U204_FC03_OP.F_CV;49.217201233;100.0 +25/10/2020 02:06:18;U204.U204_FC03_OP.F_CV;49.510177612;100.0 +25/10/2020 02:06:25;U204.U204_FC03_OP.F_CV;49.583423615;100.0 +25/10/2020 02:06:28;U204.U204_FC03_OP.F_CV;49.803153992;100.0 +25/10/2020 02:06:34;U204.U204_FC03_OP.F_CV;49.949645996;100.0 +25/10/2020 02:06:36;U204.U204_FC03_OP.F_CV;49.851985931;100.0 +25/10/2020 02:06:41;U204.U204_FC03_OP.F_CV;49.925228119;100.0 +25/10/2020 02:06:51;U204.U204_FC03_OP.F_CV;49.705497742;100.0 +25/10/2020 02:06:54;U204.U204_FC03_OP.F_CV;49.510177612;100.0 +25/10/2020 02:06:00;U204.U204_FC03_PV.F_CV;260.393066406;100.0 +25/10/2020 02:06:18;U204.U204_FC03_PV.F_CV;257.714477539;100.0 +25/10/2020 02:06:21;U204.U204_FC03_PV.F_CV;258.460418701;100.0 +25/10/2020 02:06:28;U204.U204_FC03_PV.F_CV;256.923217773;100.0 +25/10/2020 02:06:30;U204.U204_FC03_PV.F_CV;257.841064453;100.0 +25/10/2020 02:06:49;U204.U204_FC03_PV.F_CV;259.749877930;100.0 +25/10/2020 02:06:54;U204.U204_FC03_PV.F_CV;260.996551514;100.0 +25/10/2020 02:06:58;U204.U204_FC03_PV.F_CV;259.303558350;100.0 +25/10/2020 02:06:20;U204.U204_FC03_SP.F_CV;259.000000000;100.0 +25/10/2020 02:06:20;U204.U204_FC10_OP.F_CV;19.200000763;100.0 +25/10/2020 02:06:20;U204.U204_FC10_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U204.U204_FC10_SP.F_CV;330.000000000;100.0 +25/10/2020 02:06:34;U204.U204_FC110_OP.F_CV;87.719352722;100.0 +25/10/2020 02:06:45;U204.U204_FC110_PV.F_CV;242.474395752;100.0 +25/10/2020 02:06:20;U204.U204_FC110_SP.F_CV;242.399993896;100.0 +25/10/2020 02:06:01;U204.U204_FC11_OP.F_CV;23.899044037;100.0 +25/10/2020 02:06:23;U204.U204_FC11_OP.F_CV;23.996704102;100.0 +25/10/2020 02:06:27;U204.U204_FC11_OP.F_CV;24.118778229;100.0 +25/10/2020 02:06:29;U204.U204_FC11_OP.F_CV;24.192022324;100.0 +25/10/2020 02:06:41;U204.U204_FC11_OP.F_CV;24.362926483;100.0 +25/10/2020 02:06:56;U204.U204_FC11_OP.F_CV;24.265266418;100.0 +25/10/2020 02:06:40;U204.U204_FC11_PV.F_CV;83.749641418;100.0 +25/10/2020 02:06:20;U204.U204_FC11_SP.F_CV;85.000000000;100.0 +25/10/2020 02:06:24;U204.U204_FC14_OP.F_CV;38.010803223;100.0 +25/10/2020 02:06:33;U204.U204_FC14_OP.F_CV;37.913143158;100.0 +25/10/2020 02:06:57;U204.U204_FC14_OP.F_CV;38.108463287;100.0 +25/10/2020 02:06:03;U204.U204_FC14_PV.F_CV;319.580383301;100.0 +25/10/2020 02:06:04;U204.U204_FC14_PV.F_CV;318.951629639;100.0 +25/10/2020 02:06:20;U204.U204_FC14_PV.F_CV;321.329101563;100.0 +25/10/2020 02:06:24;U204.U204_FC14_PV.F_CV;323.074127197;100.0 +25/10/2020 02:06:28;U204.U204_FC14_PV.F_CV;322.460784912;100.0 +25/10/2020 02:06:33;U204.U204_FC14_PV.F_CV;324.274871826;100.0 +25/10/2020 02:06:43;U204.U204_FC14_PV.F_CV;323.196075439;100.0 +25/10/2020 02:06:48;U204.U204_FC14_PV.F_CV;321.529113770;100.0 +25/10/2020 02:06:51;U204.U204_FC14_PV.F_CV;322.179534912;100.0 +25/10/2020 02:06:20;U204.U204_FC14_SP.F_CV;321.000000000;100.0 +25/10/2020 02:06:15;U204.U204_FC17_OP.F_CV;28.562273026;100.0 +25/10/2020 02:06:52;U204.U204_FC17_PV.F_CV;282.075744629;100.0 +25/10/2020 02:06:20;U204.U204_FC17_SP.F_CV;282.000000000;100.0 +25/10/2020 02:06:27;U204.U204_FI07.F_CV;198.748916626;100.0 +25/10/2020 02:06:36;U204.U204_FI07.F_CV;199.276138306;100.0 +25/10/2020 02:06:01;U204.U204_FI08.F_CV;90.855857849;100.0 +25/10/2020 02:06:02;U204.U204_FI08.F_CV;105.207176208;100.0 +25/10/2020 02:06:03;U204.U204_FI08.F_CV;90.238235474;100.0 +25/10/2020 02:06:04;U204.U204_FI08.F_CV;67.440315247;100.0 +25/10/2020 02:06:05;U204.U204_FI08.F_CV;92.131553650;100.0 +25/10/2020 02:06:06;U204.U204_FI08.F_CV;114.674812317;100.0 +25/10/2020 02:06:07;U204.U204_FI08.F_CV;60.065673828;100.0 +25/10/2020 02:06:08;U204.U204_FI08.F_CV;102.629013062;100.0 +25/10/2020 02:06:09;U204.U204_FI08.F_CV;98.517311096;100.0 +25/10/2020 02:06:10;U204.U204_FI08.F_CV;84.058334351;100.0 +25/10/2020 02:06:11;U204.U204_FI08.F_CV;115.971618652;100.0 +25/10/2020 02:06:12;U204.U204_FI08.F_CV;94.896003723;100.0 +25/10/2020 02:06:13;U204.U204_FI08.F_CV;82.948165894;100.0 +25/10/2020 02:06:15;U204.U204_FI08.F_CV;99.886344910;100.0 +25/10/2020 02:06:16;U204.U204_FI08.F_CV;83.066184998;100.0 +25/10/2020 02:06:17;U204.U204_FI08.F_CV;101.983467102;100.0 +25/10/2020 02:06:18;U204.U204_FI08.F_CV;103.319068909;100.0 +25/10/2020 02:06:20;U204.U204_FI08.F_CV;119.427383423;100.0 +25/10/2020 02:06:21;U204.U204_FI08.F_CV;117.167373657;100.0 +25/10/2020 02:06:22;U204.U204_FI08.F_CV;95.616004944;100.0 +25/10/2020 02:06:23;U204.U204_FI08.F_CV;96.823127747;100.0 +25/10/2020 02:06:24;U204.U204_FI08.F_CV;118.244316101;100.0 +25/10/2020 02:06:25;U204.U204_FI08.F_CV;102.977775574;100.0 +25/10/2020 02:06:26;U204.U204_FI08.F_CV;111.829025269;100.0 +25/10/2020 02:06:27;U204.U204_FI08.F_CV;114.225952148;100.0 +25/10/2020 02:06:28;U204.U204_FI08.F_CV;124.693115234;100.0 +25/10/2020 02:06:29;U204.U204_FI08.F_CV;126.358360291;100.0 +25/10/2020 02:06:30;U204.U204_FI08.F_CV;109.254592896;100.0 +25/10/2020 02:06:31;U204.U204_FI08.F_CV;81.758720398;100.0 +25/10/2020 02:06:32;U204.U204_FI08.F_CV;112.890602112;100.0 +25/10/2020 02:06:33;U204.U204_FI08.F_CV;87.381614685;100.0 +25/10/2020 02:06:34;U204.U204_FI08.F_CV;96.217071533;100.0 +25/10/2020 02:06:35;U204.U204_FI08.F_CV;128.843841553;100.0 +25/10/2020 02:06:36;U204.U204_FI08.F_CV;120.846244812;100.0 +25/10/2020 02:06:37;U204.U204_FI08.F_CV;108.518470764;100.0 +25/10/2020 02:06:38;U204.U204_FI08.F_CV;83.310707092;100.0 +25/10/2020 02:06:39;U204.U204_FI08.F_CV;72.935127258;100.0 +25/10/2020 02:06:40;U204.U204_FI08.F_CV;126.948303223;100.0 +25/10/2020 02:06:41;U204.U204_FI08.F_CV;110.079902649;100.0 +25/10/2020 02:06:42;U204.U204_FI08.F_CV;73.598762512;100.0 +25/10/2020 02:06:43;U204.U204_FI08.F_CV;106.526023865;100.0 +25/10/2020 02:06:44;U204.U204_FI08.F_CV;129.566497803;100.0 +25/10/2020 02:06:45;U204.U204_FI08.F_CV;129.037811279;100.0 +25/10/2020 02:06:47;U204.U204_FI08.F_CV;102.417625427;100.0 +25/10/2020 02:06:48;U204.U204_FI08.F_CV;100.938957214;100.0 +25/10/2020 02:06:49;U204.U204_FI08.F_CV;126.500442505;100.0 +25/10/2020 02:06:50;U204.U204_FI08.F_CV;116.304916382;100.0 +25/10/2020 02:06:51;U204.U204_FI08.F_CV;124.144104004;100.0 +25/10/2020 02:06:52;U204.U204_FI08.F_CV;134.637832642;100.0 +25/10/2020 02:06:53;U204.U204_FI08.F_CV;127.320770264;100.0 +25/10/2020 02:06:54;U204.U204_FI08.F_CV;111.601600647;100.0 +25/10/2020 02:06:55;U204.U204_FI08.F_CV;100.761764526;100.0 +25/10/2020 02:06:56;U204.U204_FI08.F_CV;122.566375732;100.0 +25/10/2020 02:06:57;U204.U204_FI08.F_CV;107.691566467;100.0 +25/10/2020 02:06:58;U204.U204_FI08.F_CV;103.154228210;100.0 +25/10/2020 02:06:59;U204.U204_FI08.F_CV;105.422470093;100.0 +25/10/2020 02:06:00;U204.U204_FI13.F_CV;775.009155273;100.0 +25/10/2020 02:06:01;U204.U204_FI13.F_CV;720.272033691;100.0 +25/10/2020 02:06:02;U204.U204_FI13.F_CV;695.950500488;100.0 +25/10/2020 02:06:03;U204.U204_FI13.F_CV;679.971252441;100.0 +25/10/2020 02:06:04;U204.U204_FI13.F_CV;678.933349609;100.0 +25/10/2020 02:06:05;U204.U204_FI13.F_CV;719.503112793;100.0 +25/10/2020 02:06:06;U204.U204_FI13.F_CV;739.908508301;100.0 +25/10/2020 02:06:07;U204.U204_FI13.F_CV;736.800476074;100.0 +25/10/2020 02:06:08;U204.U204_FI13.F_CV;667.083679199;100.0 +25/10/2020 02:06:09;U204.U204_FI13.F_CV;696.644897461;100.0 +25/10/2020 02:06:10;U204.U204_FI13.F_CV;714.409729004;100.0 +25/10/2020 02:06:11;U204.U204_FI13.F_CV;515.421691895;100.0 +25/10/2020 02:06:12;U204.U204_FI13.F_CV;810.994384766;100.0 +25/10/2020 02:06:13;U204.U204_FI13.F_CV;711.029296875;100.0 +25/10/2020 02:06:14;U204.U204_FI13.F_CV;580.897094727;100.0 +25/10/2020 02:06:15;U204.U204_FI13.F_CV;714.187561035;100.0 +25/10/2020 02:06:16;U204.U204_FI13.F_CV;683.883422852;100.0 +25/10/2020 02:06:17;U204.U204_FI13.F_CV;664.923950195;100.0 +25/10/2020 02:06:18;U204.U204_FI13.F_CV;572.350769043;100.0 +25/10/2020 02:06:19;U204.U204_FI13.F_CV;1007.768066406;100.0 +25/10/2020 02:06:20;U204.U204_FI13.F_CV;1090.165039063;100.0 +25/10/2020 02:06:21;U204.U204_FI13.F_CV;657.005187988;100.0 +25/10/2020 02:06:22;U204.U204_FI13.F_CV;554.455932617;100.0 +25/10/2020 02:06:23;U204.U204_FI13.F_CV;490.440368652;100.0 +25/10/2020 02:06:24;U204.U204_FI13.F_CV;930.990600586;100.0 +25/10/2020 02:06:25;U204.U204_FI13.F_CV;1061.492187500;100.0 +25/10/2020 02:06:26;U204.U204_FI13.F_CV;710.413269043;100.0 +25/10/2020 02:06:27;U204.U204_FI13.F_CV;605.206359863;100.0 +25/10/2020 02:06:29;U204.U204_FI13.F_CV;608.347717285;100.0 +25/10/2020 02:06:30;U204.U204_FI13.F_CV;535.137695313;100.0 +25/10/2020 02:06:32;U204.U204_FI13.F_CV;410.855316162;100.0 +25/10/2020 02:06:33;U204.U204_FI13.F_CV;814.040222168;100.0 +25/10/2020 02:06:34;U204.U204_FI13.F_CV;731.680358887;100.0 +25/10/2020 02:06:35;U204.U204_FI13.F_CV;590.168884277;100.0 +25/10/2020 02:06:36;U204.U204_FI13.F_CV;491.493499756;100.0 +25/10/2020 02:06:37;U204.U204_FI13.F_CV;431.893615723;100.0 +25/10/2020 02:06:38;U204.U204_FI13.F_CV;780.788208008;100.0 +25/10/2020 02:06:39;U204.U204_FI13.F_CV;761.843139648;100.0 +25/10/2020 02:06:40;U204.U204_FI13.F_CV;622.123474121;100.0 +25/10/2020 02:06:41;U204.U204_FI13.F_CV;501.158264160;100.0 +25/10/2020 02:06:42;U204.U204_FI13.F_CV;385.529785156;100.0 +25/10/2020 02:06:43;U204.U204_FI13.F_CV;379.143615723;100.0 +25/10/2020 02:06:44;U204.U204_FI13.F_CV;508.172546387;100.0 +25/10/2020 02:06:45;U204.U204_FI13.F_CV;542.435729980;100.0 +25/10/2020 02:06:46;U204.U204_FI13.F_CV;484.206298828;100.0 +25/10/2020 02:06:47;U204.U204_FI13.F_CV;449.098419189;100.0 +25/10/2020 02:06:48;U204.U204_FI13.F_CV;392.970977783;100.0 +25/10/2020 02:06:49;U204.U204_FI13.F_CV;694.405273438;100.0 +25/10/2020 02:06:50;U204.U204_FI13.F_CV;522.248535156;100.0 +25/10/2020 02:06:51;U204.U204_FI13.F_CV;509.192260742;100.0 +25/10/2020 02:06:52;U204.U204_FI13.F_CV;493.831115723;100.0 +25/10/2020 02:06:53;U204.U204_FI13.F_CV;457.400512695;100.0 +25/10/2020 02:06:54;U204.U204_FI13.F_CV;494.679534912;100.0 +25/10/2020 02:06:55;U204.U204_FI13.F_CV;518.039062500;100.0 +25/10/2020 02:06:56;U204.U204_FI13.F_CV;530.111877441;100.0 +25/10/2020 02:06:57;U204.U204_FI13.F_CV;501.758300781;100.0 +25/10/2020 02:06:58;U204.U204_FI13.F_CV;480.158935547;100.0 +25/10/2020 02:06:59;U204.U204_FI13.F_CV;474.987792969;100.0 +25/10/2020 02:06:00;U204.U204_FQ08.F_CV;95591.062500000;100.0 +25/10/2020 02:06:00;U204.U204_FQ13.F_CV;470362.593750000;100.0 +25/10/2020 02:06:02;U204.U204_LC04_OP.F_CV;89.233070374;100.0 +25/10/2020 02:06:03;U204.U204_LC04_OP.F_CV;88.329719543;100.0 +25/10/2020 02:06:09;U204.U204_LC04_OP.F_CV;88.329719543;100.0 +25/10/2020 02:06:10;U204.U204_LC04_OP.F_CV;87.719352722;100.0 +25/10/2020 02:06:17;U204.U204_LC04_OP.F_CV;87.719352722;100.0 +25/10/2020 02:06:18;U204.U204_LC04_OP.F_CV;87.035736084;100.0 +25/10/2020 02:06:26;U204.U204_LC04_OP.F_CV;87.231056213;100.0 +25/10/2020 02:06:33;U204.U204_LC04_OP.F_CV;87.231056213;100.0 +25/10/2020 02:06:34;U204.U204_LC04_OP.F_CV;87.939086914;100.0 +25/10/2020 02:06:40;U204.U204_LC04_OP.F_CV;87.939086914;100.0 +25/10/2020 02:06:41;U204.U204_LC04_OP.F_CV;88.622695923;100.0 +25/10/2020 02:06:49;U204.U204_LC04_OP.F_CV;88.622695923;100.0 +25/10/2020 02:06:50;U204.U204_LC04_OP.F_CV;89.184242249;100.0 +25/10/2020 02:06:56;U204.U204_LC04_OP.F_CV;89.184242249;100.0 +25/10/2020 02:06:57;U204.U204_LC04_OP.F_CV;89.526046753;100.0 +25/10/2020 02:06:19;U204.U204_LC04_PV.F_CV;19.713663101;100.0 +25/10/2020 02:06:53;U204.U204_LC04_PV.F_CV;20.213155746;100.0 +25/10/2020 02:06:20;U204.U204_LC04_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:03;U204.U204_LC05_OP.F_CV;3.878902435;100.0 +25/10/2020 02:06:08;U204.U204_LC05_OP.F_CV;4.196295261;100.0 +25/10/2020 02:06:15;U204.U204_LC05_OP.F_CV;4.538102150;100.0 +25/10/2020 02:06:20;U204.U204_LC05_OP.F_CV;4.855494976;100.0 +25/10/2020 02:06:27;U204.U204_LC05_OP.F_CV;5.001983643;100.0 +25/10/2020 02:06:30;U204.U204_LC05_OP.F_CV;4.904324532;100.0 +25/10/2020 02:06:32;U204.U204_LC05_OP.F_CV;4.611346722;100.0 +25/10/2020 02:06:36;U204.U204_LC05_OP.F_CV;4.538102150;100.0 +25/10/2020 02:06:39;U204.U204_LC05_OP.F_CV;4.220709801;100.0 +25/10/2020 02:06:51;U204.U204_LC05_OP.F_CV;3.830072880;100.0 +25/10/2020 02:06:57;U204.U204_LC05_OP.F_CV;3.756828547;100.0 +25/10/2020 02:06:15;U204.U204_LC05_PV.F_CV;40.194305420;100.0 +25/10/2020 02:06:17;U204.U204_LC05_PV.F_CV;40.244987488;100.0 +25/10/2020 02:06:38;U204.U204_LC05_PV.F_CV;40.025379181;100.0 +25/10/2020 02:06:39;U204.U204_LC05_PV.F_CV;39.921405792;100.0 +25/10/2020 02:06:47;U204.U204_LC05_PV.F_CV;39.853023529;100.0 +25/10/2020 02:06:20;U204.U204_LC05_SP.F_CV;40.000000000;100.0 +25/10/2020 02:06:00;U204.U204_LC07_OP.F_CV;29.001739502;100.0 +25/10/2020 02:06:01;U204.U204_LC07_OP.F_CV;26.682332993;100.0 +25/10/2020 02:06:07;U204.U204_LC07_OP.F_CV;26.682332993;100.0 +25/10/2020 02:06:08;U204.U204_LC07_OP.F_CV;25.510421753;100.0 +25/10/2020 02:06:15;U204.U204_LC07_OP.F_CV;25.510421753;100.0 +25/10/2020 02:06:16;U204.U204_LC07_OP.F_CV;25.022125244;100.0 +25/10/2020 02:06:23;U204.U204_LC07_OP.F_CV;25.022125244;100.0 +25/10/2020 02:06:24;U204.U204_LC07_OP.F_CV;24.118778229;100.0 +25/10/2020 02:06:31;U204.U204_LC07_OP.F_CV;24.118778229;100.0 +25/10/2020 02:06:32;U204.U204_LC07_OP.F_CV;24.802392960;100.0 +25/10/2020 02:06:38;U204.U204_LC07_OP.F_CV;24.802392960;100.0 +25/10/2020 02:06:39;U204.U204_LC07_OP.F_CV;27.463605881;100.0 +25/10/2020 02:06:47;U204.U204_LC07_OP.F_CV;27.463605881;100.0 +25/10/2020 02:06:48;U204.U204_LC07_OP.F_CV;30.246894836;100.0 +25/10/2020 02:06:54;U204.U204_LC07_OP.F_CV;30.246894836;100.0 +25/10/2020 02:06:55;U204.U204_LC07_OP.F_CV;31.931516647;100.0 +25/10/2020 02:06:02;U204.U204_LC07_PV.F_CV;58.914680481;100.0 +25/10/2020 02:06:07;U204.U204_LC07_PV.F_CV;58.227588654;100.0 +25/10/2020 02:06:10;U204.U204_LC07_PV.F_CV;57.937187195;100.0 +25/10/2020 02:06:11;U204.U204_LC07_PV.F_CV;57.990394592;100.0 +25/10/2020 02:06:15;U204.U204_LC07_PV.F_CV;57.886154175;100.0 +25/10/2020 02:06:16;U204.U204_LC07_PV.F_CV;57.986999512;100.0 +25/10/2020 02:06:17;U204.U204_LC07_PV.F_CV;57.725555420;100.0 +25/10/2020 02:06:23;U204.U204_LC07_PV.F_CV;57.542682648;100.0 +25/10/2020 02:06:26;U204.U204_LC07_PV.F_CV;57.871776581;100.0 +25/10/2020 02:06:27;U204.U204_LC07_PV.F_CV;57.429252625;100.0 +25/10/2020 02:06:33;U204.U204_LC07_PV.F_CV;58.140518188;100.0 +25/10/2020 02:06:35;U204.U204_LC07_PV.F_CV;58.823825836;100.0 +25/10/2020 02:06:37;U204.U204_LC07_PV.F_CV;58.712162018;100.0 +25/10/2020 02:06:38;U204.U204_LC07_PV.F_CV;59.226913452;100.0 +25/10/2020 02:06:40;U204.U204_LC07_PV.F_CV;59.989295959;100.0 +25/10/2020 02:06:42;U204.U204_LC07_PV.F_CV;60.186798096;100.0 +25/10/2020 02:06:43;U204.U204_LC07_PV.F_CV;60.028266907;100.0 +25/10/2020 02:06:47;U204.U204_LC07_PV.F_CV;60.622852325;100.0 +25/10/2020 02:06:49;U204.U204_LC07_PV.F_CV;61.199440002;100.0 +25/10/2020 02:06:50;U204.U204_LC07_PV.F_CV;60.919792175;100.0 +25/10/2020 02:06:52;U204.U204_LC07_PV.F_CV;61.402439117;100.0 +25/10/2020 02:06:53;U204.U204_LC07_PV.F_CV;61.229698181;100.0 +25/10/2020 02:06:55;U204.U204_LC07_PV.F_CV;61.454917908;100.0 +25/10/2020 02:06:58;U204.U204_LC07_PV.F_CV;61.625659943;100.0 +25/10/2020 02:06:20;U204.U204_LC07_SP.F_CV;60.000000000;100.0 +25/10/2020 02:06:00;U204.U204_LC12_OP.F_CV;46.897792816;100.0 +25/10/2020 02:06:01;U204.U204_LC12_OP.F_CV;45.652637482;100.0 +25/10/2020 02:06:02;U204.U204_LC12_OP.F_CV;49.900814056;100.0 +25/10/2020 02:06:03;U204.U204_LC12_OP.F_CV;47.361675262;100.0 +25/10/2020 02:06:04;U204.U204_LC12_OP.F_CV;49.021881104;100.0 +25/10/2020 02:06:05;U204.U204_LC12_OP.F_CV;47.532577515;100.0 +25/10/2020 02:06:06;U204.U204_LC12_OP.F_CV;49.925228119;100.0 +25/10/2020 02:06:07;U204.U204_LC12_OP.F_CV;48.265022278;100.0 +25/10/2020 02:06:08;U204.U204_LC12_OP.F_CV;50.340282440;100.0 +25/10/2020 02:06:09;U204.U204_LC12_OP.F_CV;51.219215393;100.0 +25/10/2020 02:06:10;U204.U204_LC12_OP.F_CV;49.412517548;100.0 +25/10/2020 02:06:11;U204.U204_LC12_OP.F_CV;48.802146912;100.0 +25/10/2020 02:06:12;U204.U204_LC12_OP.F_CV;52.635272980;100.0 +25/10/2020 02:06:13;U204.U204_LC12_OP.F_CV;50.047302246;100.0 +25/10/2020 02:06:14;U204.U204_LC12_OP.F_CV;51.561019897;100.0 +25/10/2020 02:06:15;U204.U204_LC12_OP.F_CV;50.071720123;100.0 +25/10/2020 02:06:16;U204.U204_LC12_OP.F_CV;51.707511902;100.0 +25/10/2020 02:06:17;U204.U204_LC12_OP.F_CV;50.828578949;100.0 +25/10/2020 02:06:19;U204.U204_LC12_OP.F_CV;49.998474121;100.0 +25/10/2020 02:06:20;U204.U204_LC12_OP.F_CV;50.291450500;100.0 +25/10/2020 02:06:21;U204.U204_LC12_OP.F_CV;48.777732849;100.0 +25/10/2020 02:06:22;U204.U204_LC12_OP.F_CV;49.632251740;100.0 +25/10/2020 02:06:23;U204.U204_LC12_OP.F_CV;49.388103485;100.0 +25/10/2020 02:06:25;U204.U204_LC12_OP.F_CV;49.754325867;100.0 +25/10/2020 02:06:26;U204.U204_LC12_OP.F_CV;44.187747955;100.0 +25/10/2020 02:06:27;U204.U204_LC12_OP.F_CV;47.141941071;100.0 +25/10/2020 02:06:28;U204.U204_LC12_OP.F_CV;45.139926910;100.0 +25/10/2020 02:06:29;U204.U204_LC12_OP.F_CV;46.995452881;100.0 +25/10/2020 02:06:30;U204.U204_LC12_OP.F_CV;47.630237579;100.0 +25/10/2020 02:06:31;U204.U204_LC12_OP.F_CV;46.800132751;100.0 +25/10/2020 02:06:32;U204.U204_LC12_OP.F_CV;47.410503387;100.0 +25/10/2020 02:06:33;U204.U204_LC12_OP.F_CV;45.896785736;100.0 +25/10/2020 02:06:34;U204.U204_LC12_OP.F_CV;46.824550629;100.0 +25/10/2020 02:06:35;U204.U204_LC12_OP.F_CV;44.163333893;100.0 +25/10/2020 02:06:36;U204.U204_LC12_OP.F_CV;45.725883484;100.0 +25/10/2020 02:06:37;U204.U204_LC12_OP.F_CV;46.263008118;100.0 +25/10/2020 02:06:38;U204.U204_LC12_OP.F_CV;48.509170532;100.0 +25/10/2020 02:06:40;U204.U204_LC12_OP.F_CV;46.604816437;100.0 +25/10/2020 02:06:41;U204.U204_LC12_OP.F_CV;46.702476501;100.0 +25/10/2020 02:06:42;U204.U204_LC12_OP.F_CV;42.063659668;100.0 +25/10/2020 02:06:43;U204.U204_LC12_OP.F_CV;44.334239960;100.0 +25/10/2020 02:06:44;U204.U204_LC12_OP.F_CV;46.995452881;100.0 +25/10/2020 02:06:45;U204.U204_LC12_OP.F_CV;48.826564789;100.0 +25/10/2020 02:06:46;U204.U204_LC12_OP.F_CV;47.361675262;100.0 +25/10/2020 02:06:48;U204.U204_LC12_OP.F_CV;46.848964691;100.0 +25/10/2020 02:06:49;U204.U204_LC12_OP.F_CV;47.190773010;100.0 +25/10/2020 02:06:50;U204.U204_LC12_OP.F_CV;46.702476501;100.0 +25/10/2020 02:06:51;U204.U204_LC12_OP.F_CV;46.482742310;100.0 +25/10/2020 02:06:53;U204.U204_LC12_OP.F_CV;47.508163452;100.0 +25/10/2020 02:06:54;U204.U204_LC12_OP.F_CV;46.971038818;100.0 +25/10/2020 02:06:55;U204.U204_LC12_OP.F_CV;52.488784790;100.0 +25/10/2020 02:06:56;U204.U204_LC12_OP.F_CV;49.656665802;100.0 +25/10/2020 02:06:57;U204.U204_LC12_OP.F_CV;53.221229553;100.0 +25/10/2020 02:06:58;U204.U204_LC12_OP.F_CV;50.486770630;100.0 +25/10/2020 02:06:59;U204.U204_LC12_OP.F_CV;53.685108185;100.0 +25/10/2020 02:06:02;U204.U204_LC12_PV.F_CV;59.158252716;100.0 +25/10/2020 02:06:04;U204.U204_LC12_PV.F_CV;59.474384308;100.0 +25/10/2020 02:06:08;U204.U204_LC12_PV.F_CV;59.810142517;100.0 +25/10/2020 02:06:09;U204.U204_LC12_PV.F_CV;59.995586395;100.0 +25/10/2020 02:06:16;U204.U204_LC12_PV.F_CV;60.501281738;100.0 +25/10/2020 02:06:24;U204.U204_LC12_PV.F_CV;60.348979950;100.0 +25/10/2020 02:06:26;U204.U204_LC12_PV.F_CV;59.999622345;100.0 +25/10/2020 02:06:28;U204.U204_LC12_PV.F_CV;59.814739227;100.0 +25/10/2020 02:06:33;U204.U204_LC12_PV.F_CV;59.603118896;100.0 +25/10/2020 02:06:35;U204.U204_LC12_PV.F_CV;59.417278290;100.0 +25/10/2020 02:06:38;U204.U204_LC12_PV.F_CV;59.531349182;100.0 +25/10/2020 02:06:42;U204.U204_LC12_PV.F_CV;59.209190369;100.0 +25/10/2020 02:06:44;U204.U204_LC12_PV.F_CV;59.320747375;100.0 +25/10/2020 02:06:45;U204.U204_LC12_PV.F_CV;59.482158661;100.0 +25/10/2020 02:06:53;U204.U204_LC12_PV.F_CV;59.613311768;100.0 +25/10/2020 02:06:57;U204.U204_LC12_PV.F_CV;60.239749908;100.0 +25/10/2020 02:06:20;U204.U204_LC12_SP.F_CV;60.000000000;100.0 +25/10/2020 02:06:58;U204.U204_LI02.F_CV;37.633522034;100.0 +25/10/2020 02:06:02;U204.U204_LI03.F_CV;12.101745605;100.0 +25/10/2020 02:06:03;U204.U204_LI03.F_CV;12.256248474;100.0 +25/10/2020 02:06:05;U204.U204_LI03.F_CV;12.005600929;100.0 +25/10/2020 02:06:11;U204.U204_LI03.F_CV;12.005600929;100.0 +25/10/2020 02:06:12;U204.U204_LI03.F_CV;12.267794609;100.0 +25/10/2020 02:06:17;U204.U204_LI03.F_CV;11.998353004;100.0 +25/10/2020 02:06:18;U204.U204_LI03.F_CV;12.082943916;100.0 +25/10/2020 02:06:20;U204.U204_LI03.F_CV;12.004620552;100.0 +25/10/2020 02:06:22;U204.U204_LI03.F_CV;12.183202744;100.0 +25/10/2020 02:06:24;U204.U204_LI03.F_CV;12.057883263;100.0 +25/10/2020 02:06:25;U204.U204_LI03.F_CV;12.233332634;100.0 +25/10/2020 02:06:29;U204.U204_LI03.F_CV;12.004620552;100.0 +25/10/2020 02:06:32;U204.U204_LI03.F_CV;12.076683998;100.0 +25/10/2020 02:06:34;U204.U204_LI03.F_CV;11.995226860;100.0 +25/10/2020 02:06:39;U204.U204_LI03.F_CV;12.183202744;100.0 +25/10/2020 02:06:40;U204.U204_LI03.F_CV;12.001486778;100.0 +25/10/2020 02:06:44;U204.U204_LI03.F_CV;12.111145973;100.0 +25/10/2020 02:06:46;U204.U204_LI03.F_CV;12.000513077;100.0 +25/10/2020 02:06:00;U204.U204_LI08.F_CV;61.750316620;100.0 +25/10/2020 02:06:02;U204.U204_LI08.F_CV;62.254726410;100.0 +25/10/2020 02:06:03;U204.U204_LI08.F_CV;61.689941406;100.0 +25/10/2020 02:06:05;U204.U204_LI08.F_CV;62.144245148;100.0 +25/10/2020 02:06:08;U204.U204_LI08.F_CV;62.549221039;100.0 +25/10/2020 02:06:10;U204.U204_LI08.F_CV;61.982154846;100.0 +25/10/2020 02:06:12;U204.U204_LI08.F_CV;62.589962006;100.0 +25/10/2020 02:06:13;U204.U204_LI08.F_CV;62.317382813;100.0 +25/10/2020 02:06:16;U204.U204_LI08.F_CV;61.910926819;100.0 +25/10/2020 02:06:18;U204.U204_LI08.F_CV;62.279788971;100.0 +25/10/2020 02:06:22;U204.U204_LI08.F_CV;62.182666779;100.0 +25/10/2020 02:06:23;U204.U204_LI08.F_CV;61.784774780;100.0 +25/10/2020 02:06:25;U204.U204_LI08.F_CV;61.885036469;100.0 +25/10/2020 02:06:26;U204.U204_LI08.F_CV;62.273521423;100.0 +25/10/2020 02:06:31;U204.U204_LI08.F_CV;62.273521423;100.0 +25/10/2020 02:06:32;U204.U204_LI08.F_CV;62.057346344;100.0 +25/10/2020 02:06:34;U204.U204_LI08.F_CV;61.969627380;100.0 +25/10/2020 02:06:35;U204.U204_LI08.F_CV;61.603061676;100.0 +25/10/2020 02:06:37;U204.U204_LI08.F_CV;62.239063263;100.0 +25/10/2020 02:06:39;U204.U204_LI08.F_CV;61.151908875;100.0 +25/10/2020 02:06:40;U204.U204_LI08.F_CV;61.910099030;100.0 +25/10/2020 02:06:42;U204.U204_LI08.F_CV;61.618728638;100.0 +25/10/2020 02:06:44;U204.U204_LI08.F_CV;61.966491699;100.0 +25/10/2020 02:06:48;U204.U204_LI08.F_CV;61.707294464;100.0 +25/10/2020 02:06:50;U204.U204_LI08.F_CV;62.452106476;100.0 +25/10/2020 02:06:54;U204.U204_LI08.F_CV;62.151336670;100.0 +25/10/2020 02:06:55;U204.U204_LI08.F_CV;62.220256805;100.0 +25/10/2020 02:06:57;U204.U204_LI08.F_CV;61.615592957;100.0 +25/10/2020 02:06:59;U204.U204_LI08.F_CV;61.230243683;100.0 +25/10/2020 02:06:01;U204.U204_PC04_OP.F_CV;28.977325439;100.0 +25/10/2020 02:06:04;U204.U204_PC04_OP.F_CV;29.074983597;100.0 +25/10/2020 02:06:09;U204.U204_PC04_OP.F_CV;28.879665375;100.0 +25/10/2020 02:06:10;U204.U204_PC04_OP.F_CV;28.952909470;100.0 +25/10/2020 02:06:11;U204.U204_PC04_OP.F_CV;28.757591248;100.0 +25/10/2020 02:06:19;U204.U204_PC04_OP.F_CV;28.293710709;100.0 +25/10/2020 02:06:23;U204.U204_PC04_OP.F_CV;27.707754135;100.0 +25/10/2020 02:06:24;U204.U204_PC04_OP.F_CV;27.268287659;100.0 +25/10/2020 02:06:26;U204.U204_PC04_OP.F_CV;26.779991150;100.0 +25/10/2020 02:06:28;U204.U204_PC04_OP.F_CV;25.339517593;100.0 +25/10/2020 02:06:29;U204.U204_PC04_OP.F_CV;25.266273499;100.0 +25/10/2020 02:06:31;U204.U204_PC04_OP.F_CV;24.948881149;100.0 +25/10/2020 02:06:33;U204.U204_PC04_OP.F_CV;24.777976990;100.0 +25/10/2020 02:06:36;U204.U204_PC04_OP.F_CV;24.851222992;100.0 +25/10/2020 02:06:37;U204.U204_PC04_OP.F_CV;24.753562927;100.0 +25/10/2020 02:06:44;U204.U204_PC04_OP.F_CV;24.533830643;100.0 +25/10/2020 02:06:45;U204.U204_PC04_OP.F_CV;24.607074738;100.0 +25/10/2020 02:06:46;U204.U204_PC04_OP.F_CV;24.533830643;100.0 +25/10/2020 02:06:47;U204.U204_PC04_OP.F_CV;24.777976990;100.0 +25/10/2020 02:06:48;U204.U204_PC04_OP.F_CV;24.704732895;100.0 +25/10/2020 02:06:51;U204.U204_PC04_OP.F_CV;25.559251785;100.0 +25/10/2020 02:06:58;U204.U204_PC04_OP.F_CV;26.438184738;100.0 +25/10/2020 02:06:26;U204.U204_PC04_PV.F_CV;159.715957642;100.0 +25/10/2020 02:06:20;U204.U204_PC04_SP.F_CV;160.000000000;100.0 +25/10/2020 02:06:06;U204.U204_PDI32.F_CV;0.383580416;100.0 +25/10/2020 02:06:29;U204.U204_PDI32.F_CV;1.256133199;100.0 +25/10/2020 02:06:30;U204.U204_PDI32.F_CV;0.480355352;100.0 +25/10/2020 02:06:58;U204.U204_PDI32.F_CV;1.045087695;100.0 +25/10/2020 02:06:16;U204.U204_PI39.F_CV;158.658157349;100.0 +25/10/2020 02:06:29;U204.U204_PI39.F_CV;158.057556152;100.0 +25/10/2020 02:06:49;U204.U204_PI39.F_CV;158.348266602;100.0 +25/10/2020 02:06:00;U204.U204_PI50.F_CV;0.155198887;100.0 +25/10/2020 02:06:02;U204.U204_PI50.F_CV;0.155836269;100.0 +25/10/2020 02:06:10;U204.U204_PI50.F_CV;0.155280814;100.0 +25/10/2020 02:06:19;U204.U204_PI50.F_CV;0.157646164;100.0 +25/10/2020 02:06:25;U204.U204_PI50.F_CV;0.160361603;100.0 +25/10/2020 02:06:26;U204.U204_PI50.F_CV;0.163447320;100.0 +25/10/2020 02:06:28;U204.U204_PI50.F_CV;0.164712459;100.0 +25/10/2020 02:06:36;U204.U204_PI50.F_CV;0.166883409;100.0 +25/10/2020 02:06:38;U204.U204_PI50.F_CV;0.165298700;100.0 +25/10/2020 02:06:41;U204.U204_PI50.F_CV;0.167242721;100.0 +25/10/2020 02:06:42;U204.U204_PI50.F_CV;0.169290379;100.0 +25/10/2020 02:06:44;U204.U204_PI50.F_CV;0.167068586;100.0 +25/10/2020 02:06:46;U204.U204_PI50.F_CV;0.166101009;100.0 +25/10/2020 02:06:47;U204.U204_PI50.F_CV;0.167366147;100.0 +25/10/2020 02:06:52;U204.U204_PI50.F_CV;0.167890713;100.0 +25/10/2020 02:06:56;U204.U204_PI50.F_CV;0.165545627;100.0 +25/10/2020 02:06:57;U204.U204_PI50.F_CV;0.163766742;100.0 +25/10/2020 02:06:38;U204.U204_TC01_OP.F_CV;42.210151672;100.0 +25/10/2020 02:06:20;U204.U204_TC01_PV.F_CV;249.924682617;100.0 +25/10/2020 02:06:20;U204.U204_TC01_SP.F_CV;250.000000000;100.0 +25/10/2020 02:06:04;U204.U204_TC02_OP.F_CV;27.024139404;100.0 +25/10/2020 02:06:05;U204.U204_TC02_OP.F_CV;26.804407120;100.0 +25/10/2020 02:06:16;U204.U204_TC02_OP.F_CV;26.804407120;100.0 +25/10/2020 02:06:17;U204.U204_TC02_OP.F_CV;27.341531754;100.0 +25/10/2020 02:06:28;U204.U204_TC02_OP.F_CV;27.341531754;100.0 +25/10/2020 02:06:29;U204.U204_TC02_OP.F_CV;28.318124771;100.0 +25/10/2020 02:06:40;U204.U204_TC02_OP.F_CV;28.318124771;100.0 +25/10/2020 02:06:41;U204.U204_TC02_OP.F_CV;32.200080872;100.0 +25/10/2020 02:06:52;U204.U204_TC02_OP.F_CV;32.200080872;100.0 +25/10/2020 02:06:53;U204.U204_TC02_OP.F_CV;31.150241852;100.0 +25/10/2020 02:06:01;U204.U204_TC02_PV.F_CV;358.871459961;100.0 +25/10/2020 02:06:16;U204.U204_TC02_PV.F_CV;358.153137207;100.0 +25/10/2020 02:06:31;U204.U204_TC02_PV.F_CV;356.426208496;100.0 +25/10/2020 02:06:33;U204.U204_TC02_PV.F_CV;354.761535645;100.0 +25/10/2020 02:06:39;U204.U204_TC02_PV.F_CV;351.451599121;100.0 +25/10/2020 02:06:41;U204.U204_TC02_PV.F_CV;351.011474609;100.0 +25/10/2020 02:06:50;U204.U204_TC02_PV.F_CV;351.627624512;100.0 +25/10/2020 02:06:59;U204.U204_TC02_PV.F_CV;354.259307861;100.0 +25/10/2020 02:06:20;U204.U204_TC02_SP.F_CV;355.000000000;100.0 +25/10/2020 02:06:29;U204.U204_TC03_OP.F_CV;27.512435913;100.0 +25/10/2020 02:06:40;U204.U204_TC03_OP.F_CV;27.512435913;100.0 +25/10/2020 02:06:41;U204.U204_TC03_OP.F_CV;27.780998230;100.0 +25/10/2020 02:06:38;U204.U204_TC03_PV.F_CV;391.010772705;100.0 +25/10/2020 02:06:20;U204.U204_TC03_SP.F_CV;391.000000000;100.0 +25/10/2020 02:06:17;U204.U204_TC04_OP.F_CV;26.145206451;100.0 +25/10/2020 02:06:53;U204.U204_TC04_OP.F_CV;25.901058197;100.0 +25/10/2020 02:06:20;U204.U204_TC04_PV.F_CV;390.934387207;100.0 +25/10/2020 02:06:20;U204.U204_TC04_SP.F_CV;391.000000000;100.0 +25/10/2020 02:06:30;U204.U204_TC05_OP.F_CV;31.931516647;100.0 +25/10/2020 02:06:42;U204.U204_TC05_OP.F_CV;32.053588867;100.0 +25/10/2020 02:06:44;U204.U204_TC05_PV.F_CV;390.752685547;100.0 +25/10/2020 02:06:20;U204.U204_TC05_SP.F_CV;391.000000000;100.0 +25/10/2020 02:06:42;U204.U204_TC06_OP.F_CV;26.731163025;100.0 +25/10/2020 02:06:16;U204.U204_TC06_PV.F_CV;391.169158936;100.0 +25/10/2020 02:06:42;U204.U204_TC06_PV.F_CV;390.827239990;100.0 +25/10/2020 02:06:20;U204.U204_TC06_SP.F_CV;391.000000000;100.0 +25/10/2020 02:06:54;U204.U204_TC07_OP.F_CV;20.285654068;100.0 +25/10/2020 02:06:20;U204.U204_TC07_PV.F_CV;391.045227051;100.0 +25/10/2020 02:06:20;U204.U204_TC07_SP.F_CV;391.000000000;100.0 +25/10/2020 02:06:17;U204.U204_TC18_OP.F_CV;33.518478394;100.0 +25/10/2020 02:06:20;U204.U204_TC18_PV.F_CV;390.959136963;100.0 +25/10/2020 02:06:20;U204.U204_TC18_SP.F_CV;391.000000000;100.0 +25/10/2020 02:06:00;U204.U204_TC19_OP.F_CV;21.558275223;100.0 +25/10/2020 02:06:01;U204.U204_TC19_OP.F_CV;24.170660019;100.0 +25/10/2020 02:06:10;U204.U204_TC19_OP.F_CV;24.170660019;100.0 +25/10/2020 02:06:11;U204.U204_TC19_OP.F_CV;25.415815353;100.0 +25/10/2020 02:06:20;U204.U204_TC19_OP.F_CV;25.415815353;100.0 +25/10/2020 02:06:21;U204.U204_TC19_OP.F_CV;23.364971161;100.0 +25/10/2020 02:06:30;U204.U204_TC19_OP.F_CV;23.364971161;100.0 +25/10/2020 02:06:31;U204.U204_TC19_OP.F_CV;21.631519318;100.0 +25/10/2020 02:06:40;U204.U204_TC19_OP.F_CV;21.631519318;100.0 +25/10/2020 02:06:41;U204.U204_TC19_OP.F_CV;22.779014587;100.0 +25/10/2020 02:06:50;U204.U204_TC19_OP.F_CV;22.779014587;100.0 +25/10/2020 02:06:51;U204.U204_TC19_OP.F_CV;23.364971161;100.0 +25/10/2020 02:06:05;U204.U204_TC19_PV.F_CV;79.819274902;100.0 +25/10/2020 02:06:18;U204.U204_TC19_PV.F_CV;79.883819580;100.0 +25/10/2020 02:06:30;U204.U204_TC19_PV.F_CV;80.077453613;100.0 +25/10/2020 02:06:51;U204.U204_TC19_PV.F_CV;80.012908936;100.0 +25/10/2020 02:06:55;U204.U204_TC19_PV.F_CV;79.926849365;100.0 +25/10/2020 02:06:20;U204.U204_TC19_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:14;U204.U204_TC21_OP.F_CV;39.622180939;100.0 +25/10/2020 02:06:25;U204.U204_TC21_OP.F_CV;39.622180939;100.0 +25/10/2020 02:06:26;U204.U204_TC21_OP.F_CV;39.963989258;100.0 +25/10/2020 02:06:50;U204.U204_TC21_OP.F_CV;39.793083191;100.0 +25/10/2020 02:06:09;U204.U204_TC21_PV.F_CV;250.161346436;100.0 +25/10/2020 02:06:20;U204.U204_TC21_SP.F_CV;250.000000000;100.0 +25/10/2020 02:06:13;U204.U204_TC22_OP.F_CV;26.633502960;100.0 +25/10/2020 02:06:14;U204.U204_TC22_OP.F_CV;27.048555374;100.0 +25/10/2020 02:06:49;U204.U204_TC22_OP.F_CV;27.048555374;100.0 +25/10/2020 02:06:50;U204.U204_TC22_OP.F_CV;26.657918930;100.0 +25/10/2020 02:06:10;U204.U204_TC22_PV.F_CV;320.003997803;100.0 +25/10/2020 02:06:30;U204.U204_TC22_PV.F_CV;319.685821533;100.0 +25/10/2020 02:06:59;U204.U204_TC22_SP.F_CV;320.000000000;100.0 +25/10/2020 02:06:15;U204.U204_TC23_OP.F_CV;19.968259811;100.0 +25/10/2020 02:06:37;U204.U204_TC23_OP.F_CV;20.041505814;100.0 +25/10/2020 02:06:38;U204.U204_TC23_OP.F_CV;20.261238098;100.0 +25/10/2020 02:06:50;U204.U204_TC23_OP.F_CV;20.065919876;100.0 +25/10/2020 02:06:20;U204.U204_TC23_PV.F_CV;324.432647705;100.0 +25/10/2020 02:06:20;U204.U204_TC23_SP.F_CV;324.500000000;100.0 +25/10/2020 02:06:24;U204.U204_TC24_OP.F_CV;16.696676254;100.0 +25/10/2020 02:06:38;U204.U204_TC24_OP.F_CV;16.769920349;100.0 +25/10/2020 02:06:56;U204.U204_TC24_PV.F_CV;324.319244385;100.0 +25/10/2020 02:06:20;U204.U204_TC24_SP.F_CV;324.500000000;100.0 +25/10/2020 02:06:17;U204.U204_TC25_OP.F_CV;19.357891083;100.0 +25/10/2020 02:06:56;U204.U204_TC25_PV.F_CV;324.365936279;100.0 +25/10/2020 02:06:20;U204.U204_TC25_SP.F_CV;324.500000000;100.0 +25/10/2020 02:06:31;U204.U204_TC26_OP.F_CV;18.454542160;100.0 +25/10/2020 02:06:01;U204.U204_TC26_PV.F_CV;324.475097656;100.0 +25/10/2020 02:06:20;U204.U204_TC26_SP.F_CV;324.500000000;100.0 +25/10/2020 02:06:26;U204.U204_TC27_OP.F_CV;15.768914223;100.0 +25/10/2020 02:06:20;U204.U204_TC27_PV.F_CV;324.476104736;100.0 +25/10/2020 02:06:20;U204.U204_TC27_SP.F_CV;324.500000000;100.0 +25/10/2020 02:06:51;U204.U204_TC38_OP.F_CV;23.508407593;100.0 +25/10/2020 02:06:56;U204.U204_TC38_PV.F_CV;324.476104736;100.0 +25/10/2020 02:06:20;U204.U204_TC38_SP.F_CV;324.500000000;100.0 +25/10/2020 02:06:20;U204.U204_TC40_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U204.U204_TC40_PV.F_CV;71.901885986;100.0 +25/10/2020 02:06:20;U204.U204_TC40_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U204.U204_TC42_OP.F_CV;5.978576183;100.0 +25/10/2020 02:06:01;U204.U204_TC42_OP.F_CV;6.857509136;100.0 +25/10/2020 02:06:10;U204.U204_TC42_OP.F_CV;6.857509136;100.0 +25/10/2020 02:06:11;U204.U204_TC42_OP.F_CV;7.150486946;100.0 +25/10/2020 02:06:21;U204.U204_TC42_OP.F_CV;7.150486946;100.0 +25/10/2020 02:06:22;U204.U204_TC42_OP.F_CV;8.005004883;100.0 +25/10/2020 02:06:31;U204.U204_TC42_OP.F_CV;8.005004883;100.0 +25/10/2020 02:06:32;U204.U204_TC42_OP.F_CV;6.393627644;100.0 +25/10/2020 02:06:41;U204.U204_TC42_OP.F_CV;6.393627644;100.0 +25/10/2020 02:06:42;U204.U204_TC42_OP.F_CV;5.710012913;100.0 +25/10/2020 02:06:51;U204.U204_TC42_OP.F_CV;5.710012913;100.0 +25/10/2020 02:06:52;U204.U204_TC42_OP.F_CV;5.441450119;100.0 +25/10/2020 02:06:24;U204.U204_TC42_PV.F_CV;79.539588928;100.0 +25/10/2020 02:06:41;U204.U204_TC42_PV.F_CV;80.335624695;100.0 +25/10/2020 02:06:20;U204.U204_TC42_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:08;U204.U204_TC45_OP.F_CV;44.920192719;100.0 +25/10/2020 02:06:09;U204.U204_TC45_OP.F_CV;44.651630402;100.0 +25/10/2020 02:06:19;U204.U204_TC45_OP.F_CV;44.651630402;100.0 +25/10/2020 02:06:20;U204.U204_TC45_OP.F_CV;44.407482147;100.0 +25/10/2020 02:06:31;U204.U204_TC45_OP.F_CV;44.407482147;100.0 +25/10/2020 02:06:32;U204.U204_TC45_OP.F_CV;44.651630402;100.0 +25/10/2020 02:06:43;U204.U204_TC45_OP.F_CV;44.846950531;100.0 +25/10/2020 02:06:54;U204.U204_TC45_OP.F_CV;44.846950531;100.0 +25/10/2020 02:06:55;U204.U204_TC45_OP.F_CV;45.481735229;100.0 +25/10/2020 02:06:48;U204.U204_TC45_PV.F_CV;274.784851074;100.0 +25/10/2020 02:06:01;U204.U204_TC45_SP.F_CV;275.200744629;100.0 +25/10/2020 02:06:10;U204.U204_TC45_SP.F_CV;274.996978760;100.0 +25/10/2020 02:06:52;U204.U204_TC45_SP.F_CV;275.462097168;100.0 +25/10/2020 02:06:55;U204.U204_TC46_OP.F_CV;56.028930664;100.0 +25/10/2020 02:06:41;U204.U204_TC46_PV.F_CV;350.000000000;100.0 +25/10/2020 02:06:20;U204.U204_TC46_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:44;U204.U204_TC49_OP.F_CV;39.182712555;100.0 +25/10/2020 02:06:20;U204.U204_TC49_PV.F_CV;330.744384766;100.0 +25/10/2020 02:06:39;U204.U204_TC49_SP.F_CV;330.837646484;100.0 +25/10/2020 02:06:55;U204.U204_TC50_OP.F_CV;33.762626648;100.0 +25/10/2020 02:06:27;U204.U204_TC50_PV.F_CV;311.553344727;100.0 +25/10/2020 02:06:50;U204.U204_TC50_SP.F_CV;311.696777344;100.0 +25/10/2020 02:06:21;U204.U204_TC52_OP.F_CV;27.292703629;100.0 +25/10/2020 02:06:20;U204.U204_TC52_PV.F_CV;263.640258789;100.0 +25/10/2020 02:06:36;U204.U204_TC52_SP.F_CV;263.763977051;100.0 +25/10/2020 02:06:09;U204.U204_TC53_OP.F_CV;25.095371246;100.0 +25/10/2020 02:06:55;U204.U204_TC53_OP.F_CV;24.997711182;100.0 +25/10/2020 02:06:20;U204.U204_TC53_PV.F_CV;234.961273193;100.0 +25/10/2020 02:06:20;U204.U204_TC53_SP.F_CV;235.000000000;100.0 +25/10/2020 02:06:01;U204.U204_TI02.F_CV;358.871459961;100.0 +25/10/2020 02:06:15;U204.U204_TI02.F_CV;358.277984619;100.0 +25/10/2020 02:06:31;U204.U204_TI02.F_CV;356.426208496;100.0 +25/10/2020 02:06:33;U204.U204_TI02.F_CV;354.761535645;100.0 +25/10/2020 02:06:39;U204.U204_TI02.F_CV;351.451599121;100.0 +25/10/2020 02:06:41;U204.U204_TI02.F_CV;351.011474609;100.0 +25/10/2020 02:06:50;U204.U204_TI02.F_CV;351.627624512;100.0 +25/10/2020 02:06:59;U204.U204_TI02.F_CV;354.259307861;100.0 +25/10/2020 02:06:39;U204.U204_TI03.F_CV;390.882232666;100.0 +25/10/2020 02:06:56;U204.U204_TI03.F_CV;391.139343262;100.0 +25/10/2020 02:06:56;U204.U204_TI04.F_CV;390.998565674;100.0 +25/10/2020 02:06:36;U204.U204_TI05.F_CV;390.966613770;100.0 +25/10/2020 02:06:38;U204.U204_TI06.F_CV;390.891387939;100.0 +25/10/2020 02:06:44;U204.U204_TI07.F_CV;390.873077393;100.0 +25/10/2020 02:06:11;U204.U204_TI11.F_CV;91.892936707;100.0 +25/10/2020 02:06:20;U204.U204_TI111.F_CV;281.531036377;100.0 +25/10/2020 02:06:20;U204.U204_TI112.F_CV;372.090026855;100.0 +25/10/2020 02:06:20;U204.U204_TI113.F_CV;390.743988037;100.0 +25/10/2020 02:06:20;U204.U204_TI114.F_CV;377.060089111;100.0 +25/10/2020 02:06:20;U204.U204_TI115.F_CV;377.748596191;100.0 +25/10/2020 02:06:20;U204.U204_TI116.F_CV;369.701782227;100.0 +25/10/2020 02:06:56;U204.U204_TI117.F_CV;382.847778320;100.0 +25/10/2020 02:06:20;U204.U204_TI118.F_CV;374.736419678;100.0 +25/10/2020 02:06:20;U204.U204_TI12.F_CV;284.242004395;100.0 +25/10/2020 02:06:20;U204.U204_TI13.F_CV;344.184326172;100.0 +25/10/2020 02:06:56;U204.U204_TI131.F_CV;296.032531738;100.0 +25/10/2020 02:06:20;U204.U204_TI132.F_CV;301.712646484;100.0 +25/10/2020 02:06:20;U204.U204_TI133.F_CV;306.618194580;100.0 +25/10/2020 02:06:20;U204.U204_TI134.F_CV;313.223449707;100.0 +25/10/2020 02:06:20;U204.U204_TI135.F_CV;316.924133301;100.0 +25/10/2020 02:06:20;U204.U204_TI136.F_CV;312.190704346;100.0 +25/10/2020 02:06:20;U204.U204_TI137.F_CV;312.728576660;100.0 +25/10/2020 02:06:20;U204.U204_TI138.F_CV;316.945648193;100.0 +25/10/2020 02:06:20;U204.U204_TI14.F_CV;316.085021973;100.0 +25/10/2020 02:06:32;U204.U204_TI140.F_CV;55.335624695;100.0 +25/10/2020 02:06:15;U204.U204_TI142.F_CV;87.413940430;100.0 +25/10/2020 02:06:41;U204.U204_TI145.F_CV;321.213409424;100.0 +25/10/2020 02:06:20;U204.U204_TI146.F_CV;350.989654541;100.0 +25/10/2020 02:06:20;U204.U204_TI149.F_CV;328.119598389;100.0 +25/10/2020 02:06:20;U204.U204_TI15.F_CV;362.128326416;100.0 +25/10/2020 02:06:56;U204.U204_TI150.F_CV;305.981079102;100.0 +25/10/2020 02:06:20;U204.U204_TI152.F_CV;261.531829834;100.0 +25/10/2020 02:06:20;U204.U204_TI153.F_CV;236.166076660;100.0 +25/10/2020 02:06:41;U204.U204_TI157.F_CV;187.177276611;100.0 +25/10/2020 02:06:20;U204.U204_TI16.F_CV;387.301513672;100.0 +25/10/2020 02:06:56;U204.U204_TI17.F_CV;357.868225098;100.0 +25/10/2020 02:06:20;U204.U204_TI18.F_CV;390.959136963;100.0 +25/10/2020 02:06:07;U204.U204_TI180.F_CV;81.992248535;100.0 +25/10/2020 02:06:35;U204.U204_TI180.F_CV;81.497413635;100.0 +25/10/2020 02:06:39;U204.U204_TI180.F_CV;81.282272339;100.0 +25/10/2020 02:06:14;U204.U204_TI22.F_CV;319.855529785;100.0 +25/10/2020 02:06:41;U204.U204_TI23.F_CV;324.411407471;100.0 +25/10/2020 02:06:56;U204.U204_TI24.F_CV;324.319244385;100.0 +25/10/2020 02:06:37;U204.U204_TI25.F_CV;324.429504395;100.0 +25/10/2020 02:06:29;U204.U204_TI26.F_CV;324.432312012;100.0 +25/10/2020 02:06:35;U204.U204_TI27.F_CV;324.411529541;100.0 +25/10/2020 02:06:54;U204.U204_TI31.F_CV;57.059249878;100.0 +25/10/2020 02:06:20;U204.U204_TI32.F_CV;229.657043457;100.0 +25/10/2020 02:06:56;U204.U204_TI33.F_CV;330.694091797;100.0 +25/10/2020 02:06:20;U204.U204_TI34.F_CV;323.163635254;100.0 +25/10/2020 02:06:56;U204.U204_TI35.F_CV;322.216949463;100.0 +25/10/2020 02:06:20;U204.U204_TI36.F_CV;323.550903320;100.0 +25/10/2020 02:06:20;U204.U204_TI37.F_CV;321.937225342;100.0 +25/10/2020 02:06:56;U204.U204_TI38.F_CV;324.476104736;100.0 +25/10/2020 02:06:00;U204.U204_TI39.F_CV;82.401031494;100.0 +25/10/2020 02:06:07;U204.U204_TI39.F_CV;82.573143005;100.0 +25/10/2020 02:06:09;U204.U204_TI39.F_CV;82.680717468;100.0 +25/10/2020 02:06:15;U204.U204_TI39.F_CV;82.314971924;100.0 +25/10/2020 02:06:17;U204.U204_TI39.F_CV;82.594665527;100.0 +25/10/2020 02:06:22;U204.U204_TI39.F_CV;82.594665527;100.0 +25/10/2020 02:06:23;U204.U204_TI39.F_CV;82.271942139;100.0 +25/10/2020 02:06:25;U204.U204_TI39.F_CV;82.702239990;100.0 +25/10/2020 02:06:35;U204.U204_TI39.F_CV;82.379516602;100.0 +25/10/2020 02:06:38;U204.U204_TI39.F_CV;82.680717468;100.0 +25/10/2020 02:06:45;U204.U204_TI39.F_CV;82.616172791;100.0 +25/10/2020 02:06:48;U204.U204_TI39.F_CV;82.379516602;100.0 +25/10/2020 02:06:52;U204.U204_TI39.F_CV;82.788291931;100.0 +25/10/2020 02:06:56;U204.U204_TI39.F_CV;82.487091064;100.0 +25/10/2020 02:06:19;U204.U204_TI41.F_CV;77.366607666;100.0 +25/10/2020 02:06:38;U204.U204_TI44.F_CV;60.025817871;100.0 +25/10/2020 02:06:01;U204.U204_TI47.F_CV;191.157485962;100.0 +25/10/2020 02:06:02;U204.U204_TI47.F_CV;190.533554077;100.0 +25/10/2020 02:06:07;U204.U204_TI47.F_CV;190.167816162;100.0 +25/10/2020 02:06:09;U204.U204_TI47.F_CV;189.371765137;100.0 +25/10/2020 02:06:18;U204.U204_TI47.F_CV;189.027542114;100.0 +25/10/2020 02:06:27;U204.U204_TI47.F_CV;189.328735352;100.0 +25/10/2020 02:06:45;U204.U204_TI47.F_CV;188.446640015;100.0 +25/10/2020 02:06:54;U204.U204_TI48.F_CV;283.455230713;100.0 +25/10/2020 02:06:12;U204.U204_TI51.F_CV;233.132522583;100.0 +25/10/2020 02:06:33;U204.U204_TI51.F_CV;233.928558350;100.0 +25/10/2020 02:06:47;U204.U204_TI51.F_CV;235.778808594;100.0 +25/10/2020 02:06:55;U204.U204_TI51.F_CV;236.101531982;100.0 +25/10/2020 02:06:09;U204.U204_TI54.F_CV;266.716857910;100.0 +25/10/2020 02:06:48;U204.U204_TI54.F_CV;267.383819580;100.0 +25/10/2020 02:06:20;U204.U204_TI57.F_CV;283.691894531;100.0 +25/10/2020 02:06:17;U204.U204_TI60.F_CV;11.166092873;100.0 +25/10/2020 02:06:42;U204.U204_TI60.F_CV;11.488811493;100.0 +25/10/2020 02:06:56;U204.U204_TI61.F_CV;22.310670853;100.0 +25/10/2020 02:06:05;U204.U204_TI62.F_CV;22.030981064;100.0 +25/10/2020 02:06:08;U204.U204_TI62.F_CV;20.761615753;100.0 +25/10/2020 02:06:19;U204.U204_TI62.F_CV;21.600687027;100.0 +25/10/2020 02:06:21;U204.U204_TI62.F_CV;21.299482346;100.0 +25/10/2020 02:06:24;U204.U204_TI62.F_CV;22.203096390;100.0 +25/10/2020 02:06:27;U204.U204_TI62.F_CV;21.234937668;100.0 +25/10/2020 02:06:29;U204.U204_TI62.F_CV;22.030981064;100.0 +25/10/2020 02:06:30;U204.U204_TI62.F_CV;20.847675323;100.0 +25/10/2020 02:06:33;U204.U204_TI62.F_CV;22.117038727;100.0 +25/10/2020 02:06:37;U204.U204_TI62.F_CV;21.708259583;100.0 +25/10/2020 02:06:40;U204.U204_TI62.F_CV;20.718587875;100.0 +25/10/2020 02:06:42;U204.U204_TI62.F_CV;21.407056808;100.0 +25/10/2020 02:06:49;U204.U204_TI62.F_CV;20.869190216;100.0 +25/10/2020 02:06:53;U204.U204_TI62.F_CV;21.751291275;100.0 +25/10/2020 02:06:55;U204.U204_TI62.F_CV;20.890705109;100.0 +25/10/2020 02:06:31;U204.U204_TI63.F_CV;6.841651917;100.0 +25/10/2020 02:06:01;U204.U204_TI64.F_CV;80.314109802;100.0 +25/10/2020 02:06:08;U204.U204_TI64.F_CV;80.206535339;100.0 +25/10/2020 02:06:42;U204.U204_TI64.F_CV;80.314109802;100.0 +25/10/2020 02:06:59;U204.U204_TI64.F_CV;80.206535339;100.0 +25/10/2020 02:06:55;U204.U204_TI65.F_CV;111.682441711;100.0 +25/10/2020 02:06:22;U204.U204_WI01.F_CV;2207.100097656;100.0 +25/10/2020 02:06:34;U204.U204_WI02.F_CV;4673.000000000;100.0 +25/10/2020 02:06:53;U204.U204_WI03.F_CV;36.500000000;100.0 +25/10/2020 02:06:49;U204.U204_WI04.F_CV;4288.000000000;100.0 +25/10/2020 02:06:42;U214.AI2.F_CV;0.857582986;100.0 +25/10/2020 02:06:08;U214.FC1_OP.F_CV;62.545204163;100.0 +25/10/2020 02:06:08;U214.FC1_PV.F_CV;780.529479980;100.0 +25/10/2020 02:06:09;U214.FC1_PV.F_CV;783.398193359;100.0 +25/10/2020 02:06:19;U214.FC1_PV.F_CV;784.679931641;100.0 +25/10/2020 02:06:38;U214.FC1_PV.F_CV;784.679931641;100.0 +25/10/2020 02:06:39;U214.FC1_PV.F_CV;780.773620605;100.0 +25/10/2020 02:06:48;U214.FC1_PV.F_CV;780.773620605;100.0 +25/10/2020 02:06:49;U214.FC1_PV.F_CV;777.538696289;100.0 +25/10/2020 02:06:07;U214.FC1_SP_MESURE.F_CV;780.000000000;100.0 +25/10/2020 02:06:20;U214.FC2_OP.F_CV;50.000762939;100.0 +25/10/2020 02:06:09;U214.FC2_PV.F_CV;878.065185547;100.0 +25/10/2020 02:06:39;U214.FC2_PV.F_CV;877.393737793;100.0 +25/10/2020 02:06:31;U214.FC2_SP_MESURE.F_CV;900.000000000;100.0 +25/10/2020 02:06:39;U214.FC30_OP.F_CV;64.376289368;100.0 +25/10/2020 02:06:19;U214.FC30_PV.F_CV;44.995803833;100.0 +25/10/2020 02:06:42;U214.FC30_SP.F_CV;44.998855591;100.0 +25/10/2020 02:06:11;U214.FC30_SP_MESURE.F_CV;45.000000000;100.0 +25/10/2020 02:06:08;U214.FI91.F_CV;946.974914551;100.0 +25/10/2020 02:06:09;U214.FI91.F_CV;990.066406250;100.0 +25/10/2020 02:06:18;U214.FI91.F_CV;990.066406250;100.0 +25/10/2020 02:06:19;U214.FI91.F_CV;970.656921387;100.0 +25/10/2020 02:06:28;U214.FI91.F_CV;970.656921387;100.0 +25/10/2020 02:06:29;U214.FI91.F_CV;993.850585938;100.0 +25/10/2020 02:06:38;U214.FI91.F_CV;993.850585938;100.0 +25/10/2020 02:06:39;U214.FI91.F_CV;958.876953125;100.0 +25/10/2020 02:06:48;U214.FI91.F_CV;958.876953125;100.0 +25/10/2020 02:06:49;U214.FI91.F_CV;974.990478516;100.0 +25/10/2020 02:06:58;U214.FI91.F_CV;974.990478516;100.0 +25/10/2020 02:06:59;U214.FI91.F_CV;965.224670410;100.0 +25/10/2020 02:06:09;U214.FI92.F_CV;57.491416931;100.0 +25/10/2020 02:06:18;U214.FI92.F_CV;57.491416931;100.0 +25/10/2020 02:06:19;U214.FI92.F_CV;63.608757019;100.0 +25/10/2020 02:06:28;U214.FI92.F_CV;63.608757019;100.0 +25/10/2020 02:06:29;U214.FI92.F_CV;49.126422882;100.0 +25/10/2020 02:06:39;U214.FI92.F_CV;50.481422424;100.0 +25/10/2020 02:06:48;U214.FI92.F_CV;50.481422424;100.0 +25/10/2020 02:06:49;U214.FI92.F_CV;55.733577728;100.0 +25/10/2020 02:06:11;U214.FQ91.F_CV;861487.187500000;100.0 +25/10/2020 02:06:27;U214.FQ91.F_CV;861491.437500000;100.0 +25/10/2020 02:06:35;U214.FQ91.F_CV;861493.625000000;100.0 +25/10/2020 02:06:43;U214.FQ91.F_CV;861495.625000000;100.0 +25/10/2020 02:06:51;U214.FQ91.F_CV;861497.750000000;100.0 +25/10/2020 02:06:58;U214.FQ91.F_CV;861499.750000000;100.0 +25/10/2020 02:06:00;U214.FQ92.F_CV;110788.328125000;100.0 +25/10/2020 02:06:02;U214.FQ92.F_CV;110788.351562500;100.0 +25/10/2020 02:06:04;U214.FQ92.F_CV;110788.367187500;100.0 +25/10/2020 02:06:07;U214.FQ92.F_CV;110788.414062500;100.0 +25/10/2020 02:06:08;U214.FQ92.F_CV;110788.445312500;100.0 +25/10/2020 02:06:09;U214.FQ92.F_CV;110788.460937500;100.0 +25/10/2020 02:06:10;U214.FQ92.F_CV;110788.500000000;100.0 +25/10/2020 02:06:13;U214.FQ92.F_CV;110788.546875000;100.0 +25/10/2020 02:06:14;U214.FQ92.F_CV;110788.570312500;100.0 +25/10/2020 02:06:15;U214.FQ92.F_CV;110788.585937500;100.0 +25/10/2020 02:06:17;U214.FQ92.F_CV;110788.601562500;100.0 +25/10/2020 02:06:21;U214.FQ92.F_CV;110788.664062500;100.0 +25/10/2020 02:06:23;U214.FQ92.F_CV;110788.679687500;100.0 +25/10/2020 02:06:26;U214.FQ92.F_CV;110788.726562500;100.0 +25/10/2020 02:06:27;U214.FQ92.F_CV;110788.734375000;100.0 +25/10/2020 02:06:37;U214.FQ92.F_CV;110788.890625000;100.0 +25/10/2020 02:06:39;U214.FQ92.F_CV;110788.906250000;100.0 +25/10/2020 02:06:40;U214.FQ92.F_CV;110788.921875000;100.0 +25/10/2020 02:06:41;U214.FQ92.F_CV;110788.929687500;100.0 +25/10/2020 02:06:44;U214.FQ92.F_CV;110788.976562500;100.0 +25/10/2020 02:06:45;U214.FQ92.F_CV;110789.007812500;100.0 +25/10/2020 02:06:51;U214.FQ92.F_CV;110789.101562500;100.0 +25/10/2020 02:06:52;U214.FQ92.F_CV;110789.109375000;100.0 +25/10/2020 02:06:03;U214.FY20.F_CV;100.000000000;100.0 +25/10/2020 02:06:09;U214.LC30_PV.F_CV;68.699165344;100.0 +25/10/2020 02:06:18;U214.LC30_PV.F_CV;68.699165344;100.0 +25/10/2020 02:06:19;U214.LC30_PV.F_CV;69.555198669;100.0 +25/10/2020 02:06:28;U214.LC30_PV.F_CV;69.555198669;100.0 +25/10/2020 02:06:29;U214.LC30_PV.F_CV;64.184020996;100.0 +25/10/2020 02:06:38;U214.LC30_PV.F_CV;64.184020996;100.0 +25/10/2020 02:06:39;U214.LC30_PV.F_CV;63.909362793;100.0 +25/10/2020 02:06:09;U214.LC61_OP.F_CV;42.055389404;100.0 +25/10/2020 02:06:48;U214.LC61_OP.F_CV;40.366214752;100.0 +25/10/2020 02:06:49;U214.LC61_OP.F_CV;42.406349182;100.0 +25/10/2020 02:06:08;U214.LC61_PV.F_CV;69.752044678;100.0 +25/10/2020 02:06:09;U214.LC61_PV.F_CV;70.115203857;100.0 +25/10/2020 02:06:29;U214.LC61_PV.F_CV;69.930572510;100.0 +25/10/2020 02:06:49;U214.LC61_PV.F_CV;70.087738037;100.0 +25/10/2020 02:06:41;U214.LC61_SP_MESURE.F_CV;70.000000000;100.0 +25/10/2020 02:06:42;U214.LC62_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:42;U214.LC62_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:09;U214.LI1.F_CV;47.598991394;100.0 +25/10/2020 02:06:39;U214.LI1.F_CV;47.658504486;100.0 +25/10/2020 02:06:59;U214.LI3.F_CV;51.236743927;100.0 +25/10/2020 02:06:29;U214.PC10_OP.F_CV;22.638284683;100.0 +25/10/2020 02:06:30;U214.PC10_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:42;U214.PC10_SP_MESURE.F_CV;50.000000000;100.0 +25/10/2020 02:06:09;U214.PDI12.F_CV;0.236667424;100.0 +25/10/2020 02:06:49;U214.PI11.F_CV;241.504547119;100.0 +25/10/2020 02:06:42;U214.PI45.F_CV;0.068604566;100.0 +25/10/2020 02:06:19;U214.TC100_OP.F_CV;25.317770004;100.0 +25/10/2020 02:06:59;U214.TC100_OP.F_CV;23.703365326;100.0 +25/10/2020 02:06:39;U214.TC100_PV.F_CV;84.869155884;100.0 +25/10/2020 02:06:45;U214.TC100_SP_MESURE.F_CV;85.000000000;100.0 +25/10/2020 02:06:42;U214.TC10_SP_MESURE.F_CV;80.000000000;100.0 +25/10/2020 02:06:30;U214.TC13_OP.F_CV;8.453497887;100.0 +25/10/2020 02:06:30;U214.TC13_PV.F_CV;179.957275391;100.0 +25/10/2020 02:06:29;U214.TC13_SP_MESURE.F_CV;180.000000000;100.0 +25/10/2020 02:06:30;U214.TC17_OP.F_CV;8.960097313;100.0 +25/10/2020 02:06:40;U214.TC17_PV.F_CV;179.888610840;100.0 +25/10/2020 02:06:11;U214.TC17_SP_MESURE.F_CV;180.000000000;100.0 +25/10/2020 02:06:59;U214.TC21_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U214.TC21_PV.F_CV;181.895172119;100.0 +25/10/2020 02:06:31;U214.TC21_SP_MESURE.F_CV;180.000000000;100.0 +25/10/2020 02:06:29;U214.TC22_OP.F_CV;3.955138445;100.0 +25/10/2020 02:06:10;U214.TC22_PV.F_CV;180.018310547;100.0 +25/10/2020 02:06:21;U214.TC22_SP_MESURE.F_CV;180.000000000;100.0 +25/10/2020 02:06:39;U214.TC23_OP.F_CV;5.294880390;100.0 +25/10/2020 02:06:20;U214.TC23_PV.F_CV;180.003051758;100.0 +25/10/2020 02:06:36;U214.TC23_SP_MESURE.F_CV;180.000000000;100.0 +25/10/2020 02:06:39;U214.TC24_OP.F_CV;3.784237385;100.0 +25/10/2020 02:06:59;U214.TC24_PV.F_CV;179.964904785;100.0 +25/10/2020 02:06:48;U214.TC24_SP_MESURE.F_CV;180.000000000;100.0 +25/10/2020 02:06:20;U214.TC25_OP.F_CV;6.483558178;100.0 +25/10/2020 02:06:00;U214.TC25_PV.F_CV;180.003051758;100.0 +25/10/2020 02:06:32;U214.TC25_SP_MESURE.F_CV;180.000000000;100.0 +25/10/2020 02:06:09;U214.TC26_OP.F_CV;6.445410728;100.0 +25/10/2020 02:06:20;U214.TC26_PV.F_CV;179.972534180;100.0 +25/10/2020 02:06:40;U214.TC26_SP_MESURE.F_CV;180.000000000;100.0 +25/10/2020 02:06:10;U214.TC3_OP.F_CV;5.999847412;100.0 +25/10/2020 02:06:20;U214.TC3_PV.F_CV;88.883804321;100.0 +25/10/2020 02:06:44;U214.TC3_SP_MESURE.F_CV;80.000000000;100.0 +25/10/2020 02:06:19;U214.TC41_OP.F_CV;8.766307831;100.0 +25/10/2020 02:06:50;U214.TC41_PV.F_CV;180.109863281;100.0 +25/10/2020 02:06:13;U214.TC41_SP_MESURE.F_CV;180.000000000;100.0 +25/10/2020 02:06:59;U214.TC42_OP.F_CV;1.355001092;100.0 +25/10/2020 02:06:39;U214.TC42_PV.F_CV;179.949645996;100.0 +25/10/2020 02:06:25;U214.TC42_SP_MESURE.F_CV;180.000000000;100.0 +25/10/2020 02:06:09;U214.TC43_OP.F_CV;10.339512825;100.0 +25/10/2020 02:06:00;U214.TC43_PV.F_CV;179.964904785;100.0 +25/10/2020 02:06:26;U214.TC43_SP_MESURE.F_CV;180.000000000;100.0 +25/10/2020 02:06:59;U214.TC44_OP.F_CV;3.553826094;100.0 +25/10/2020 02:06:50;U214.TC44_PV.F_CV;180.010681152;100.0 +25/10/2020 02:06:24;U214.TC44_SP_MESURE.F_CV;180.000000000;100.0 +25/10/2020 02:06:20;U214.TC45_OP.F_CV;4.565499306;100.0 +25/10/2020 02:06:00;U214.TC45_PV.F_CV;179.896240234;100.0 +25/10/2020 02:06:26;U214.TC45_SP_MESURE.F_CV;180.000000000;100.0 +25/10/2020 02:06:00;U214.TC46_OP.F_CV;8.728160858;100.0 +25/10/2020 02:06:40;U214.TC46_PV.F_CV;179.957275391;100.0 +25/10/2020 02:06:22;U214.TC46_SP_MESURE.F_CV;180.000000000;100.0 +25/10/2020 02:06:39;U214.TC5_OP.F_CV;28.680856705;100.0 +25/10/2020 02:06:29;U214.TC5_PV.F_CV;90.949874878;100.0 +25/10/2020 02:06:42;U214.TC5_SP_MESURE.F_CV;80.000000000;100.0 +25/10/2020 02:06:29;U214.TC70_PV.F_CV;86.475929260;100.0 +25/10/2020 02:06:43;U214.TC70_SP_MESURE.F_CV;75.000000000;100.0 +25/10/2020 02:06:29;U214.TI10.F_CV;79.465934753;100.0 +25/10/2020 02:06:49;U214.TI10.F_CV;79.896240234;100.0 +25/10/2020 02:06:29;U214.TI11.F_CV;114.421302795;100.0 +25/10/2020 02:06:49;U214.TI12.F_CV;235.461959839;100.0 +25/10/2020 02:06:30;U214.TI13.F_CV;179.964904785;100.0 +25/10/2020 02:06:29;U214.TI14.F_CV;139.238571167;100.0 +25/10/2020 02:06:10;U214.TI15.F_CV;109.399559021;100.0 +25/10/2020 02:06:20;U214.TI16.F_CV;164.240478516;100.0 +25/10/2020 02:06:40;U214.TI17.F_CV;179.888610840;100.0 +25/10/2020 02:06:40;U214.TI18.F_CV;107.248031616;100.0 +25/10/2020 02:06:48;U214.TI21.F_CV;181.887542725;100.0 +25/10/2020 02:06:10;U214.TI22.F_CV;180.010681152;100.0 +25/10/2020 02:06:20;U214.TI23.F_CV;179.995422363;100.0 +25/10/2020 02:06:59;U214.TI24.F_CV;179.964904785;100.0 +25/10/2020 02:06:10;U214.TI25.F_CV;179.964904785;100.0 +25/10/2020 02:06:20;U214.TI26.F_CV;179.964904785;100.0 +25/10/2020 02:06:50;U214.TI31.F_CV;160.616470337;100.0 +25/10/2020 02:06:59;U214.TI32.F_CV;171.877624512;100.0 +25/10/2020 02:06:09;U214.TI33.F_CV;180.621047974;100.0 +25/10/2020 02:06:49;U214.TI34.F_CV;165.407791138;100.0 +25/10/2020 02:06:09;U214.TI35.F_CV;169.726104736;100.0 +25/10/2020 02:06:09;U214.TI36.F_CV;167.071029663;100.0 +25/10/2020 02:06:50;U214.TI41.F_CV;180.102233887;100.0 +25/10/2020 02:06:39;U214.TI42.F_CV;179.949645996;100.0 +25/10/2020 02:06:00;U214.TI43.F_CV;179.964904785;100.0 +25/10/2020 02:06:50;U214.TI44.F_CV;180.010681152;100.0 +25/10/2020 02:06:00;U214.TI45.F_CV;179.888610840;100.0 +25/10/2020 02:06:40;U214.TI46.F_CV;179.949645996;100.0 +25/10/2020 02:06:39;U214.TI51.F_CV;197.940032959;100.0 +25/10/2020 02:06:09;U214.TI52.F_CV;173.754486084;100.0 +25/10/2020 02:06:59;U214.TI53.F_CV;201.663238525;100.0 +25/10/2020 02:06:49;U214.TI54.F_CV;175.356674194;100.0 +25/10/2020 02:06:29;U214.TI55.F_CV;168.398559570;100.0 +25/10/2020 02:06:30;U214.TI56.F_CV;188.052185059;100.0 +25/10/2020 02:06:20;U214.TI61.F_CV;83.445487976;100.0 +25/10/2020 02:06:42;U214.TI62.F_CV;0.000000000;0.0 +25/10/2020 02:06:26;U214.TI75.F_CV;6.323338509;100.0 +25/10/2020 02:06:03;U214.TI91.F_CV;21.759365082;100.0 +25/10/2020 02:06:03;U214.TI92.F_CV;20.051879883;100.0 +25/10/2020 02:06:00;U214.U214_COEF_A_FI02.F_CV;1.045822859;100.0 +25/10/2020 02:06:00;U214.U214_COEF_A_FI30.F_CV;1.009796262;100.0 +25/10/2020 02:06:00;U214.U214_COEF_A_TI21.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U214.U214_COEF_A_TI22.F_CV;0.993316531;100.0 +25/10/2020 02:06:00;U214.U214_COEF_A_TI23.F_CV;1.002609253;100.0 +25/10/2020 02:06:00;U214.U214_COEF_A_TI24.F_CV;1.001693726;100.0 +25/10/2020 02:06:00;U214.U214_COEF_A_TI25.F_CV;1.000183105;100.0 +25/10/2020 02:06:00;U214.U214_COEF_A_TI26.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U214.U214_COEF_A_TI41.F_CV;1.004394650;100.0 +25/10/2020 02:06:00;U214.U214_COEF_A_TI42.F_CV;1.001785278;100.0 +25/10/2020 02:06:00;U214.U214_COEF_A_TI43.F_CV;1.004119992;100.0 +25/10/2020 02:06:00;U214.U214_COEF_A_TI44.F_CV;1.002380371;100.0 +25/10/2020 02:06:00;U214.U214_COEF_A_TI45.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U214.U214_COEF_A_TI46.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U214.U214_COEF_B_FI02.F_CV;10.000000000;100.0 +25/10/2020 02:06:00;U214.U214_COEF_B_FI30.F_CV;0.200961322;100.0 +25/10/2020 02:06:00;U214.U214_COEF_B_TI21.F_CV;-0.712748885;100.0 +25/10/2020 02:06:00;U214.U214_COEF_B_TI22.F_CV;1.728389382;100.0 +25/10/2020 02:06:00;U214.U214_COEF_B_TI23.F_CV;-1.586785674;100.0 +25/10/2020 02:06:00;U214.U214_COEF_B_TI24.F_CV;-1.223010659;100.0 +25/10/2020 02:06:00;U214.U214_COEF_B_TI25.F_CV;-0.641031504;100.0 +25/10/2020 02:06:00;U214.U214_COEF_B_TI26.F_CV;0.000152590;100.0 +25/10/2020 02:06:00;U214.U214_COEF_B_TI41.F_CV;-1.133897901;100.0 +25/10/2020 02:06:00;U214.U214_COEF_B_TI42.F_CV;-0.398413062;100.0 +25/10/2020 02:06:00;U214.U214_COEF_B_TI43.F_CV;-1.229419351;100.0 +25/10/2020 02:06:00;U214.U214_COEF_B_TI44.F_CV;-0.826886415;100.0 +25/10/2020 02:06:00;U214.U214_COEF_B_TI45.F_CV;0.000152590;100.0 +25/10/2020 02:06:00;U214.U214_COEF_B_TI46.F_CV;0.000152590;100.0 +25/10/2020 02:06:08;U214.WI2.F_CV;8.617990494;100.0 +25/10/2020 02:06:09;U214.WI2.F_CV;8.614938736;100.0 +25/10/2020 02:06:18;U214.WI2.F_CV;8.614938736;100.0 +25/10/2020 02:06:19;U214.WI2.F_CV;8.612192154;100.0 +25/10/2020 02:06:28;U214.WI2.F_CV;8.612192154;100.0 +25/10/2020 02:06:29;U214.WI2.F_CV;8.610055923;100.0 +25/10/2020 02:06:38;U214.WI2.F_CV;8.610055923;100.0 +25/10/2020 02:06:39;U214.WI2.F_CV;8.608224869;100.0 +25/10/2020 02:06:48;U214.WI2.F_CV;8.608224869;100.0 +25/10/2020 02:06:49;U214.WI2.F_CV;8.604562759;100.0 +25/10/2020 02:06:58;U214.WI2.F_CV;8.604562759;100.0 +25/10/2020 02:06:59;U214.WI2.F_CV;8.600290298;100.0 +25/10/2020 02:06:08;U214.WI3.F_CV;13.897459030;100.0 +25/10/2020 02:06:09;U214.WI3.F_CV;13.897001266;100.0 +25/10/2020 02:06:18;U214.WI3.F_CV;13.897001266;100.0 +25/10/2020 02:06:19;U214.WI3.F_CV;13.896085739;100.0 +25/10/2020 02:06:28;U214.WI3.F_CV;13.896085739;100.0 +25/10/2020 02:06:29;U214.WI3.F_CV;13.894254684;100.0 +25/10/2020 02:06:38;U214.WI3.F_CV;13.894254684;100.0 +25/10/2020 02:06:39;U214.WI3.F_CV;13.893339157;100.0 +25/10/2020 02:06:48;U214.WI3.F_CV;13.893339157;100.0 +25/10/2020 02:06:49;U214.WI3.F_CV;13.892881393;100.0 +25/10/2020 02:06:42;U217.AGE.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U217.DELTAP.F_CV;0.715037763;100.0 +25/10/2020 02:06:20;U217.DELTAP.F_CV;0.672312498;100.0 +25/10/2020 02:06:25;U217.DELTAP.F_CV;0.672312498;100.0 +25/10/2020 02:06:26;U217.DELTAP.F_CV;0.723582804;100.0 +25/10/2020 02:06:56;U217.DELTAP.F_CV;0.803845286;100.0 +25/10/2020 02:06:02;U217.DTIX22A.F_CV;0.301365674;100.0 +25/10/2020 02:06:14;U217.DTIX22A.F_CV;0.251010925;100.0 +25/10/2020 02:06:20;U217.DTIX22B.F_CV;-0.325780123;100.0 +25/10/2020 02:06:32;U217.DTIX22B.F_CV;-0.251010925;100.0 +25/10/2020 02:06:50;U217.DTIX22B.F_CV;-0.376134902;100.0 +25/10/2020 02:06:44;U217.DTIX23A.F_CV;2.379644394;100.0 +25/10/2020 02:06:08;U217.DTIX23B.F_CV;-0.099946596;100.0 +25/10/2020 02:06:38;U217.DTIX23B.F_CV;0.000762951;100.0 +25/10/2020 02:06:50;U217.DTIX23B.F_CV;-0.049591821;100.0 +25/10/2020 02:06:42;U217.FC122_OP.F_CV;74.999618530;100.0 +25/10/2020 02:06:42;U217.FC122_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U217.FC122_SP.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U217.FC201_OP.F_CV;15.915160179;100.0 +25/10/2020 02:06:44;U217.FC201_OP.F_CV;15.841916084;100.0 +25/10/2020 02:06:02;U217.FC201_PV.F_CV;250.553146362;100.0 +25/10/2020 02:06:08;U217.FC201_SP.F_CV;250.003814697;100.0 +25/10/2020 02:06:32;U217.FC213_OP.F_CV;87.866027832;100.0 +25/10/2020 02:06:14;U217.FC213_PV.F_CV;792.904541016;100.0 +25/10/2020 02:06:38;U217.FC213_PV.F_CV;797.848449707;100.0 +25/10/2020 02:06:42;U217.FC213_SP.F_CV;800.000000000;100.0 +25/10/2020 02:06:02;U217.FC236_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U217.FC236_PV.F_CV;241.361099243;100.0 +25/10/2020 02:06:02;U217.FC236_PV.F_CV;236.246276855;100.0 +25/10/2020 02:06:08;U217.FC236_PV.F_CV;234.927902222;100.0 +25/10/2020 02:06:13;U217.FC236_PV.F_CV;234.927902222;100.0 +25/10/2020 02:06:14;U217.FC236_PV.F_CV;239.371322632;100.0 +25/10/2020 02:06:19;U217.FC236_PV.F_CV;239.371322632;100.0 +25/10/2020 02:06:20;U217.FC236_PV.F_CV;242.972457886;100.0 +25/10/2020 02:06:25;U217.FC236_PV.F_CV;242.972457886;100.0 +25/10/2020 02:06:26;U217.FC236_PV.F_CV;237.979705811;100.0 +25/10/2020 02:06:31;U217.FC236_PV.F_CV;237.979705811;100.0 +25/10/2020 02:06:32;U217.FC236_PV.F_CV;233.536285400;100.0 +25/10/2020 02:06:37;U217.FC236_PV.F_CV;233.536285400;100.0 +25/10/2020 02:06:38;U217.FC236_PV.F_CV;238.236053467;100.0 +25/10/2020 02:06:43;U217.FC236_PV.F_CV;238.236053467;100.0 +25/10/2020 02:06:44;U217.FC236_PV.F_CV;244.705886841;100.0 +25/10/2020 02:06:49;U217.FC236_PV.F_CV;244.705886841;100.0 +25/10/2020 02:06:50;U217.FC236_PV.F_CV;246.585800171;100.0 +25/10/2020 02:06:55;U217.FC236_PV.F_CV;246.585800171;100.0 +25/10/2020 02:06:56;U217.FC236_PV.F_CV;242.105743408;100.0 +25/10/2020 02:06:02;U217.FC236_SP.F_CV;200.003051758;100.0 +25/10/2020 02:06:42;U217.FC269_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:42;U217.FC269_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U217.FC269_SP.F_CV;0.430006862;100.0 +25/10/2020 02:06:14;U217.FC299_OP.F_CV;58.519874573;100.0 +25/10/2020 02:06:56;U217.FC299_OP.F_CV;58.324558258;100.0 +25/10/2020 02:06:07;U217.FC299_PV.F_CV;502.403289795;100.0 +25/10/2020 02:06:08;U217.FC299_PV.F_CV;500.343322754;100.0 +25/10/2020 02:06:13;U217.FC299_PV.F_CV;500.343322754;100.0 +25/10/2020 02:06:14;U217.FC299_PV.F_CV;498.191802979;100.0 +25/10/2020 02:06:26;U217.FC299_PV.F_CV;499.427795410;100.0 +25/10/2020 02:06:38;U217.FC299_PV.F_CV;498.008697510;100.0 +25/10/2020 02:06:49;U217.FC299_PV.F_CV;498.008697510;100.0 +25/10/2020 02:06:50;U217.FC299_PV.F_CV;500.205993652;100.0 +25/10/2020 02:06:55;U217.FC299_PV.F_CV;500.205993652;100.0 +25/10/2020 02:06:56;U217.FC299_PV.F_CV;502.952606201;100.0 +25/10/2020 02:06:14;U217.FC299_SP.F_CV;500.022888184;100.0 +25/10/2020 02:06:44;U217.FC322_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U217.FC322_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U217.FC322_SP.F_CV;3.000000000;100.0 +25/10/2020 02:06:44;U217.FC416_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U217.FC416_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U217.FC416_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U217.FC421_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U217.FC421_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U217.FC421_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U217.FC603_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U217.FC603_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U217.FC603_SP.F_CV;249.988555908;100.0 +25/10/2020 02:06:44;U217.FC604_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U217.FC604_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U217.FC604_SP.F_CV;80.018310547;100.0 +25/10/2020 02:06:42;U217.FC608_OP.F_CV;20.000000000;100.0 +25/10/2020 02:06:44;U217.FC608_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U217.FC608_SP.F_CV;250.003814697;100.0 +25/10/2020 02:06:44;U217.FC609_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U217.FC609_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U217.FC609_SP.F_CV;900.006408691;100.0 +25/10/2020 02:06:44;U217.FC610_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U217.FC610_PV.F_CV;6.317234993;100.0 +25/10/2020 02:06:08;U217.FC610_PV.F_CV;7.995727539;100.0 +25/10/2020 02:06:44;U217.FC610_PV.F_CV;5.951018333;100.0 +25/10/2020 02:06:55;U217.FC610_PV.F_CV;5.951018333;100.0 +25/10/2020 02:06:56;U217.FC610_PV.F_CV;7.293812275;100.0 +25/10/2020 02:06:42;U217.FC610_SP.F_CV;449.988555908;100.0 +25/10/2020 02:06:44;U217.FI01.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U217.FI116.F_CV;0.058365759;100.0 +25/10/2020 02:06:02;U217.FI116.F_CV;0.073548488;100.0 +25/10/2020 02:06:08;U217.FI116.F_CV;0.080415048;100.0 +25/10/2020 02:06:26;U217.FI116.F_CV;0.070878156;100.0 +25/10/2020 02:06:32;U217.FI116.F_CV;0.077134356;100.0 +25/10/2020 02:06:37;U217.FI116.F_CV;0.077134356;100.0 +25/10/2020 02:06:38;U217.FI116.F_CV;0.093385212;100.0 +25/10/2020 02:06:43;U217.FI116.F_CV;0.093385212;100.0 +25/10/2020 02:06:44;U217.FI116.F_CV;0.113221943;100.0 +25/10/2020 02:06:49;U217.FI116.F_CV;0.113221943;100.0 +25/10/2020 02:06:50;U217.FI116.F_CV;0.135576412;100.0 +25/10/2020 02:06:55;U217.FI116.F_CV;0.135576412;100.0 +25/10/2020 02:06:56;U217.FI116.F_CV;0.152742803;100.0 +25/10/2020 02:06:56;U217.FI116/116C.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U217.FI116C.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U217.FI122.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U217.FI149.F_CV;1300.618041992;100.0 +25/10/2020 02:06:56;U217.FI149.F_CV;1304.707397461;100.0 +25/10/2020 02:06:01;U217.FI150.F_CV;21.911954880;100.0 +25/10/2020 02:06:02;U217.FI150.F_CV;22.206455231;100.0 +25/10/2020 02:06:07;U217.FI150.F_CV;22.206455231;100.0 +25/10/2020 02:06:08;U217.FI150.F_CV;22.598611832;100.0 +25/10/2020 02:06:13;U217.FI150.F_CV;22.598611832;100.0 +25/10/2020 02:06:14;U217.FI150.F_CV;22.995346069;100.0 +25/10/2020 02:06:19;U217.FI150.F_CV;22.995346069;100.0 +25/10/2020 02:06:20;U217.FI150.F_CV;22.607767105;100.0 +25/10/2020 02:06:26;U217.FI150.F_CV;22.433813095;100.0 +25/10/2020 02:06:37;U217.FI150.F_CV;22.491798401;100.0 +25/10/2020 02:06:38;U217.FI150.F_CV;22.923627853;100.0 +25/10/2020 02:06:49;U217.FI150.F_CV;22.923627853;100.0 +25/10/2020 02:06:50;U217.FI150.F_CV;22.455177307;100.0 +25/10/2020 02:06:55;U217.FI150.F_CV;22.455177307;100.0 +25/10/2020 02:06:56;U217.FI150.F_CV;22.143892288;100.0 +25/10/2020 02:06:08;U217.FI201.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U217.FI213.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U217.FI236.F_CV;241.359573364;100.0 +25/10/2020 02:06:02;U217.FI236.F_CV;236.243988037;100.0 +25/10/2020 02:06:08;U217.FI236.F_CV;234.927902222;100.0 +25/10/2020 02:06:13;U217.FI236.F_CV;234.927902222;100.0 +25/10/2020 02:06:14;U217.FI236.F_CV;239.368270874;100.0 +25/10/2020 02:06:19;U217.FI236.F_CV;239.368270874;100.0 +25/10/2020 02:06:20;U217.FI236.F_CV;242.973220825;100.0 +25/10/2020 02:06:25;U217.FI236.F_CV;242.973220825;100.0 +25/10/2020 02:06:26;U217.FI236.F_CV;237.983520508;100.0 +25/10/2020 02:06:31;U217.FI236.F_CV;237.983520508;100.0 +25/10/2020 02:06:32;U217.FI236.F_CV;233.611816406;100.0 +25/10/2020 02:06:37;U217.FI236.F_CV;233.611816406;100.0 +25/10/2020 02:06:38;U217.FI236.F_CV;238.235290527;100.0 +25/10/2020 02:06:43;U217.FI236.F_CV;238.235290527;100.0 +25/10/2020 02:06:44;U217.FI236.F_CV;244.426635742;100.0 +25/10/2020 02:06:49;U217.FI236.F_CV;244.426635742;100.0 +25/10/2020 02:06:50;U217.FI236.F_CV;246.578170776;100.0 +25/10/2020 02:06:55;U217.FI236.F_CV;246.578170776;100.0 +25/10/2020 02:06:56;U217.FI236.F_CV;242.103454590;100.0 +25/10/2020 02:06:42;U217.FI269.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U217.FI276/276C.F_CV;0.000534066;100.0 +25/10/2020 02:06:50;U217.FI276C.F_CV;0.008026246;100.0 +25/10/2020 02:06:01;U217.FI296.F_CV;1053.147216797;100.0 +25/10/2020 02:06:02;U217.FI296.F_CV;1221.149047852;100.0 +25/10/2020 02:06:07;U217.FI296.F_CV;1221.149047852;100.0 +25/10/2020 02:06:08;U217.FI296.F_CV;1340.352539063;100.0 +25/10/2020 02:06:13;U217.FI296.F_CV;1340.352539063;100.0 +25/10/2020 02:06:14;U217.FI296.F_CV;1432.089721680;100.0 +25/10/2020 02:06:19;U217.FI296.F_CV;1432.089721680;100.0 +25/10/2020 02:06:20;U217.FI296.F_CV;1496.223388672;100.0 +25/10/2020 02:06:25;U217.FI296.F_CV;1496.223388672;100.0 +25/10/2020 02:06:26;U217.FI296.F_CV;1537.972045898;100.0 +25/10/2020 02:06:31;U217.FI296.F_CV;1537.972045898;100.0 +25/10/2020 02:06:32;U217.FI296.F_CV;1511.924926758;100.0 +25/10/2020 02:06:37;U217.FI296.F_CV;1511.924926758;100.0 +25/10/2020 02:06:38;U217.FI296.F_CV;1497.505126953;100.0 +25/10/2020 02:06:43;U217.FI296.F_CV;1497.505126953;100.0 +25/10/2020 02:06:44;U217.FI296.F_CV;1426.871093750;100.0 +25/10/2020 02:06:49;U217.FI296.F_CV;1426.871093750;100.0 +25/10/2020 02:06:50;U217.FI296.F_CV;1325.474975586;100.0 +25/10/2020 02:06:55;U217.FI296.F_CV;1325.474975586;100.0 +25/10/2020 02:06:56;U217.FI296.F_CV;1188.510009766;100.0 +25/10/2020 02:06:44;U217.FI313.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U217.FI322.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U217.FI416.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U217.FI421.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U217.FI423.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U217.FI603.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U217.FI604.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U217.FI608.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U217.FI609.F_CV;0.000000000;0.0 +25/10/2020 02:06:07;U217.FI610.F_CV;6.317234993;100.0 +25/10/2020 02:06:08;U217.FI610.F_CV;7.995727539;100.0 +25/10/2020 02:06:44;U217.FI610.F_CV;5.951018333;100.0 +25/10/2020 02:06:55;U217.FI610.F_CV;5.951018333;100.0 +25/10/2020 02:06:56;U217.FI610.F_CV;7.293812275;100.0 +25/10/2020 02:06:28;U217.FQ296.F_CV;215762.546875000;100.0 +25/10/2020 02:06:42;U217.FQ296E.F_CV;8850.231445313;100.0 +25/10/2020 02:06:04;U217.FQ423.F_CV;171663.984375000;100.0 +25/10/2020 02:06:19;U217.FQ423E.F_CV;5035.476562500;100.0 +25/10/2020 02:06:44;U217.LC214_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U217.LC214_PV.F_CV;100.000000000;100.0 +25/10/2020 02:06:42;U217.LC214_SP.F_CV;88.000305176;100.0 +25/10/2020 02:06:42;U217.LC249_OP.F_CV;60.000000000;100.0 +25/10/2020 02:06:58;U217.LC249_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U217.LC249_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:44;U217.LC282_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U217.LC282_PV.F_CV;45.696193695;100.0 +25/10/2020 02:06:42;U217.LC282_SP.F_CV;40.000000000;100.0 +25/10/2020 02:06:44;U217.LC283_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U217.LC283_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U217.LC283_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:42;U217.LC291_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U217.LC291_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U217.LC291_SP.F_CV;80.999465942;100.0 +25/10/2020 02:06:44;U217.LC311_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U217.LC311_PV.F_CV;100.000000000;100.0 +25/10/2020 02:06:42;U217.LC311_SP.F_CV;45.000381470;100.0 +25/10/2020 02:06:44;U217.LC321_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U217.LC321_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U217.LC321_SP.F_CV;65.000381470;100.0 +25/10/2020 02:06:44;U217.LC324_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U217.LC324_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U217.LC324_SP.F_CV;65.000381470;100.0 +25/10/2020 02:06:44;U217.LC330_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U217.LC330_PV.F_CV;13.823147774;100.0 +25/10/2020 02:06:20;U217.LC330_PV.F_CV;13.931487083;100.0 +25/10/2020 02:06:55;U217.LC330_PV.F_CV;13.846036911;100.0 +25/10/2020 02:06:56;U217.LC330_PV.F_CV;13.469139099;100.0 +25/10/2020 02:06:42;U217.LC330_SP.F_CV;70.000762939;100.0 +25/10/2020 02:06:44;U217.LC331_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U217.LC331_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U217.LC331_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:44;U217.LC508_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U217.LC508_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U217.LC508_SP.F_CV;50.000762939;100.0 +25/10/2020 02:06:08;U217.LI112.F_CV;42.641338348;100.0 +25/10/2020 02:06:42;U217.LI214.F_CV;100.000000000;100.0 +25/10/2020 02:06:58;U217.LI249.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U217.LI273.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U217.LI274.F_CV;28.299381256;100.0 +25/10/2020 02:06:56;U217.LI282.F_CV;45.700771332;100.0 +25/10/2020 02:06:02;U217.LI283.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U217.LI295.F_CV;34.612037659;100.0 +25/10/2020 02:06:20;U217.LI295.F_CV;34.424354553;100.0 +25/10/2020 02:06:25;U217.LI295.F_CV;34.424354553;100.0 +25/10/2020 02:06:26;U217.LI295.F_CV;34.042877197;100.0 +25/10/2020 02:06:44;U217.LI295.F_CV;33.704128265;100.0 +25/10/2020 02:06:42;U217.LI311.F_CV;100.000000000;100.0 +25/10/2020 02:06:42;U217.LI321.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U217.LI324.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U217.LI330.F_CV;13.823147774;100.0 +25/10/2020 02:06:20;U217.LI330.F_CV;13.931487083;100.0 +25/10/2020 02:06:44;U217.LI330.F_CV;13.846036911;100.0 +25/10/2020 02:06:44;U217.LI331.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U217.LI508.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U217.PC279_OP.F_CV;4.879835129;100.0 +25/10/2020 02:06:02;U217.PC279_OP.F_CV;9.005874634;100.0 +25/10/2020 02:06:07;U217.PC279_OP.F_CV;9.005874634;100.0 +25/10/2020 02:06:08;U217.PC279_OP.F_CV;10.836956978;100.0 +25/10/2020 02:06:13;U217.PC279_OP.F_CV;10.836956978;100.0 +25/10/2020 02:06:14;U217.PC279_OP.F_CV;7.785152912;100.0 +25/10/2020 02:06:25;U217.PC279_OP.F_CV;7.785152912;100.0 +25/10/2020 02:06:26;U217.PC279_OP.F_CV;5.612268448;100.0 +25/10/2020 02:06:31;U217.PC279_OP.F_CV;5.612268448;100.0 +25/10/2020 02:06:32;U217.PC279_OP.F_CV;9.811551094;100.0 +25/10/2020 02:06:37;U217.PC279_OP.F_CV;9.811551094;100.0 +25/10/2020 02:06:38;U217.PC279_OP.F_CV;9.567406654;100.0 +25/10/2020 02:06:43;U217.PC279_OP.F_CV;9.567406654;100.0 +25/10/2020 02:06:44;U217.PC279_OP.F_CV;4.831006527;100.0 +25/10/2020 02:06:56;U217.PC279_OP.F_CV;4.635690689;100.0 +25/10/2020 02:06:00;U217.PC279_PV.F_CV;155.930419922;100.0 +25/10/2020 02:06:01;U217.PC279_PV.F_CV;155.930419922;100.0 +25/10/2020 02:06:02;U217.PC279_PV.F_CV;156.072326660;100.0 +25/10/2020 02:06:03;U217.PC279_PV.F_CV;156.072326660;100.0 +25/10/2020 02:06:04;U217.PC279_PV.F_CV;156.072326660;100.0 +25/10/2020 02:06:05;U217.PC279_PV.F_CV;156.072326660;100.0 +25/10/2020 02:06:06;U217.PC279_PV.F_CV;156.072326660;100.0 +25/10/2020 02:06:07;U217.PC279_PV.F_CV;156.072326660;100.0 +25/10/2020 02:06:08;U217.PC279_PV.F_CV;156.140991211;100.0 +25/10/2020 02:06:09;U217.PC279_PV.F_CV;156.140991211;100.0 +25/10/2020 02:06:10;U217.PC279_PV.F_CV;156.140991211;100.0 +25/10/2020 02:06:11;U217.PC279_PV.F_CV;156.140991211;100.0 +25/10/2020 02:06:12;U217.PC279_PV.F_CV;156.140991211;100.0 +25/10/2020 02:06:13;U217.PC279_PV.F_CV;156.140991211;100.0 +25/10/2020 02:06:14;U217.PC279_PV.F_CV;156.017395020;100.0 +25/10/2020 02:06:15;U217.PC279_PV.F_CV;156.017395020;100.0 +25/10/2020 02:06:16;U217.PC279_PV.F_CV;156.017395020;100.0 +25/10/2020 02:06:17;U217.PC279_PV.F_CV;156.017395020;100.0 +25/10/2020 02:06:18;U217.PC279_PV.F_CV;156.017395020;100.0 +25/10/2020 02:06:19;U217.PC279_PV.F_CV;156.017395020;100.0 +25/10/2020 02:06:20;U217.PC279_PV.F_CV;155.875488281;100.0 +25/10/2020 02:06:21;U217.PC279_PV.F_CV;155.875488281;100.0 +25/10/2020 02:06:22;U217.PC279_PV.F_CV;155.875488281;100.0 +25/10/2020 02:06:23;U217.PC279_PV.F_CV;155.875488281;100.0 +25/10/2020 02:06:24;U217.PC279_PV.F_CV;155.875488281;100.0 +25/10/2020 02:06:25;U217.PC279_PV.F_CV;155.875488281;100.0 +25/10/2020 02:06:26;U217.PC279_PV.F_CV;156.003662109;100.0 +25/10/2020 02:06:27;U217.PC279_PV.F_CV;156.003662109;100.0 +25/10/2020 02:06:28;U217.PC279_PV.F_CV;156.003662109;100.0 +25/10/2020 02:06:29;U217.PC279_PV.F_CV;156.003662109;100.0 +25/10/2020 02:06:30;U217.PC279_PV.F_CV;156.003662109;100.0 +25/10/2020 02:06:31;U217.PC279_PV.F_CV;156.003662109;100.0 +25/10/2020 02:06:32;U217.PC279_PV.F_CV;156.140991211;100.0 +25/10/2020 02:06:33;U217.PC279_PV.F_CV;156.140991211;100.0 +25/10/2020 02:06:34;U217.PC279_PV.F_CV;156.140991211;100.0 +25/10/2020 02:06:35;U217.PC279_PV.F_CV;156.140991211;100.0 +25/10/2020 02:06:36;U217.PC279_PV.F_CV;156.140991211;100.0 +25/10/2020 02:06:37;U217.PC279_PV.F_CV;156.140991211;100.0 +25/10/2020 02:06:38;U217.PC279_PV.F_CV;156.072326660;100.0 +25/10/2020 02:06:39;U217.PC279_PV.F_CV;156.072326660;100.0 +25/10/2020 02:06:40;U217.PC279_PV.F_CV;156.072326660;100.0 +25/10/2020 02:06:41;U217.PC279_PV.F_CV;156.072326660;100.0 +25/10/2020 02:06:42;U217.PC279_PV.F_CV;156.072326660;100.0 +25/10/2020 02:06:43;U217.PC279_PV.F_CV;156.072326660;100.0 +25/10/2020 02:06:44;U217.PC279_PV.F_CV;155.875488281;100.0 +25/10/2020 02:06:45;U217.PC279_PV.F_CV;155.875488281;100.0 +25/10/2020 02:06:46;U217.PC279_PV.F_CV;155.875488281;100.0 +25/10/2020 02:06:47;U217.PC279_PV.F_CV;155.875488281;100.0 +25/10/2020 02:06:48;U217.PC279_PV.F_CV;155.875488281;100.0 +25/10/2020 02:06:49;U217.PC279_PV.F_CV;155.875488281;100.0 +25/10/2020 02:06:50;U217.PC279_PV.F_CV;155.738159180;100.0 +25/10/2020 02:06:51;U217.PC279_PV.F_CV;155.738159180;100.0 +25/10/2020 02:06:52;U217.PC279_PV.F_CV;155.738159180;100.0 +25/10/2020 02:06:53;U217.PC279_PV.F_CV;155.738159180;100.0 +25/10/2020 02:06:54;U217.PC279_PV.F_CV;155.738159180;100.0 +25/10/2020 02:06:55;U217.PC279_PV.F_CV;155.738159180;100.0 +25/10/2020 02:06:56;U217.PC279_PV.F_CV;155.875488281;100.0 +25/10/2020 02:06:57;U217.PC279_PV.F_CV;155.875488281;100.0 +25/10/2020 02:06:58;U217.PC279_PV.F_CV;155.875488281;100.0 +25/10/2020 02:06:59;U217.PC279_PV.F_CV;155.875488281;100.0 +25/10/2020 02:06:02;U217.PC279_SP.F_CV;155.999084473;100.0 +25/10/2020 02:06:01;U217.PC296_OP.F_CV;62.645915985;100.0 +25/10/2020 02:06:02;U217.PC296_OP.F_CV;66.576637268;100.0 +25/10/2020 02:06:07;U217.PC296_OP.F_CV;66.576637268;100.0 +25/10/2020 02:06:08;U217.PC296_OP.F_CV;68.773941040;100.0 +25/10/2020 02:06:13;U217.PC296_OP.F_CV;68.773941040;100.0 +25/10/2020 02:06:14;U217.PC296_OP.F_CV;69.042495728;100.0 +25/10/2020 02:06:19;U217.PC296_OP.F_CV;69.042495728;100.0 +25/10/2020 02:06:20;U217.PC296_OP.F_CV;67.333488464;100.0 +25/10/2020 02:06:25;U217.PC296_OP.F_CV;67.333488464;100.0 +25/10/2020 02:06:26;U217.PC296_OP.F_CV;64.379341125;100.0 +25/10/2020 02:06:31;U217.PC296_OP.F_CV;64.379341125;100.0 +25/10/2020 02:06:32;U217.PC296_OP.F_CV;59.227893829;100.0 +25/10/2020 02:06:37;U217.PC296_OP.F_CV;59.227893829;100.0 +25/10/2020 02:06:38;U217.PC296_OP.F_CV;52.611579895;100.0 +25/10/2020 02:06:43;U217.PC296_OP.F_CV;52.611579895;100.0 +25/10/2020 02:06:44;U217.PC296_OP.F_CV;46.311130524;100.0 +25/10/2020 02:06:49;U217.PC296_OP.F_CV;46.311130524;100.0 +25/10/2020 02:06:50;U217.PC296_OP.F_CV;38.132297516;100.0 +25/10/2020 02:06:55;U217.PC296_OP.F_CV;38.132297516;100.0 +25/10/2020 02:06:56;U217.PC296_OP.F_CV;29.684900284;100.0 +25/10/2020 02:06:00;U217.PC296_PV.F_CV;160.613418579;100.0 +25/10/2020 02:06:01;U217.PC296_PV.F_CV;160.613418579;100.0 +25/10/2020 02:06:02;U217.PC296_PV.F_CV;160.416564941;100.0 +25/10/2020 02:06:03;U217.PC296_PV.F_CV;160.416564941;100.0 +25/10/2020 02:06:04;U217.PC296_PV.F_CV;160.416564941;100.0 +25/10/2020 02:06:05;U217.PC296_PV.F_CV;160.416564941;100.0 +25/10/2020 02:06:06;U217.PC296_PV.F_CV;160.416564941;100.0 +25/10/2020 02:06:07;U217.PC296_PV.F_CV;160.416564941;100.0 +25/10/2020 02:06:08;U217.PC296_PV.F_CV;160.201416016;100.0 +25/10/2020 02:06:09;U217.PC296_PV.F_CV;160.201416016;100.0 +25/10/2020 02:06:10;U217.PC296_PV.F_CV;160.201416016;100.0 +25/10/2020 02:06:11;U217.PC296_PV.F_CV;160.201416016;100.0 +25/10/2020 02:06:12;U217.PC296_PV.F_CV;160.201416016;100.0 +25/10/2020 02:06:13;U217.PC296_PV.F_CV;160.201416016;100.0 +25/10/2020 02:06:14;U217.PC296_PV.F_CV;159.972534180;100.0 +25/10/2020 02:06:15;U217.PC296_PV.F_CV;159.972534180;100.0 +25/10/2020 02:06:16;U217.PC296_PV.F_CV;159.972534180;100.0 +25/10/2020 02:06:17;U217.PC296_PV.F_CV;159.972534180;100.0 +25/10/2020 02:06:18;U217.PC296_PV.F_CV;159.972534180;100.0 +25/10/2020 02:06:19;U217.PC296_PV.F_CV;159.972534180;100.0 +25/10/2020 02:06:20;U217.PC296_PV.F_CV;159.725341797;100.0 +25/10/2020 02:06:21;U217.PC296_PV.F_CV;159.725341797;100.0 +25/10/2020 02:06:22;U217.PC296_PV.F_CV;159.725341797;100.0 +25/10/2020 02:06:23;U217.PC296_PV.F_CV;159.725341797;100.0 +25/10/2020 02:06:24;U217.PC296_PV.F_CV;159.725341797;100.0 +25/10/2020 02:06:25;U217.PC296_PV.F_CV;159.725341797;100.0 +25/10/2020 02:06:26;U217.PC296_PV.F_CV;159.528503418;100.0 +25/10/2020 02:06:27;U217.PC296_PV.F_CV;159.528503418;100.0 +25/10/2020 02:06:28;U217.PC296_PV.F_CV;159.528503418;100.0 +25/10/2020 02:06:29;U217.PC296_PV.F_CV;159.528503418;100.0 +25/10/2020 02:06:30;U217.PC296_PV.F_CV;159.528503418;100.0 +25/10/2020 02:06:31;U217.PC296_PV.F_CV;159.528503418;100.0 +25/10/2020 02:06:32;U217.PC296_PV.F_CV;159.327072144;100.0 +25/10/2020 02:06:33;U217.PC296_PV.F_CV;159.327072144;100.0 +25/10/2020 02:06:34;U217.PC296_PV.F_CV;159.327072144;100.0 +25/10/2020 02:06:35;U217.PC296_PV.F_CV;159.327072144;100.0 +25/10/2020 02:06:36;U217.PC296_PV.F_CV;159.327072144;100.0 +25/10/2020 02:06:37;U217.PC296_PV.F_CV;159.327072144;100.0 +25/10/2020 02:06:38;U217.PC296_PV.F_CV;159.176010132;100.0 +25/10/2020 02:06:39;U217.PC296_PV.F_CV;159.176010132;100.0 +25/10/2020 02:06:40;U217.PC296_PV.F_CV;159.176010132;100.0 +25/10/2020 02:06:41;U217.PC296_PV.F_CV;159.176010132;100.0 +25/10/2020 02:06:42;U217.PC296_PV.F_CV;159.176010132;100.0 +25/10/2020 02:06:43;U217.PC296_PV.F_CV;159.176010132;100.0 +25/10/2020 02:06:44;U217.PC296_PV.F_CV;159.079879761;100.0 +25/10/2020 02:06:45;U217.PC296_PV.F_CV;159.079879761;100.0 +25/10/2020 02:06:46;U217.PC296_PV.F_CV;159.079879761;100.0 +25/10/2020 02:06:47;U217.PC296_PV.F_CV;159.079879761;100.0 +25/10/2020 02:06:48;U217.PC296_PV.F_CV;159.079879761;100.0 +25/10/2020 02:06:49;U217.PC296_PV.F_CV;159.079879761;100.0 +25/10/2020 02:06:50;U217.PC296_PV.F_CV;159.020370483;100.0 +25/10/2020 02:06:51;U217.PC296_PV.F_CV;159.020370483;100.0 +25/10/2020 02:06:52;U217.PC296_PV.F_CV;159.020370483;100.0 +25/10/2020 02:06:53;U217.PC296_PV.F_CV;159.020370483;100.0 +25/10/2020 02:06:54;U217.PC296_PV.F_CV;159.020370483;100.0 +25/10/2020 02:06:55;U217.PC296_PV.F_CV;159.020370483;100.0 +25/10/2020 02:06:56;U217.PC296_PV.F_CV;158.983749390;100.0 +25/10/2020 02:06:57;U217.PC296_PV.F_CV;158.983749390;100.0 +25/10/2020 02:06:58;U217.PC296_PV.F_CV;158.983749390;100.0 +25/10/2020 02:06:59;U217.PC296_PV.F_CV;158.983749390;100.0 +25/10/2020 02:06:44;U217.PC296_SP.F_CV;160.000000000;100.0 +25/10/2020 02:06:44;U217.PC326_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U217.PC326_PV.F_CV;15.000000000;100.0 +25/10/2020 02:06:44;U217.PC326_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U217.PC332_OP.F_CV;73.559165955;100.0 +25/10/2020 02:06:19;U217.PC332_OP.F_CV;73.461509705;100.0 +25/10/2020 02:06:20;U217.PC332_OP.F_CV;73.241775513;100.0 +25/10/2020 02:06:26;U217.PC332_OP.F_CV;73.144119263;100.0 +25/10/2020 02:06:32;U217.PC332_OP.F_CV;73.266197205;100.0 +25/10/2020 02:06:44;U217.PC332_OP.F_CV;73.339439392;100.0 +25/10/2020 02:06:20;U217.PC332_PV.F_CV;0.997024477;100.0 +25/10/2020 02:06:42;U217.PC332_SP.F_CV;1.000015259;100.0 +25/10/2020 02:06:14;U217.PDI250.F_CV;0.743114352;100.0 +25/10/2020 02:06:38;U217.PDI250.F_CV;0.727244973;100.0 +25/10/2020 02:06:07;U217.PDI288.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U217.PDI341.F_CV;0.200000003;100.0 +25/10/2020 02:06:42;U217.PDI343.F_CV;0.001355001;100.0 +25/10/2020 02:06:42;U217.PESCYC.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U217.PI213.F_CV;159.926757813;100.0 +25/10/2020 02:06:02;U217.PI279.F_CV;156.072326660;100.0 +25/10/2020 02:06:20;U217.PI279.F_CV;155.875488281;100.0 +25/10/2020 02:06:32;U217.PI279.F_CV;156.140991211;100.0 +25/10/2020 02:06:44;U217.PI279.F_CV;155.875488281;100.0 +25/10/2020 02:06:56;U217.PI325.F_CV;964.316772461;100.0 +25/10/2020 02:06:42;U217.PI326.F_CV;15.000000000;100.0 +25/10/2020 02:06:20;U217.PI332.F_CV;0.997024477;100.0 +25/10/2020 02:06:44;U217.PI510.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U217.TC106_OP.F_CV;23.228809357;100.0 +25/10/2020 02:06:32;U217.TC106_OP.F_CV;23.472953796;100.0 +25/10/2020 02:06:50;U217.TC106_OP.F_CV;23.334096909;100.0 +25/10/2020 02:06:08;U217.TC106_PV.F_CV;150.026702881;100.0 +25/10/2020 02:06:14;U217.TC106_SP.F_CV;150.003814697;100.0 +25/10/2020 02:06:02;U217.TC111_OP.F_CV;34.999618530;100.0 +25/10/2020 02:06:02;U217.TC111_PV.F_CV;112.096588135;100.0 +25/10/2020 02:06:01;U217.TC111_SP.F_CV;140.001525879;100.0 +25/10/2020 02:06:44;U217.TC122_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U217.TC122_PV.F_CV;141.035324097;100.0 +25/10/2020 02:06:42;U217.TC122_SP.F_CV;55.271991730;100.0 +25/10/2020 02:06:42;U217.TC125_OP.F_CV;20.000000000;100.0 +25/10/2020 02:06:26;U217.TC125_PV.F_CV;86.942092896;100.0 +25/10/2020 02:06:42;U217.TC125_SP.F_CV;94.106201172;100.0 +25/10/2020 02:06:08;U217.TC128_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U217.TC128_PV.F_CV;144.151977539;100.0 +25/10/2020 02:06:19;U217.TC128_SP.F_CV;119.996948242;100.0 +25/10/2020 02:06:42;U217.TC130_OP.F_CV;70.000762939;100.0 +25/10/2020 02:06:42;U217.TC130_PV.F_CV;28.561073303;100.0 +25/10/2020 02:06:01;U217.TC130_SP.F_CV;28.614480972;100.0 +25/10/2020 02:06:02;U217.TC132_OP.F_CV;20.141908646;100.0 +25/10/2020 02:06:55;U217.TC132_OP.F_CV;20.263980865;100.0 +25/10/2020 02:06:56;U217.TC132_OP.F_CV;20.044250488;100.0 +25/10/2020 02:06:50;U217.TC132_PV.F_CV;79.949645996;100.0 +25/10/2020 02:06:42;U217.TC132_SP.F_CV;79.999237061;100.0 +25/10/2020 02:06:42;U217.TC134_OP.F_CV;10.000762939;100.0 +25/10/2020 02:06:50;U217.TC134_PV.F_CV;26.306552887;100.0 +25/10/2020 02:06:42;U217.TC134_SP.F_CV;90.001525879;100.0 +25/10/2020 02:06:02;U217.TC136_OP.F_CV;44.434272766;100.0 +25/10/2020 02:06:26;U217.TC136_OP.F_CV;44.629589081;100.0 +25/10/2020 02:06:32;U217.TC136_OP.F_CV;44.434272766;100.0 +25/10/2020 02:06:43;U217.TC136_OP.F_CV;44.434272766;100.0 +25/10/2020 02:06:44;U217.TC136_OP.F_CV;44.165714264;100.0 +25/10/2020 02:06:55;U217.TC136_OP.F_CV;44.263370514;100.0 +25/10/2020 02:06:56;U217.TC136_OP.F_CV;44.019226074;100.0 +25/10/2020 02:06:20;U217.TC136_PV.F_CV;89.851226807;100.0 +25/10/2020 02:06:56;U217.TC136_PV.F_CV;89.976348877;100.0 +25/10/2020 02:06:20;U217.TC136_SP.F_CV;90.000762939;100.0 +25/10/2020 02:06:44;U217.TC201_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;U217.TC201_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;U217.TC201_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;U217.TC202_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;U217.TC202_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;U217.TC202_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:42;U217.TC206_1_OP.F_CV;39.000534058;100.0 +25/10/2020 02:06:42;U217.TC206_1_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TC206_1_SP.F_CV;200.000000000;100.0 +25/10/2020 02:06:44;U217.TC206_2_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U217.TC206_2_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TC206_2_SP.F_CV;200.000000000;100.0 +25/10/2020 02:06:42;U217.TC206_3_OP.F_CV;10.000762939;100.0 +25/10/2020 02:06:42;U217.TC206_3_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TC206_3_SP.F_CV;200.000000000;100.0 +25/10/2020 02:06:42;U217.TC206_4_OP.F_CV;10.000762939;100.0 +25/10/2020 02:06:42;U217.TC206_4_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TC206_4_SP.F_CV;200.000000000;100.0 +25/10/2020 02:06:42;U217.TC206_5_OP.F_CV;10.000762939;100.0 +25/10/2020 02:06:42;U217.TC206_5_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TC206_5_SP.F_CV;200.000000000;100.0 +25/10/2020 02:06:42;U217.TC206_6_OP.F_CV;10.000762939;100.0 +25/10/2020 02:06:42;U217.TC206_6_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TC206_6_SP.F_CV;200.000000000;100.0 +25/10/2020 02:06:47;U217.TC206_7_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U217.TC206_7_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TC206_7_SP.F_CV;200.000000000;100.0 +25/10/2020 02:06:42;U217.TC206_8_OP.F_CV;30.000762939;100.0 +25/10/2020 02:06:42;U217.TC206_8_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TC206_8_SP.F_CV;200.000000000;100.0 +25/10/2020 02:06:42;U217.TC216_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U217.TC216_PV.F_CV;19.189746857;100.0 +25/10/2020 02:06:42;U217.TC216_SP.F_CV;150.002288818;100.0 +25/10/2020 02:06:42;U217.TC219_OP.F_CV;60.000000000;100.0 +25/10/2020 02:06:56;U217.TC219_PV.F_CV;19.491874695;100.0 +25/10/2020 02:06:42;U217.TC219_SP.F_CV;249.997711182;100.0 +25/10/2020 02:06:42;U217.TC220_OP.F_CV;10.000762939;100.0 +25/10/2020 02:06:42;U217.TC220_PV.F_CV;18.741130829;100.0 +25/10/2020 02:06:42;U217.TC220_SP.F_CV;18.741130829;100.0 +25/10/2020 02:06:42;U217.TC226_OP.F_CV;40.000000000;100.0 +25/10/2020 02:06:42;U217.TC226_PV.F_CV;24.481575012;100.0 +25/10/2020 02:06:42;U217.TC226_SP.F_CV;30.002288818;100.0 +25/10/2020 02:06:44;U217.TC237_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;U217.TC237_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;U217.TC237_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;U217.TC238_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;U217.TC238_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;U217.TC238_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:42;U217.TC242_1_OP.F_CV;10.000762939;100.0 +25/10/2020 02:06:42;U217.TC242_1_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TC242_1_SP.F_CV;150.002288818;100.0 +25/10/2020 02:06:42;U217.TC242_2_OP.F_CV;10.000762939;100.0 +25/10/2020 02:06:42;U217.TC242_2_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TC242_2_SP.F_CV;150.002288818;100.0 +25/10/2020 02:06:42;U217.TC242_3_OP.F_CV;10.000762939;100.0 +25/10/2020 02:06:42;U217.TC242_3_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TC242_3_SP.F_CV;150.002288818;100.0 +25/10/2020 02:06:42;U217.TC242_4_OP.F_CV;10.000762939;100.0 +25/10/2020 02:06:42;U217.TC242_4_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TC242_4_SP.F_CV;150.002288818;100.0 +25/10/2020 02:06:42;U217.TC242_5_OP.F_CV;10.000762939;100.0 +25/10/2020 02:06:42;U217.TC242_5_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TC242_5_SP.F_CV;150.002288818;100.0 +25/10/2020 02:06:42;U217.TC242_6_OP.F_CV;10.000762939;100.0 +25/10/2020 02:06:42;U217.TC242_6_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TC242_6_SP.F_CV;150.002288818;100.0 +25/10/2020 02:06:42;U217.TC242_7_OP.F_CV;10.000762939;100.0 +25/10/2020 02:06:42;U217.TC242_7_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TC242_7_SP.F_CV;150.002288818;100.0 +25/10/2020 02:06:42;U217.TC242_8_OP.F_CV;10.000762939;100.0 +25/10/2020 02:06:42;U217.TC242_8_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TC242_8_SP.F_CV;150.002288818;100.0 +25/10/2020 02:06:42;U217.TC252_OP.F_CV;10.000762939;100.0 +25/10/2020 02:06:56;U217.TC252_PV.F_CV;29.864957809;100.0 +25/10/2020 02:06:42;U217.TC252_SP.F_CV;30.002288818;100.0 +25/10/2020 02:06:42;U217.TC262_OP.F_CV;6.999313354;100.0 +25/10/2020 02:06:42;U217.TC262_PV.F_CV;23.932249069;100.0 +25/10/2020 02:06:42;U217.TC262_SP.F_CV;25.232318878;100.0 +25/10/2020 02:06:42;U217.TC263_OP.F_CV;6.999313354;100.0 +25/10/2020 02:06:42;U217.TC263_PV.F_CV;23.849851608;100.0 +25/10/2020 02:06:42;U217.TC263_SP.F_CV;24.628061295;100.0 +25/10/2020 02:06:42;U217.TC264_OP.F_CV;28.000305176;100.0 +25/10/2020 02:06:08;U217.TC264_PV.F_CV;22.522315979;100.0 +25/10/2020 02:06:42;U217.TC264_SP.F_CV;425.003448486;100.0 +25/10/2020 02:06:53;U217.TC265_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U217.TC265_PV.F_CV;23.401235580;100.0 +25/10/2020 02:06:42;U217.TC265_SP.F_CV;289.997711182;100.0 +25/10/2020 02:06:42;U217.TC270_OP.F_CV;10.000762939;100.0 +25/10/2020 02:06:20;U217.TC270_PV.F_CV;24.753948212;100.0 +25/10/2020 02:06:04;U217.TC270_SP.F_CV;21.496147156;100.0 +25/10/2020 02:06:42;U217.TC280_OP.F_CV;20.000000000;100.0 +25/10/2020 02:06:02;U217.TC280_PV.F_CV;22.421606064;100.0 +25/10/2020 02:06:42;U217.TC280_SP.F_CV;31.146715164;100.0 +25/10/2020 02:06:42;U217.TC284_OP.F_CV;14.999618530;100.0 +25/10/2020 02:06:32;U217.TC284_PV.F_CV;23.552299500;100.0 +25/10/2020 02:06:42;U217.TC284_SP.F_CV;31.944763184;100.0 +25/10/2020 02:06:42;U217.TC285_OP.F_CV;10.000762939;100.0 +25/10/2020 02:06:53;U217.TC285_PV.F_CV;23.904783249;100.0 +25/10/2020 02:06:42;U217.TC285_SP.F_CV;31.641107559;100.0 +25/10/2020 02:06:42;U217.TC288_OP.F_CV;10.000762939;100.0 +25/10/2020 02:06:52;U217.TC288_PV.F_CV;23.529411316;100.0 +25/10/2020 02:06:42;U217.TC288_SP.F_CV;249.997711182;100.0 +25/10/2020 02:06:42;U217.TC294_OP.F_CV;80.000000000;100.0 +25/10/2020 02:06:44;U217.TC294_PV.F_CV;22.751201630;100.0 +25/10/2020 02:06:42;U217.TC294_SP.F_CV;420.004577637;100.0 +25/10/2020 02:06:53;U217.TC298_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U217.TC298_PV.F_CV;23.373769760;100.0 +25/10/2020 02:06:42;U217.TC298_SP.F_CV;20.004577637;100.0 +25/10/2020 02:06:20;U217.TC300_OP.F_CV;20.288394928;100.0 +25/10/2020 02:06:08;U217.TC300_PV.F_CV;150.014495850;100.0 +25/10/2020 02:06:14;U217.TC300_SP.F_CV;150.002288818;100.0 +25/10/2020 02:06:02;U217.TC301_OP.F_CV;34.999618530;100.0 +25/10/2020 02:06:26;U217.TC301_PV.F_CV;44.727245331;100.0 +25/10/2020 02:06:43;U217.TC301_SP.F_CV;150.002288818;100.0 +25/10/2020 02:06:02;U217.TC304_OP.F_CV;12.671092033;100.0 +25/10/2020 02:06:38;U217.TC304_PV.F_CV;150.264739990;100.0 +25/10/2020 02:06:08;U217.TC304_SP.F_CV;150.002288818;100.0 +25/10/2020 02:06:42;U217.TC306_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:42;U217.TC306_PV.F_CV;24.032958984;100.0 +25/10/2020 02:06:42;U217.TC306_SP.F_CV;95.448234558;100.0 +25/10/2020 02:06:42;U217.TC309_OP.F_CV;70.000762939;100.0 +25/10/2020 02:06:07;U217.TC309_PV.F_CV;21.295490265;100.0 +25/10/2020 02:06:42;U217.TC309_SP.F_CV;36.279850006;100.0 +25/10/2020 02:06:14;U217.TC311_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U217.TC311_PV.F_CV;58.081939697;100.0 +25/10/2020 02:06:56;U217.TC311_SP.F_CV;19.671930313;100.0 +25/10/2020 02:06:44;U217.TC312_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U217.TC312_PV.F_CV;27.814146042;100.0 +25/10/2020 02:06:42;U217.TC312_SP.F_CV;29.999237061;100.0 +25/10/2020 02:06:42;U217.TC316_OP.F_CV;13.000686646;100.0 +25/10/2020 02:06:16;U217.TC316_PV.F_CV;47.910278320;100.0 +25/10/2020 02:06:42;U217.TC316_SP.F_CV;67.298393250;100.0 +25/10/2020 02:06:42;U217.TC320_OP.F_CV;40.000000000;100.0 +25/10/2020 02:06:08;U217.TC320_PV.F_CV;78.251319885;100.0 +25/10/2020 02:06:42;U217.TC320_SP.F_CV;79.066146851;100.0 +25/10/2020 02:06:42;U217.TC350_OP.F_CV;20.000000000;100.0 +25/10/2020 02:06:32;U217.TC350_PV.F_CV;22.174409866;100.0 +25/10/2020 02:06:32;U217.TC350_SP.F_CV;22.174409866;100.0 +25/10/2020 02:06:42;U217.TC360_OP.F_CV;11.000228882;100.0 +25/10/2020 02:06:50;U217.TC360_PV.F_CV;20.973526001;100.0 +25/10/2020 02:06:42;U217.TC360_SP.F_CV;34.073394775;100.0 +25/10/2020 02:06:20;U217.TI106.F_CV;149.973297119;100.0 +25/10/2020 02:06:01;U217.TI107.F_CV;125.307090759;100.0 +25/10/2020 02:06:02;U217.TI107.F_CV;124.017700195;100.0 +25/10/2020 02:06:08;U217.TI107.F_CV;124.811172485;100.0 +25/10/2020 02:06:20;U217.TI107.F_CV;125.658042908;100.0 +25/10/2020 02:06:44;U217.TI107.F_CV;124.696723938;100.0 +25/10/2020 02:06:50;U217.TI107.F_CV;125.009536743;100.0 +25/10/2020 02:06:44;U217.TI110.F_CV;102.475776672;100.0 +25/10/2020 02:06:42;U217.TI111.F_CV;250.000000000;100.0 +25/10/2020 02:06:56;U217.TI122.F_CV;141.035324097;100.0 +25/10/2020 02:06:20;U217.TI123.F_CV;76.318000793;100.0 +25/10/2020 02:06:20;U217.TI124.F_CV;158.121612549;100.0 +25/10/2020 02:06:26;U217.TI125.F_CV;86.942092896;100.0 +25/10/2020 02:06:44;U217.TI127.F_CV;215.625244141;100.0 +25/10/2020 02:06:32;U217.TI128.F_CV;144.136718750;100.0 +25/10/2020 02:06:42;U217.TI130.F_CV;28.561073303;100.0 +25/10/2020 02:06:38;U217.TI131.F_CV;25.329977036;100.0 +25/10/2020 02:06:50;U217.TI132.F_CV;79.949645996;100.0 +25/10/2020 02:06:08;U217.TI133.F_CV;100.122070313;100.0 +25/10/2020 02:06:56;U217.TI134.F_CV;26.306552887;100.0 +25/10/2020 02:06:42;U217.TI135.F_CV;26.459144592;100.0 +25/10/2020 02:06:20;U217.TI136.F_CV;89.851226807;100.0 +25/10/2020 02:06:56;U217.TI136.F_CV;89.976348877;100.0 +25/10/2020 02:06:02;U217.TI137.F_CV;77.698936462;100.0 +25/10/2020 02:06:32;U217.TI137.F_CV;77.900360107;100.0 +25/10/2020 02:06:38;U217.TI137.F_CV;77.723350525;100.0 +25/10/2020 02:06:14;U217.TI140.F_CV;120.939193726;100.0 +25/10/2020 02:06:32;U217.TI146.F_CV;22.572671890;100.0 +25/10/2020 02:06:50;U217.TI201.F_CV;21.423666000;100.0 +25/10/2020 02:06:44;U217.TI202.F_CV;22.119478226;100.0 +25/10/2020 02:06:26;U217.TI203.F_CV;21.368734360;100.0 +25/10/2020 02:06:20;U217.TI204_1.F_CV;21.844816208;100.0 +25/10/2020 02:06:50;U217.TI204_2.F_CV;21.295490265;100.0 +25/10/2020 02:06:50;U217.TI204_3.F_CV;21.094072342;100.0 +25/10/2020 02:06:44;U217.TI204_4.F_CV;20.874341965;100.0 +25/10/2020 02:06:42;U217.TI204_5.F_CV;20.846876144;100.0 +25/10/2020 02:06:02;U217.TI204_6.F_CV;21.121538162;100.0 +25/10/2020 02:06:07;U217.TI204_7.F_CV;20.920118332;100.0 +25/10/2020 02:06:02;U217.TI204_8.F_CV;20.947586060;100.0 +25/10/2020 02:06:47;U217.TI205_1.F_CV;21.872282028;100.0 +25/10/2020 02:06:42;U217.TI205_2.F_CV;21.771572113;100.0 +25/10/2020 02:06:42;U217.TI205_3.F_CV;21.551841736;100.0 +25/10/2020 02:06:05;U217.TI205_4.F_CV;21.396200180;100.0 +25/10/2020 02:06:42;U217.TI205_5.F_CV;20.975051880;100.0 +25/10/2020 02:06:42;U217.TI205_6.F_CV;21.167314529;100.0 +25/10/2020 02:06:42;U217.TI205_7.F_CV;21.249713898;100.0 +25/10/2020 02:06:42;U217.TI205_8.F_CV;21.075761795;100.0 +25/10/2020 02:06:42;U217.TI206_1.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TI206_2.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TI206_3.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TI206_4.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TI206_5.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TI206_6.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TI206_7.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TI206_8.F_CV;600.000000000;100.0 +25/10/2020 02:06:20;U217.TI207.F_CV;17.439537048;100.0 +25/10/2020 02:06:26;U217.TI207.F_CV;17.389181137;100.0 +25/10/2020 02:06:44;U217.TI211.F_CV;19.192035675;100.0 +25/10/2020 02:06:08;U217.TI212.F_CV;21.094072342;100.0 +25/10/2020 02:06:14;U217.TI213.F_CV;19.043258667;100.0 +25/10/2020 02:06:32;U217.TI214.F_CV;21.551841736;100.0 +25/10/2020 02:06:43;U217.TI215.F_CV;20.444038391;100.0 +25/10/2020 02:06:55;U217.TI216.F_CV;19.189746857;100.0 +25/10/2020 02:06:20;U217.TI218.F_CV;19.794002533;100.0 +25/10/2020 02:06:56;U217.TI219.F_CV;19.491874695;100.0 +25/10/2020 02:06:42;U217.TI220.F_CV;18.741130829;100.0 +25/10/2020 02:06:42;U217.TI221.F_CV;20.617990494;100.0 +25/10/2020 02:06:42;U217.TI225.F_CV;24.051269531;100.0 +25/10/2020 02:06:42;U217.TI226.F_CV;24.481575012;100.0 +25/10/2020 02:06:10;U217.TI237.F_CV;600.000000000;100.0 +25/10/2020 02:06:32;U217.TI238.F_CV;20.773632050;100.0 +25/10/2020 02:06:56;U217.TI239.F_CV;23.501945496;100.0 +25/10/2020 02:06:08;U217.TI240_1.F_CV;22.595560074;100.0 +25/10/2020 02:06:50;U217.TI240_2.F_CV;22.101167679;100.0 +25/10/2020 02:06:20;U217.TI240_3.F_CV;21.744106293;100.0 +25/10/2020 02:06:56;U217.TI240_4.F_CV;21.625085831;100.0 +25/10/2020 02:06:50;U217.TI240_5.F_CV;21.268024445;100.0 +25/10/2020 02:06:44;U217.TI240_6.F_CV;21.469444275;100.0 +25/10/2020 02:06:44;U217.TI240_7.F_CV;21.551841736;100.0 +25/10/2020 02:06:02;U217.TI240_8.F_CV;21.597620010;100.0 +25/10/2020 02:06:42;U217.TI241_1.F_CV;22.549781799;100.0 +25/10/2020 02:06:42;U217.TI241_2.F_CV;22.201877594;100.0 +25/10/2020 02:06:59;U217.TI241_3.F_CV;22.000457764;100.0 +25/10/2020 02:06:17;U217.TI241_4.F_CV;21.799037933;100.0 +25/10/2020 02:06:42;U217.TI241_5.F_CV;21.469444275;100.0 +25/10/2020 02:06:42;U217.TI241_6.F_CV;21.643396378;100.0 +25/10/2020 02:06:42;U217.TI241_7.F_CV;21.698329926;100.0 +25/10/2020 02:06:42;U217.TI241_8.F_CV;21.643396378;100.0 +25/10/2020 02:06:42;U217.TI242_1.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TI242_2.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TI242_3.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TI242_4.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TI242_5.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TI242_6.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TI242_7.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U217.TI242_8.F_CV;600.000000000;100.0 +25/10/2020 02:06:20;U217.TI243.F_CV;19.844358444;100.0 +25/10/2020 02:06:38;U217.TI244.F_CV;19.317922592;100.0 +25/10/2020 02:06:08;U217.TI245.F_CV;21.396200180;100.0 +25/10/2020 02:06:15;U217.TI247.F_CV;30.267795563;100.0 +25/10/2020 02:06:26;U217.TI248.F_CV;21.094072342;100.0 +25/10/2020 02:06:32;U217.TI249.F_CV;20.769054413;100.0 +25/10/2020 02:06:42;U217.TI251.F_CV;600.000000000;100.0 +25/10/2020 02:06:56;U217.TI252.F_CV;29.864957809;100.0 +25/10/2020 02:06:14;U217.TI258.F_CV;21.368734360;100.0 +25/10/2020 02:06:44;U217.TI259.F_CV;19.516288757;100.0 +25/10/2020 02:06:42;U217.TI261.F_CV;24.078737259;100.0 +25/10/2020 02:06:42;U217.TI262A.F_CV;23.932249069;100.0 +25/10/2020 02:06:42;U217.TI262B.F_CV;23.730831146;100.0 +25/10/2020 02:06:42;U217.TI263A.F_CV;23.849851608;100.0 +25/10/2020 02:06:42;U217.TI263B.F_CV;23.749141693;100.0 +25/10/2020 02:06:08;U217.TI264.F_CV;22.522315979;100.0 +25/10/2020 02:06:42;U217.TI265.F_CV;23.401235580;100.0 +25/10/2020 02:06:50;U217.TI266.F_CV;23.254749298;100.0 +25/10/2020 02:06:42;U217.TI267.F_CV;24.106203079;100.0 +25/10/2020 02:06:26;U217.TI269.F_CV;24.803539276;100.0 +25/10/2020 02:06:20;U217.TI270.F_CV;24.753948212;100.0 +25/10/2020 02:06:08;U217.TI271.F_CV;19.218738556;100.0 +25/10/2020 02:06:20;U217.TI272.F_CV;20.618753433;100.0 +25/10/2020 02:06:44;U217.TI275.F_CV;21.350423813;100.0 +25/10/2020 02:06:44;U217.TI276.F_CV;20.370794296;100.0 +25/10/2020 02:06:20;U217.TI277.F_CV;18.411535263;100.0 +25/10/2020 02:06:42;U217.TI278.F_CV;21.551841736;100.0 +25/10/2020 02:06:02;U217.TI280.F_CV;22.421606064;100.0 +25/10/2020 02:06:59;U217.TI281.F_CV;23.099107742;100.0 +25/10/2020 02:06:01;U217.TI282.F_CV;145.296401978;100.0 +25/10/2020 02:06:02;U217.TI282.F_CV;153.334854126;100.0 +25/10/2020 02:06:07;U217.TI282.F_CV;153.334854126;100.0 +25/10/2020 02:06:08;U217.TI282.F_CV;203.295944214;100.0 +25/10/2020 02:06:13;U217.TI282.F_CV;203.295944214;100.0 +25/10/2020 02:06:14;U217.TI282.F_CV;126.775009155;100.0 +25/10/2020 02:06:19;U217.TI282.F_CV;126.775009155;100.0 +25/10/2020 02:06:20;U217.TI282.F_CV;243.131149292;100.0 +25/10/2020 02:06:25;U217.TI282.F_CV;243.131149292;100.0 +25/10/2020 02:06:26;U217.TI282.F_CV;152.336914063;100.0 +25/10/2020 02:06:31;U217.TI282.F_CV;152.336914063;100.0 +25/10/2020 02:06:32;U217.TI282.F_CV;133.495071411;100.0 +25/10/2020 02:06:37;U217.TI282.F_CV;133.495071411;100.0 +25/10/2020 02:06:38;U217.TI282.F_CV;206.005950928;100.0 +25/10/2020 02:06:43;U217.TI282.F_CV;206.005950928;100.0 +25/10/2020 02:06:44;U217.TI282.F_CV;150.981918335;100.0 +25/10/2020 02:06:49;U217.TI282.F_CV;150.981918335;100.0 +25/10/2020 02:06:50;U217.TI282.F_CV;126.454566956;100.0 +25/10/2020 02:06:55;U217.TI282.F_CV;126.454566956;100.0 +25/10/2020 02:06:56;U217.TI282.F_CV;143.263900757;100.0 +25/10/2020 02:06:02;U217.TI283.F_CV;23.502708435;100.0 +25/10/2020 02:06:32;U217.TI284.F_CV;23.552299500;100.0 +25/10/2020 02:06:42;U217.TI286.F_CV;23.373769760;100.0 +25/10/2020 02:06:42;U217.TI287.F_CV;23.474479675;100.0 +25/10/2020 02:06:20;U217.TI288.F_CV;23.227283478;100.0 +25/10/2020 02:06:52;U217.TI289.F_CV;23.529411316;100.0 +25/10/2020 02:06:14;U217.TI290.F_CV;23.428701401;100.0 +25/10/2020 02:06:42;U217.TI292.F_CV;23.529411316;100.0 +25/10/2020 02:06:42;U217.TI293.F_CV;23.053329468;100.0 +25/10/2020 02:06:44;U217.TI294.F_CV;22.751201630;100.0 +25/10/2020 02:06:32;U217.TI296.F_CV;22.723735809;100.0 +25/10/2020 02:06:20;U217.TI297.F_CV;22.595560074;100.0 +25/10/2020 02:06:42;U217.TI298.F_CV;23.373769760;100.0 +25/10/2020 02:06:08;U217.TI300.F_CV;150.014495850;100.0 +25/10/2020 02:06:26;U217.TI301.F_CV;44.727245331;100.0 +25/10/2020 02:06:55;U217.TI302.F_CV;267.801940918;100.0 +25/10/2020 02:06:19;U217.TI303.F_CV;56.049438477;100.0 +25/10/2020 02:06:38;U217.TI304.F_CV;150.264739990;100.0 +25/10/2020 02:06:26;U217.TI305.F_CV;151.644165039;100.0 +25/10/2020 02:06:01;U217.TI306.F_CV;24.078737259;100.0 +25/10/2020 02:06:42;U217.TI307.F_CV;28.738842010;100.0 +25/10/2020 02:06:26;U217.TI308.F_CV;34.653240204;100.0 +25/10/2020 02:06:07;U217.TI309.F_CV;21.295490265;100.0 +25/10/2020 02:06:08;U217.TI310.F_CV;147.078659058;100.0 +25/10/2020 02:06:44;U217.TI311.F_CV;58.081939697;100.0 +25/10/2020 02:06:26;U217.TI312.F_CV;27.814146042;100.0 +25/10/2020 02:06:42;U217.TI313.F_CV;27.489128113;100.0 +25/10/2020 02:06:42;U217.TI315.F_CV;59.034103394;100.0 +25/10/2020 02:06:26;U217.TI316.F_CV;47.980468750;100.0 +25/10/2020 02:06:20;U217.TI317.F_CV;27.731746674;100.0 +25/10/2020 02:06:50;U217.TI319.F_CV;75.797668457;100.0 +25/10/2020 02:06:43;U217.TI320.F_CV;78.248260498;100.0 +25/10/2020 02:06:42;U217.TI321.F_CV;20.773632050;100.0 +25/10/2020 02:06:42;U217.TI322.F_CV;20.599679947;100.0 +25/10/2020 02:06:08;U217.TI323.F_CV;19.794002533;100.0 +25/10/2020 02:06:14;U217.TI344.F_CV;133.327224731;100.0 +25/10/2020 02:06:42;U217.TI345.F_CV;600.000000000;100.0 +25/10/2020 02:06:26;U217.TI349.F_CV;107.569999695;100.0 +25/10/2020 02:06:32;U217.TI350.F_CV;22.174409866;100.0 +25/10/2020 02:06:42;U217.TI351.F_CV;400.000000000;100.0 +25/10/2020 02:06:42;U217.TI352.F_CV;20.846876144;100.0 +25/10/2020 02:06:42;U217.TI353.F_CV;21.972991943;100.0 +25/10/2020 02:06:08;U217.TI354.F_CV;21.020828247;100.0 +25/10/2020 02:06:26;U217.TI355.F_CV;79.047836304;100.0 +25/10/2020 02:06:26;U217.TI356.F_CV;166.367584229;100.0 +25/10/2020 02:06:13;U217.TI357.F_CV;137.505157471;100.0 +25/10/2020 02:06:42;U217.TI358.F_CV;600.000000000;100.0 +25/10/2020 02:06:19;U217.TI359.F_CV;23.172349930;100.0 +25/10/2020 02:06:50;U217.TI360.F_CV;20.973526001;100.0 +25/10/2020 02:06:49;U217.TI361.F_CV;24.826429367;100.0 +25/10/2020 02:06:42;U217.TI362.F_CV;28.358892441;100.0 +25/10/2020 02:06:14;U217.TI418.F_CV;18.515296936;100.0 +25/10/2020 02:06:02;U217.TI423.F_CV;19.945068359;100.0 +25/10/2020 02:06:14;U217.TI423.F_CV;20.019836426;100.0 +25/10/2020 02:06:20;U217.TI423.F_CV;19.945068359;100.0 +25/10/2020 02:06:26;U217.TI423.F_CV;19.995422363;100.0 +25/10/2020 02:06:44;U217.TI423.F_CV;19.919126511;100.0 +25/10/2020 02:06:42;U217.TI701.F_CV;150.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_A_FT149.F_CV;100.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_A_FT201.F_CV;0.921500027;100.0 +25/10/2020 02:06:01;U217.U217_COEF_A_FT213.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_A_FT236.F_CV;0.958400071;100.0 +25/10/2020 02:06:01;U217.U217_COEF_A_FT299.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_A_TI206-4.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_A_TI206-5.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_A_TI206-6.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_A_TI206-7.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_A_TI206-8.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_A_TI242-1.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_A_TI242-2.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_A_TI242-3.F_CV;1.008999944;100.0 +25/10/2020 02:06:01;U217.U217_COEF_A_TI242-4.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_A_TI242-5.F_CV;0.996600032;100.0 +25/10/2020 02:06:01;U217.U217_COEF_A_TI242-6.F_CV;1.000699997;100.0 +25/10/2020 02:06:01;U217.U217_COEF_A_TI242-7.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_A_TI242-8.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_B_FT149.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_B_FT201.F_CV;-10.898699760;100.0 +25/10/2020 02:06:01;U217.U217_COEF_B_FT213.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_B_FT236.F_CV;-62.520000458;100.0 +25/10/2020 02:06:01;U217.U217_COEF_B_FT299.F_CV;100.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_B_TI206-4.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_B_TI206-5.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_B_TI206-6.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_B_TI206-7.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_B_TI206-8.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_B_TI242-1.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_B_TI242-2.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_B_TI242-3.F_CV;-4.598000050;100.0 +25/10/2020 02:06:01;U217.U217_COEF_B_TI242-4.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_B_TI242-5.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_B_TI242-6.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_B_TI242-7.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U217.U217_COEF_B_TI242-8.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U217.WI116.F_CV;13.029983521;100.0 +25/10/2020 02:06:02;U217.WI116.F_CV;13.043717384;100.0 +25/10/2020 02:06:07;U217.WI116.F_CV;13.043717384;100.0 +25/10/2020 02:06:08;U217.WI116.F_CV;13.048295021;100.0 +25/10/2020 02:06:13;U217.WI116.F_CV;13.048295021;100.0 +25/10/2020 02:06:14;U217.WI116.F_CV;13.050126076;100.0 +25/10/2020 02:06:19;U217.WI116.F_CV;13.050126076;100.0 +25/10/2020 02:06:20;U217.WI116.F_CV;13.038224220;100.0 +25/10/2020 02:06:25;U217.WI116.F_CV;13.038224220;100.0 +25/10/2020 02:06:26;U217.WI116.F_CV;13.040055275;100.0 +25/10/2020 02:06:31;U217.WI116.F_CV;13.040055275;100.0 +25/10/2020 02:06:32;U217.WI116.F_CV;13.019912720;100.0 +25/10/2020 02:06:37;U217.WI116.F_CV;13.019912720;100.0 +25/10/2020 02:06:38;U217.WI116.F_CV;13.036393166;100.0 +25/10/2020 02:06:43;U217.WI116.F_CV;13.036393166;100.0 +25/10/2020 02:06:44;U217.WI116.F_CV;13.033646584;100.0 +25/10/2020 02:06:55;U217.WI116.F_CV;13.033646584;100.0 +25/10/2020 02:06:56;U217.WI116.F_CV;13.019912720;100.0 +25/10/2020 02:06:42;U217.WI116D.F_CV;23.294116974;100.0 +25/10/2020 02:06:42;U217.WI116E.F_CV;10.095674515;100.0 +25/10/2020 02:06:42;U217.WI116F.F_CV;13.198443413;100.0 +25/10/2020 02:06:13;U217.WI276.F_CV;4.325016975;100.0 +25/10/2020 02:06:14;U217.WI276.F_CV;4.325932503;100.0 +25/10/2020 02:06:37;U217.WI276.F_CV;4.325932503;100.0 +25/10/2020 02:06:38;U217.WI276.F_CV;4.326848030;100.0 +25/10/2020 02:06:43;U217.WI276.F_CV;4.326848030;100.0 +25/10/2020 02:06:44;U217.WI276.F_CV;4.327763557;100.0 +25/10/2020 02:06:42;U217.WI276D.F_CV;4.044861317;100.0 +25/10/2020 02:06:42;U217.WI276E.F_CV;1.079423189;100.0 +25/10/2020 02:06:42;U217.WI276F.F_CV;2.966353893;100.0 +25/10/2020 02:06:01;U217.WI405.F_CV;0.119935915;100.0 +25/10/2020 02:06:02;U217.WI405.F_CV;0.134889752;100.0 +25/10/2020 02:06:07;U217.WI405.F_CV;0.134889752;100.0 +25/10/2020 02:06:08;U217.WI405.F_CV;0.130006865;100.0 +25/10/2020 02:06:13;U217.WI405.F_CV;0.130006865;100.0 +25/10/2020 02:06:14;U217.WI405.F_CV;0.134889752;100.0 +25/10/2020 02:06:19;U217.WI405.F_CV;0.134889752;100.0 +25/10/2020 02:06:20;U217.WI405.F_CV;0.125123978;100.0 +25/10/2020 02:06:25;U217.WI405.F_CV;0.125123978;100.0 +25/10/2020 02:06:26;U217.WI405.F_CV;0.150148779;100.0 +25/10/2020 02:06:31;U217.WI405.F_CV;0.150148779;100.0 +25/10/2020 02:06:32;U217.WI405.F_CV;0.130006865;100.0 +25/10/2020 02:06:37;U217.WI405.F_CV;0.130006865;100.0 +25/10/2020 02:06:38;U217.WI405.F_CV;0.140077814;100.0 +25/10/2020 02:06:43;U217.WI405.F_CV;0.140077814;100.0 +25/10/2020 02:06:44;U217.WI405.F_CV;0.130006865;100.0 +25/10/2020 02:06:42;U217.WI405D.F_CV;3.794918776;100.0 +25/10/2020 02:06:42;U217.WI405E.F_CV;7.064927101;100.0 +25/10/2020 02:06:42;U217.WI405F.F_CV;10.860151291;100.0 +25/10/2020 02:06:20;U217.WI410.F_CV;5.885099411;100.0 +25/10/2020 02:06:42;U217.WI410D.F_CV;4.274662495;100.0 +25/10/2020 02:06:42;U217.WI410E.F_CV;4.824902534;100.0 +25/10/2020 02:06:42;U217.WI410F.F_CV;9.099565506;100.0 +25/10/2020 02:06:50;U217.WI415.F_CV;3.685969353;100.0 +25/10/2020 02:06:55;U217.WI415.F_CV;3.685969353;100.0 +25/10/2020 02:06:56;U217.WI415.F_CV;3.687800407;100.0 +25/10/2020 02:06:42;U217.WI415D.F_CV;2.135042429;100.0 +25/10/2020 02:06:42;U217.WI415E.F_CV;2.460059404;100.0 +25/10/2020 02:06:42;U217.WI415F.F_CV;4.595101833;100.0 +25/10/2020 02:06:06;U247.AGE.F_CV;1951.611572266;100.0 +25/10/2020 02:06:06;U247.AI2.F_CV;0.897700071;100.0 +25/10/2020 02:06:14;U247.FC1_OP.F_CV;67.870109558;100.0 +25/10/2020 02:06:26;U247.FC1_OP.F_CV;67.699211121;100.0 +25/10/2020 02:06:38;U247.FC1_OP.F_CV;67.845695496;100.0 +25/10/2020 02:06:56;U247.FC1_OP.F_CV;67.772453308;100.0 +25/10/2020 02:06:25;U247.FC1_PV.F_CV;525.550720215;100.0 +25/10/2020 02:06:26;U247.FC1_PV.F_CV;531.295410156;100.0 +25/10/2020 02:06:31;U247.FC1_PV.F_CV;531.295410156;100.0 +25/10/2020 02:06:32;U247.FC1_PV.F_CV;527.709228516;100.0 +25/10/2020 02:06:37;U247.FC1_PV.F_CV;527.709228516;100.0 +25/10/2020 02:06:38;U247.FC1_PV.F_CV;523.115234375;100.0 +25/10/2020 02:06:56;U247.FC1_PV.F_CV;526.437500000;100.0 +25/10/2020 02:06:44;U247.FC1_SP.F_CV;524.000000000;100.0 +25/10/2020 02:06:38;U247.FC2_OP.F_CV;8.566545486;100.0 +25/10/2020 02:06:44;U247.FC2_PV.F_CV;285.201843262;100.0 +25/10/2020 02:06:02;U247.FC2_SP.F_CV;285.000000000;100.0 +25/10/2020 02:06:50;U247.FC30_OP.F_CV;34.592731476;100.0 +25/10/2020 02:06:26;U247.FC30_PV.F_CV;44.899993896;100.0 +25/10/2020 02:06:20;U247.FC30_SP.F_CV;45.000000000;100.0 +25/10/2020 02:06:01;U247.FI91.F_CV;309.550415039;100.0 +25/10/2020 02:06:02;U247.FI91.F_CV;299.478271484;100.0 +25/10/2020 02:06:07;U247.FI91.F_CV;299.478271484;100.0 +25/10/2020 02:06:08;U247.FI91.F_CV;289.140045166;100.0 +25/10/2020 02:06:13;U247.FI91.F_CV;289.140045166;100.0 +25/10/2020 02:06:14;U247.FI91.F_CV;282.096313477;100.0 +25/10/2020 02:06:20;U247.FI91.F_CV;281.410675049;100.0 +25/10/2020 02:06:26;U247.FI91.F_CV;283.242431641;100.0 +25/10/2020 02:06:31;U247.FI91.F_CV;283.242431641;100.0 +25/10/2020 02:06:32;U247.FI91.F_CV;275.844085693;100.0 +25/10/2020 02:06:43;U247.FI91.F_CV;275.844085693;100.0 +25/10/2020 02:06:44;U247.FI91.F_CV;279.275024414;100.0 +25/10/2020 02:06:49;U247.FI91.F_CV;279.275024414;100.0 +25/10/2020 02:06:50;U247.FI91.F_CV;293.907348633;100.0 +25/10/2020 02:06:55;U247.FI91.F_CV;293.907348633;100.0 +25/10/2020 02:06:56;U247.FI91.F_CV;298.976837158;100.0 +25/10/2020 02:06:08;U247.FI92.F_CV;54.240058899;100.0 +25/10/2020 02:06:25;U247.FI92.F_CV;54.240058899;100.0 +25/10/2020 02:06:26;U247.FI92.F_CV;52.217559814;100.0 +25/10/2020 02:06:32;U247.FI92.F_CV;51.301563263;100.0 +25/10/2020 02:06:38;U247.FI92.F_CV;51.893268585;100.0 +25/10/2020 02:06:44;U247.FI92.F_CV;51.318721771;100.0 +25/10/2020 02:06:56;U247.FI92.F_CV;52.767185211;100.0 +25/10/2020 02:06:01;U247.FQ91.F_CV;813571.312500000;100.0 +25/10/2020 02:06:02;U247.FQ91.F_CV;813571.750000000;100.0 +25/10/2020 02:06:07;U247.FQ91.F_CV;813571.750000000;100.0 +25/10/2020 02:06:08;U247.FQ91.F_CV;813572.125000000;100.0 +25/10/2020 02:06:13;U247.FQ91.F_CV;813572.125000000;100.0 +25/10/2020 02:06:14;U247.FQ91.F_CV;813572.562500000;100.0 +25/10/2020 02:06:19;U247.FQ91.F_CV;813572.562500000;100.0 +25/10/2020 02:06:20;U247.FQ91.F_CV;813573.000000000;100.0 +25/10/2020 02:06:25;U247.FQ91.F_CV;813573.000000000;100.0 +25/10/2020 02:06:26;U247.FQ91.F_CV;813573.812500000;100.0 +25/10/2020 02:06:31;U247.FQ91.F_CV;813573.812500000;100.0 +25/10/2020 02:06:32;U247.FQ91.F_CV;813574.187500000;100.0 +25/10/2020 02:06:37;U247.FQ91.F_CV;813574.187500000;100.0 +25/10/2020 02:06:38;U247.FQ91.F_CV;813574.625000000;100.0 +25/10/2020 02:06:43;U247.FQ91.F_CV;813574.625000000;100.0 +25/10/2020 02:06:44;U247.FQ91.F_CV;813575.000000000;100.0 +25/10/2020 02:06:49;U247.FQ91.F_CV;813575.000000000;100.0 +25/10/2020 02:06:50;U247.FQ91.F_CV;813575.437500000;100.0 +25/10/2020 02:06:55;U247.FQ91.F_CV;813575.437500000;100.0 +25/10/2020 02:06:56;U247.FQ91.F_CV;813576.250000000;100.0 +25/10/2020 02:06:01;U247.FQ92.F_CV;86700.718750000;100.0 +25/10/2020 02:06:02;U247.FQ92.F_CV;86700.789062500;100.0 +25/10/2020 02:06:07;U247.FQ92.F_CV;86700.789062500;100.0 +25/10/2020 02:06:08;U247.FQ92.F_CV;86700.890625000;100.0 +25/10/2020 02:06:13;U247.FQ92.F_CV;86700.890625000;100.0 +25/10/2020 02:06:14;U247.FQ92.F_CV;86700.992187500;100.0 +25/10/2020 02:06:19;U247.FQ92.F_CV;86700.992187500;100.0 +25/10/2020 02:06:20;U247.FQ92.F_CV;86701.078125000;100.0 +25/10/2020 02:06:25;U247.FQ92.F_CV;86701.078125000;100.0 +25/10/2020 02:06:26;U247.FQ92.F_CV;86701.179687500;100.0 +25/10/2020 02:06:31;U247.FQ92.F_CV;86701.179687500;100.0 +25/10/2020 02:06:32;U247.FQ92.F_CV;86701.265625000;100.0 +25/10/2020 02:06:37;U247.FQ92.F_CV;86701.265625000;100.0 +25/10/2020 02:06:38;U247.FQ92.F_CV;86701.351562500;100.0 +25/10/2020 02:06:43;U247.FQ92.F_CV;86701.351562500;100.0 +25/10/2020 02:06:44;U247.FQ92.F_CV;86701.437500000;100.0 +25/10/2020 02:06:49;U247.FQ92.F_CV;86701.437500000;100.0 +25/10/2020 02:06:50;U247.FQ92.F_CV;86701.515625000;100.0 +25/10/2020 02:06:55;U247.FQ92.F_CV;86701.515625000;100.0 +25/10/2020 02:06:56;U247.FQ92.F_CV;86701.625000000;100.0 +25/10/2020 02:06:06;U247.FY20.F_CV;50.000000000;100.0 +25/10/2020 02:06:07;U247.LC30_PV.F_CV;46.710178375;100.0 +25/10/2020 02:06:08;U247.LC30_PV.F_CV;46.917377472;100.0 +25/10/2020 02:06:13;U247.LC30_PV.F_CV;46.917377472;100.0 +25/10/2020 02:06:14;U247.LC30_PV.F_CV;47.727897644;100.0 +25/10/2020 02:06:19;U247.LC30_PV.F_CV;47.727897644;100.0 +25/10/2020 02:06:20;U247.LC30_PV.F_CV;46.813774109;100.0 +25/10/2020 02:06:25;U247.LC30_PV.F_CV;46.813774109;100.0 +25/10/2020 02:06:26;U247.LC30_PV.F_CV;47.386627197;100.0 +25/10/2020 02:06:32;U247.LC30_PV.F_CV;47.203804016;100.0 +25/10/2020 02:06:37;U247.LC30_PV.F_CV;47.203804016;100.0 +25/10/2020 02:06:38;U247.LC30_PV.F_CV;47.484130859;100.0 +25/10/2020 02:06:43;U247.LC30_PV.F_CV;47.484130859;100.0 +25/10/2020 02:06:44;U247.LC30_PV.F_CV;47.148948669;100.0 +25/10/2020 02:06:50;U247.LC30_PV.F_CV;47.081920624;100.0 +25/10/2020 02:06:56;U247.LC30_PV.F_CV;47.264743805;100.0 +25/10/2020 02:06:01;U247.LC35_PV.F_CV;29.309999466;100.0 +25/10/2020 02:06:02;U247.LC35_PV.F_CV;28.959999084;100.0 +25/10/2020 02:06:07;U247.LC35_PV.F_CV;28.959999084;100.0 +25/10/2020 02:06:08;U247.LC35_PV.F_CV;29.539999008;100.0 +25/10/2020 02:06:19;U247.LC35_PV.F_CV;29.539999008;100.0 +25/10/2020 02:06:20;U247.LC35_PV.F_CV;29.000000000;100.0 +25/10/2020 02:06:31;U247.LC35_PV.F_CV;29.099998474;100.0 +25/10/2020 02:06:32;U247.LC35_PV.F_CV;29.409999847;100.0 +25/10/2020 02:06:38;U247.LC35_PV.F_CV;29.510000229;100.0 +25/10/2020 02:06:55;U247.LC35_PV.F_CV;29.510000229;100.0 +25/10/2020 02:06:56;U247.LC35_PV.F_CV;29.039999008;100.0 +25/10/2020 02:06:01;U247.LC61_OP.F_CV;82.006286621;100.0 +25/10/2020 02:06:02;U247.LC61_OP.F_CV;81.640068054;100.0 +25/10/2020 02:06:07;U247.LC61_OP.F_CV;81.640068054;100.0 +25/10/2020 02:06:08;U247.LC61_OP.F_CV;80.297248840;100.0 +25/10/2020 02:06:13;U247.LC61_OP.F_CV;80.297248840;100.0 +25/10/2020 02:06:14;U247.LC61_OP.F_CV;79.198585510;100.0 +25/10/2020 02:06:19;U247.LC61_OP.F_CV;79.198585510;100.0 +25/10/2020 02:06:20;U247.LC61_OP.F_CV;78.002258301;100.0 +25/10/2020 02:06:25;U247.LC61_OP.F_CV;78.002258301;100.0 +25/10/2020 02:06:26;U247.LC61_OP.F_CV;78.978851318;100.0 +25/10/2020 02:06:31;U247.LC61_OP.F_CV;78.978851318;100.0 +25/10/2020 02:06:32;U247.LC61_OP.F_CV;79.418319702;100.0 +25/10/2020 02:06:37;U247.LC61_OP.F_CV;79.418319702;100.0 +25/10/2020 02:06:38;U247.LC61_OP.F_CV;79.906616211;100.0 +25/10/2020 02:06:43;U247.LC61_OP.F_CV;79.906616211;100.0 +25/10/2020 02:06:44;U247.LC61_OP.F_CV;80.932037354;100.0 +25/10/2020 02:06:49;U247.LC61_OP.F_CV;80.932037354;100.0 +25/10/2020 02:06:50;U247.LC61_OP.F_CV;81.566818237;100.0 +25/10/2020 02:06:07;U247.LC61_PV.F_CV;44.825984955;100.0 +25/10/2020 02:06:08;U247.LC61_PV.F_CV;44.599487305;100.0 +25/10/2020 02:06:20;U247.LC61_PV.F_CV;44.424274445;100.0 +25/10/2020 02:06:25;U247.LC61_PV.F_CV;44.424274445;100.0 +25/10/2020 02:06:26;U247.LC61_PV.F_CV;44.702007294;100.0 +25/10/2020 02:06:44;U247.LC61_PV.F_CV;45.169040680;100.0 +25/10/2020 02:06:50;U247.LC61_PV.F_CV;45.237384796;100.0 +25/10/2020 02:06:06;U247.LC61_SP.F_CV;45.000000000;100.0 +25/10/2020 02:06:02;U247.LI1.F_CV;32.033069611;100.0 +25/10/2020 02:06:08;U247.LI1.F_CV;32.223205566;100.0 +25/10/2020 02:06:26;U247.LI1.F_CV;31.994068146;100.0 +25/10/2020 02:06:44;U247.LI1.F_CV;32.113513947;100.0 +25/10/2020 02:06:50;U247.LI1.F_CV;31.964817047;100.0 +25/10/2020 02:06:14;U247.LI3.F_CV;46.446678162;100.0 +25/10/2020 02:06:50;U247.LI3.F_CV;46.256542206;100.0 +25/10/2020 02:06:56;U247.LI3.F_CV;46.373550415;100.0 +25/10/2020 02:06:42;U247.LXH30.F_CV;50.000000000;100.0 +25/10/2020 02:06:06;U247.LXH35.F_CV;45.000000000;100.0 +25/10/2020 02:06:42;U247.LXL30.F_CV;49.000000000;100.0 +25/10/2020 02:06:06;U247.LXL35.F_CV;30.000000000;100.0 +25/10/2020 02:06:01;U247.PC10_OP.F_CV;13.815729141;100.0 +25/10/2020 02:06:02;U247.PC10_OP.F_CV;14.401684761;100.0 +25/10/2020 02:06:20;U247.PC10_OP.F_CV;14.059877396;100.0 +25/10/2020 02:06:25;U247.PC10_OP.F_CV;14.059877396;100.0 +25/10/2020 02:06:26;U247.PC10_OP.F_CV;13.742485046;100.0 +25/10/2020 02:06:31;U247.PC10_OP.F_CV;13.742485046;100.0 +25/10/2020 02:06:32;U247.PC10_OP.F_CV;14.084292412;100.0 +25/10/2020 02:06:37;U247.PC10_OP.F_CV;14.084292412;100.0 +25/10/2020 02:06:38;U247.PC10_OP.F_CV;13.840144157;100.0 +25/10/2020 02:06:49;U247.PC10_OP.F_CV;13.913388252;100.0 +25/10/2020 02:06:50;U247.PC10_OP.F_CV;14.426099777;100.0 +25/10/2020 02:06:20;U247.PC10_PV.F_CV;89.969718933;100.0 +25/10/2020 02:06:06;U247.PC10_SP.F_CV;90.000000000;100.0 +25/10/2020 02:06:06;U247.PDI12.F_CV;0.512995958;100.0 +25/10/2020 02:06:50;U247.PI11.F_CV;248.581390381;100.0 +25/10/2020 02:06:14;U247.PI45.F_CV;0.133637711;100.0 +25/10/2020 02:06:20;U247.PI45.F_CV;0.132723600;100.0 +25/10/2020 02:06:25;U247.PI45.F_CV;0.132723600;100.0 +25/10/2020 02:06:26;U247.PI45.F_CV;0.131565690;100.0 +25/10/2020 02:06:44;U247.PI45.F_CV;0.129493713;100.0 +25/10/2020 02:06:01;U247.TC100_OP.F_CV;23.250000000;100.0 +25/10/2020 02:06:02;U247.TC100_OP.F_CV;23.779998779;100.0 +25/10/2020 02:06:07;U247.TC100_OP.F_CV;23.779998779;100.0 +25/10/2020 02:06:08;U247.TC100_OP.F_CV;25.119998932;100.0 +25/10/2020 02:06:19;U247.TC100_OP.F_CV;25.029998779;100.0 +25/10/2020 02:06:20;U247.TC100_OP.F_CV;25.739999771;100.0 +25/10/2020 02:06:25;U247.TC100_OP.F_CV;25.739999771;100.0 +25/10/2020 02:06:26;U247.TC100_OP.F_CV;25.269998550;100.0 +25/10/2020 02:06:31;U247.TC100_OP.F_CV;25.269998550;100.0 +25/10/2020 02:06:32;U247.TC100_OP.F_CV;25.059999466;100.0 +25/10/2020 02:06:37;U247.TC100_OP.F_CV;25.059999466;100.0 +25/10/2020 02:06:38;U247.TC100_OP.F_CV;24.709999084;100.0 +25/10/2020 02:06:43;U247.TC100_OP.F_CV;24.709999084;100.0 +25/10/2020 02:06:44;U247.TC100_OP.F_CV;24.389999390;100.0 +25/10/2020 02:06:49;U247.TC100_OP.F_CV;24.389999390;100.0 +25/10/2020 02:06:50;U247.TC100_OP.F_CV;24.100000381;100.0 +25/10/2020 02:06:55;U247.TC100_OP.F_CV;24.100000381;100.0 +25/10/2020 02:06:56;U247.TC100_OP.F_CV;23.569999695;100.0 +25/10/2020 02:06:32;U247.TC100_PV.F_CV;84.869995117;100.0 +25/10/2020 02:06:06;U247.TC100_SP.F_CV;85.000000000;100.0 +25/10/2020 02:06:14;U247.TC10_OP.F_CV;0.094607383;100.0 +25/10/2020 02:06:25;U247.TC10_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U247.TC10_OP.F_CV;0.875881195;100.0 +25/10/2020 02:06:31;U247.TC10_OP.F_CV;0.875881195;100.0 +25/10/2020 02:06:32;U247.TC10_OP.F_CV;0.314340651;100.0 +25/10/2020 02:06:37;U247.TC10_OP.F_CV;0.314340651;100.0 +25/10/2020 02:06:38;U247.TC10_OP.F_CV;1.144444108;100.0 +25/10/2020 02:06:43;U247.TC10_OP.F_CV;1.144444108;100.0 +25/10/2020 02:06:44;U247.TC10_OP.F_CV;0.045777764;100.0 +25/10/2020 02:06:55;U247.TC10_OP.F_CV;0.045777764;100.0 +25/10/2020 02:06:56;U247.TC10_OP.F_CV;0.827051580;100.0 +25/10/2020 02:06:01;U247.TC10_PV.F_CV;84.638557434;100.0 +25/10/2020 02:06:02;U247.TC10_PV.F_CV;87.392425537;100.0 +25/10/2020 02:06:07;U247.TC10_PV.F_CV;87.392425537;100.0 +25/10/2020 02:06:08;U247.TC10_PV.F_CV;89.586914063;100.0 +25/10/2020 02:06:13;U247.TC10_PV.F_CV;89.586914063;100.0 +25/10/2020 02:06:14;U247.TC10_PV.F_CV;85.864883423;100.0 +25/10/2020 02:06:26;U247.TC10_PV.F_CV;85.370048523;100.0 +25/10/2020 02:06:31;U247.TC10_PV.F_CV;85.370048523;100.0 +25/10/2020 02:06:32;U247.TC10_PV.F_CV;84.724609375;100.0 +25/10/2020 02:06:37;U247.TC10_PV.F_CV;84.724609375;100.0 +25/10/2020 02:06:38;U247.TC10_PV.F_CV;83.067985535;100.0 +25/10/2020 02:06:43;U247.TC10_PV.F_CV;83.067985535;100.0 +25/10/2020 02:06:44;U247.TC10_PV.F_CV;85.025817871;100.0 +25/10/2020 02:06:49;U247.TC10_PV.F_CV;85.025817871;100.0 +25/10/2020 02:06:50;U247.TC10_PV.F_CV;85.886398315;100.0 +25/10/2020 02:06:55;U247.TC10_PV.F_CV;85.886398315;100.0 +25/10/2020 02:06:56;U247.TC10_PV.F_CV;85.025817871;100.0 +25/10/2020 02:06:42;U247.TC10_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:14;U247.TC13_OP.F_CV;4.712058067;100.0 +25/10/2020 02:06:32;U247.TC13_OP.F_CV;4.516739368;100.0 +25/10/2020 02:06:44;U247.TC13_OP.F_CV;4.589983940;100.0 +25/10/2020 02:06:50;U247.TC13_OP.F_CV;4.712058067;100.0 +25/10/2020 02:06:56;U247.TC13_OP.F_CV;4.541154385;100.0 +25/10/2020 02:06:25;U247.TC13_PV.F_CV;149.941909790;100.0 +25/10/2020 02:06:20;U247.TC13_SP.F_CV;150.000000000;100.0 +25/10/2020 02:06:01;U247.TC17_OP.F_CV;7.983642101;100.0 +25/10/2020 02:06:02;U247.TC17_OP.F_CV;8.496353149;100.0 +25/10/2020 02:06:08;U247.TC17_OP.F_CV;8.667256355;100.0 +25/10/2020 02:06:13;U247.TC17_OP.F_CV;8.667256355;100.0 +25/10/2020 02:06:14;U247.TC17_OP.F_CV;8.935819626;100.0 +25/10/2020 02:06:19;U247.TC17_OP.F_CV;8.935819626;100.0 +25/10/2020 02:06:20;U247.TC17_OP.F_CV;9.277626991;100.0 +25/10/2020 02:06:25;U247.TC17_OP.F_CV;9.277626991;100.0 +25/10/2020 02:06:26;U247.TC17_OP.F_CV;9.497360229;100.0 +25/10/2020 02:06:44;U247.TC17_OP.F_CV;9.033478737;100.0 +25/10/2020 02:06:50;U247.TC17_OP.F_CV;9.131137848;100.0 +25/10/2020 02:06:26;U247.TC17_PV.F_CV;269.417755127;100.0 +25/10/2020 02:06:42;U247.TC17_SP.F_CV;270.000000000;100.0 +25/10/2020 02:06:02;U247.TC21_OP.F_CV;8.716086388;100.0 +25/10/2020 02:06:14;U247.TC21_OP.F_CV;8.569597244;100.0 +25/10/2020 02:06:20;U247.TC21_OP.F_CV;8.642842293;100.0 +25/10/2020 02:06:20;U247.TC21_PV.F_CV;148.673324585;100.0 +25/10/2020 02:06:42;U247.TC21_SP.F_CV;150.000000000;100.0 +25/10/2020 02:06:13;U247.TC22_OP.F_CV;3.686635971;100.0 +25/10/2020 02:06:14;U247.TC22_OP.F_CV;3.930783987;100.0 +25/10/2020 02:06:32;U247.TC22_OP.F_CV;3.735465527;100.0 +25/10/2020 02:06:38;U247.TC22_OP.F_CV;3.881954432;100.0 +25/10/2020 02:06:44;U247.TC22_OP.F_CV;3.759880304;100.0 +25/10/2020 02:06:50;U247.TC22_OP.F_CV;3.930783987;100.0 +25/10/2020 02:06:42;U247.TC22_PV.F_CV;150.453567505;100.0 +25/10/2020 02:06:42;U247.TC22_SP.F_CV;150.000000000;100.0 +25/10/2020 02:06:07;U247.TC23_OP.F_CV;3.173924923;100.0 +25/10/2020 02:06:08;U247.TC23_OP.F_CV;3.418073177;100.0 +25/10/2020 02:06:20;U247.TC23_OP.F_CV;3.735465527;100.0 +25/10/2020 02:06:32;U247.TC23_OP.F_CV;3.540147066;100.0 +25/10/2020 02:06:56;U247.TC23_OP.F_CV;3.442487955;100.0 +25/10/2020 02:06:38;U247.TC23_PV.F_CV;149.726104736;100.0 +25/10/2020 02:06:47;U247.TC23_SP.F_CV;150.000000000;100.0 +25/10/2020 02:06:56;U247.TC24_OP.F_CV;10.000000000;100.0 +25/10/2020 02:06:56;U247.TC24_PV.F_CV;146.126007080;100.0 +25/10/2020 02:06:42;U247.TC24_SP.F_CV;150.000000000;100.0 +25/10/2020 02:06:20;U247.TC25_OP.F_CV;3.442487955;100.0 +25/10/2020 02:06:26;U247.TC25_OP.F_CV;3.564561844;100.0 +25/10/2020 02:06:44;U247.TC25_OP.F_CV;3.686635971;100.0 +25/10/2020 02:06:56;U247.TC25_OP.F_CV;3.466902733;100.0 +25/10/2020 02:06:42;U247.TC25_PV.F_CV;150.102218628;100.0 +25/10/2020 02:06:42;U247.TC25_SP.F_CV;150.000000000;100.0 +25/10/2020 02:06:26;U247.TC26_OP.F_CV;0.122074038;100.0 +25/10/2020 02:06:32;U247.TC26_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U247.TC26_PV.F_CV;154.653808594;100.0 +25/10/2020 02:06:42;U247.TC26_SP.F_CV;150.000000000;100.0 +25/10/2020 02:06:14;U247.TC3_OP.F_CV;16.138187408;100.0 +25/10/2020 02:06:32;U247.TC3_OP.F_CV;15.845210075;100.0 +25/10/2020 02:06:43;U247.TC3_OP.F_CV;15.845210075;100.0 +25/10/2020 02:06:44;U247.TC3_OP.F_CV;16.431165695;100.0 +25/10/2020 02:06:49;U247.TC3_OP.F_CV;16.431165695;100.0 +25/10/2020 02:06:50;U247.TC3_OP.F_CV;15.942869186;100.0 +25/10/2020 02:06:38;U247.TC3_PV.F_CV;68.957351685;100.0 +25/10/2020 02:06:06;U247.TC3_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:08;U247.TC41_OP.F_CV;8.642842293;100.0 +25/10/2020 02:06:26;U247.TC41_OP.F_CV;8.349864006;100.0 +25/10/2020 02:06:56;U247.TC41_OP.F_CV;8.569597244;100.0 +25/10/2020 02:06:02;U247.TC41_PV.F_CV;319.844207764;100.0 +25/10/2020 02:06:14;U247.TC41_PV.F_CV;320.186981201;100.0 +25/10/2020 02:06:42;U247.TC41_SP.F_CV;320.000000000;100.0 +25/10/2020 02:06:01;U247.TC42_OP.F_CV;6.762901783;100.0 +25/10/2020 02:06:02;U247.TC42_OP.F_CV;6.543168545;100.0 +25/10/2020 02:06:14;U247.TC42_OP.F_CV;6.445509434;100.0 +25/10/2020 02:06:20;U247.TC42_OP.F_CV;6.299020290;100.0 +25/10/2020 02:06:50;U247.TC42_OP.F_CV;6.543168545;100.0 +25/10/2020 02:06:56;U247.TC42_OP.F_CV;6.689657211;100.0 +25/10/2020 02:06:44;U247.TC42_PV.F_CV;330.018707275;100.0 +25/10/2020 02:06:42;U247.TC42_SP.F_CV;330.000000000;100.0 +25/10/2020 02:06:01;U247.TC43_OP.F_CV;7.495346069;100.0 +25/10/2020 02:06:02;U247.TC43_OP.F_CV;7.177953243;100.0 +25/10/2020 02:06:07;U247.TC43_OP.F_CV;7.177953243;100.0 +25/10/2020 02:06:08;U247.TC43_OP.F_CV;6.909390450;100.0 +25/10/2020 02:06:13;U247.TC43_OP.F_CV;6.909390450;100.0 +25/10/2020 02:06:14;U247.TC43_OP.F_CV;6.689657211;100.0 +25/10/2020 02:06:25;U247.TC43_OP.F_CV;6.616412640;100.0 +25/10/2020 02:06:26;U247.TC43_OP.F_CV;6.372264862;100.0 +25/10/2020 02:06:32;U247.TC43_OP.F_CV;6.299020290;100.0 +25/10/2020 02:06:38;U247.TC43_OP.F_CV;6.445509434;100.0 +25/10/2020 02:06:49;U247.TC43_OP.F_CV;6.445509434;100.0 +25/10/2020 02:06:50;U247.TC43_OP.F_CV;6.811731339;100.0 +25/10/2020 02:06:26;U247.TC43_PV.F_CV;349.970245361;100.0 +25/10/2020 02:06:42;U247.TC43_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:38;U247.TC44_OP.F_CV;7.788323402;100.0 +25/10/2020 02:06:02;U247.TC44_PV.F_CV;350.370910645;100.0 +25/10/2020 02:06:42;U247.TC44_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:25;U247.TC45_OP.F_CV;7.617420197;100.0 +25/10/2020 02:06:26;U247.TC45_OP.F_CV;7.397686481;100.0 +25/10/2020 02:06:49;U247.TC45_OP.F_CV;7.300027370;100.0 +25/10/2020 02:06:50;U247.TC45_OP.F_CV;7.519760609;100.0 +25/10/2020 02:06:08;U247.TC45_PV.F_CV;349.671417236;100.0 +25/10/2020 02:06:42;U247.TC45_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:08;U247.TC46_OP.F_CV;13.476973534;100.0 +25/10/2020 02:06:26;U247.TC46_OP.F_CV;13.672292709;100.0 +25/10/2020 02:06:32;U247.TC46_OP.F_CV;13.550218582;100.0 +25/10/2020 02:06:38;U247.TC46_PV.F_CV;339.881225586;100.0 +25/10/2020 02:06:42;U247.TC46_SP.F_CV;340.000000000;100.0 +25/10/2020 02:06:32;U247.TC5_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U247.TC5_PV.F_CV;100.413093567;100.0 +25/10/2020 02:06:06;U247.TC5_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:02;U247.TC70_OP.F_CV;8.374279022;100.0 +25/10/2020 02:06:07;U247.TC70_OP.F_CV;8.374279022;100.0 +25/10/2020 02:06:08;U247.TC70_OP.F_CV;8.008056641;100.0 +25/10/2020 02:06:13;U247.TC70_OP.F_CV;8.008056641;100.0 +25/10/2020 02:06:14;U247.TC70_OP.F_CV;8.569597244;100.0 +25/10/2020 02:06:20;U247.TC70_OP.F_CV;8.716086388;100.0 +25/10/2020 02:06:25;U247.TC70_OP.F_CV;8.716086388;100.0 +25/10/2020 02:06:26;U247.TC70_OP.F_CV;8.276619911;100.0 +25/10/2020 02:06:31;U247.TC70_OP.F_CV;8.276619911;100.0 +25/10/2020 02:06:32;U247.TC70_OP.F_CV;8.569597244;100.0 +25/10/2020 02:06:37;U247.TC70_OP.F_CV;8.569597244;100.0 +25/10/2020 02:06:38;U247.TC70_OP.F_CV;8.081301689;100.0 +25/10/2020 02:06:43;U247.TC70_OP.F_CV;8.081301689;100.0 +25/10/2020 02:06:44;U247.TC70_OP.F_CV;8.496353149;100.0 +25/10/2020 02:06:01;U247.TC70_PV.F_CV;79.754730225;100.0 +25/10/2020 02:06:02;U247.TC70_PV.F_CV;80.636825562;100.0 +25/10/2020 02:06:07;U247.TC70_PV.F_CV;80.636825562;100.0 +25/10/2020 02:06:08;U247.TC70_PV.F_CV;81.734077454;100.0 +25/10/2020 02:06:13;U247.TC70_PV.F_CV;81.734077454;100.0 +25/10/2020 02:06:14;U247.TC70_PV.F_CV;80.012908936;100.0 +25/10/2020 02:06:20;U247.TC70_PV.F_CV;79.539588928;100.0 +25/10/2020 02:06:25;U247.TC70_PV.F_CV;79.539588928;100.0 +25/10/2020 02:06:26;U247.TC70_PV.F_CV;80.916519165;100.0 +25/10/2020 02:06:31;U247.TC70_PV.F_CV;80.916519165;100.0 +25/10/2020 02:06:32;U247.TC70_PV.F_CV;79.905334473;100.0 +25/10/2020 02:06:38;U247.TC70_PV.F_CV;80.228057861;100.0 +25/10/2020 02:06:55;U247.TC70_PV.F_CV;80.228057861;100.0 +25/10/2020 02:06:56;U247.TC70_PV.F_CV;81.174697876;100.0 +25/10/2020 02:06:57;U247.TC70_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:01;U247.TI11.F_CV;70.675559998;100.0 +25/10/2020 02:06:02;U247.TI11.F_CV;72.095520020;100.0 +25/10/2020 02:06:08;U247.TI11.F_CV;71.342506409;100.0 +25/10/2020 02:06:14;U247.TI11.F_CV;71.944923401;100.0 +25/10/2020 02:06:20;U247.TI11.F_CV;71.579170227;100.0 +25/10/2020 02:06:32;U247.TI11.F_CV;73.106712341;100.0 +25/10/2020 02:06:37;U247.TI11.F_CV;73.106712341;100.0 +25/10/2020 02:06:38;U247.TI11.F_CV;70.869186401;100.0 +25/10/2020 02:06:44;U247.TI11.F_CV;71.966430664;100.0 +25/10/2020 02:06:50;U247.TI11.F_CV;71.062820435;100.0 +25/10/2020 02:06:06;U247.TI12.F_CV;111.213905334;100.0 +25/10/2020 02:06:00;U247.TI13.F_CV;149.984924316;100.0 +25/10/2020 02:06:07;U247.TI14.F_CV;89.590774536;100.0 +25/10/2020 02:06:08;U247.TI14.F_CV;91.247467041;100.0 +25/10/2020 02:06:20;U247.TI14.F_CV;89.741378784;100.0 +25/10/2020 02:06:25;U247.TI14.F_CV;89.741378784;100.0 +25/10/2020 02:06:26;U247.TI14.F_CV;91.527168274;100.0 +25/10/2020 02:06:32;U247.TI14.F_CV;90.666549683;100.0 +25/10/2020 02:06:37;U247.TI14.F_CV;90.666549683;100.0 +25/10/2020 02:06:38;U247.TI14.F_CV;89.461677551;100.0 +25/10/2020 02:06:43;U247.TI14.F_CV;89.461677551;100.0 +25/10/2020 02:06:44;U247.TI14.F_CV;91.268989563;100.0 +25/10/2020 02:06:49;U247.TI14.F_CV;91.268989563;100.0 +25/10/2020 02:06:50;U247.TI14.F_CV;88.945304871;100.0 +25/10/2020 02:06:55;U247.TI14.F_CV;88.945304871;100.0 +25/10/2020 02:06:56;U247.TI14.F_CV;90.408363342;100.0 +25/10/2020 02:06:56;U247.TI15.F_CV;120.438896179;100.0 +25/10/2020 02:06:42;U247.TI16.F_CV;221.674774170;100.0 +25/10/2020 02:06:26;U247.TI17.F_CV;269.417755127;100.0 +25/10/2020 02:06:08;U247.TI18.F_CV;184.840133667;100.0 +25/10/2020 02:06:14;U247.TI21.F_CV;148.651977539;100.0 +25/10/2020 02:06:15;U247.TI22.F_CV;150.453567505;100.0 +25/10/2020 02:06:38;U247.TI23.F_CV;149.726104736;100.0 +25/10/2020 02:06:44;U247.TI24.F_CV;146.126007080;100.0 +25/10/2020 02:06:42;U247.TI25.F_CV;150.102218628;100.0 +25/10/2020 02:06:08;U247.TI26.F_CV;154.675323486;100.0 +25/10/2020 02:06:08;U247.TI31.F_CV;167.218887329;100.0 +25/10/2020 02:06:44;U247.TI31.F_CV;167.541625977;100.0 +25/10/2020 02:06:20;U247.TI32.F_CV;143.186019897;100.0 +25/10/2020 02:06:25;U247.TI33.F_CV;154.503189087;100.0 +25/10/2020 02:06:08;U247.TI34.F_CV;153.986831665;100.0 +25/10/2020 02:06:56;U247.TI34.F_CV;154.309555054;100.0 +25/10/2020 02:06:02;U247.TI35.F_CV;137.742584229;100.0 +25/10/2020 02:06:26;U247.TI36.F_CV;158.827819824;100.0 +25/10/2020 02:06:14;U247.TI41.F_CV;320.186981201;100.0 +25/10/2020 02:06:44;U247.TI42.F_CV;330.018707275;100.0 +25/10/2020 02:06:08;U247.TI43.F_CV;349.754882813;100.0 +25/10/2020 02:06:38;U247.TI44.F_CV;350.392303467;100.0 +25/10/2020 02:06:56;U247.TI45.F_CV;349.757232666;100.0 +25/10/2020 02:06:38;U247.TI46.F_CV;339.881225586;100.0 +25/10/2020 02:06:06;U247.TI51.F_CV;346.034667969;100.0 +25/10/2020 02:06:32;U247.TI52.F_CV;322.410583496;100.0 +25/10/2020 02:06:47;U247.TI53.F_CV;331.941986084;100.0 +25/10/2020 02:06:26;U247.TI54.F_CV;331.619232178;100.0 +25/10/2020 02:06:20;U247.TI55.F_CV;331.059844971;100.0 +25/10/2020 02:06:11;U247.TI56.F_CV;333.534118652;100.0 +25/10/2020 02:06:20;U247.TI61.F_CV;87.241821289;100.0 +25/10/2020 02:06:02;U247.TI71.F_CV;87.005165100;100.0 +25/10/2020 02:06:07;U247.TI71.F_CV;87.005165100;100.0 +25/10/2020 02:06:08;U247.TI71.F_CV;87.951805115;100.0 +25/10/2020 02:06:19;U247.TI71.F_CV;87.629089355;100.0 +25/10/2020 02:06:20;U247.TI71.F_CV;86.295173645;100.0 +25/10/2020 02:06:25;U247.TI71.F_CV;86.295173645;100.0 +25/10/2020 02:06:26;U247.TI71.F_CV;88.296035767;100.0 +25/10/2020 02:06:32;U247.TI71.F_CV;87.951805115;100.0 +25/10/2020 02:06:38;U247.TI71.F_CV;88.360580444;100.0 +25/10/2020 02:06:38;U247.TI75.F_CV;5.830464363;100.0 +25/10/2020 02:06:02;U247.TI80.F_CV;80.939994812;100.0 +25/10/2020 02:06:06;U247.TI91.F_CV;22.870050430;100.0 +25/10/2020 02:06:25;U247.TI92.F_CV;20.288293839;100.0 +25/10/2020 02:06:06;U247.U247_COEF_A_FQ91.F_CV;1.030099988;100.0 +25/10/2020 02:06:06;U247.U247_COEF_A_FQ92.F_CV;1.043900013;100.0 +25/10/2020 02:06:06;U247.U247_COEF_A_TI21.F_CV;0.992500067;100.0 +25/10/2020 02:06:06;U247.U247_COEF_A_TI22.F_CV;0.993700087;100.0 +25/10/2020 02:06:06;U247.U247_COEF_A_TI23.F_CV;0.998900056;100.0 +25/10/2020 02:06:06;U247.U247_COEF_A_TI24.F_CV;0.995400071;100.0 +25/10/2020 02:06:06;U247.U247_COEF_A_TI25.F_CV;0.999900043;100.0 +25/10/2020 02:06:06;U247.U247_COEF_A_TI26.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U247.U247_COEF_A_TI41.F_CV;0.995700061;100.0 +25/10/2020 02:06:06;U247.U247_COEF_A_TI42.F_CV;0.997300088;100.0 +25/10/2020 02:06:06;U247.U247_COEF_A_TI43.F_CV;1.001000047;100.0 +25/10/2020 02:06:06;U247.U247_COEF_A_TI44.F_CV;0.994200051;100.0 +25/10/2020 02:06:06;U247.U247_COEF_A_TI45.F_CV;0.997100055;100.0 +25/10/2020 02:06:06;U247.U247_COEF_A_TI46.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U247.U247_COEF_B_TI21.F_CV;2.269000053;100.0 +25/10/2020 02:06:06;U247.U247_COEF_B_TI22.F_CV;1.755600095;100.0 +25/10/2020 02:06:06;U247.U247_COEF_B_TI23.F_CV;-0.760100067;100.0 +25/10/2020 02:06:06;U247.U247_COEF_B_TI24.F_CV;0.835900068;100.0 +25/10/2020 02:06:06;U247.U247_COEF_B_TI25.F_CV;-0.642200053;100.0 +25/10/2020 02:06:06;U247.U247_COEF_B_TI26.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U247.U247_COEF_B_TI41.F_CV;2.119100094;100.0 +25/10/2020 02:06:06;U247.U247_COEF_B_TI42.F_CV;1.419100046;100.0 +25/10/2020 02:06:06;U247.U247_COEF_B_TI43.F_CV;-1.837800026;100.0 +25/10/2020 02:06:06;U247.U247_COEF_B_TI44.F_CV;0.610500038;100.0 +25/10/2020 02:06:06;U247.U247_COEF_B_TI45.F_CV;1.036100030;100.0 +25/10/2020 02:06:06;U247.U247_COEF_B_TI46.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U247.WI2.F_CV;8.409999847;100.0 +25/10/2020 02:06:02;U247.WI2.F_CV;8.408999443;100.0 +25/10/2020 02:06:07;U247.WI2.F_CV;8.408999443;100.0 +25/10/2020 02:06:08;U247.WI2.F_CV;8.406999588;100.0 +25/10/2020 02:06:13;U247.WI2.F_CV;8.406999588;100.0 +25/10/2020 02:06:14;U247.WI2.F_CV;8.407999992;100.0 +25/10/2020 02:06:19;U247.WI2.F_CV;8.407999992;100.0 +25/10/2020 02:06:20;U247.WI2.F_CV;8.405999184;100.0 +25/10/2020 02:06:25;U247.WI2.F_CV;8.405999184;100.0 +25/10/2020 02:06:26;U247.WI2.F_CV;8.403999329;100.0 +25/10/2020 02:06:43;U247.WI2.F_CV;8.403999329;100.0 +25/10/2020 02:06:44;U247.WI2.F_CV;8.402999878;100.0 +25/10/2020 02:06:49;U247.WI2.F_CV;8.402999878;100.0 +25/10/2020 02:06:50;U247.WI2.F_CV;8.401999474;100.0 +25/10/2020 02:06:55;U247.WI2.F_CV;8.401999474;100.0 +25/10/2020 02:06:56;U247.WI2.F_CV;8.401000023;100.0 +25/10/2020 02:06:20;U247.WI3.F_CV;0.064999998;100.0 +25/10/2020 02:06:42;U248.BILANR34_DUREE.F_CV;720.000000000;100.0 +25/10/2020 02:06:42;U248.BILANR34_STAB.F_CV;30.000000000;100.0 +25/10/2020 02:06:00;U248.DPY01.F_CV;2.781250000;100.0 +25/10/2020 02:06:01;U248.DPY01.F_CV;2.890625000;100.0 +25/10/2020 02:06:02;U248.DPY01.F_CV;2.828125000;100.0 +25/10/2020 02:06:03;U248.DPY01.F_CV;2.812500000;100.0 +25/10/2020 02:06:07;U248.DPY01.F_CV;2.875000000;100.0 +25/10/2020 02:06:08;U248.DPY01.F_CV;2.843750000;100.0 +25/10/2020 02:06:09;U248.DPY01.F_CV;2.828125000;100.0 +25/10/2020 02:06:10;U248.DPY01.F_CV;2.875000000;100.0 +25/10/2020 02:06:12;U248.DPY01.F_CV;2.906250000;100.0 +25/10/2020 02:06:14;U248.DPY01.F_CV;2.968750000;100.0 +25/10/2020 02:06:15;U248.DPY01.F_CV;2.984375000;100.0 +25/10/2020 02:06:16;U248.DPY01.F_CV;2.937500000;100.0 +25/10/2020 02:06:17;U248.DPY01.F_CV;2.828125000;100.0 +25/10/2020 02:06:18;U248.DPY01.F_CV;2.843750000;100.0 +25/10/2020 02:06:21;U248.DPY01.F_CV;2.828125000;100.0 +25/10/2020 02:06:22;U248.DPY01.F_CV;2.843750000;100.0 +25/10/2020 02:06:23;U248.DPY01.F_CV;2.875000000;100.0 +25/10/2020 02:06:24;U248.DPY01.F_CV;2.843750000;100.0 +25/10/2020 02:06:25;U248.DPY01.F_CV;2.796875000;100.0 +25/10/2020 02:06:29;U248.DPY01.F_CV;2.796875000;100.0 +25/10/2020 02:06:30;U248.DPY01.F_CV;2.765625000;100.0 +25/10/2020 02:06:33;U248.DPY01.F_CV;2.812500000;100.0 +25/10/2020 02:06:34;U248.DPY01.F_CV;2.890625000;100.0 +25/10/2020 02:06:38;U248.DPY01.F_CV;2.875000000;100.0 +25/10/2020 02:06:39;U248.DPY01.F_CV;2.906250000;100.0 +25/10/2020 02:06:43;U248.DPY01.F_CV;2.875000000;100.0 +25/10/2020 02:06:44;U248.DPY01.F_CV;2.906250000;100.0 +25/10/2020 02:06:47;U248.DPY01.F_CV;2.859375000;100.0 +25/10/2020 02:06:48;U248.DPY01.F_CV;2.890625000;100.0 +25/10/2020 02:06:49;U248.DPY01.F_CV;2.937500000;100.0 +25/10/2020 02:06:51;U248.DPY01.F_CV;2.921875000;100.0 +25/10/2020 02:06:52;U248.DPY01.F_CV;2.937500000;100.0 +25/10/2020 02:06:54;U248.DPY01.F_CV;2.984375000;100.0 +25/10/2020 02:06:55;U248.DPY01.F_CV;2.953125000;100.0 +25/10/2020 02:06:56;U248.DPY01.F_CV;2.937500000;100.0 +25/10/2020 02:06:57;U248.DPY01.F_CV;2.953125000;100.0 +25/10/2020 02:06:01;U248.DPY02.F_CV;20.171875000;100.0 +25/10/2020 02:06:02;U248.DPY02.F_CV;20.187500000;100.0 +25/10/2020 02:06:05;U248.DPY02.F_CV;20.203125000;100.0 +25/10/2020 02:06:07;U248.DPY02.F_CV;20.187500000;100.0 +25/10/2020 02:06:09;U248.DPY02.F_CV;20.281250000;100.0 +25/10/2020 02:06:10;U248.DPY02.F_CV;20.234375000;100.0 +25/10/2020 02:06:12;U248.DPY02.F_CV;20.218750000;100.0 +25/10/2020 02:06:14;U248.DPY02.F_CV;20.171875000;100.0 +25/10/2020 02:06:15;U248.DPY02.F_CV;20.125000000;100.0 +25/10/2020 02:06:16;U248.DPY02.F_CV;20.171875000;100.0 +25/10/2020 02:06:17;U248.DPY02.F_CV;20.203125000;100.0 +25/10/2020 02:06:20;U248.DPY02.F_CV;20.218750000;100.0 +25/10/2020 02:06:21;U248.DPY02.F_CV;20.187500000;100.0 +25/10/2020 02:06:22;U248.DPY02.F_CV;20.171875000;100.0 +25/10/2020 02:06:26;U248.DPY02.F_CV;20.296875000;100.0 +25/10/2020 02:06:29;U248.DPY02.F_CV;20.265625000;100.0 +25/10/2020 02:06:30;U248.DPY02.F_CV;20.281250000;100.0 +25/10/2020 02:06:32;U248.DPY02.F_CV;20.328125000;100.0 +25/10/2020 02:06:33;U248.DPY02.F_CV;20.343750000;100.0 +25/10/2020 02:06:34;U248.DPY02.F_CV;20.265625000;100.0 +25/10/2020 02:06:36;U248.DPY02.F_CV;20.234375000;100.0 +25/10/2020 02:06:37;U248.DPY02.F_CV;20.250000000;100.0 +25/10/2020 02:06:39;U248.DPY02.F_CV;20.265625000;100.0 +25/10/2020 02:06:40;U248.DPY02.F_CV;20.234375000;100.0 +25/10/2020 02:06:41;U248.DPY02.F_CV;20.265625000;100.0 +25/10/2020 02:06:42;U248.DPY02.F_CV;20.218750000;100.0 +25/10/2020 02:06:43;U248.DPY02.F_CV;20.250000000;100.0 +25/10/2020 02:06:46;U248.DPY02.F_CV;20.218750000;100.0 +25/10/2020 02:06:47;U248.DPY02.F_CV;20.234375000;100.0 +25/10/2020 02:06:48;U248.DPY02.F_CV;20.218750000;100.0 +25/10/2020 02:06:50;U248.DPY02.F_CV;20.234375000;100.0 +25/10/2020 02:06:56;U248.DPY02.F_CV;20.140625000;100.0 +25/10/2020 02:06:59;U248.DPY02.F_CV;20.156250000;100.0 +25/10/2020 02:06:00;U248.DPY03.F_CV;-0.015625000;100.0 +25/10/2020 02:06:01;U248.DPY03.F_CV;0.046875000;100.0 +25/10/2020 02:06:06;U248.DPY03.F_CV;-0.015625000;100.0 +25/10/2020 02:06:07;U248.DPY03.F_CV;-0.031250000;100.0 +25/10/2020 02:06:08;U248.DPY03.F_CV;0.015625000;100.0 +25/10/2020 02:06:09;U248.DPY03.F_CV;0.093750000;100.0 +25/10/2020 02:06:10;U248.DPY03.F_CV;0.156250000;100.0 +25/10/2020 02:06:12;U248.DPY03.F_CV;0.140625000;100.0 +25/10/2020 02:06:13;U248.DPY03.F_CV;0.109375000;100.0 +25/10/2020 02:06:14;U248.DPY03.F_CV;0.125000000;100.0 +25/10/2020 02:06:15;U248.DPY03.F_CV;0.109375000;100.0 +25/10/2020 02:06:17;U248.DPY03.F_CV;0.046875000;100.0 +25/10/2020 02:06:21;U248.DPY03.F_CV;0.015625000;100.0 +25/10/2020 02:06:22;U248.DPY03.F_CV;0.078125000;100.0 +25/10/2020 02:06:24;U248.DPY03.F_CV;0.093750000;100.0 +25/10/2020 02:06:25;U248.DPY03.F_CV;0.062500000;100.0 +25/10/2020 02:06:26;U248.DPY03.F_CV;-0.015625000;100.0 +25/10/2020 02:06:28;U248.DPY03.F_CV;0.015625000;100.0 +25/10/2020 02:06:29;U248.DPY03.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U248.DPY03.F_CV;-0.031250000;100.0 +25/10/2020 02:06:31;U248.DPY03.F_CV;0.015625000;100.0 +25/10/2020 02:06:32;U248.DPY03.F_CV;0.093750000;100.0 +25/10/2020 02:06:33;U248.DPY03.F_CV;0.078125000;100.0 +25/10/2020 02:06:34;U248.DPY03.F_CV;0.109375000;100.0 +25/10/2020 02:06:37;U248.DPY03.F_CV;0.125000000;100.0 +25/10/2020 02:06:38;U248.DPY03.F_CV;0.109375000;100.0 +25/10/2020 02:06:39;U248.DPY03.F_CV;0.046875000;100.0 +25/10/2020 02:06:41;U248.DPY03.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U248.DPY03.F_CV;0.062500000;100.0 +25/10/2020 02:06:43;U248.DPY03.F_CV;0.078125000;100.0 +25/10/2020 02:06:44;U248.DPY03.F_CV;0.046875000;100.0 +25/10/2020 02:06:46;U248.DPY03.F_CV;0.031250000;100.0 +25/10/2020 02:06:47;U248.DPY03.F_CV;-0.031250000;100.0 +25/10/2020 02:06:48;U248.DPY03.F_CV;-0.015625000;100.0 +25/10/2020 02:06:49;U248.DPY03.F_CV;-0.046875000;100.0 +25/10/2020 02:06:52;U248.DPY03.F_CV;-0.093750000;100.0 +25/10/2020 02:06:54;U248.DPY03.F_CV;-0.078125000;100.0 +25/10/2020 02:06:55;U248.DPY03.F_CV;-0.031250000;100.0 +25/10/2020 02:06:57;U248.DPY03.F_CV;-0.093750000;100.0 +25/10/2020 02:06:59;U248.DPY03.F_CV;-0.031250000;100.0 +25/10/2020 02:06:00;U248.DPY04.F_CV;-25.343750000;100.0 +25/10/2020 02:06:02;U248.DPY04.F_CV;-25.359375000;100.0 +25/10/2020 02:06:05;U248.DPY04.F_CV;-25.406250000;100.0 +25/10/2020 02:06:09;U248.DPY04.F_CV;-25.453125000;100.0 +25/10/2020 02:06:10;U248.DPY04.F_CV;-25.468750000;100.0 +25/10/2020 02:06:12;U248.DPY04.F_CV;-25.421875000;100.0 +25/10/2020 02:06:13;U248.DPY04.F_CV;-25.406250000;100.0 +25/10/2020 02:06:15;U248.DPY04.F_CV;-25.390625000;100.0 +25/10/2020 02:06:16;U248.DPY04.F_CV;-25.375000000;100.0 +25/10/2020 02:06:18;U248.DPY04.F_CV;-25.359375000;100.0 +25/10/2020 02:06:20;U248.DPY04.F_CV;-25.296875000;100.0 +25/10/2020 02:06:21;U248.DPY04.F_CV;-25.312500000;100.0 +25/10/2020 02:06:22;U248.DPY04.F_CV;-25.343750000;100.0 +25/10/2020 02:06:25;U248.DPY04.F_CV;-25.359375000;100.0 +25/10/2020 02:06:26;U248.DPY04.F_CV;-25.265625000;100.0 +25/10/2020 02:06:29;U248.DPY04.F_CV;-25.234375000;100.0 +25/10/2020 02:06:30;U248.DPY04.F_CV;-25.281250000;100.0 +25/10/2020 02:06:31;U248.DPY04.F_CV;-25.312500000;100.0 +25/10/2020 02:06:32;U248.DPY04.F_CV;-25.375000000;100.0 +25/10/2020 02:06:33;U248.DPY04.F_CV;-25.406250000;100.0 +25/10/2020 02:06:34;U248.DPY04.F_CV;-25.390625000;100.0 +25/10/2020 02:06:37;U248.DPY04.F_CV;-25.453125000;100.0 +25/10/2020 02:06:38;U248.DPY04.F_CV;-25.484375000;100.0 +25/10/2020 02:06:39;U248.DPY04.F_CV;-25.468750000;100.0 +25/10/2020 02:06:40;U248.DPY04.F_CV;-25.421875000;100.0 +25/10/2020 02:06:43;U248.DPY04.F_CV;-25.468750000;100.0 +25/10/2020 02:06:44;U248.DPY04.F_CV;-25.421875000;100.0 +25/10/2020 02:06:46;U248.DPY04.F_CV;-25.406250000;100.0 +25/10/2020 02:06:47;U248.DPY04.F_CV;-25.359375000;100.0 +25/10/2020 02:06:48;U248.DPY04.F_CV;-25.375000000;100.0 +25/10/2020 02:06:51;U248.DPY04.F_CV;-25.390625000;100.0 +25/10/2020 02:06:52;U248.DPY04.F_CV;-25.343750000;100.0 +25/10/2020 02:06:54;U248.DPY04.F_CV;-25.328125000;100.0 +25/10/2020 02:06:56;U248.DPY04.F_CV;-25.359375000;100.0 +25/10/2020 02:06:57;U248.DPY04.F_CV;-25.328125000;100.0 +25/10/2020 02:06:59;U248.DPY04.F_CV;-25.359375000;100.0 +25/10/2020 02:06:00;U248.DPY12.F_CV;12.703125000;100.0 +25/10/2020 02:06:01;U248.DPY12.F_CV;12.734375000;100.0 +25/10/2020 02:06:03;U248.DPY12.F_CV;12.656250000;100.0 +25/10/2020 02:06:05;U248.DPY12.F_CV;12.687500000;100.0 +25/10/2020 02:06:07;U248.DPY12.F_CV;12.640625000;100.0 +25/10/2020 02:06:09;U248.DPY12.F_CV;12.687500000;100.0 +25/10/2020 02:06:13;U248.DPY12.F_CV;12.750000000;100.0 +25/10/2020 02:06:15;U248.DPY12.F_CV;12.718750000;100.0 +25/10/2020 02:06:16;U248.DPY12.F_CV;12.671875000;100.0 +25/10/2020 02:06:18;U248.DPY12.F_CV;12.687500000;100.0 +25/10/2020 02:06:21;U248.DPY12.F_CV;12.656250000;100.0 +25/10/2020 02:06:22;U248.DPY12.F_CV;12.687500000;100.0 +25/10/2020 02:06:23;U248.DPY12.F_CV;12.750000000;100.0 +25/10/2020 02:06:26;U248.DPY12.F_CV;12.718750000;100.0 +25/10/2020 02:06:29;U248.DPY12.F_CV;12.750000000;100.0 +25/10/2020 02:06:31;U248.DPY12.F_CV;12.671875000;100.0 +25/10/2020 02:06:32;U248.DPY12.F_CV;12.687500000;100.0 +25/10/2020 02:06:34;U248.DPY12.F_CV;12.765625000;100.0 +25/10/2020 02:06:36;U248.DPY12.F_CV;12.750000000;100.0 +25/10/2020 02:06:38;U248.DPY12.F_CV;12.796875000;100.0 +25/10/2020 02:06:40;U248.DPY12.F_CV;12.828125000;100.0 +25/10/2020 02:06:42;U248.DPY12.F_CV;12.781250000;100.0 +25/10/2020 02:06:43;U248.DPY12.F_CV;12.796875000;100.0 +25/10/2020 02:06:44;U248.DPY12.F_CV;12.781250000;100.0 +25/10/2020 02:06:48;U248.DPY12.F_CV;12.812500000;100.0 +25/10/2020 02:06:52;U248.DPY12.F_CV;12.796875000;100.0 +25/10/2020 02:06:55;U248.DPY12.F_CV;12.765625000;100.0 +25/10/2020 02:06:57;U248.DPY12.F_CV;12.812500000;100.0 +25/10/2020 02:06:58;U248.DPY12.F_CV;12.781250000;100.0 +25/10/2020 02:06:00;U248.DPY14.F_CV;-0.890625000;100.0 +25/10/2020 02:06:02;U248.DPY14.F_CV;-0.968750000;100.0 +25/10/2020 02:06:08;U248.DPY14.F_CV;-0.937500000;100.0 +25/10/2020 02:06:12;U248.DPY14.F_CV;-0.828125000;100.0 +25/10/2020 02:06:16;U248.DPY14.F_CV;-0.859375000;100.0 +25/10/2020 02:06:17;U248.DPY14.F_CV;-0.921875000;100.0 +25/10/2020 02:06:20;U248.DPY14.F_CV;-0.843750000;100.0 +25/10/2020 02:06:21;U248.DPY14.F_CV;-0.890625000;100.0 +25/10/2020 02:06:24;U248.DPY14.F_CV;-0.812500000;100.0 +25/10/2020 02:06:25;U248.DPY14.F_CV;-0.890625000;100.0 +25/10/2020 02:06:26;U248.DPY14.F_CV;-0.812500000;100.0 +25/10/2020 02:06:30;U248.DPY14.F_CV;-0.859375000;100.0 +25/10/2020 02:06:34;U248.DPY14.F_CV;-0.781250000;100.0 +25/10/2020 02:06:36;U248.DPY14.F_CV;-0.828125000;100.0 +25/10/2020 02:06:37;U248.DPY14.F_CV;-0.890625000;100.0 +25/10/2020 02:06:40;U248.DPY14.F_CV;-0.859375000;100.0 +25/10/2020 02:06:41;U248.DPY14.F_CV;-0.906250000;100.0 +25/10/2020 02:06:43;U248.DPY14.F_CV;-0.875000000;100.0 +25/10/2020 02:06:44;U248.DPY14.F_CV;-0.828125000;100.0 +25/10/2020 02:06:51;U248.DPY14.F_CV;-0.906250000;100.0 +25/10/2020 02:06:59;U248.DPY14.F_CV;-0.765625000;100.0 +25/10/2020 02:06:00;U248.DPY34.F_CV;-25.312500000;100.0 +25/10/2020 02:06:04;U248.DPY34.F_CV;-25.359375000;100.0 +25/10/2020 02:06:06;U248.DPY34.F_CV;-25.437500000;100.0 +25/10/2020 02:06:11;U248.DPY34.F_CV;-25.328125000;100.0 +25/10/2020 02:06:12;U248.DPY34.F_CV;-25.281250000;100.0 +25/10/2020 02:06:13;U248.DPY34.F_CV;-25.296875000;100.0 +25/10/2020 02:06:14;U248.DPY34.F_CV;-25.250000000;100.0 +25/10/2020 02:06:17;U248.DPY34.F_CV;-25.296875000;100.0 +25/10/2020 02:06:19;U248.DPY34.F_CV;-25.281250000;100.0 +25/10/2020 02:06:20;U248.DPY34.F_CV;-25.250000000;100.0 +25/10/2020 02:06:21;U248.DPY34.F_CV;-25.281250000;100.0 +25/10/2020 02:06:22;U248.DPY34.F_CV;-25.234375000;100.0 +25/10/2020 02:06:25;U248.DPY34.F_CV;-25.250000000;100.0 +25/10/2020 02:06:26;U248.DPY34.F_CV;-25.281250000;100.0 +25/10/2020 02:06:28;U248.DPY34.F_CV;-25.250000000;100.0 +25/10/2020 02:06:30;U248.DPY34.F_CV;-25.328125000;100.0 +25/10/2020 02:06:32;U248.DPY34.F_CV;-25.281250000;100.0 +25/10/2020 02:06:33;U248.DPY34.F_CV;-25.328125000;100.0 +25/10/2020 02:06:34;U248.DPY34.F_CV;-25.281250000;100.0 +25/10/2020 02:06:37;U248.DPY34.F_CV;-25.328125000;100.0 +25/10/2020 02:06:39;U248.DPY34.F_CV;-25.421875000;100.0 +25/10/2020 02:06:40;U248.DPY34.F_CV;-25.375000000;100.0 +25/10/2020 02:06:41;U248.DPY34.F_CV;-25.437500000;100.0 +25/10/2020 02:06:42;U248.DPY34.F_CV;-25.390625000;100.0 +25/10/2020 02:06:44;U248.DPY34.F_CV;-25.375000000;100.0 +25/10/2020 02:06:47;U248.DPY34.F_CV;-25.390625000;100.0 +25/10/2020 02:06:50;U248.DPY34.F_CV;-25.437500000;100.0 +25/10/2020 02:06:51;U248.DPY34.F_CV;-25.468750000;100.0 +25/10/2020 02:06:53;U248.DPY34.F_CV;-25.437500000;100.0 +25/10/2020 02:06:55;U248.DPY34.F_CV;-25.375000000;100.0 +25/10/2020 02:06:57;U248.DPY34.F_CV;-25.421875000;100.0 +25/10/2020 02:06:59;U248.DPY34.F_CV;-25.390625000;100.0 +25/10/2020 02:06:03;U248.FI01.F_CV;216.756637573;100.0 +25/10/2020 02:06:10;U248.FI01.F_CV;216.111099243;100.0 +25/10/2020 02:06:12;U248.FI01.F_CV;214.961074829;100.0 +25/10/2020 02:06:17;U248.FI01.F_CV;213.389511108;100.0 +25/10/2020 02:06:18;U248.FI01.F_CV;212.611145020;100.0 +25/10/2020 02:06:22;U248.FI01.F_CV;212.200332642;100.0 +25/10/2020 02:06:23;U248.FI01.F_CV;211.754943848;100.0 +25/10/2020 02:06:27;U248.FI01.F_CV;212.253326416;100.0 +25/10/2020 02:06:29;U248.FI01.F_CV;213.884017944;100.0 +25/10/2020 02:06:33;U248.FI01.F_CV;214.291061401;100.0 +25/10/2020 02:06:37;U248.FI01.F_CV;213.885955811;100.0 +25/10/2020 02:06:38;U248.FI01.F_CV;213.429870605;100.0 +25/10/2020 02:06:40;U248.FI01.F_CV;214.304916382;100.0 +25/10/2020 02:06:43;U248.FI01.F_CV;217.180191040;100.0 +25/10/2020 02:06:47;U248.FI01.F_CV;218.167434692;100.0 +25/10/2020 02:06:50;U248.FI01.F_CV;217.045669556;100.0 +25/10/2020 02:06:53;U248.FI01.F_CV;216.747787476;100.0 +25/10/2020 02:06:58;U248.FI01.F_CV;217.504699707;100.0 +25/10/2020 02:06:59;U248.FI01.F_CV;218.363327026;100.0 +25/10/2020 02:06:54;U248.FI02.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U248.FI04.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U248.FI08.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U248.FI101.F_CV;563.970458984;100.0 +25/10/2020 02:06:42;U248.FI102.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U248.FI104.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U248.FI108.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U248.FQ08.F_CV;262668.031250000;100.0 +25/10/2020 02:06:42;U248.FQ108.F_CV;262929.500000000;100.0 +25/10/2020 02:06:00;U248.FT01.F_CV;217.759506226;100.0 +25/10/2020 02:06:01;U248.FT01.F_CV;220.184997559;100.0 +25/10/2020 02:06:02;U248.FT01.F_CV;215.585998535;100.0 +25/10/2020 02:06:03;U248.FT01.F_CV;216.404998779;100.0 +25/10/2020 02:06:04;U248.FT01.F_CV;218.704498291;100.0 +25/10/2020 02:06:06;U248.FT01.F_CV;216.058502197;100.0 +25/10/2020 02:06:07;U248.FT01.F_CV;215.397003174;100.0 +25/10/2020 02:06:08;U248.FT01.F_CV;210.388504028;100.0 +25/10/2020 02:06:09;U248.FT01.F_CV;211.176010132;100.0 +25/10/2020 02:06:10;U248.FT01.F_CV;214.263000488;100.0 +25/10/2020 02:06:13;U248.FT01.F_CV;213.097503662;100.0 +25/10/2020 02:06:14;U248.FT01.F_CV;214.326004028;100.0 +25/10/2020 02:06:17;U248.FT01.F_CV;209.254501343;100.0 +25/10/2020 02:06:18;U248.FT01.F_CV;211.995010376;100.0 +25/10/2020 02:06:19;U248.FT01.F_CV;210.514495850;100.0 +25/10/2020 02:06:20;U248.FT01.F_CV;214.105499268;100.0 +25/10/2020 02:06:21;U248.FT01.F_CV;211.995010376;100.0 +25/10/2020 02:06:22;U248.FT01.F_CV;211.333496094;100.0 +25/10/2020 02:06:23;U248.FT01.F_CV;213.601501465;100.0 +25/10/2020 02:06:26;U248.FT01.F_CV;215.239501953;100.0 +25/10/2020 02:06:27;U248.FT01.F_CV;219.082504272;100.0 +25/10/2020 02:06:28;U248.FT01.F_CV;216.562500000;100.0 +25/10/2020 02:06:29;U248.FT01.F_CV;212.625000000;100.0 +25/10/2020 02:06:30;U248.FT01.F_CV;212.215499878;100.0 +25/10/2020 02:06:32;U248.FT01.F_CV;213.947998047;100.0 +25/10/2020 02:06:35;U248.FT01.F_CV;213.255004883;100.0 +25/10/2020 02:06:36;U248.FT01.F_CV;210.325500488;100.0 +25/10/2020 02:06:37;U248.FT01.F_CV;214.168502808;100.0 +25/10/2020 02:06:38;U248.FT01.F_CV;221.476501465;100.0 +25/10/2020 02:06:39;U248.FT01.F_CV;219.775497437;100.0 +25/10/2020 02:06:41;U248.FT01.F_CV;222.043502808;100.0 +25/10/2020 02:06:43;U248.FT01.F_CV;217.475997925;100.0 +25/10/2020 02:06:44;U248.FT01.F_CV;212.876998901;100.0 +25/10/2020 02:06:46;U248.FT01.F_CV;215.837997437;100.0 +25/10/2020 02:06:48;U248.FT01.F_CV;213.885009766;100.0 +25/10/2020 02:06:49;U248.FT01.F_CV;213.538497925;100.0 +25/10/2020 02:06:50;U248.FT01.F_CV;219.555007935;100.0 +25/10/2020 02:06:51;U248.FT01.F_CV;220.972503662;100.0 +25/10/2020 02:06:53;U248.FT01.F_CV;216.972000122;100.0 +25/10/2020 02:06:54;U248.FT01.F_CV;215.617507935;100.0 +25/10/2020 02:06:55;U248.FT01.F_CV;216.216003418;100.0 +25/10/2020 02:06:56;U248.FT01.F_CV;218.830505371;100.0 +25/10/2020 02:06:57;U248.FT01.F_CV;219.996002197;100.0 +25/10/2020 02:06:58;U248.FT01.F_CV;219.617996216;100.0 +25/10/2020 02:06:04;U248.FT101.F_CV;563.471984863;100.0 +25/10/2020 02:06:07;U248.FT101.F_CV;563.881530762;100.0 +25/10/2020 02:06:44;U248.FT101.F_CV;563.566528320;100.0 +25/10/2020 02:06:58;U248.FT101.F_CV;564.133483887;100.0 +25/10/2020 02:06:04;U248.LI06.F_CV;3.418750048;100.0 +25/10/2020 02:06:05;U248.LI06.F_CV;3.331249952;100.0 +25/10/2020 02:06:06;U248.LI06.F_CV;3.468750000;100.0 +25/10/2020 02:06:12;U248.LI06.F_CV;3.531250000;100.0 +25/10/2020 02:06:15;U248.LI06.F_CV;3.312500000;100.0 +25/10/2020 02:06:16;U248.LI06.F_CV;3.406250000;100.0 +25/10/2020 02:06:22;U248.LI06.F_CV;3.500000000;100.0 +25/10/2020 02:06:27;U248.LI06.F_CV;3.437500000;100.0 +25/10/2020 02:06:28;U248.LI06.F_CV;3.356250048;100.0 +25/10/2020 02:06:29;U248.LI06.F_CV;3.462500095;100.0 +25/10/2020 02:06:30;U248.LI06.F_CV;3.406250000;100.0 +25/10/2020 02:06:36;U248.LI06.F_CV;3.575000048;100.0 +25/10/2020 02:06:38;U248.LI06.F_CV;3.431250095;100.0 +25/10/2020 02:06:43;U248.LI06.F_CV;3.549999952;100.0 +25/10/2020 02:06:45;U248.LI06.F_CV;3.431250095;100.0 +25/10/2020 02:06:48;U248.LI06.F_CV;3.500000000;100.0 +25/10/2020 02:06:57;U248.LI06.F_CV;3.400000095;100.0 +25/10/2020 02:06:59;U248.LI06.F_CV;3.462500095;100.0 +25/10/2020 02:06:04;U248.LI11.F_CV;-0.756250024;100.0 +25/10/2020 02:06:05;U248.LI11.F_CV;-0.618750036;100.0 +25/10/2020 02:06:10;U248.LI11.F_CV;-0.725000024;100.0 +25/10/2020 02:06:11;U248.LI11.F_CV;-0.618750036;100.0 +25/10/2020 02:06:14;U248.LI11.F_CV;-0.712500036;100.0 +25/10/2020 02:06:15;U248.LI11.F_CV;-0.631250024;100.0 +25/10/2020 02:06:21;U248.LI11.F_CV;-0.693750024;100.0 +25/10/2020 02:06:22;U248.LI11.F_CV;-0.568750024;100.0 +25/10/2020 02:06:24;U248.LI11.F_CV;-0.662500024;100.0 +25/10/2020 02:06:31;U248.LI11.F_CV;-0.712500036;100.0 +25/10/2020 02:06:33;U248.LI11.F_CV;-0.600000024;100.0 +25/10/2020 02:06:34;U248.LI11.F_CV;-0.693750024;100.0 +25/10/2020 02:06:38;U248.LI11.F_CV;-0.637499988;100.0 +25/10/2020 02:06:39;U248.LI11.F_CV;-0.543749988;100.0 +25/10/2020 02:06:42;U248.LI11.F_CV;-0.712500036;100.0 +25/10/2020 02:06:43;U248.LI11.F_CV;-0.600000024;100.0 +25/10/2020 02:06:44;U248.LI11.F_CV;-0.675000012;100.0 +25/10/2020 02:06:45;U248.LI11.F_CV;-0.593750000;100.0 +25/10/2020 02:06:48;U248.LI11.F_CV;-0.675000012;100.0 +25/10/2020 02:06:52;U248.LI11.F_CV;-0.600000024;100.0 +25/10/2020 02:06:54;U248.LI11.F_CV;-0.662500024;100.0 +25/10/2020 02:06:59;U248.LI11.F_CV;-0.562500000;100.0 +25/10/2020 02:06:00;U248.LI111.F_CV;-0.574999988;100.0 +25/10/2020 02:06:05;U248.LI111.F_CV;-0.693750024;100.0 +25/10/2020 02:06:06;U248.LI111.F_CV;-0.587500036;100.0 +25/10/2020 02:06:07;U248.LI111.F_CV;-0.793749988;100.0 +25/10/2020 02:06:11;U248.LI111.F_CV;-0.643750012;100.0 +25/10/2020 02:06:12;U248.LI111.F_CV;-0.731249988;100.0 +25/10/2020 02:06:20;U248.LI111.F_CV;-0.668749988;100.0 +25/10/2020 02:06:27;U248.LI111.F_CV;-0.806250036;100.0 +25/10/2020 02:06:30;U248.LI111.F_CV;-0.662500024;100.0 +25/10/2020 02:06:34;U248.LI111.F_CV;-0.712500036;100.0 +25/10/2020 02:06:40;U248.LI111.F_CV;-0.650000036;100.0 +25/10/2020 02:06:45;U248.LI111.F_CV;-0.743750036;100.0 +25/10/2020 02:06:47;U248.LI111.F_CV;-0.600000024;100.0 +25/10/2020 02:06:50;U248.LI111.F_CV;-0.762499988;100.0 +25/10/2020 02:06:52;U248.LI111.F_CV;-0.612500012;100.0 +25/10/2020 02:06:58;U248.LI111.F_CV;-0.818750024;100.0 +25/10/2020 02:06:59;U248.LI111.F_CV;-0.731249988;100.0 +25/10/2020 02:06:04;U248.LI122.F_CV;39.956249237;100.0 +25/10/2020 02:06:09;U248.LI122.F_CV;40.112499237;100.0 +25/10/2020 02:06:12;U248.LI122.F_CV;39.937500000;100.0 +25/10/2020 02:06:16;U248.LI122.F_CV;40.137500763;100.0 +25/10/2020 02:06:20;U248.LI122.F_CV;39.931251526;100.0 +25/10/2020 02:06:22;U248.LI122.F_CV;40.174999237;100.0 +25/10/2020 02:06:25;U248.LI122.F_CV;39.950000763;100.0 +25/10/2020 02:06:27;U248.LI122.F_CV;40.075000763;100.0 +25/10/2020 02:06:28;U248.LI122.F_CV;39.950000763;100.0 +25/10/2020 02:06:29;U248.LI122.F_CV;40.056251526;100.0 +25/10/2020 02:06:30;U248.LI122.F_CV;39.993751526;100.0 +25/10/2020 02:06:34;U248.LI122.F_CV;40.131252289;100.0 +25/10/2020 02:06:38;U248.LI122.F_CV;39.918750763;100.0 +25/10/2020 02:06:40;U248.LI122.F_CV;40.025001526;100.0 +25/10/2020 02:06:43;U248.LI122.F_CV;39.968750000;100.0 +25/10/2020 02:06:47;U248.LI122.F_CV;40.043750763;100.0 +25/10/2020 02:06:57;U248.LI122.F_CV;39.987499237;100.0 +25/10/2020 02:06:00;U248.LI19.F_CV;19.887500763;100.0 +25/10/2020 02:06:02;U248.LI19.F_CV;20.031250000;100.0 +25/10/2020 02:06:03;U248.LI19.F_CV;20.181249619;100.0 +25/10/2020 02:06:04;U248.LI19.F_CV;20.531250000;100.0 +25/10/2020 02:06:05;U248.LI19.F_CV;19.893751144;100.0 +25/10/2020 02:06:06;U248.LI19.F_CV;20.031250000;100.0 +25/10/2020 02:06:07;U248.LI19.F_CV;19.500000000;100.0 +25/10/2020 02:06:09;U248.LI19.F_CV;20.068750381;100.0 +25/10/2020 02:06:10;U248.LI19.F_CV;19.993749619;100.0 +25/10/2020 02:06:11;U248.LI19.F_CV;20.093750000;100.0 +25/10/2020 02:06:12;U248.LI19.F_CV;20.012500763;100.0 +25/10/2020 02:06:13;U248.LI19.F_CV;20.625000000;100.0 +25/10/2020 02:06:14;U248.LI19.F_CV;20.024999619;100.0 +25/10/2020 02:06:15;U248.LI19.F_CV;19.968750000;100.0 +25/10/2020 02:06:16;U248.LI19.F_CV;20.493749619;100.0 +25/10/2020 02:06:18;U248.LI19.F_CV;20.406250000;100.0 +25/10/2020 02:06:19;U248.LI19.F_CV;20.050001144;100.0 +25/10/2020 02:06:20;U248.LI19.F_CV;19.468750000;100.0 +25/10/2020 02:06:21;U248.LI19.F_CV;20.062500000;100.0 +25/10/2020 02:06:24;U248.LI19.F_CV;20.393751144;100.0 +25/10/2020 02:06:25;U248.LI19.F_CV;20.593750000;100.0 +25/10/2020 02:06:27;U248.LI19.F_CV;20.050001144;100.0 +25/10/2020 02:06:28;U248.LI19.F_CV;20.568750381;100.0 +25/10/2020 02:06:30;U248.LI19.F_CV;20.418750763;100.0 +25/10/2020 02:06:31;U248.LI19.F_CV;20.649999619;100.0 +25/10/2020 02:06:32;U248.LI19.F_CV;20.493749619;100.0 +25/10/2020 02:06:33;U248.LI19.F_CV;20.143751144;100.0 +25/10/2020 02:06:34;U248.LI19.F_CV;20.243749619;100.0 +25/10/2020 02:06:36;U248.LI19.F_CV;20.100000381;100.0 +25/10/2020 02:06:37;U248.LI19.F_CV;20.318750381;100.0 +25/10/2020 02:06:38;U248.LI19.F_CV;20.100000381;100.0 +25/10/2020 02:06:39;U248.LI19.F_CV;20.325000763;100.0 +25/10/2020 02:06:40;U248.LI19.F_CV;20.068750381;100.0 +25/10/2020 02:06:43;U248.LI19.F_CV;20.281250000;100.0 +25/10/2020 02:06:45;U248.LI19.F_CV;19.937500000;100.0 +25/10/2020 02:06:47;U248.LI19.F_CV;20.581251144;100.0 +25/10/2020 02:06:49;U248.LI19.F_CV;20.662500381;100.0 +25/10/2020 02:06:50;U248.LI19.F_CV;20.556249619;100.0 +25/10/2020 02:06:52;U248.LI19.F_CV;20.812500000;100.0 +25/10/2020 02:06:55;U248.LI19.F_CV;20.012500763;100.0 +25/10/2020 02:06:56;U248.LI19.F_CV;20.493749619;100.0 +25/10/2020 02:06:57;U248.LI19.F_CV;19.737501144;100.0 +25/10/2020 02:06:59;U248.LI19.F_CV;20.075000763;100.0 +25/10/2020 02:06:00;U248.LI22.F_CV;35.931251526;100.0 +25/10/2020 02:06:04;U248.LI22.F_CV;35.993751526;100.0 +25/10/2020 02:06:07;U248.LI22.F_CV;35.843750000;100.0 +25/10/2020 02:06:12;U248.LI22.F_CV;36.031250000;100.0 +25/10/2020 02:06:13;U248.LI22.F_CV;35.912502289;100.0 +25/10/2020 02:06:21;U248.LI22.F_CV;35.850002289;100.0 +25/10/2020 02:06:22;U248.LI22.F_CV;35.750000000;100.0 +25/10/2020 02:06:23;U248.LI22.F_CV;35.981250763;100.0 +25/10/2020 02:06:25;U248.LI22.F_CV;36.037502289;100.0 +25/10/2020 02:06:34;U248.LI22.F_CV;35.881252289;100.0 +25/10/2020 02:06:36;U248.LI22.F_CV;35.950000763;100.0 +25/10/2020 02:06:37;U248.LI22.F_CV;35.775001526;100.0 +25/10/2020 02:06:41;U248.LI22.F_CV;36.025001526;100.0 +25/10/2020 02:06:44;U248.LI22.F_CV;35.924999237;100.0 +25/10/2020 02:06:45;U248.LI22.F_CV;36.025001526;100.0 +25/10/2020 02:06:47;U248.LI22.F_CV;35.912502289;100.0 +25/10/2020 02:06:49;U248.LI22.F_CV;36.012500763;100.0 +25/10/2020 02:06:50;U248.LI22.F_CV;35.918750763;100.0 +25/10/2020 02:06:57;U248.LI22.F_CV;36.006252289;100.0 +25/10/2020 02:06:04;U248.LT06.F_CV;3.343750000;100.0 +25/10/2020 02:06:07;U248.LT06.F_CV;3.525000095;100.0 +25/10/2020 02:06:13;U248.LT06.F_CV;3.468750000;100.0 +25/10/2020 02:06:14;U248.LT06.F_CV;3.387500048;100.0 +25/10/2020 02:06:19;U248.LT06.F_CV;3.468750000;100.0 +25/10/2020 02:06:20;U248.LT06.F_CV;3.375000000;100.0 +25/10/2020 02:06:25;U248.LT06.F_CV;3.549999952;100.0 +25/10/2020 02:06:27;U248.LT06.F_CV;3.356250048;100.0 +25/10/2020 02:06:31;U248.LT06.F_CV;3.481250048;100.0 +25/10/2020 02:06:42;U248.LT06.F_CV;3.562500000;100.0 +25/10/2020 02:06:44;U248.LT06.F_CV;3.406250000;100.0 +25/10/2020 02:06:46;U248.LT06.F_CV;3.475000143;100.0 +25/10/2020 02:06:50;U248.LT06.F_CV;3.418750048;100.0 +25/10/2020 02:06:51;U248.LT06.F_CV;3.549999952;100.0 +25/10/2020 02:06:56;U248.LT06.F_CV;3.400000095;100.0 +25/10/2020 02:06:03;U248.LT11.F_CV;-0.762499988;100.0 +25/10/2020 02:06:04;U248.LT11.F_CV;-0.618750036;100.0 +25/10/2020 02:06:09;U248.LT11.F_CV;-0.725000024;100.0 +25/10/2020 02:06:10;U248.LT11.F_CV;-0.612500012;100.0 +25/10/2020 02:06:14;U248.LT11.F_CV;-0.681250036;100.0 +25/10/2020 02:06:19;U248.LT11.F_CV;-0.556250036;100.0 +25/10/2020 02:06:20;U248.LT11.F_CV;-0.693750024;100.0 +25/10/2020 02:06:21;U248.LT11.F_CV;-0.587500036;100.0 +25/10/2020 02:06:30;U248.LT11.F_CV;-0.737500012;100.0 +25/10/2020 02:06:32;U248.LT11.F_CV;-0.618750036;100.0 +25/10/2020 02:06:33;U248.LT11.F_CV;-0.687500000;100.0 +25/10/2020 02:06:38;U248.LT11.F_CV;-0.537500024;100.0 +25/10/2020 02:06:39;U248.LT11.F_CV;-0.656250000;100.0 +25/10/2020 02:06:40;U248.LT11.F_CV;-0.606249988;100.0 +25/10/2020 02:06:41;U248.LT11.F_CV;-0.706250012;100.0 +25/10/2020 02:06:44;U248.LT11.F_CV;-0.574999988;100.0 +25/10/2020 02:06:49;U248.LT11.F_CV;-0.687500000;100.0 +25/10/2020 02:06:51;U248.LT11.F_CV;-0.631250024;100.0 +25/10/2020 02:06:54;U248.LT11.F_CV;-0.687500000;100.0 +25/10/2020 02:06:57;U248.LT11.F_CV;-0.637499988;100.0 +25/10/2020 02:06:00;U248.LT111.F_CV;-0.562500000;100.0 +25/10/2020 02:06:04;U248.LT111.F_CV;-0.693750024;100.0 +25/10/2020 02:06:06;U248.LT111.F_CV;-0.587500036;100.0 +25/10/2020 02:06:07;U248.LT111.F_CV;-0.793749988;100.0 +25/10/2020 02:06:10;U248.LT111.F_CV;-0.643750012;100.0 +25/10/2020 02:06:18;U248.LT111.F_CV;-0.800000012;100.0 +25/10/2020 02:06:21;U248.LT111.F_CV;-0.631250024;100.0 +25/10/2020 02:06:22;U248.LT111.F_CV;-0.731249988;100.0 +25/10/2020 02:06:23;U248.LT111.F_CV;-0.675000012;100.0 +25/10/2020 02:06:25;U248.LT111.F_CV;-0.725000024;100.0 +25/10/2020 02:06:26;U248.LT111.F_CV;-0.868750036;100.0 +25/10/2020 02:06:29;U248.LT111.F_CV;-0.650000036;100.0 +25/10/2020 02:06:30;U248.LT111.F_CV;-0.731249988;100.0 +25/10/2020 02:06:32;U248.LT111.F_CV;-0.643750012;100.0 +25/10/2020 02:06:33;U248.LT111.F_CV;-0.731249988;100.0 +25/10/2020 02:06:35;U248.LT111.F_CV;-0.637499988;100.0 +25/10/2020 02:06:36;U248.LT111.F_CV;-0.706250012;100.0 +25/10/2020 02:06:43;U248.LT111.F_CV;-0.656250000;100.0 +25/10/2020 02:06:44;U248.LT111.F_CV;-0.781250000;100.0 +25/10/2020 02:06:47;U248.LT111.F_CV;-0.606249988;100.0 +25/10/2020 02:06:50;U248.LT111.F_CV;-0.762499988;100.0 +25/10/2020 02:06:52;U248.LT111.F_CV;-0.643750012;100.0 +25/10/2020 02:06:57;U248.LT111.F_CV;-0.818750024;100.0 +25/10/2020 02:06:58;U248.LT111.F_CV;-0.687500000;100.0 +25/10/2020 02:06:03;U248.LT122.F_CV;39.943752289;100.0 +25/10/2020 02:06:08;U248.LT122.F_CV;40.112499237;100.0 +25/10/2020 02:06:12;U248.LT122.F_CV;39.924999237;100.0 +25/10/2020 02:06:13;U248.LT122.F_CV;40.100002289;100.0 +25/10/2020 02:06:14;U248.LT122.F_CV;40.031250000;100.0 +25/10/2020 02:06:16;U248.LT122.F_CV;40.150001526;100.0 +25/10/2020 02:06:19;U248.LT122.F_CV;39.981250763;100.0 +25/10/2020 02:06:21;U248.LT122.F_CV;40.187500000;100.0 +25/10/2020 02:06:25;U248.LT122.F_CV;39.962501526;100.0 +25/10/2020 02:06:26;U248.LT122.F_CV;40.093750000;100.0 +25/10/2020 02:06:27;U248.LT122.F_CV;40.006252289;100.0 +25/10/2020 02:06:28;U248.LT122.F_CV;40.068752289;100.0 +25/10/2020 02:06:29;U248.LT122.F_CV;39.987499237;100.0 +25/10/2020 02:06:33;U248.LT122.F_CV;40.137500763;100.0 +25/10/2020 02:06:37;U248.LT122.F_CV;39.918750763;100.0 +25/10/2020 02:06:40;U248.LT122.F_CV;40.106250763;100.0 +25/10/2020 02:06:44;U248.LT122.F_CV;39.968750000;100.0 +25/10/2020 02:06:55;U248.LT122.F_CV;40.087501526;100.0 +25/10/2020 02:06:56;U248.LT122.F_CV;40.000000000;100.0 +25/10/2020 02:06:58;U248.LT122.F_CV;40.087501526;100.0 +25/10/2020 02:06:00;U248.LT19.F_CV;19.756250381;100.0 +25/10/2020 02:06:01;U248.LT19.F_CV;20.075000763;100.0 +25/10/2020 02:06:03;U248.LT19.F_CV;20.518751144;100.0 +25/10/2020 02:06:04;U248.LT19.F_CV;19.893751144;100.0 +25/10/2020 02:06:07;U248.LT19.F_CV;20.087499619;100.0 +25/10/2020 02:06:10;U248.LT19.F_CV;19.962499619;100.0 +25/10/2020 02:06:12;U248.LT19.F_CV;20.618749619;100.0 +25/10/2020 02:06:13;U248.LT19.F_CV;20.243749619;100.0 +25/10/2020 02:06:14;U248.LT19.F_CV;20.325000763;100.0 +25/10/2020 02:06:16;U248.LT19.F_CV;20.200000763;100.0 +25/10/2020 02:06:17;U248.LT19.F_CV;19.793750763;100.0 +25/10/2020 02:06:18;U248.LT19.F_CV;20.262500763;100.0 +25/10/2020 02:06:19;U248.LT19.F_CV;20.100000381;100.0 +25/10/2020 02:06:21;U248.LT19.F_CV;20.318750381;100.0 +25/10/2020 02:06:22;U248.LT19.F_CV;20.081251144;100.0 +25/10/2020 02:06:23;U248.LT19.F_CV;20.581251144;100.0 +25/10/2020 02:06:25;U248.LT19.F_CV;20.643751144;100.0 +25/10/2020 02:06:26;U248.LT19.F_CV;20.206251144;100.0 +25/10/2020 02:06:27;U248.LT19.F_CV;20.575000763;100.0 +25/10/2020 02:06:28;U248.LT19.F_CV;20.087499619;100.0 +25/10/2020 02:06:29;U248.LT19.F_CV;20.637500763;100.0 +25/10/2020 02:06:30;U248.LT19.F_CV;20.068750381;100.0 +25/10/2020 02:06:31;U248.LT19.F_CV;20.524999619;100.0 +25/10/2020 02:06:32;U248.LT19.F_CV;21.600000381;100.0 +25/10/2020 02:06:33;U248.LT19.F_CV;20.350000381;100.0 +25/10/2020 02:06:35;U248.LT19.F_CV;20.112501144;100.0 +25/10/2020 02:06:36;U248.LT19.F_CV;20.437500000;100.0 +25/10/2020 02:06:39;U248.LT19.F_CV;20.031250000;100.0 +25/10/2020 02:06:40;U248.LT19.F_CV;19.781250000;100.0 +25/10/2020 02:06:41;U248.LT19.F_CV;20.418750763;100.0 +25/10/2020 02:06:42;U248.LT19.F_CV;20.200000763;100.0 +25/10/2020 02:06:44;U248.LT19.F_CV;20.543750763;100.0 +25/10/2020 02:06:46;U248.LT19.F_CV;20.662500381;100.0 +25/10/2020 02:06:47;U248.LT19.F_CV;20.225000381;100.0 +25/10/2020 02:06:48;U248.LT19.F_CV;20.762500763;100.0 +25/10/2020 02:06:49;U248.LT19.F_CV;19.868749619;100.0 +25/10/2020 02:06:50;U248.LT19.F_CV;19.931249619;100.0 +25/10/2020 02:06:51;U248.LT19.F_CV;20.187500000;100.0 +25/10/2020 02:06:52;U248.LT19.F_CV;20.649999619;100.0 +25/10/2020 02:06:53;U248.LT19.F_CV;20.768751144;100.0 +25/10/2020 02:06:54;U248.LT19.F_CV;20.012500763;100.0 +25/10/2020 02:06:55;U248.LT19.F_CV;20.493749619;100.0 +25/10/2020 02:06:56;U248.LT19.F_CV;19.737501144;100.0 +25/10/2020 02:06:58;U248.LT19.F_CV;20.075000763;100.0 +25/10/2020 02:06:00;U248.LT22.F_CV;35.924999237;100.0 +25/10/2020 02:06:03;U248.LT22.F_CV;35.981250763;100.0 +25/10/2020 02:06:07;U248.LT22.F_CV;35.843750000;100.0 +25/10/2020 02:06:11;U248.LT22.F_CV;36.049999237;100.0 +25/10/2020 02:06:12;U248.LT22.F_CV;35.912502289;100.0 +25/10/2020 02:06:14;U248.LT22.F_CV;35.862499237;100.0 +25/10/2020 02:06:25;U248.LT22.F_CV;36.068752289;100.0 +25/10/2020 02:06:29;U248.LT22.F_CV;35.881252289;100.0 +25/10/2020 02:06:30;U248.LT22.F_CV;35.968750000;100.0 +25/10/2020 02:06:36;U248.LT22.F_CV;35.762500763;100.0 +25/10/2020 02:06:40;U248.LT22.F_CV;36.012500763;100.0 +25/10/2020 02:06:43;U248.LT22.F_CV;35.943752289;100.0 +25/10/2020 02:06:50;U248.LT22.F_CV;36.000000000;100.0 +25/10/2020 02:06:51;U248.LT22.F_CV;35.937500000;100.0 +25/10/2020 02:06:56;U248.LT22.F_CV;36.000000000;100.0 +25/10/2020 02:06:42;U248.P04_DEBIT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U248.P04_Q.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U248.P104_DEBIT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U248.P104_Q.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U248.PI02.F_CV;-0.032499999;100.0 +25/10/2020 02:06:03;U248.PI02.F_CV;-0.038750000;100.0 +25/10/2020 02:06:04;U248.PI02.F_CV;-0.063749999;100.0 +25/10/2020 02:06:06;U248.PI02.F_CV;-0.039999999;100.0 +25/10/2020 02:06:07;U248.PI02.F_CV;-0.016249999;100.0 +25/10/2020 02:06:09;U248.PI02.F_CV;-0.003750000;100.0 +25/10/2020 02:06:10;U248.PI02.F_CV;-0.043749999;100.0 +25/10/2020 02:06:12;U248.PI02.F_CV;-0.032499999;100.0 +25/10/2020 02:06:14;U248.PI02.F_CV;-0.047499999;100.0 +25/10/2020 02:06:15;U248.PI02.F_CV;-0.064999998;100.0 +25/10/2020 02:06:16;U248.PI02.F_CV;-0.043749999;100.0 +25/10/2020 02:06:18;U248.PI02.F_CV;-0.056249999;100.0 +25/10/2020 02:06:19;U248.PI02.F_CV;-0.042500000;100.0 +25/10/2020 02:06:22;U248.PI02.F_CV;-0.049999997;100.0 +25/10/2020 02:06:24;U248.PI02.F_CV;-0.028749999;100.0 +25/10/2020 02:06:31;U248.PI02.F_CV;-0.053749997;100.0 +25/10/2020 02:06:32;U248.PI02.F_CV;-0.032499999;100.0 +25/10/2020 02:06:33;U248.PI02.F_CV;-0.026249999;100.0 +25/10/2020 02:06:34;U248.PI02.F_CV;-0.042500000;100.0 +25/10/2020 02:06:37;U248.PI02.F_CV;-0.026249999;100.0 +25/10/2020 02:06:38;U248.PI02.F_CV;-0.055000000;100.0 +25/10/2020 02:06:39;U248.PI02.F_CV;-0.047499999;100.0 +25/10/2020 02:06:41;U248.PI02.F_CV;-0.056249999;100.0 +25/10/2020 02:06:44;U248.PI02.F_CV;-0.032499999;100.0 +25/10/2020 02:06:45;U248.PI02.F_CV;-0.044999998;100.0 +25/10/2020 02:06:49;U248.PI02.F_CV;-0.020000000;100.0 +25/10/2020 02:06:52;U248.PI02.F_CV;-0.035000000;100.0 +25/10/2020 02:06:54;U248.PI02.F_CV;-0.059999999;100.0 +25/10/2020 02:06:56;U248.PI02.F_CV;-0.029999999;100.0 +25/10/2020 02:06:59;U248.PI02.F_CV;-0.042500000;100.0 +25/10/2020 02:06:48;U248.PI10.F_CV;24.578125000;100.0 +25/10/2020 02:06:02;U248.PI101.F_CV;21.625000000;100.0 +25/10/2020 02:06:00;U248.PI102.F_CV;-0.018749999;100.0 +25/10/2020 02:06:03;U248.PI102.F_CV;-0.028749999;100.0 +25/10/2020 02:06:06;U248.PI102.F_CV;-0.022499999;100.0 +25/10/2020 02:06:09;U248.PI102.F_CV;-0.038750000;100.0 +25/10/2020 02:06:11;U248.PI102.F_CV;-0.003750000;100.0 +25/10/2020 02:06:12;U248.PI102.F_CV;-0.008750000;100.0 +25/10/2020 02:06:13;U248.PI102.F_CV;-0.027500000;100.0 +25/10/2020 02:06:14;U248.PI102.F_CV;-0.010000000;100.0 +25/10/2020 02:06:15;U248.PI102.F_CV;-0.039999999;100.0 +25/10/2020 02:06:16;U248.PI102.F_CV;-0.024999999;100.0 +25/10/2020 02:06:18;U248.PI102.F_CV;-0.013750000;100.0 +25/10/2020 02:06:19;U248.PI102.F_CV;-0.024999999;100.0 +25/10/2020 02:06:21;U248.PI102.F_CV;-0.007500000;100.0 +25/10/2020 02:06:22;U248.PI102.F_CV;-0.023750000;100.0 +25/10/2020 02:06:23;U248.PI102.F_CV;-0.017500000;100.0 +25/10/2020 02:06:25;U248.PI102.F_CV;-0.036249999;100.0 +25/10/2020 02:06:27;U248.PI102.F_CV;-0.024999999;100.0 +25/10/2020 02:06:28;U248.PI102.F_CV;0.001250000;100.0 +25/10/2020 02:06:29;U248.PI102.F_CV;-0.011250000;100.0 +25/10/2020 02:06:31;U248.PI102.F_CV;-0.020000000;100.0 +25/10/2020 02:06:32;U248.PI102.F_CV;-0.043749999;100.0 +25/10/2020 02:06:37;U248.PI102.F_CV;-0.002500000;100.0 +25/10/2020 02:06:38;U248.PI102.F_CV;0.017500000;100.0 +25/10/2020 02:06:39;U248.PI102.F_CV;-0.013750000;100.0 +25/10/2020 02:06:41;U248.PI102.F_CV;-0.032499999;100.0 +25/10/2020 02:06:42;U248.PI102.F_CV;-0.049999997;100.0 +25/10/2020 02:06:43;U248.PI102.F_CV;-0.032499999;100.0 +25/10/2020 02:06:44;U248.PI102.F_CV;-0.026249999;100.0 +25/10/2020 02:06:45;U248.PI102.F_CV;-0.042500000;100.0 +25/10/2020 02:06:47;U248.PI102.F_CV;-0.017500000;100.0 +25/10/2020 02:06:52;U248.PI102.F_CV;-0.031250000;100.0 +25/10/2020 02:06:54;U248.PI102.F_CV;-0.046250001;100.0 +25/10/2020 02:06:56;U248.PI102.F_CV;-0.024999999;100.0 +25/10/2020 02:06:57;U248.PI102.F_CV;-0.006250000;100.0 +25/10/2020 02:06:58;U248.PI102.F_CV;-0.013750000;100.0 +25/10/2020 02:06:00;U248.PI11.F_CV;0.656250000;100.0 +25/10/2020 02:06:02;U248.PI11.F_CV;0.875000000;100.0 +25/10/2020 02:06:04;U248.PI11.F_CV;0.656250000;100.0 +25/10/2020 02:06:07;U248.PI11.F_CV;0.906250000;100.0 +25/10/2020 02:06:09;U248.PI11.F_CV;0.656250000;100.0 +25/10/2020 02:06:11;U248.PI11.F_CV;1.203125000;100.0 +25/10/2020 02:06:12;U248.PI11.F_CV;0.671875000;100.0 +25/10/2020 02:06:15;U248.PI11.F_CV;1.046875000;100.0 +25/10/2020 02:06:18;U248.PI11.F_CV;0.750000000;100.0 +25/10/2020 02:06:22;U248.PI11.F_CV;1.250000000;100.0 +25/10/2020 02:06:23;U248.PI11.F_CV;0.812500000;100.0 +25/10/2020 02:06:29;U248.PI11.F_CV;0.531250000;100.0 +25/10/2020 02:06:36;U248.PI11.F_CV;0.875000000;100.0 +25/10/2020 02:06:38;U248.PI11.F_CV;0.687500000;100.0 +25/10/2020 02:06:40;U248.PI11.F_CV;1.109375000;100.0 +25/10/2020 02:06:41;U248.PI11.F_CV;0.812500000;100.0 +25/10/2020 02:06:45;U248.PI11.F_CV;0.546875000;100.0 +25/10/2020 02:06:47;U248.PI11.F_CV;0.921875000;100.0 +25/10/2020 02:06:52;U248.PI11.F_CV;0.515625000;100.0 +25/10/2020 02:06:57;U248.PI11.F_CV;0.875000000;100.0 +25/10/2020 02:06:15;U248.PI110.F_CV;0.109375000;100.0 +25/10/2020 02:06:57;U248.PI110.F_CV;-0.062500000;100.0 +25/10/2020 02:06:04;U248.PI111.F_CV;0.875000000;100.0 +25/10/2020 02:06:29;U248.PI111.F_CV;1.031250000;100.0 +25/10/2020 02:06:03;U248.PI113.F_CV;11.765625000;100.0 +25/10/2020 02:06:03;U248.PI115.F_CV;-0.013125001;100.0 +25/10/2020 02:06:04;U248.PI115.F_CV;-0.023250001;100.0 +25/10/2020 02:06:05;U248.PI115.F_CV;-0.021375000;100.0 +25/10/2020 02:06:06;U248.PI115.F_CV;-0.025687501;100.0 +25/10/2020 02:06:07;U248.PI115.F_CV;-0.019500000;100.0 +25/10/2020 02:06:10;U248.PI115.F_CV;-0.025125001;100.0 +25/10/2020 02:06:13;U248.PI115.F_CV;-0.011812500;100.0 +25/10/2020 02:06:14;U248.PI115.F_CV;-0.022125000;100.0 +25/10/2020 02:06:15;U248.PI115.F_CV;-0.020437500;100.0 +25/10/2020 02:06:16;U248.PI115.F_CV;-0.008812500;100.0 +25/10/2020 02:06:18;U248.PI115.F_CV;-0.022312500;100.0 +25/10/2020 02:06:19;U248.PI115.F_CV;-0.017250000;100.0 +25/10/2020 02:06:21;U248.PI115.F_CV;-0.027000001;100.0 +25/10/2020 02:06:22;U248.PI115.F_CV;-0.019874999;100.0 +25/10/2020 02:06:23;U248.PI115.F_CV;-0.022500001;100.0 +25/10/2020 02:06:25;U248.PI115.F_CV;-0.019874999;100.0 +25/10/2020 02:06:27;U248.PI115.F_CV;-0.048562501;100.0 +25/10/2020 02:06:28;U248.PI115.F_CV;-0.023250001;100.0 +25/10/2020 02:06:31;U248.PI115.F_CV;-0.017250000;100.0 +25/10/2020 02:06:32;U248.PI115.F_CV;-0.021000000;100.0 +25/10/2020 02:06:33;U248.PI115.F_CV;0.001875000;100.0 +25/10/2020 02:06:34;U248.PI115.F_CV;-0.017062500;100.0 +25/10/2020 02:06:36;U248.PI115.F_CV;-0.020625001;100.0 +25/10/2020 02:06:37;U248.PI115.F_CV;-0.014437500;100.0 +25/10/2020 02:06:38;U248.PI115.F_CV;-0.021375000;100.0 +25/10/2020 02:06:40;U248.PI115.F_CV;-0.018562499;100.0 +25/10/2020 02:06:41;U248.PI115.F_CV;-0.026625000;100.0 +25/10/2020 02:06:42;U248.PI115.F_CV;-0.023437500;100.0 +25/10/2020 02:06:43;U248.PI115.F_CV;-0.025312500;100.0 +25/10/2020 02:06:44;U248.PI115.F_CV;-0.020625001;100.0 +25/10/2020 02:06:47;U248.PI115.F_CV;-0.034312502;100.0 +25/10/2020 02:06:48;U248.PI115.F_CV;-0.025500000;100.0 +25/10/2020 02:06:49;U248.PI115.F_CV;-0.004125000;100.0 +25/10/2020 02:06:50;U248.PI115.F_CV;-0.006187500;100.0 +25/10/2020 02:06:51;U248.PI115.F_CV;-0.014062501;100.0 +25/10/2020 02:06:54;U248.PI115.F_CV;-0.030750001;100.0 +25/10/2020 02:06:55;U248.PI115.F_CV;-0.019874999;100.0 +25/10/2020 02:06:57;U248.PI115.F_CV;-0.036750000;100.0 +25/10/2020 02:06:58;U248.PI115.F_CV;-0.023062501;100.0 +25/10/2020 02:06:59;U248.PI115.F_CV;-0.027000001;100.0 +25/10/2020 02:06:19;U248.PI13.F_CV;25.328125000;100.0 +25/10/2020 02:06:41;U248.PI13.F_CV;25.468750000;100.0 +25/10/2020 02:06:00;U248.PI15.F_CV;0.307875007;100.0 +25/10/2020 02:06:03;U248.PI15.F_CV;0.319499999;100.0 +25/10/2020 02:06:05;U248.PI15.F_CV;0.314249992;100.0 +25/10/2020 02:06:06;U248.PI15.F_CV;0.316500008;100.0 +25/10/2020 02:06:07;U248.PI15.F_CV;0.310124993;100.0 +25/10/2020 02:06:09;U248.PI15.F_CV;0.314062506;100.0 +25/10/2020 02:06:10;U248.PI15.F_CV;0.322499990;100.0 +25/10/2020 02:06:13;U248.PI15.F_CV;0.305249989;100.0 +25/10/2020 02:06:14;U248.PI15.F_CV;0.332625002;100.0 +25/10/2020 02:06:15;U248.PI15.F_CV;0.318562508;100.0 +25/10/2020 02:06:16;U248.PI15.F_CV;0.312937498;100.0 +25/10/2020 02:06:18;U248.PI15.F_CV;0.314624995;100.0 +25/10/2020 02:06:19;U248.PI15.F_CV;0.320062488;100.0 +25/10/2020 02:06:20;U248.PI15.F_CV;0.316687495;100.0 +25/10/2020 02:06:21;U248.PI15.F_CV;0.320812494;100.0 +25/10/2020 02:06:22;U248.PI15.F_CV;0.314062506;100.0 +25/10/2020 02:06:25;U248.PI15.F_CV;0.322499990;100.0 +25/10/2020 02:06:27;U248.PI15.F_CV;0.314062506;100.0 +25/10/2020 02:06:28;U248.PI15.F_CV;0.318374991;100.0 +25/10/2020 02:06:29;U248.PI15.F_CV;0.312375009;100.0 +25/10/2020 02:06:30;U248.PI15.F_CV;0.315187514;100.0 +25/10/2020 02:06:31;U248.PI15.F_CV;0.322874993;100.0 +25/10/2020 02:06:33;U248.PI15.F_CV;0.304875016;100.0 +25/10/2020 02:06:34;U248.PI15.F_CV;0.320625007;100.0 +25/10/2020 02:06:37;U248.PI15.F_CV;0.312187493;100.0 +25/10/2020 02:06:39;U248.PI15.F_CV;0.318374991;100.0 +25/10/2020 02:06:40;U248.PI15.F_CV;0.287812501;100.0 +25/10/2020 02:06:41;U248.PI15.F_CV;0.312937498;100.0 +25/10/2020 02:06:42;U248.PI15.F_CV;0.323812515;100.0 +25/10/2020 02:06:43;U248.PI15.F_CV;0.310874999;100.0 +25/10/2020 02:06:44;U248.PI15.F_CV;0.317625016;100.0 +25/10/2020 02:06:45;U248.PI15.F_CV;0.312750012;100.0 +25/10/2020 02:06:47;U248.PI15.F_CV;0.320062488;100.0 +25/10/2020 02:06:49;U248.PI15.F_CV;0.307312489;100.0 +25/10/2020 02:06:51;U248.PI15.F_CV;0.314062506;100.0 +25/10/2020 02:06:54;U248.PI15.F_CV;0.310312510;100.0 +25/10/2020 02:06:55;U248.PI15.F_CV;0.317250013;100.0 +25/10/2020 02:06:56;U248.PI15.F_CV;0.314062506;100.0 +25/10/2020 02:06:57;U248.PI15.F_CV;0.326062500;100.0 +25/10/2020 02:06:59;U248.PI15.F_CV;0.301874995;100.0 +25/10/2020 02:06:12;U248.PI154.F_CV;0.987750053;100.0 +25/10/2020 02:06:14;U248.PI154.F_CV;0.989250064;100.0 +25/10/2020 02:06:22;U248.PI154.F_CV;0.988250017;100.0 +25/10/2020 02:06:23;U248.PI154.F_CV;0.989625037;100.0 +25/10/2020 02:06:45;U248.PI154.F_CV;0.988500059;100.0 +25/10/2020 02:06:49;U248.PI154.F_CV;0.990250051;100.0 +25/10/2020 02:06:54;U248.PI154.F_CV;0.989125073;100.0 +25/10/2020 02:06:56;U248.PI154.F_CV;0.987000048;100.0 +25/10/2020 02:06:58;U248.PI154.F_CV;0.988750041;100.0 +25/10/2020 02:06:50;U248.PI201.F_CV;1.406250000;100.0 +25/10/2020 02:06:38;U248.PI301.F_CV;-0.046875000;100.0 +25/10/2020 02:06:42;U248.PI50.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U248.PI54.F_CV;0.996375024;100.0 +25/10/2020 02:06:07;U248.PI54.F_CV;0.998000026;100.0 +25/10/2020 02:06:10;U248.PI54.F_CV;0.996875048;100.0 +25/10/2020 02:06:20;U248.PI54.F_CV;0.999000072;100.0 +25/10/2020 02:06:28;U248.PI54.F_CV;0.995500028;100.0 +25/10/2020 02:06:30;U248.PI54.F_CV;0.996625066;100.0 +25/10/2020 02:06:38;U248.PI54.F_CV;0.994750023;100.0 +25/10/2020 02:06:40;U248.PI54.F_CV;0.996500075;100.0 +25/10/2020 02:06:48;U248.PI54.F_CV;0.997625053;100.0 +25/10/2020 02:06:49;U248.PI54.F_CV;0.996500075;100.0 +25/10/2020 02:06:02;U248.PT02.F_CV;-0.041249998;100.0 +25/10/2020 02:06:03;U248.PT02.F_CV;-0.059999999;100.0 +25/10/2020 02:06:04;U248.PT02.F_CV;-0.066249996;100.0 +25/10/2020 02:06:06;U248.PT02.F_CV;-0.044999998;100.0 +25/10/2020 02:06:07;U248.PT02.F_CV;-0.018749999;100.0 +25/10/2020 02:06:08;U248.PT02.F_CV;-0.003750000;100.0 +25/10/2020 02:06:09;U248.PT02.F_CV;-0.044999998;100.0 +25/10/2020 02:06:10;U248.PT02.F_CV;-0.036249999;100.0 +25/10/2020 02:06:11;U248.PT02.F_CV;-0.048749998;100.0 +25/10/2020 02:06:12;U248.PT02.F_CV;-0.037499998;100.0 +25/10/2020 02:06:14;U248.PT02.F_CV;-0.063749999;100.0 +25/10/2020 02:06:17;U248.PT02.F_CV;-0.037499998;100.0 +25/10/2020 02:06:18;U248.PT02.F_CV;-0.046250001;100.0 +25/10/2020 02:06:19;U248.PT02.F_CV;-0.039999999;100.0 +25/10/2020 02:06:20;U248.PT02.F_CV;-0.052499998;100.0 +25/10/2020 02:06:21;U248.PT02.F_CV;-0.038750000;100.0 +25/10/2020 02:06:25;U248.PT02.F_CV;-0.033749998;100.0 +25/10/2020 02:06:26;U248.PT02.F_CV;-0.044999998;100.0 +25/10/2020 02:06:29;U248.PT02.F_CV;-0.036249999;100.0 +25/10/2020 02:06:30;U248.PT02.F_CV;-0.051250000;100.0 +25/10/2020 02:06:32;U248.PT02.F_CV;-0.022499999;100.0 +25/10/2020 02:06:33;U248.PT02.F_CV;-0.044999998;100.0 +25/10/2020 02:06:35;U248.PT02.F_CV;-0.035000000;100.0 +25/10/2020 02:06:36;U248.PT02.F_CV;-0.020000000;100.0 +25/10/2020 02:06:37;U248.PT02.F_CV;-0.053749997;100.0 +25/10/2020 02:06:40;U248.PT02.F_CV;-0.046250001;100.0 +25/10/2020 02:06:41;U248.PT02.F_CV;-0.052499998;100.0 +25/10/2020 02:06:43;U248.PT02.F_CV;-0.024999999;100.0 +25/10/2020 02:06:44;U248.PT02.F_CV;-0.056249999;100.0 +25/10/2020 02:06:46;U248.PT02.F_CV;-0.033749998;100.0 +25/10/2020 02:06:47;U248.PT02.F_CV;-0.052499998;100.0 +25/10/2020 02:06:48;U248.PT02.F_CV;-0.039999999;100.0 +25/10/2020 02:06:49;U248.PT02.F_CV;-0.012499999;100.0 +25/10/2020 02:06:53;U248.PT02.F_CV;-0.059999999;100.0 +25/10/2020 02:06:55;U248.PT02.F_CV;-0.029999999;100.0 +25/10/2020 02:06:02;U248.PT10.F_CV;24.453125000;100.0 +25/10/2020 02:06:13;U248.PT10.F_CV;24.593750000;100.0 +25/10/2020 02:06:18;U248.PT10.F_CV;24.453125000;100.0 +25/10/2020 02:06:43;U248.PT10.F_CV;24.609375000;100.0 +25/10/2020 02:06:14;U248.PT101.F_CV;21.578125000;100.0 +25/10/2020 02:06:26;U248.PT101.F_CV;21.718750000;100.0 +25/10/2020 02:06:53;U248.PT101.F_CV;21.578125000;100.0 +25/10/2020 02:06:00;U248.PT102.F_CV;-0.018749999;100.0 +25/10/2020 02:06:07;U248.PT102.F_CV;-0.029999999;100.0 +25/10/2020 02:06:08;U248.PT102.F_CV;-0.038750000;100.0 +25/10/2020 02:06:10;U248.PT102.F_CV;-0.016249999;100.0 +25/10/2020 02:06:16;U248.PT102.F_CV;-0.031250000;100.0 +25/10/2020 02:06:17;U248.PT102.F_CV;-0.018749999;100.0 +25/10/2020 02:06:21;U248.PT102.F_CV;-0.007500000;100.0 +25/10/2020 02:06:26;U248.PT102.F_CV;-0.031250000;100.0 +25/10/2020 02:06:28;U248.PT102.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U248.PT102.F_CV;-0.022499999;100.0 +25/10/2020 02:06:31;U248.PT102.F_CV;-0.044999998;100.0 +25/10/2020 02:06:35;U248.PT102.F_CV;-0.033749998;100.0 +25/10/2020 02:06:36;U248.PT102.F_CV;-0.001250000;100.0 +25/10/2020 02:06:37;U248.PT102.F_CV;0.016249999;100.0 +25/10/2020 02:06:38;U248.PT102.F_CV;-0.008750000;100.0 +25/10/2020 02:06:40;U248.PT102.F_CV;-0.022499999;100.0 +25/10/2020 02:06:41;U248.PT102.F_CV;-0.064999998;100.0 +25/10/2020 02:06:42;U248.PT102.F_CV;-0.035000000;100.0 +25/10/2020 02:06:43;U248.PT102.F_CV;-0.023750000;100.0 +25/10/2020 02:06:44;U248.PT102.F_CV;-0.052499998;100.0 +25/10/2020 02:06:47;U248.PT102.F_CV;-0.008750000;100.0 +25/10/2020 02:06:48;U248.PT102.F_CV;-0.026249999;100.0 +25/10/2020 02:06:49;U248.PT102.F_CV;-0.017500000;100.0 +25/10/2020 02:06:50;U248.PT102.F_CV;-0.024999999;100.0 +25/10/2020 02:06:52;U248.PT102.F_CV;-0.016249999;100.0 +25/10/2020 02:06:53;U248.PT102.F_CV;-0.046250001;100.0 +25/10/2020 02:06:55;U248.PT102.F_CV;-0.024999999;100.0 +25/10/2020 02:06:56;U248.PT102.F_CV;-0.006250000;100.0 +25/10/2020 02:06:10;U248.PT11.F_CV;1.156250000;100.0 +25/10/2020 02:06:11;U248.PT11.F_CV;0.640625000;100.0 +25/10/2020 02:06:16;U248.PT11.F_CV;1.031250000;100.0 +25/10/2020 02:06:19;U248.PT11.F_CV;0.515625000;100.0 +25/10/2020 02:06:21;U248.PT11.F_CV;1.125000000;100.0 +25/10/2020 02:06:22;U248.PT11.F_CV;0.875000000;100.0 +25/10/2020 02:06:25;U248.PT11.F_CV;0.718750000;100.0 +25/10/2020 02:06:26;U248.PT11.F_CV;0.906250000;100.0 +25/10/2020 02:06:29;U248.PT11.F_CV;0.640625000;100.0 +25/10/2020 02:06:35;U248.PT11.F_CV;0.796875000;100.0 +25/10/2020 02:06:39;U248.PT11.F_CV;1.125000000;100.0 +25/10/2020 02:06:40;U248.PT11.F_CV;0.796875000;100.0 +25/10/2020 02:06:41;U248.PT11.F_CV;0.968750000;100.0 +25/10/2020 02:06:42;U248.PT11.F_CV;0.609375000;100.0 +25/10/2020 02:06:48;U248.PT11.F_CV;1.062500000;100.0 +25/10/2020 02:06:50;U248.PT11.F_CV;0.656250000;100.0 +25/10/2020 02:06:56;U248.PT11.F_CV;0.875000000;100.0 +25/10/2020 02:06:50;U248.PT110.F_CV;0.015625000;100.0 +25/10/2020 02:06:07;U248.PT111.F_CV;0.828125000;100.0 +25/10/2020 02:06:25;U248.PT111.F_CV;0.968750000;100.0 +25/10/2020 02:06:03;U248.PT113.F_CV;11.781250000;100.0 +25/10/2020 02:06:01;U248.PT115.F_CV;-0.015750000;100.0 +25/10/2020 02:06:03;U248.PT115.F_CV;-0.023250001;100.0 +25/10/2020 02:06:04;U248.PT115.F_CV;-0.021375000;100.0 +25/10/2020 02:06:06;U248.PT115.F_CV;-0.025687501;100.0 +25/10/2020 02:06:07;U248.PT115.F_CV;-0.019500000;100.0 +25/10/2020 02:06:11;U248.PT115.F_CV;-0.038437501;100.0 +25/10/2020 02:06:12;U248.PT115.F_CV;-0.014250000;100.0 +25/10/2020 02:06:14;U248.PT115.F_CV;-0.021000000;100.0 +25/10/2020 02:06:17;U248.PT115.F_CV;-0.015562500;100.0 +25/10/2020 02:06:18;U248.PT115.F_CV;-0.035812501;100.0 +25/10/2020 02:06:20;U248.PT115.F_CV;-0.020625001;100.0 +25/10/2020 02:06:21;U248.PT115.F_CV;-0.009375000;100.0 +25/10/2020 02:06:22;U248.PT115.F_CV;-0.020812500;100.0 +25/10/2020 02:06:23;U248.PT115.F_CV;-0.004687500;100.0 +25/10/2020 02:06:25;U248.PT115.F_CV;-0.034687500;100.0 +25/10/2020 02:06:26;U248.PT115.F_CV;-0.022312500;100.0 +25/10/2020 02:06:28;U248.PT115.F_CV;-0.013312500;100.0 +25/10/2020 02:06:29;U248.PT115.F_CV;-0.020812500;100.0 +25/10/2020 02:06:31;U248.PT115.F_CV;-0.012000000;100.0 +25/10/2020 02:06:32;U248.PT115.F_CV;-0.018562499;100.0 +25/10/2020 02:06:33;U248.PT115.F_CV;-0.007312500;100.0 +25/10/2020 02:06:35;U248.PT115.F_CV;-0.019500000;100.0 +25/10/2020 02:06:37;U248.PT115.F_CV;-0.024375001;100.0 +25/10/2020 02:06:38;U248.PT115.F_CV;-0.017437501;100.0 +25/10/2020 02:06:39;U248.PT115.F_CV;-0.020625001;100.0 +25/10/2020 02:06:40;U248.PT115.F_CV;-0.056437500;100.0 +25/10/2020 02:06:41;U248.PT115.F_CV;-0.022500001;100.0 +25/10/2020 02:06:43;U248.PT115.F_CV;-0.032062501;100.0 +25/10/2020 02:06:44;U248.PT115.F_CV;-0.021000000;100.0 +25/10/2020 02:06:48;U248.PT115.F_CV;-0.018375000;100.0 +25/10/2020 02:06:50;U248.PT115.F_CV;-0.027750000;100.0 +25/10/2020 02:06:51;U248.PT115.F_CV;-0.008625000;100.0 +25/10/2020 02:06:52;U248.PT115.F_CV;-0.022875000;100.0 +25/10/2020 02:06:53;U248.PT115.F_CV;-0.030750001;100.0 +25/10/2020 02:06:55;U248.PT115.F_CV;-0.020812500;100.0 +25/10/2020 02:06:56;U248.PT115.F_CV;0.018750001;100.0 +25/10/2020 02:06:57;U248.PT115.F_CV;-0.023062501;100.0 +25/10/2020 02:06:15;U248.PT13.F_CV;25.375000000;100.0 +25/10/2020 02:06:00;U248.PT15.F_CV;0.307875007;100.0 +25/10/2020 02:06:01;U248.PT15.F_CV;0.315750003;100.0 +25/10/2020 02:06:02;U248.PT15.F_CV;0.306750000;100.0 +25/10/2020 02:06:03;U248.PT15.F_CV;0.316125005;100.0 +25/10/2020 02:06:04;U248.PT15.F_CV;0.314249992;100.0 +25/10/2020 02:06:06;U248.PT15.F_CV;0.316500008;100.0 +25/10/2020 02:06:07;U248.PT15.F_CV;0.310124993;100.0 +25/10/2020 02:06:08;U248.PT15.F_CV;0.314062506;100.0 +25/10/2020 02:06:10;U248.PT15.F_CV;0.337500006;100.0 +25/10/2020 02:06:11;U248.PT15.F_CV;0.309187502;100.0 +25/10/2020 02:06:16;U248.PT15.F_CV;0.320062488;100.0 +25/10/2020 02:06:17;U248.PT15.F_CV;0.314062506;100.0 +25/10/2020 02:06:18;U248.PT15.F_CV;0.317062497;100.0 +25/10/2020 02:06:19;U248.PT15.F_CV;0.314062506;100.0 +25/10/2020 02:06:22;U248.PT15.F_CV;0.317437500;100.0 +25/10/2020 02:06:23;U248.PT15.F_CV;0.315375000;100.0 +25/10/2020 02:06:25;U248.PT15.F_CV;0.292499989;100.0 +25/10/2020 02:06:26;U248.PT15.F_CV;0.315187514;100.0 +25/10/2020 02:06:27;U248.PT15.F_CV;0.319312513;100.0 +25/10/2020 02:06:29;U248.PT15.F_CV;0.312937498;100.0 +25/10/2020 02:06:30;U248.PT15.F_CV;0.314624995;100.0 +25/10/2020 02:06:32;U248.PT15.F_CV;0.309749991;100.0 +25/10/2020 02:06:35;U248.PT15.F_CV;0.323812515;100.0 +25/10/2020 02:06:36;U248.PT15.F_CV;0.313125014;100.0 +25/10/2020 02:06:38;U248.PT15.F_CV;0.315187514;100.0 +25/10/2020 02:06:39;U248.PT15.F_CV;0.306187510;100.0 +25/10/2020 02:06:40;U248.PT15.F_CV;0.317437500;100.0 +25/10/2020 02:06:41;U248.PT15.F_CV;0.273750007;100.0 +25/10/2020 02:06:42;U248.PT15.F_CV;0.299062490;100.0 +25/10/2020 02:06:43;U248.PT15.F_CV;0.317625016;100.0 +25/10/2020 02:06:44;U248.PT15.F_CV;0.314062506;100.0 +25/10/2020 02:06:46;U248.PT15.F_CV;0.322874993;100.0 +25/10/2020 02:06:47;U248.PT15.F_CV;0.315375000;100.0 +25/10/2020 02:06:49;U248.PT15.F_CV;0.309937507;100.0 +25/10/2020 02:06:50;U248.PT15.F_CV;0.324187517;100.0 +25/10/2020 02:06:51;U248.PT15.F_CV;0.314812511;100.0 +25/10/2020 02:06:52;U248.PT15.F_CV;0.318374991;100.0 +25/10/2020 02:06:53;U248.PT15.F_CV;0.310312510;100.0 +25/10/2020 02:06:54;U248.PT15.F_CV;0.323062509;100.0 +25/10/2020 02:06:55;U248.PT15.F_CV;0.314062506;100.0 +25/10/2020 02:06:56;U248.PT15.F_CV;0.326062500;100.0 +25/10/2020 02:06:57;U248.PT15.F_CV;0.313125014;100.0 +25/10/2020 02:06:01;U248.PT154.F_CV;0.989750028;100.0 +25/10/2020 02:06:04;U248.PT154.F_CV;0.988000035;100.0 +25/10/2020 02:06:08;U248.PT154.F_CV;0.989250064;100.0 +25/10/2020 02:06:12;U248.PT154.F_CV;0.987875044;100.0 +25/10/2020 02:06:13;U248.PT154.F_CV;0.989250064;100.0 +25/10/2020 02:06:32;U248.PT154.F_CV;0.990500033;100.0 +25/10/2020 02:06:36;U248.PT154.F_CV;0.989000022;100.0 +25/10/2020 02:06:48;U248.PT154.F_CV;0.990500033;100.0 +25/10/2020 02:06:53;U248.PT154.F_CV;0.989125073;100.0 +25/10/2020 02:06:55;U248.PT154.F_CV;0.987000048;100.0 +25/10/2020 02:06:50;U248.PT201.F_CV;1.406250000;100.0 +25/10/2020 02:06:45;U248.PT301.F_CV;0.031250000;100.0 +25/10/2020 02:06:03;U248.PT54.F_CV;0.995875061;100.0 +25/10/2020 02:06:13;U248.PT54.F_CV;0.998125076;100.0 +25/10/2020 02:06:14;U248.PT54.F_CV;0.996500075;100.0 +25/10/2020 02:06:19;U248.PT54.F_CV;0.998375058;100.0 +25/10/2020 02:06:27;U248.PT54.F_CV;0.995500028;100.0 +25/10/2020 02:06:29;U248.PT54.F_CV;0.996625066;100.0 +25/10/2020 02:06:37;U248.PT54.F_CV;0.994250059;100.0 +25/10/2020 02:06:43;U248.PT54.F_CV;0.997625053;100.0 +25/10/2020 02:06:49;U248.PT54.F_CV;0.996500075;100.0 +25/10/2020 02:06:42;U248.TC120_OP.F_CV;10.000000000;100.0 +25/10/2020 02:06:42;U248.TC125_OP.F_CV;15.000000000;100.0 +25/10/2020 02:06:42;U248.TC220_OP.F_CV;10.000000000;100.0 +25/10/2020 02:06:42;U248.TC225_OP.F_CV;15.000000000;100.0 +25/10/2020 02:06:42;U248.TC320_OP.F_CV;5.000000000;100.0 +25/10/2020 02:06:42;U248.TC325_OP.F_CV;15.000000000;100.0 +25/10/2020 02:06:42;U248.TC420_OP.F_CV;10.000000000;100.0 +25/10/2020 02:06:42;U248.TC425_OP.F_CV;15.000000000;100.0 +25/10/2020 02:06:56;U248.TE01.F_CV;11.199999809;100.0 +25/10/2020 02:06:56;U248.TE02.F_CV;11.600000381;100.0 +25/10/2020 02:06:06;U248.TE03.F_CV;13.699999809;100.0 +25/10/2020 02:06:35;U248.TE04.F_CV;12.600000381;100.0 +25/10/2020 02:06:16;U248.TE06.F_CV;13.899999619;100.0 +25/10/2020 02:06:02;U248.TE10.F_CV;15.000000000;100.0 +25/10/2020 02:06:03;U248.TE10.F_CV;15.100000381;100.0 +25/10/2020 02:06:04;U248.TE10.F_CV;15.000000000;100.0 +25/10/2020 02:06:21;U248.TE10.F_CV;15.000000000;100.0 +25/10/2020 02:06:22;U248.TE10.F_CV;14.899999619;100.0 +25/10/2020 02:06:23;U248.TE10.F_CV;15.000000000;100.0 +25/10/2020 02:06:26;U248.TE10.F_CV;14.899999619;100.0 +25/10/2020 02:06:28;U248.TE10.F_CV;15.000000000;100.0 +25/10/2020 02:06:40;U248.TE10.F_CV;15.000000000;100.0 +25/10/2020 02:06:41;U248.TE10.F_CV;15.100000381;100.0 +25/10/2020 02:06:42;U248.TE10.F_CV;15.000000000;100.0 +25/10/2020 02:06:44;U248.TE10.F_CV;15.100000381;100.0 +25/10/2020 02:06:48;U248.TE10.F_CV;15.000000000;100.0 +25/10/2020 02:06:42;U248.TE100.F_CV;12.399999619;100.0 +25/10/2020 02:06:42;U248.TE101.F_CV;13.199999809;100.0 +25/10/2020 02:06:42;U248.TE102.F_CV;12.399999619;100.0 +25/10/2020 02:06:42;U248.TE103.F_CV;12.699999809;100.0 +25/10/2020 02:06:19;U248.TE1032.F_CV;13.600000381;100.0 +25/10/2020 02:06:47;U248.TE1033.F_CV;13.500000000;100.0 +25/10/2020 02:06:42;U248.TE104.F_CV;12.500000000;100.0 +25/10/2020 02:06:33;U248.TE1040.F_CV;13.199999809;100.0 +25/10/2020 02:06:11;U248.TE1041.F_CV;14.100000381;100.0 +25/10/2020 02:06:30;U248.TE1042.F_CV;14.500000000;100.0 +25/10/2020 02:06:43;U248.TE1043.F_CV;14.100000381;100.0 +25/10/2020 02:06:09;U248.TE105.F_CV;12.500000000;100.0 +25/10/2020 02:06:48;U248.TE1050.F_CV;14.399999619;100.0 +25/10/2020 02:06:22;U248.TE1054.F_CV;14.800000191;100.0 +25/10/2020 02:06:24;U248.TE1054.F_CV;14.899999619;100.0 +25/10/2020 02:06:33;U248.TE1054.F_CV;14.800000191;100.0 +25/10/2020 02:06:40;U248.TE1054.F_CV;14.899999619;100.0 +25/10/2020 02:06:46;U248.TE1054.F_CV;14.800000191;100.0 +25/10/2020 02:06:25;U248.TE1070.F_CV;13.100000381;100.0 +25/10/2020 02:06:49;U248.TE110.F_CV;13.300000191;100.0 +25/10/2020 02:06:10;U248.TE111.F_CV;13.300000191;100.0 +25/10/2020 02:06:55;U248.TE112.F_CV;13.199999809;100.0 +25/10/2020 02:06:04;U248.TE113.F_CV;13.199999809;100.0 +25/10/2020 02:06:06;U248.TE1133.F_CV;14.199999809;100.0 +25/10/2020 02:06:17;U248.TE1133.F_CV;14.399999619;100.0 +25/10/2020 02:06:25;U248.TE1133.F_CV;14.199999809;100.0 +25/10/2020 02:06:38;U248.TE114.F_CV;13.500000000;100.0 +25/10/2020 02:06:36;U248.TE1140.F_CV;15.199999809;100.0 +25/10/2020 02:06:16;U248.TE1143.F_CV;15.100000381;100.0 +25/10/2020 02:06:25;U248.TE1143.F_CV;15.300000191;100.0 +25/10/2020 02:06:05;U248.TE1145.F_CV;14.800000191;100.0 +25/10/2020 02:06:06;U248.TE1145.F_CV;14.699999809;100.0 +25/10/2020 02:06:08;U248.TE1145.F_CV;14.800000191;100.0 +25/10/2020 02:06:09;U248.TE1145.F_CV;14.699999809;100.0 +25/10/2020 02:06:11;U248.TE1145.F_CV;14.800000191;100.0 +25/10/2020 02:06:28;U248.TE1145.F_CV;14.800000191;100.0 +25/10/2020 02:06:29;U248.TE1145.F_CV;14.699999809;100.0 +25/10/2020 02:06:30;U248.TE1145.F_CV;14.800000191;100.0 +25/10/2020 02:06:37;U248.TE1145.F_CV;14.899999619;100.0 +25/10/2020 02:06:40;U248.TE1145.F_CV;14.800000191;100.0 +25/10/2020 02:06:43;U248.TE1145.F_CV;14.899999619;100.0 +25/10/2020 02:06:44;U248.TE1145.F_CV;14.800000191;100.0 +25/10/2020 02:06:22;U248.TE115.F_CV;13.800000191;100.0 +25/10/2020 02:06:04;U248.TE1150.F_CV;13.800000191;100.0 +25/10/2020 02:06:37;U248.TE1170.F_CV;13.600000381;100.0 +25/10/2020 02:06:42;U248.TE121.F_CV;1199.999755859;100.0 +25/10/2020 02:06:42;U248.TE122A.F_CV;1200.000000000;100.0 +25/10/2020 02:06:42;U248.TE122B.F_CV;1200.000000000;100.0 +25/10/2020 02:06:42;U248.TE123.F_CV;1200.000000000;100.0 +25/10/2020 02:06:42;U248.TE124A.F_CV;1200.000000000;100.0 +25/10/2020 02:06:42;U248.TE124B.F_CV;1200.000000000;100.0 +25/10/2020 02:06:42;U248.TE126.F_CV;1200.000000000;100.0 +25/10/2020 02:06:10;U248.TE200.F_CV;12.300000191;100.0 +25/10/2020 02:06:19;U248.TE200.F_CV;12.600000381;100.0 +25/10/2020 02:06:23;U248.TE200.F_CV;12.300000191;100.0 +25/10/2020 02:06:26;U248.TE200.F_CV;12.699999809;100.0 +25/10/2020 02:06:27;U248.TE200.F_CV;12.199999809;100.0 +25/10/2020 02:06:28;U248.TE200.F_CV;12.500000000;100.0 +25/10/2020 02:06:29;U248.TE200.F_CV;12.199999809;100.0 +25/10/2020 02:06:32;U248.TE200.F_CV;12.500000000;100.0 +25/10/2020 02:06:35;U248.TE200.F_CV;12.199999809;100.0 +25/10/2020 02:06:38;U248.TE200.F_CV;12.500000000;100.0 +25/10/2020 02:06:43;U248.TE200.F_CV;12.199999809;100.0 +25/10/2020 02:06:44;U248.TE200.F_CV;12.699999809;100.0 +25/10/2020 02:06:46;U248.TE200.F_CV;12.399999619;100.0 +25/10/2020 02:06:47;U248.TE200.F_CV;12.699999809;100.0 +25/10/2020 02:06:50;U248.TE200.F_CV;12.100000381;100.0 +25/10/2020 02:06:54;U248.TE200.F_CV;12.500000000;100.0 +25/10/2020 02:06:11;U248.TE201.F_CV;12.199999809;100.0 +25/10/2020 02:06:12;U248.TE201.F_CV;12.500000000;100.0 +25/10/2020 02:06:14;U248.TE201.F_CV;12.199999809;100.0 +25/10/2020 02:06:19;U248.TE201.F_CV;12.500000000;100.0 +25/10/2020 02:06:22;U248.TE201.F_CV;12.100000381;100.0 +25/10/2020 02:06:35;U248.TE201.F_CV;12.600000381;100.0 +25/10/2020 02:06:38;U248.TE201.F_CV;12.300000191;100.0 +25/10/2020 02:06:42;U248.TE201.F_CV;12.699999809;100.0 +25/10/2020 02:06:46;U248.TE201.F_CV;12.399999619;100.0 +25/10/2020 02:06:00;U248.TE202.F_CV;12.500000000;100.0 +25/10/2020 02:06:02;U248.TE202.F_CV;12.899999619;100.0 +25/10/2020 02:06:07;U248.TE202.F_CV;12.500000000;100.0 +25/10/2020 02:06:09;U248.TE202.F_CV;12.899999619;100.0 +25/10/2020 02:06:12;U248.TE202.F_CV;12.500000000;100.0 +25/10/2020 02:06:16;U248.TE202.F_CV;12.800000191;100.0 +25/10/2020 02:06:18;U248.TE202.F_CV;12.500000000;100.0 +25/10/2020 02:06:28;U248.TE202.F_CV;12.800000191;100.0 +25/10/2020 02:06:38;U248.TE202.F_CV;12.500000000;100.0 +25/10/2020 02:06:44;U248.TE202.F_CV;12.899999619;100.0 +25/10/2020 02:06:47;U248.TE202.F_CV;12.500000000;100.0 +25/10/2020 02:06:50;U248.TE202.F_CV;12.800000191;100.0 +25/10/2020 02:06:52;U248.TE202.F_CV;12.500000000;100.0 +25/10/2020 02:06:59;U248.TE202.F_CV;12.800000191;100.0 +25/10/2020 02:06:04;U248.TE203.F_CV;13.100000381;100.0 +25/10/2020 02:06:09;U248.TE203.F_CV;12.800000191;100.0 +25/10/2020 02:06:23;U248.TE203.F_CV;13.100000381;100.0 +25/10/2020 02:06:24;U248.TE203.F_CV;12.699999809;100.0 +25/10/2020 02:06:28;U248.TE203.F_CV;13.000000000;100.0 +25/10/2020 02:06:59;U248.TE203.F_CV;12.699999809;100.0 +25/10/2020 02:06:05;U248.TE2032.F_CV;13.100000381;100.0 +25/10/2020 02:06:11;U248.TE2033.F_CV;13.600000381;100.0 +25/10/2020 02:06:01;U248.TE204.F_CV;14.000000000;100.0 +25/10/2020 02:06:02;U248.TE204.F_CV;13.699999809;100.0 +25/10/2020 02:06:03;U248.TE204.F_CV;14.000000000;100.0 +25/10/2020 02:06:04;U248.TE204.F_CV;13.600000381;100.0 +25/10/2020 02:06:16;U248.TE204.F_CV;14.000000000;100.0 +25/10/2020 02:06:48;U248.TE2040.F_CV;13.600000381;100.0 +25/10/2020 02:06:11;U248.TE2041.F_CV;15.300000191;100.0 +25/10/2020 02:06:20;U248.TE2041.F_CV;15.100000381;100.0 +25/10/2020 02:06:31;U248.TE2041.F_CV;15.300000191;100.0 +25/10/2020 02:06:43;U248.TE2042.F_CV;41.500000000;100.0 +25/10/2020 02:06:58;U248.TE2043.F_CV;13.800000191;100.0 +25/10/2020 02:06:26;U248.TE205.F_CV;14.300000191;100.0 +25/10/2020 02:06:27;U248.TE205.F_CV;14.000000000;100.0 +25/10/2020 02:06:28;U248.TE2050.F_CV;13.899999619;100.0 +25/10/2020 02:06:02;U248.TE2054.F_CV;15.699999809;100.0 +25/10/2020 02:06:03;U248.TE2054.F_CV;15.800000191;100.0 +25/10/2020 02:06:04;U248.TE2054.F_CV;15.699999809;100.0 +25/10/2020 02:06:07;U248.TE2054.F_CV;15.800000191;100.0 +25/10/2020 02:06:09;U248.TE2054.F_CV;15.699999809;100.0 +25/10/2020 02:06:30;U248.TE2054.F_CV;15.699999809;100.0 +25/10/2020 02:06:31;U248.TE2054.F_CV;15.800000191;100.0 +25/10/2020 02:06:36;U248.TE2054.F_CV;15.600000381;100.0 +25/10/2020 02:06:38;U248.TE2054.F_CV;15.699999809;100.0 +25/10/2020 02:06:56;U248.TE2054.F_CV;15.600000381;100.0 +25/10/2020 02:06:59;U248.TE2054.F_CV;15.699999809;100.0 +25/10/2020 02:06:32;U248.TE210.F_CV;12.399999619;100.0 +25/10/2020 02:06:20;U248.TE211.F_CV;11.600000381;100.0 +25/10/2020 02:06:06;U248.TE212.F_CV;12.000000000;100.0 +25/10/2020 02:06:46;U248.TE213.F_CV;12.000000000;100.0 +25/10/2020 02:06:07;U248.TE2133.F_CV;14.899999619;100.0 +25/10/2020 02:06:28;U248.TE214.F_CV;13.000000000;100.0 +25/10/2020 02:06:39;U248.TE2140.F_CV;14.399999619;100.0 +25/10/2020 02:06:54;U248.TE2143.F_CV;14.500000000;100.0 +25/10/2020 02:06:00;U248.TE2145.F_CV;15.199999809;100.0 +25/10/2020 02:06:01;U248.TE2145.F_CV;15.300000191;100.0 +25/10/2020 02:06:02;U248.TE2145.F_CV;15.199999809;100.0 +25/10/2020 02:06:09;U248.TE2145.F_CV;15.100000381;100.0 +25/10/2020 02:06:14;U248.TE2145.F_CV;15.100000381;100.0 +25/10/2020 02:06:15;U248.TE2145.F_CV;15.300000191;100.0 +25/10/2020 02:06:16;U248.TE2145.F_CV;15.100000381;100.0 +25/10/2020 02:06:17;U248.TE2145.F_CV;15.199999809;100.0 +25/10/2020 02:06:20;U248.TE2145.F_CV;15.300000191;100.0 +25/10/2020 02:06:24;U248.TE2145.F_CV;15.300000191;100.0 +25/10/2020 02:06:25;U248.TE2145.F_CV;15.199999809;100.0 +25/10/2020 02:06:26;U248.TE2145.F_CV;15.300000191;100.0 +25/10/2020 02:06:27;U248.TE2145.F_CV;15.199999809;100.0 +25/10/2020 02:06:28;U248.TE2145.F_CV;15.300000191;100.0 +25/10/2020 02:06:31;U248.TE2145.F_CV;15.199999809;100.0 +25/10/2020 02:06:32;U248.TE2145.F_CV;15.300000191;100.0 +25/10/2020 02:06:37;U248.TE2145.F_CV;15.100000381;100.0 +25/10/2020 02:06:38;U248.TE2145.F_CV;15.199999809;100.0 +25/10/2020 02:06:41;U248.TE2145.F_CV;15.300000191;100.0 +25/10/2020 02:06:43;U248.TE2145.F_CV;15.199999809;100.0 +25/10/2020 02:06:48;U248.TE2145.F_CV;15.199999809;100.0 +25/10/2020 02:06:49;U248.TE2145.F_CV;15.300000191;100.0 +25/10/2020 02:06:41;U248.TE215.F_CV;13.199999809;100.0 +25/10/2020 02:06:32;U248.TE2150.F_CV;14.300000191;100.0 +25/10/2020 02:06:42;U248.TE221.F_CV;1199.999755859;100.0 +25/10/2020 02:06:42;U248.TE222A.F_CV;1200.000000000;100.0 +25/10/2020 02:06:42;U248.TE222B.F_CV;1200.000000000;100.0 +25/10/2020 02:06:42;U248.TE223.F_CV;1200.000000000;100.0 +25/10/2020 02:06:42;U248.TE224A.F_CV;1200.000000000;100.0 +25/10/2020 02:06:42;U248.TE224B.F_CV;1200.000000000;100.0 +25/10/2020 02:06:42;U248.TE226.F_CV;1200.000000000;100.0 +25/10/2020 02:06:19;U248.TE300.F_CV;12.600000381;100.0 +25/10/2020 02:06:27;U248.TE301.F_CV;13.100000381;100.0 +25/10/2020 02:06:42;U248.TE302.F_CV;13.500000000;100.0 +25/10/2020 02:06:24;U248.TE303.F_CV;13.600000381;100.0 +25/10/2020 02:06:42;U248.TE304.F_CV;14.100000381;100.0 +25/10/2020 02:06:10;U248.TE305.F_CV;14.600000381;100.0 +25/10/2020 02:06:16;U248.TE310.F_CV;12.800000191;100.0 +25/10/2020 02:06:37;U248.TE311.F_CV;12.300000191;100.0 +25/10/2020 02:06:21;U248.TE312.F_CV;12.500000000;100.0 +25/10/2020 02:06:56;U248.TE313.F_CV;12.500000000;100.0 +25/10/2020 02:06:48;U248.TE314.F_CV;13.500000000;100.0 +25/10/2020 02:06:47;U248.TE315.F_CV;13.800000191;100.0 +25/10/2020 02:06:42;U248.TE321.F_CV;1199.999755859;100.0 +25/10/2020 02:06:42;U248.TE322A.F_CV;1200.000000000;100.0 +25/10/2020 02:06:42;U248.TE322B.F_CV;1200.000000000;100.0 +25/10/2020 02:06:42;U248.TE323.F_CV;1200.000000000;100.0 +25/10/2020 02:06:42;U248.TE324A.F_CV;1200.000000000;100.0 +25/10/2020 02:06:42;U248.TE324B.F_CV;1200.000000000;100.0 +25/10/2020 02:06:42;U248.TE326.F_CV;1200.000000000;100.0 +25/10/2020 02:06:09;U248.TE400.F_CV;14.399999619;100.0 +25/10/2020 02:06:42;U248.TE401.F_CV;14.100000381;100.0 +25/10/2020 02:06:32;U248.TE402.F_CV;14.199999809;100.0 +25/10/2020 02:06:02;U248.TE403.F_CV;14.300000191;100.0 +25/10/2020 02:06:20;U248.TE404.F_CV;14.500000000;100.0 +25/10/2020 02:06:37;U248.TE405.F_CV;14.699999809;100.0 +25/10/2020 02:06:01;U248.TE410.F_CV;13.899999619;100.0 +25/10/2020 02:06:53;U248.TE411.F_CV;13.300000191;100.0 +25/10/2020 02:06:50;U248.TE412.F_CV;13.500000000;100.0 +25/10/2020 02:06:39;U248.TE413.F_CV;13.500000000;100.0 +25/10/2020 02:06:19;U248.TE414.F_CV;14.500000000;100.0 +25/10/2020 02:06:29;U248.TE415.F_CV;14.800000191;100.0 +25/10/2020 02:06:42;U248.TE421.F_CV;1199.999755859;100.0 +25/10/2020 02:06:42;U248.TE422A.F_CV;1200.000000000;100.0 +25/10/2020 02:06:42;U248.TE422B.F_CV;1200.000000000;100.0 +25/10/2020 02:06:42;U248.TE423.F_CV;1200.000000000;100.0 +25/10/2020 02:06:42;U248.TE424A.F_CV;1200.000000000;100.0 +25/10/2020 02:06:42;U248.TE424B.F_CV;1200.000000000;100.0 +25/10/2020 02:06:42;U248.TE426.F_CV;1200.000000000;100.0 +25/10/2020 02:06:39;U248.TI01.F_CV;11.199999809;100.0 +25/10/2020 02:06:04;U248.TI02.F_CV;11.699999809;100.0 +25/10/2020 02:06:54;U248.TI02.F_CV;11.500000000;100.0 +25/10/2020 02:06:05;U248.TI03.F_CV;13.800000191;100.0 +25/10/2020 02:06:12;U248.TI03.F_CV;13.600000381;100.0 +25/10/2020 02:06:01;U248.TI04.F_CV;12.699999809;100.0 +25/10/2020 02:06:02;U248.TI04.F_CV;12.500000000;100.0 +25/10/2020 02:06:06;U248.TI04.F_CV;12.699999809;100.0 +25/10/2020 02:06:42;U248.TI04.F_CV;12.500000000;100.0 +25/10/2020 02:06:54;U248.TI04.F_CV;12.699999809;100.0 +25/10/2020 02:06:58;U248.TI04.F_CV;12.500000000;100.0 +25/10/2020 02:06:16;U248.TI06.F_CV;13.899999619;100.0 +25/10/2020 02:06:03;U248.TI10.F_CV;15.000000000;100.0 +25/10/2020 02:06:04;U248.TI10.F_CV;15.100000381;100.0 +25/10/2020 02:06:05;U248.TI10.F_CV;15.000000000;100.0 +25/10/2020 02:06:21;U248.TI10.F_CV;15.000000000;100.0 +25/10/2020 02:06:22;U248.TI10.F_CV;14.899999619;100.0 +25/10/2020 02:06:23;U248.TI10.F_CV;15.000000000;100.0 +25/10/2020 02:06:27;U248.TI10.F_CV;14.899999619;100.0 +25/10/2020 02:06:29;U248.TI10.F_CV;15.000000000;100.0 +25/10/2020 02:06:41;U248.TI10.F_CV;15.000000000;100.0 +25/10/2020 02:06:42;U248.TI10.F_CV;15.100000381;100.0 +25/10/2020 02:06:43;U248.TI10.F_CV;15.000000000;100.0 +25/10/2020 02:06:45;U248.TI10.F_CV;15.100000381;100.0 +25/10/2020 02:06:48;U248.TI10.F_CV;15.000000000;100.0 +25/10/2020 02:06:42;U248.TI100.F_CV;12.399999619;100.0 +25/10/2020 02:06:42;U248.TI101.F_CV;13.199999809;100.0 +25/10/2020 02:06:42;U248.TI102.F_CV;12.399999619;100.0 +25/10/2020 02:06:42;U248.TI103.F_CV;12.699999809;100.0 +25/10/2020 02:06:05;U248.TI1032.F_CV;13.800000191;100.0 +25/10/2020 02:06:20;U248.TI1032.F_CV;13.600000381;100.0 +25/10/2020 02:06:51;U248.TI1032.F_CV;13.800000191;100.0 +25/10/2020 02:06:54;U248.TI1032.F_CV;13.600000381;100.0 +25/10/2020 02:06:48;U248.TI1033.F_CV;13.500000000;100.0 +25/10/2020 02:06:42;U248.TI104.F_CV;12.500000000;100.0 +25/10/2020 02:06:34;U248.TI1040.F_CV;13.199999809;100.0 +25/10/2020 02:06:11;U248.TI1041.F_CV;14.100000381;100.0 +25/10/2020 02:06:53;U248.TI1042.F_CV;14.500000000;100.0 +25/10/2020 02:06:53;U248.TI1043.F_CV;14.100000381;100.0 +25/10/2020 02:06:10;U248.TI105.F_CV;12.500000000;100.0 +25/10/2020 02:06:52;U248.TI1050.F_CV;14.399999619;100.0 +25/10/2020 02:06:15;U248.TI1054.F_CV;14.899999619;100.0 +25/10/2020 02:06:25;U248.TI1070.F_CV;13.100000381;100.0 +25/10/2020 02:06:41;U248.TI110.F_CV;13.300000191;100.0 +25/10/2020 02:06:50;U248.TI111.F_CV;13.199999809;100.0 +25/10/2020 02:06:50;U248.TI112.F_CV;13.199999809;100.0 +25/10/2020 02:06:25;U248.TI113.F_CV;13.199999809;100.0 +25/10/2020 02:06:06;U248.TI1133.F_CV;14.199999809;100.0 +25/10/2020 02:06:18;U248.TI1133.F_CV;14.399999619;100.0 +25/10/2020 02:06:25;U248.TI1133.F_CV;14.199999809;100.0 +25/10/2020 02:06:26;U248.TI114.F_CV;13.500000000;100.0 +25/10/2020 02:06:03;U248.TI1140.F_CV;15.300000191;100.0 +25/10/2020 02:06:05;U248.TI1140.F_CV;15.100000381;100.0 +25/10/2020 02:06:31;U248.TI1140.F_CV;15.300000191;100.0 +25/10/2020 02:06:56;U248.TI1140.F_CV;15.100000381;100.0 +25/10/2020 02:06:59;U248.TI1140.F_CV;15.300000191;100.0 +25/10/2020 02:06:16;U248.TI1143.F_CV;15.100000381;100.0 +25/10/2020 02:06:25;U248.TI1143.F_CV;15.300000191;100.0 +25/10/2020 02:06:05;U248.TI1145.F_CV;14.800000191;100.0 +25/10/2020 02:06:06;U248.TI1145.F_CV;14.699999809;100.0 +25/10/2020 02:06:10;U248.TI1145.F_CV;14.699999809;100.0 +25/10/2020 02:06:11;U248.TI1145.F_CV;14.800000191;100.0 +25/10/2020 02:06:29;U248.TI1145.F_CV;14.800000191;100.0 +25/10/2020 02:06:30;U248.TI1145.F_CV;14.699999809;100.0 +25/10/2020 02:06:31;U248.TI1145.F_CV;14.800000191;100.0 +25/10/2020 02:06:38;U248.TI1145.F_CV;14.899999619;100.0 +25/10/2020 02:06:41;U248.TI1145.F_CV;14.800000191;100.0 +25/10/2020 02:06:43;U248.TI1145.F_CV;14.899999619;100.0 +25/10/2020 02:06:44;U248.TI1145.F_CV;14.800000191;100.0 +25/10/2020 02:06:24;U248.TI115.F_CV;13.800000191;100.0 +25/10/2020 02:06:06;U248.TI1150.F_CV;13.800000191;100.0 +25/10/2020 02:06:37;U248.TI1170.F_CV;13.600000381;100.0 +25/10/2020 02:06:42;U248.TI121.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U248.TI122A.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U248.TI122B.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U248.TI123.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U248.TI124A.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U248.TI124B.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U248.TI126.F_CV;600.000000000;100.0 +25/10/2020 02:06:19;U248.TI200.F_CV;12.600000381;100.0 +25/10/2020 02:06:23;U248.TI200.F_CV;12.300000191;100.0 +25/10/2020 02:06:26;U248.TI200.F_CV;12.699999809;100.0 +25/10/2020 02:06:28;U248.TI200.F_CV;12.199999809;100.0 +25/10/2020 02:06:29;U248.TI200.F_CV;12.500000000;100.0 +25/10/2020 02:06:30;U248.TI200.F_CV;12.199999809;100.0 +25/10/2020 02:06:31;U248.TI200.F_CV;12.500000000;100.0 +25/10/2020 02:06:36;U248.TI200.F_CV;12.199999809;100.0 +25/10/2020 02:06:39;U248.TI200.F_CV;12.500000000;100.0 +25/10/2020 02:06:40;U248.TI200.F_CV;12.199999809;100.0 +25/10/2020 02:06:44;U248.TI200.F_CV;12.500000000;100.0 +25/10/2020 02:06:51;U248.TI200.F_CV;12.199999809;100.0 +25/10/2020 02:06:52;U248.TI200.F_CV;12.600000381;100.0 +25/10/2020 02:06:54;U248.TI200.F_CV;12.199999809;100.0 +25/10/2020 02:06:55;U248.TI200.F_CV;12.500000000;100.0 +25/10/2020 02:06:05;U248.TI201.F_CV;12.699999809;100.0 +25/10/2020 02:06:06;U248.TI201.F_CV;12.399999619;100.0 +25/10/2020 02:06:21;U248.TI202.F_CV;12.399999619;100.0 +25/10/2020 02:06:22;U248.TI202.F_CV;12.699999809;100.0 +25/10/2020 02:06:46;U248.TI202.F_CV;12.399999619;100.0 +25/10/2020 02:06:47;U248.TI202.F_CV;12.800000191;100.0 +25/10/2020 02:06:48;U248.TI202.F_CV;12.500000000;100.0 +25/10/2020 02:06:50;U248.TI202.F_CV;12.800000191;100.0 +25/10/2020 02:06:52;U248.TI202.F_CV;12.500000000;100.0 +25/10/2020 02:06:59;U248.TI202.F_CV;12.800000191;100.0 +25/10/2020 02:06:11;U248.TI203.F_CV;12.699999809;100.0 +25/10/2020 02:06:16;U248.TI203.F_CV;13.000000000;100.0 +25/10/2020 02:06:18;U248.TI203.F_CV;12.699999809;100.0 +25/10/2020 02:06:21;U248.TI203.F_CV;13.000000000;100.0 +25/10/2020 02:06:24;U248.TI203.F_CV;12.699999809;100.0 +25/10/2020 02:06:29;U248.TI203.F_CV;13.000000000;100.0 +25/10/2020 02:06:59;U248.TI203.F_CV;12.699999809;100.0 +25/10/2020 02:06:05;U248.TI2032.F_CV;13.100000381;100.0 +25/10/2020 02:06:12;U248.TI2033.F_CV;13.600000381;100.0 +25/10/2020 02:06:03;U248.TI204.F_CV;14.000000000;100.0 +25/10/2020 02:06:05;U248.TI204.F_CV;13.500000000;100.0 +25/10/2020 02:06:13;U248.TI204.F_CV;13.800000191;100.0 +25/10/2020 02:06:18;U248.TI204.F_CV;13.500000000;100.0 +25/10/2020 02:06:22;U248.TI204.F_CV;13.800000191;100.0 +25/10/2020 02:06:25;U248.TI204.F_CV;13.500000000;100.0 +25/10/2020 02:06:29;U248.TI204.F_CV;13.800000191;100.0 +25/10/2020 02:06:44;U248.TI204.F_CV;13.500000000;100.0 +25/10/2020 02:06:46;U248.TI204.F_CV;13.800000191;100.0 +25/10/2020 02:06:47;U248.TI204.F_CV;13.500000000;100.0 +25/10/2020 02:06:49;U248.TI204.F_CV;13.800000191;100.0 +25/10/2020 02:06:47;U248.TI2040.F_CV;13.600000381;100.0 +25/10/2020 02:06:15;U248.TI2041.F_CV;15.300000191;100.0 +25/10/2020 02:06:21;U248.TI2041.F_CV;15.100000381;100.0 +25/10/2020 02:06:31;U248.TI2041.F_CV;15.300000191;100.0 +25/10/2020 02:06:37;U248.TI2042.F_CV;300.000000000;100.0 +25/10/2020 02:06:58;U248.TI2043.F_CV;13.800000191;100.0 +25/10/2020 02:06:06;U248.TI205.F_CV;13.800000191;100.0 +25/10/2020 02:06:08;U248.TI205.F_CV;14.100000381;100.0 +25/10/2020 02:06:11;U248.TI205.F_CV;13.800000191;100.0 +25/10/2020 02:06:13;U248.TI205.F_CV;14.100000381;100.0 +25/10/2020 02:06:14;U248.TI205.F_CV;13.800000191;100.0 +25/10/2020 02:06:16;U248.TI205.F_CV;14.100000381;100.0 +25/10/2020 02:06:18;U248.TI205.F_CV;13.800000191;100.0 +25/10/2020 02:06:26;U248.TI205.F_CV;14.300000191;100.0 +25/10/2020 02:06:29;U248.TI2050.F_CV;13.899999619;100.0 +25/10/2020 02:06:02;U248.TI2054.F_CV;15.699999809;100.0 +25/10/2020 02:06:03;U248.TI2054.F_CV;15.800000191;100.0 +25/10/2020 02:06:05;U248.TI2054.F_CV;15.699999809;100.0 +25/10/2020 02:06:06;U248.TI2054.F_CV;15.800000191;100.0 +25/10/2020 02:06:10;U248.TI2054.F_CV;15.699999809;100.0 +25/10/2020 02:06:30;U248.TI2054.F_CV;15.699999809;100.0 +25/10/2020 02:06:31;U248.TI2054.F_CV;15.800000191;100.0 +25/10/2020 02:06:37;U248.TI2054.F_CV;15.600000381;100.0 +25/10/2020 02:06:38;U248.TI2054.F_CV;15.699999809;100.0 +25/10/2020 02:06:58;U248.TI2054.F_CV;15.600000381;100.0 +25/10/2020 02:06:59;U248.TI2054.F_CV;15.699999809;100.0 +25/10/2020 02:06:40;U248.TI210.F_CV;12.500000000;100.0 +25/10/2020 02:06:51;U248.TI211.F_CV;11.699999809;100.0 +25/10/2020 02:06:16;U248.TI212.F_CV;11.899999619;100.0 +25/10/2020 02:06:10;U248.TI213.F_CV;12.100000381;100.0 +25/10/2020 02:06:13;U248.TI2133.F_CV;15.000000000;100.0 +25/10/2020 02:06:47;U248.TI214.F_CV;13.000000000;100.0 +25/10/2020 02:06:38;U248.TI2140.F_CV;14.399999619;100.0 +25/10/2020 02:06:55;U248.TI2143.F_CV;14.500000000;100.0 +25/10/2020 02:06:02;U248.TI2145.F_CV;15.199999809;100.0 +25/10/2020 02:06:10;U248.TI2145.F_CV;15.100000381;100.0 +25/10/2020 02:06:14;U248.TI2145.F_CV;15.100000381;100.0 +25/10/2020 02:06:15;U248.TI2145.F_CV;15.300000191;100.0 +25/10/2020 02:06:17;U248.TI2145.F_CV;15.100000381;100.0 +25/10/2020 02:06:18;U248.TI2145.F_CV;15.199999809;100.0 +25/10/2020 02:06:22;U248.TI2145.F_CV;15.300000191;100.0 +25/10/2020 02:06:25;U248.TI2145.F_CV;15.199999809;100.0 +25/10/2020 02:06:26;U248.TI2145.F_CV;15.300000191;100.0 +25/10/2020 02:06:28;U248.TI2145.F_CV;15.199999809;100.0 +25/10/2020 02:06:29;U248.TI2145.F_CV;15.300000191;100.0 +25/10/2020 02:06:32;U248.TI2145.F_CV;15.199999809;100.0 +25/10/2020 02:06:33;U248.TI2145.F_CV;15.300000191;100.0 +25/10/2020 02:06:38;U248.TI2145.F_CV;15.100000381;100.0 +25/10/2020 02:06:39;U248.TI2145.F_CV;15.199999809;100.0 +25/10/2020 02:06:42;U248.TI2145.F_CV;15.300000191;100.0 +25/10/2020 02:06:44;U248.TI2145.F_CV;15.199999809;100.0 +25/10/2020 02:06:48;U248.TI2145.F_CV;15.300000191;100.0 +25/10/2020 02:06:11;U248.TI215.F_CV;13.199999809;100.0 +25/10/2020 02:06:32;U248.TI2150.F_CV;14.300000191;100.0 +25/10/2020 02:06:42;U248.TI221.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U248.TI222A.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U248.TI222B.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U248.TI223.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U248.TI224A.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U248.TI224B.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U248.TI226.F_CV;600.000000000;100.0 +25/10/2020 02:06:20;U248.TI300.F_CV;12.600000381;100.0 +25/10/2020 02:06:23;U248.TI301.F_CV;13.100000381;100.0 +25/10/2020 02:06:42;U248.TI302.F_CV;13.399999619;100.0 +25/10/2020 02:06:42;U248.TI303.F_CV;13.699999809;100.0 +25/10/2020 02:06:42;U248.TI304.F_CV;14.100000381;100.0 +25/10/2020 02:06:09;U248.TI305.F_CV;14.600000381;100.0 +25/10/2020 02:06:52;U248.TI310.F_CV;12.800000191;100.0 +25/10/2020 02:06:19;U248.TI311.F_CV;12.399999619;100.0 +25/10/2020 02:06:20;U248.TI312.F_CV;12.500000000;100.0 +25/10/2020 02:06:03;U248.TI313.F_CV;12.399999619;100.0 +25/10/2020 02:06:10;U248.TI314.F_CV;13.500000000;100.0 +25/10/2020 02:06:19;U248.TI315.F_CV;13.899999619;100.0 +25/10/2020 02:06:42;U248.TI321.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U248.TI322A.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U248.TI322B.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U248.TI323.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U248.TI324A.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U248.TI324B.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U248.TI326.F_CV;600.000000000;100.0 +25/10/2020 02:06:33;U248.TI400.F_CV;14.399999619;100.0 +25/10/2020 02:06:28;U248.TI401.F_CV;14.100000381;100.0 +25/10/2020 02:06:32;U248.TI402.F_CV;14.199999809;100.0 +25/10/2020 02:06:21;U248.TI403.F_CV;14.300000191;100.0 +25/10/2020 02:06:19;U248.TI404.F_CV;14.500000000;100.0 +25/10/2020 02:06:39;U248.TI405.F_CV;14.800000191;100.0 +25/10/2020 02:06:00;U248.TI410.F_CV;13.800000191;100.0 +25/10/2020 02:06:40;U248.TI411.F_CV;13.399999619;100.0 +25/10/2020 02:06:26;U248.TI412.F_CV;13.500000000;100.0 +25/10/2020 02:06:41;U248.TI413.F_CV;13.500000000;100.0 +25/10/2020 02:06:48;U248.TI414.F_CV;14.500000000;100.0 +25/10/2020 02:06:50;U248.TI415.F_CV;14.699999809;100.0 +25/10/2020 02:06:42;U248.TI421.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U248.TI422A.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U248.TI422B.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U248.TI423.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U248.TI424A.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U248.TI424B.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U248.TI426.F_CV;600.000000000;100.0 +25/10/2020 02:06:13;U248.WI01.F_CV;-184.178009033;100.0 +25/10/2020 02:06:42;U248.WI01_BILAN.F_CV;193252.218750000;100.0 +25/10/2020 02:06:42;U248.WI01_D.F_CV;8600.691406250;100.0 +25/10/2020 02:06:59;U248.WI01_DEBIT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U248.WI01_F.F_CV;7607.234863281;100.0 +25/10/2020 02:06:42;U248.WI01_Q.F_CV;993.442382813;100.0 +25/10/2020 02:06:42;U248.WI01_TOT.F_CV;1606274.125000000;100.0 +25/10/2020 02:06:42;U248.WI02.F_CV;-3.399996758;100.0 +25/10/2020 02:06:42;U248.WI02_BILAN.F_CV;65669.796875000;100.0 +25/10/2020 02:06:42;U248.WI02_D.F_CV;352.518585205;100.0 +25/10/2020 02:06:42;U248.WI02_F.F_CV;1149.474487305;100.0 +25/10/2020 02:06:42;U248.WI02_Q.F_CV;796.908569336;100.0 +25/10/2020 02:06:42;U248.WI02_TOT.F_CV;1504201.125000000;100.0 +25/10/2020 02:06:53;U248.WI101.F_CV;197.500000000;100.0 +25/10/2020 02:06:18;U248.WI101_BILAN.F_CV;207476.390625000;100.0 +25/10/2020 02:06:42;U248.WI101_D.F_CV;3806.498535156;100.0 +25/10/2020 02:06:53;U248.WI101_DEBIT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U248.WI101_F.F_CV;2929.193847656;100.0 +25/10/2020 02:06:42;U248.WI101_Q.F_CV;990.816894531;100.0 +25/10/2020 02:06:02;U248.WI101_TOT.F_CV;1543004.625000000;100.0 +25/10/2020 02:06:42;U248.WI102.F_CV;9.780013084;100.0 +25/10/2020 02:06:42;U248.WI102_BILAN.F_CV;79297.968750000;100.0 +25/10/2020 02:06:42;U248.WI102_D.F_CV;359.664489746;100.0 +25/10/2020 02:06:42;U248.WI102_F.F_CV;1303.211059570;100.0 +25/10/2020 02:06:42;U248.WI102_Q.F_CV;946.878234863;100.0 +25/10/2020 02:06:42;U248.WI102_TOT.F_CV;916044.125000000;100.0 +25/10/2020 02:06:11;U248.WY01.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U248.WY101.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U248.Z04_COTEPREL.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U248.Z04_DIFFERE.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U248.Z04_IDXFL.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U248.Z04_IDXPRG.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U248.Z04_NBINJ.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U248.Z04_PRESHP.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U248.Z04_VOLFRACT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U248.Z04_VOLPREL.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.AI2.F_CV;0.798664153;100.0 +25/10/2020 02:06:00;U255.FC10_PV.F_CV;1.165771484;100.0 +25/10/2020 02:06:12;U255.FC10_PV.F_CV;0.000801682;100.0 +25/10/2020 02:06:18;U255.FC10_PV.F_CV;1.239013672;100.0 +25/10/2020 02:06:30;U255.FC10_PV.F_CV;0.004589558;100.0 +25/10/2020 02:06:36;U255.FC10_PV.F_CV;1.004028320;100.0 +25/10/2020 02:06:48;U255.FC10_PV.F_CV;0.002077222;100.0 +25/10/2020 02:06:09;U255.FC11_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:09;U255.FC15_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:09;U255.FC23_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.FC24_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.FC2_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U255.FC30_PV.F_CV;46.895832062;100.0 +25/10/2020 02:06:06;U255.FC30_PV.F_CV;49.525947571;100.0 +25/10/2020 02:06:11;U255.FC30_PV.F_CV;49.525947571;100.0 +25/10/2020 02:06:12;U255.FC30_PV.F_CV;53.719104767;100.0 +25/10/2020 02:06:17;U255.FC30_PV.F_CV;53.719104767;100.0 +25/10/2020 02:06:18;U255.FC30_PV.F_CV;49.585224152;100.0 +25/10/2020 02:06:29;U255.FC30_PV.F_CV;49.585224152;100.0 +25/10/2020 02:06:30;U255.FC30_PV.F_CV;47.443092346;100.0 +25/10/2020 02:06:53;U255.FC30_PV.F_CV;46.909244537;100.0 +25/10/2020 02:06:54;U255.FC30_PV.F_CV;49.584865570;100.0 +25/10/2020 02:06:09;U255.FC31_PV.F_CV;1000.000000000;100.0 +25/10/2020 02:06:09;U255.FI1.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U255.FI10.F_CV;1.165771484;100.0 +25/10/2020 02:06:12;U255.FI10.F_CV;0.000801682;100.0 +25/10/2020 02:06:18;U255.FI10.F_CV;1.321411133;100.0 +25/10/2020 02:06:42;U255.FI10.F_CV;0.003740191;100.0 +25/10/2020 02:06:48;U255.FI10.F_CV;1.028442383;100.0 +25/10/2020 02:06:54;U255.FI10.F_CV;0.005757809;100.0 +25/10/2020 02:06:09;U255.FI108.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.FI109.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.FI11.F_CV;0.000000000;0.0 +25/10/2020 02:06:09;U255.FI110.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.FI13.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.FI15.F_CV;0.000000000;0.0 +25/10/2020 02:06:09;U255.FI2.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.FI23.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.FI24.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U255.FI30.F_CV;46.843261719;100.0 +25/10/2020 02:06:06;U255.FI30.F_CV;49.525947571;100.0 +25/10/2020 02:06:11;U255.FI30.F_CV;49.525947571;100.0 +25/10/2020 02:06:12;U255.FI30.F_CV;53.719104767;100.0 +25/10/2020 02:06:17;U255.FI30.F_CV;53.719104767;100.0 +25/10/2020 02:06:18;U255.FI30.F_CV;49.609573364;100.0 +25/10/2020 02:06:29;U255.FI30.F_CV;49.609573364;100.0 +25/10/2020 02:06:30;U255.FI30.F_CV;47.488628387;100.0 +25/10/2020 02:06:47;U255.FI30.F_CV;46.809761047;100.0 +25/10/2020 02:06:48;U255.FI30.F_CV;48.973739624;100.0 +25/10/2020 02:06:48;U255.FI31.F_CV;1027.979980469;100.0 +25/10/2020 02:06:09;U255.FI35.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U255.FI36.F_CV;6.342250347;100.0 +25/10/2020 02:06:09;U255.FI5.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.FI5A.F_CV;0.000000000;0.0 +25/10/2020 02:06:09;U255.FI5B.F_CV;0.000000000;0.0 +25/10/2020 02:06:09;U255.FI5C.F_CV;0.000000000;0.0 +25/10/2020 02:06:09;U255.FI7.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.FQ108_PV.F_CV;8.900000572;100.0 +25/10/2020 02:06:35;U255.FQ109_PV.F_CV;20046.375000000;100.0 +25/10/2020 02:06:09;U255.LC10_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U255.LC14_PV.F_CV;48.985874176;100.0 +25/10/2020 02:06:00;U255.LC15_PV.F_CV;50.613742828;100.0 +25/10/2020 02:06:05;U255.LC15_PV.F_CV;50.613742828;100.0 +25/10/2020 02:06:06;U255.LC15_PV.F_CV;50.835140228;100.0 +25/10/2020 02:06:11;U255.LC15_PV.F_CV;50.835140228;100.0 +25/10/2020 02:06:12;U255.LC15_PV.F_CV;51.182441711;100.0 +25/10/2020 02:06:17;U255.LC15_PV.F_CV;51.182441711;100.0 +25/10/2020 02:06:18;U255.LC15_PV.F_CV;51.477611542;100.0 +25/10/2020 02:06:23;U255.LC15_PV.F_CV;51.477611542;100.0 +25/10/2020 02:06:24;U255.LC15_PV.F_CV;51.687641144;100.0 +25/10/2020 02:06:36;U255.LC15_PV.F_CV;51.820171356;100.0 +25/10/2020 02:06:54;U255.LC15_PV.F_CV;52.193801880;100.0 +25/10/2020 02:06:06;U255.LC1_PV.F_CV;50.155647278;100.0 +25/10/2020 02:06:18;U255.LC1_PV.F_CV;49.965919495;100.0 +25/10/2020 02:06:09;U255.LC5_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U255.LC7_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.LC8_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U255.LC9_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U255.LI1.F_CV;50.300060272;100.0 +25/10/2020 02:06:18;U255.LI1.F_CV;49.965919495;100.0 +25/10/2020 02:06:48;U255.LI1.F_CV;49.724464417;100.0 +25/10/2020 02:06:09;U255.LI10.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U255.LI2.F_CV;9.434499741;100.0 +25/10/2020 02:06:12;U255.LI2.F_CV;9.522117615;100.0 +25/10/2020 02:06:24;U255.LI2.F_CV;9.452920914;100.0 +25/10/2020 02:06:36;U255.LI2.F_CV;9.506234169;100.0 +25/10/2020 02:06:54;U255.LI2.F_CV;9.421538353;100.0 +25/10/2020 02:06:06;U255.LI3.F_CV;0.648751855;100.0 +25/10/2020 02:06:18;U255.LI3.F_CV;0.792944431;100.0 +25/10/2020 02:06:48;U255.LI3.F_CV;0.624978542;100.0 +25/10/2020 02:06:54;U255.LI3.F_CV;0.786939263;100.0 +25/10/2020 02:06:09;U255.LI5.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U255.LI7.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.LI8.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U255.LI9.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.PDI19.F_CV;0.021128953;100.0 +25/10/2020 02:06:09;U255.PDI5.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.PDI5B.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.PI18.F_CV;0.068199635;100.0 +25/10/2020 02:06:09;U255.PI28.F_CV;17.467451096;100.0 +25/10/2020 02:06:09;U255.PI39.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.PI50.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U255.PI64.F_CV;117.630279541;100.0 +25/10/2020 02:06:09;U255.TC104_OP.F_CV;66.649375916;100.0 +25/10/2020 02:06:09;U255.TC104_PV.F_CV;-20.000000000;100.0 +25/10/2020 02:06:09;U255.TC106_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC106_PV.F_CV;19.356994629;100.0 +25/10/2020 02:06:09;U255.TC107_OP.F_CV;17.000000000;100.0 +25/10/2020 02:06:09;U255.TC107_PV.F_CV;26.734035492;100.0 +25/10/2020 02:06:09;U255.TC109_OP.F_CV;20.000000000;100.0 +25/10/2020 02:06:09;U255.TC109_PV.F_CV;23.902784348;100.0 +25/10/2020 02:06:09;U255.TC10_OP.F_CV;6.000000000;100.0 +25/10/2020 02:06:09;U255.TC10_PV.F_CV;23.151124954;100.0 +25/10/2020 02:06:09;U255.TC110_OP.F_CV;10.000000000;100.0 +25/10/2020 02:06:09;U255.TC110_PV.F_CV;22.424518585;100.0 +25/10/2020 02:06:09;U255.TC112_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC112_PV.F_CV;23.050901413;100.0 +25/10/2020 02:06:09;U255.TC114_OP.F_CV;25.000000000;100.0 +25/10/2020 02:06:09;U255.TC114_PV.F_CV;22.925626755;100.0 +25/10/2020 02:06:09;U255.TC116_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC116_PV.F_CV;22.249132156;100.0 +25/10/2020 02:06:09;U255.TC117_OP.F_CV;10.000000000;100.0 +25/10/2020 02:06:09;U255.TC117_PV.F_CV;22.399465561;100.0 +25/10/2020 02:06:09;U255.TC118_OP.F_CV;10.000000000;100.0 +25/10/2020 02:06:09;U255.TC118_PV.F_CV;22.700128555;100.0 +25/10/2020 02:06:09;U255.TC11_OP.F_CV;10.000000000;100.0 +25/10/2020 02:06:09;U255.TC11_PV.F_CV;23.201234818;100.0 +25/10/2020 02:06:09;U255.TC120_OP.F_CV;10.000000000;100.0 +25/10/2020 02:06:09;U255.TC120_PV.F_CV;22.925626755;100.0 +25/10/2020 02:06:09;U255.TC123_OP.F_CV;10.000000000;100.0 +25/10/2020 02:06:09;U255.TC123_PV.F_CV;27.460641861;100.0 +25/10/2020 02:06:09;U255.TC125_OP.F_CV;15.000000000;100.0 +25/10/2020 02:06:09;U255.TC125_PV.F_CV;45.249923706;100.0 +25/10/2020 02:06:09;U255.TC128_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC128_PV.F_CV;11.240081787;100.0 +25/10/2020 02:06:09;U255.TC12_OP.F_CV;10.000000000;100.0 +25/10/2020 02:06:09;U255.TC12_PV.F_CV;22.925626755;100.0 +25/10/2020 02:06:09;U255.TC131_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC131_PV.F_CV;21.798135757;100.0 +25/10/2020 02:06:09;U255.TC13_OP.F_CV;5.000000000;100.0 +25/10/2020 02:06:09;U255.TC13_PV.F_CV;22.950681686;100.0 +25/10/2020 02:06:09;U255.TC15_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC15_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TC16_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC16_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TC17_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC17_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TC18_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC18_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TC190_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U255.TC190_PV.F_CV;27.861526489;100.0 +25/10/2020 02:06:09;U255.TC19_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC19_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TC20_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC20_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TC21_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC21_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TC22_OP.F_CV;6.000000000;100.0 +25/10/2020 02:06:09;U255.TC22_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TC31_OP.F_CV;12.000000000;100.0 +25/10/2020 02:06:09;U255.TC31_PV.F_CV;45.801143646;100.0 +25/10/2020 02:06:09;U255.TC32_OP.F_CV;6.000000000;100.0 +25/10/2020 02:06:09;U255.TC32_PV.F_CV;45.926418304;100.0 +25/10/2020 02:06:09;U255.TC34_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC34_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TC35_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC35_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TC36_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC36_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TC37_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC37_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TC38_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC38_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TC39_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC39_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TC3_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U255.TC3_PV.F_CV;25.280828476;100.0 +25/10/2020 02:06:09;U255.TC40_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC40_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TC41_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC41_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TC50_OP.F_CV;20.000000000;100.0 +25/10/2020 02:06:09;U255.TC50_PV.F_CV;22.574851990;100.0 +25/10/2020 02:06:09;U255.TC51_OP.F_CV;10.000000000;100.0 +25/10/2020 02:06:09;U255.TC51_PV.F_CV;22.524742126;100.0 +25/10/2020 02:06:09;U255.TC53_OP.F_CV;20.000000000;100.0 +25/10/2020 02:06:09;U255.TC53_PV.F_CV;20.219652176;100.0 +25/10/2020 02:06:09;U255.TC54_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC54_PV.F_CV;20.294816971;100.0 +25/10/2020 02:06:09;U255.TC55_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC55_PV.F_CV;20.094373703;100.0 +25/10/2020 02:06:09;U255.TC56_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC56_PV.F_CV;19.843820572;100.0 +25/10/2020 02:06:09;U255.TC57_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC57_PV.F_CV;19.518102646;100.0 +25/10/2020 02:06:09;U255.TC58_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC58_PV.F_CV;18.039836884;100.0 +25/10/2020 02:06:09;U255.TC59_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC59_PV.F_CV;19.042049408;100.0 +25/10/2020 02:06:09;U255.TC5_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC5_PV.F_CV;24.228504181;100.0 +25/10/2020 02:06:09;U255.TC60_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC60_PV.F_CV;18.791496277;100.0 +25/10/2020 02:06:09;U255.TC70_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC70_PV.F_CV;21.046476364;100.0 +25/10/2020 02:06:09;U255.TC72_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC72_PV.F_CV;21.221862793;100.0 +25/10/2020 02:06:09;U255.TC74_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC74_PV.F_CV;21.271974564;100.0 +25/10/2020 02:06:09;U255.TC76_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC76_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TC78_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC78_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TC80_OP.F_CV;20.000000000;100.0 +25/10/2020 02:06:46;U255.TC80_PV.F_CV;18.565999985;100.0 +25/10/2020 02:06:09;U255.TC81_OP.F_CV;20.000000000;100.0 +25/10/2020 02:06:09;U255.TC81_PV.F_CV;19.092161179;100.0 +25/10/2020 02:06:09;U255.TC82_OP.F_CV;20.000000000;100.0 +25/10/2020 02:06:09;U255.TC82_PV.F_CV;19.142271042;100.0 +25/10/2020 02:06:09;U255.TC83_OP.F_CV;20.000000000;100.0 +25/10/2020 02:06:09;U255.TC83_PV.F_CV;19.192380905;100.0 +25/10/2020 02:06:09;U255.TC84_OP.F_CV;30.000000000;100.0 +25/10/2020 02:06:09;U255.TC84_PV.F_CV;19.167327881;100.0 +25/10/2020 02:06:09;U255.TC85_OP.F_CV;15.000000000;100.0 +25/10/2020 02:06:09;U255.TC85_PV.F_CV;19.317657471;100.0 +25/10/2020 02:06:09;U255.TC8_OP.F_CV;10.000000000;100.0 +25/10/2020 02:06:09;U255.TC8_PV.F_CV;22.574851990;100.0 +25/10/2020 02:06:09;U255.TC95_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.TC95_PV.F_CV;100.000000000;100.0 +25/10/2020 02:06:09;U255.TC9_OP.F_CV;10.000000000;100.0 +25/10/2020 02:06:09;U255.TC9_PV.F_CV;22.800350189;100.0 +25/10/2020 02:06:09;U255.TI1.F_CV;22.449575424;100.0 +25/10/2020 02:06:09;U255.TI10.F_CV;23.151124954;100.0 +25/10/2020 02:06:35;U255.TI101.F_CV;1065.077026367;100.0 +25/10/2020 02:06:35;U255.TI102.F_CV;1065.227416992;100.0 +25/10/2020 02:06:09;U255.TI103.F_CV;28.112081528;100.0 +25/10/2020 02:06:09;U255.TI104.F_CV;-260.000000000;100.0 +25/10/2020 02:06:09;U255.TI105.F_CV;70.305252075;100.0 +25/10/2020 02:06:09;U255.TI106.F_CV;19.356994629;100.0 +25/10/2020 02:06:09;U255.TI107.F_CV;26.734035492;100.0 +25/10/2020 02:06:09;U255.TI108.F_CV;25.305881500;100.0 +25/10/2020 02:06:09;U255.TI109.F_CV;23.902784348;100.0 +25/10/2020 02:06:09;U255.TI11.F_CV;23.201234818;100.0 +25/10/2020 02:06:09;U255.TI110.F_CV;22.424518585;100.0 +25/10/2020 02:06:09;U255.TI111.F_CV;23.526954651;100.0 +25/10/2020 02:06:09;U255.TI112.F_CV;23.050901413;100.0 +25/10/2020 02:06:09;U255.TI113.F_CV;23.727397919;100.0 +25/10/2020 02:06:09;U255.TI114.F_CV;22.925626755;100.0 +25/10/2020 02:06:09;U255.TI115.F_CV;23.702341080;100.0 +25/10/2020 02:06:09;U255.TI116.F_CV;22.249132156;100.0 +25/10/2020 02:06:09;U255.TI117.F_CV;22.399465561;100.0 +25/10/2020 02:06:09;U255.TI118.F_CV;22.700128555;100.0 +25/10/2020 02:06:09;U255.TI12.F_CV;22.925626755;100.0 +25/10/2020 02:06:09;U255.TI120.F_CV;22.925626755;100.0 +25/10/2020 02:06:09;U255.TI121.F_CV;60.182899475;100.0 +25/10/2020 02:06:09;U255.TI122.F_CV;23.652231216;100.0 +25/10/2020 02:06:09;U255.TI123.F_CV;27.460641861;100.0 +25/10/2020 02:06:09;U255.TI124.F_CV;24.378833771;100.0 +25/10/2020 02:06:09;U255.TI125.F_CV;45.249923706;100.0 +25/10/2020 02:06:09;U255.TI128.F_CV;11.240081787;100.0 +25/10/2020 02:06:09;U255.TI13.F_CV;22.950681686;100.0 +25/10/2020 02:06:09;U255.TI130.F_CV;22.449575424;100.0 +25/10/2020 02:06:09;U255.TI131.F_CV;21.798135757;100.0 +25/10/2020 02:06:09;U255.TI133.F_CV;1070.488891602;100.0 +25/10/2020 02:06:35;U255.TI134.F_CV;86.541107178;100.0 +25/10/2020 02:06:09;U255.TI135.F_CV;14.231426239;100.0 +25/10/2020 02:06:35;U255.TI136.F_CV;20.670646667;100.0 +25/10/2020 02:06:09;U255.TI137.F_CV;-269.993957520;100.0 +25/10/2020 02:06:35;U255.TI138.F_CV;1065.678344727;100.0 +25/10/2020 02:06:09;U255.TI139.F_CV;22.449386597;100.0 +25/10/2020 02:06:09;U255.TI14.F_CV;23.151124954;100.0 +25/10/2020 02:06:09;U255.TI15.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TI153.F_CV;-269.993957520;100.0 +25/10/2020 02:06:09;U255.TI154.F_CV;25.907211304;100.0 +25/10/2020 02:06:09;U255.TI16.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TI17.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TI18.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TI180.F_CV;19.493045807;100.0 +25/10/2020 02:06:09;U255.TI181.F_CV;-269.996246338;100.0 +25/10/2020 02:06:09;U255.TI182.F_CV;18.265335083;100.0 +25/10/2020 02:06:09;U255.TI19.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TI190.F_CV;27.911636353;100.0 +25/10/2020 02:06:09;U255.TI2.F_CV;1063.323120117;100.0 +25/10/2020 02:06:09;U255.TI20.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TI21.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TI22.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TI223.F_CV;21.848245621;100.0 +25/10/2020 02:06:09;U255.TI224.F_CV;22.148910522;100.0 +25/10/2020 02:06:09;U255.TI225.F_CV;22.199020386;100.0 +25/10/2020 02:06:09;U255.TI226.F_CV;21.697916031;100.0 +25/10/2020 02:06:09;U255.TI227.F_CV;21.848245621;100.0 +25/10/2020 02:06:09;U255.TI228.F_CV;21.748025894;100.0 +25/10/2020 02:06:09;U255.TI229.F_CV;21.121643066;100.0 +25/10/2020 02:06:09;U255.TI23.F_CV;20.445148468;100.0 +25/10/2020 02:06:09;U255.TI230.F_CV;20.871088028;100.0 +25/10/2020 02:06:09;U255.TI24.F_CV;20.294816971;100.0 +25/10/2020 02:06:09;U255.TI242.F_CV;21.923412323;100.0 +25/10/2020 02:06:09;U255.TI243.F_CV;21.898357391;100.0 +25/10/2020 02:06:09;U255.TI244.F_CV;21.823192596;100.0 +25/10/2020 02:06:09;U255.TI245.F_CV;21.572637558;100.0 +25/10/2020 02:06:09;U255.TI246.F_CV;21.322084427;100.0 +25/10/2020 02:06:09;U255.TI247.F_CV;21.322084427;100.0 +25/10/2020 02:06:09;U255.TI248.F_CV;20.896144867;100.0 +25/10/2020 02:06:09;U255.TI249.F_CV;20.194595337;100.0 +25/10/2020 02:06:09;U255.TI25.F_CV;20.344926834;100.0 +25/10/2020 02:06:09;U255.TI26.F_CV;20.244705200;100.0 +25/10/2020 02:06:09;U255.TI261.F_CV;21.748025894;100.0 +25/10/2020 02:06:09;U255.TI262.F_CV;21.748025894;100.0 +25/10/2020 02:06:09;U255.TI263.F_CV;21.472417831;100.0 +25/10/2020 02:06:09;U255.TI264.F_CV;21.196809769;100.0 +25/10/2020 02:06:09;U255.TI265.F_CV;21.271974564;100.0 +25/10/2020 02:06:09;U255.TI266.F_CV;21.021421432;100.0 +25/10/2020 02:06:09;U255.TI267.F_CV;21.046476364;100.0 +25/10/2020 02:06:09;U255.TI268.F_CV;20.871088028;100.0 +25/10/2020 02:06:09;U255.TI27.F_CV;19.868877411;100.0 +25/10/2020 02:06:25;U255.TI28.F_CV;1068.634887695;100.0 +25/10/2020 02:06:46;U255.TI29.F_CV;19.668432236;100.0 +25/10/2020 02:06:09;U255.TI3.F_CV;25.330938339;100.0 +25/10/2020 02:06:46;U255.TI30.F_CV;18.966882706;100.0 +25/10/2020 02:06:09;U255.TI31.F_CV;45.801143646;100.0 +25/10/2020 02:06:09;U255.TI32.F_CV;45.926418304;100.0 +25/10/2020 02:06:09;U255.TI33.F_CV;45.124649048;100.0 +25/10/2020 02:06:09;U255.TI34.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TI35.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TI36.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TI37.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TI38.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TI39.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TI4.F_CV;25.681713104;100.0 +25/10/2020 02:06:09;U255.TI40.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TI41.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TI42.F_CV;20.545370102;100.0 +25/10/2020 02:06:09;U255.TI43.F_CV;20.420093536;100.0 +25/10/2020 02:06:09;U255.TI44.F_CV;20.194595337;100.0 +25/10/2020 02:06:09;U255.TI45.F_CV;20.169538498;100.0 +25/10/2020 02:06:09;U255.TI46.F_CV;19.918987274;100.0 +25/10/2020 02:06:09;U255.TI47.F_CV;19.718544006;100.0 +25/10/2020 02:06:09;U255.TI48.F_CV;19.317657471;100.0 +25/10/2020 02:06:09;U255.TI49.F_CV;19.042049408;100.0 +25/10/2020 02:06:09;U255.TI5.F_CV;24.228504181;100.0 +25/10/2020 02:06:09;U255.TI50.F_CV;22.624961853;100.0 +25/10/2020 02:06:09;U255.TI51.F_CV;22.524742126;100.0 +25/10/2020 02:06:09;U255.TI52.F_CV;21.422307968;100.0 +25/10/2020 02:06:09;U255.TI53.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TI54.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TI55.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TI56.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TI57.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TI58.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TI59.F_CV;600.000000000;100.0 +25/10/2020 02:06:09;U255.TI6.F_CV;26.132709503;100.0 +25/10/2020 02:06:09;U255.TI60.F_CV;22.700128555;100.0 +25/10/2020 02:06:09;U255.TI61.F_CV;20.219652176;100.0 +25/10/2020 02:06:09;U255.TI62.F_CV;20.294816971;100.0 +25/10/2020 02:06:09;U255.TI63.F_CV;20.094373703;100.0 +25/10/2020 02:06:09;U255.TI64.F_CV;19.843820572;100.0 +25/10/2020 02:06:09;U255.TI65.F_CV;19.518102646;100.0 +25/10/2020 02:06:09;U255.TI66.F_CV;18.039836884;100.0 +25/10/2020 02:06:09;U255.TI67.F_CV;19.042049408;100.0 +25/10/2020 02:06:09;U255.TI68.F_CV;18.791496277;100.0 +25/10/2020 02:06:35;U255.TI69.F_CV;1075.099121094;100.0 +25/10/2020 02:06:09;U255.TI7.F_CV;20.094373703;100.0 +25/10/2020 02:06:09;U255.TI70.F_CV;21.046476364;100.0 +25/10/2020 02:06:09;U255.TI71.F_CV;21.622749329;100.0 +25/10/2020 02:06:09;U255.TI72.F_CV;21.221862793;100.0 +25/10/2020 02:06:09;U255.TI73.F_CV;21.672859192;100.0 +25/10/2020 02:06:09;U255.TI74.F_CV;21.271974564;100.0 +25/10/2020 02:06:09;U255.TI75.F_CV;21.472417831;100.0 +25/10/2020 02:06:09;U255.TI76.F_CV;1064.049804688;100.0 +25/10/2020 02:06:09;U255.TI77.F_CV;21.672859192;100.0 +25/10/2020 02:06:09;U255.TI78.F_CV;1063.473510742;100.0 +25/10/2020 02:06:09;U255.TI79.F_CV;19.167327881;100.0 +25/10/2020 02:06:09;U255.TI8.F_CV;22.599906921;100.0 +25/10/2020 02:06:09;U255.TI80.F_CV;1084.394653320;100.0 +25/10/2020 02:06:09;U255.TI81.F_CV;1084.570068359;100.0 +25/10/2020 02:06:09;U255.TI82.F_CV;1084.745483398;100.0 +25/10/2020 02:06:09;U255.TI83.F_CV;1084.745483398;100.0 +25/10/2020 02:06:09;U255.TI84.F_CV;1084.996093750;100.0 +25/10/2020 02:06:09;U255.TI85.F_CV;1084.695312500;100.0 +25/10/2020 02:06:09;U255.TI86.F_CV;18.540945053;100.0 +25/10/2020 02:06:09;U255.TI87.F_CV;19.092161179;100.0 +25/10/2020 02:06:09;U255.TI88.F_CV;19.142271042;100.0 +25/10/2020 02:06:09;U255.TI89.F_CV;19.192380905;100.0 +25/10/2020 02:06:09;U255.TI9.F_CV;22.825405121;100.0 +25/10/2020 02:06:09;U255.TI90.F_CV;19.167327881;100.0 +25/10/2020 02:06:09;U255.TI91.F_CV;19.317657471;100.0 +25/10/2020 02:06:09;U255.TI93.F_CV;-269.996246338;100.0 +25/10/2020 02:06:09;U255.TI95.F_CV;1071.541259766;100.0 +25/10/2020 02:06:09;U255.TI96A.F_CV;18.440721512;100.0 +25/10/2020 02:06:48;U255.TI96B.F_CV;19.342714310;100.0 +25/10/2020 02:06:09;U255.TI97.F_CV;44.573432922;100.0 +25/10/2020 02:06:09;U255.TI98.F_CV;20.369983673;100.0 +25/10/2020 02:06:09;U255.U255_COEF_A_TI15.F_CV;1.000399947;100.0 +25/10/2020 02:06:09;U255.U255_COEF_A_TI16.F_CV;0.997700036;100.0 +25/10/2020 02:06:09;U255.U255_COEF_A_TI17.F_CV;0.999100089;100.0 +25/10/2020 02:06:09;U255.U255_COEF_A_TI18.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U255.U255_COEF_A_TI19.F_CV;0.994000018;100.0 +25/10/2020 02:06:09;U255.U255_COEF_A_TI20.F_CV;0.992000043;100.0 +25/10/2020 02:06:09;U255.U255_COEF_A_TI21.F_CV;1.001099944;100.0 +25/10/2020 02:06:09;U255.U255_COEF_A_TI22.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U255.U255_COEF_A_TI34.F_CV;0.994100034;100.0 +25/10/2020 02:06:09;U255.U255_COEF_A_TI35.F_CV;0.991100073;100.0 +25/10/2020 02:06:09;U255.U255_COEF_A_TI36.F_CV;0.989900053;100.0 +25/10/2020 02:06:09;U255.U255_COEF_A_TI37.F_CV;1.001199961;100.0 +25/10/2020 02:06:09;U255.U255_COEF_A_TI38.F_CV;0.998400033;100.0 +25/10/2020 02:06:09;U255.U255_COEF_A_TI39.F_CV;0.998500049;100.0 +25/10/2020 02:06:09;U255.U255_COEF_A_TI40.F_CV;0.996000051;100.0 +25/10/2020 02:06:09;U255.U255_COEF_A_TI41.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U255.U255_COEF_A_TI53.F_CV;0.996100068;100.0 +25/10/2020 02:06:09;U255.U255_COEF_A_TI54.F_CV;0.995700061;100.0 +25/10/2020 02:06:09;U255.U255_COEF_A_TI55.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U255.U255_COEF_A_TI56.F_CV;0.995500088;100.0 +25/10/2020 02:06:09;U255.U255_COEF_A_TI57.F_CV;0.992900074;100.0 +25/10/2020 02:06:09;U255.U255_COEF_A_TI58.F_CV;0.995200038;100.0 +25/10/2020 02:06:09;U255.U255_COEF_A_TI59.F_CV;0.996500075;100.0 +25/10/2020 02:06:09;U255.U255_COEF_A_TI60.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U255.U255_COEF_B_TI15.F_CV;-2.366899967;100.0 +25/10/2020 02:06:09;U255.U255_COEF_B_TI16.F_CV;-1.659600019;100.0 +25/10/2020 02:06:09;U255.U255_COEF_B_TI17.F_CV;-2.213200092;100.0 +25/10/2020 02:06:09;U255.U255_COEF_B_TI18.F_CV;-2.347000122;100.0 +25/10/2020 02:06:09;U255.U255_COEF_B_TI19.F_CV;-0.289800018;100.0 +25/10/2020 02:06:09;U255.U255_COEF_B_TI20.F_CV;2.351700068;100.0 +25/10/2020 02:06:09;U255.U255_COEF_B_TI21.F_CV;-2.785099983;100.0 +25/10/2020 02:06:09;U255.U255_COEF_B_TI22.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.U255_COEF_B_TI34.F_CV;1.232400060;100.0 +25/10/2020 02:06:09;U255.U255_COEF_B_TI35.F_CV;2.105600119;100.0 +25/10/2020 02:06:09;U255.U255_COEF_B_TI36.F_CV;2.995000124;100.0 +25/10/2020 02:06:09;U255.U255_COEF_B_TI37.F_CV;-1.698500037;100.0 +25/10/2020 02:06:09;U255.U255_COEF_B_TI38.F_CV;-0.171900004;100.0 +25/10/2020 02:06:09;U255.U255_COEF_B_TI39.F_CV;-0.113800004;100.0 +25/10/2020 02:06:09;U255.U255_COEF_B_TI40.F_CV;0.473000020;100.0 +25/10/2020 02:06:09;U255.U255_COEF_B_TI41.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.U255_COEF_B_TI53.F_CV;-2.388499975;100.0 +25/10/2020 02:06:09;U255.U255_COEF_B_TI54.F_CV;-2.095999956;100.0 +25/10/2020 02:06:09;U255.U255_COEF_B_TI55.F_CV;-2.772599936;100.0 +25/10/2020 02:06:09;U255.U255_COEF_B_TI56.F_CV;-1.831300020;100.0 +25/10/2020 02:06:09;U255.U255_COEF_B_TI57.F_CV;-1.117300034;100.0 +25/10/2020 02:06:09;U255.U255_COEF_B_TI58.F_CV;-2.205300093;100.0 +25/10/2020 02:06:09;U255.U255_COEF_B_TI59.F_CV;-2.420099974;100.0 +25/10/2020 02:06:09;U255.U255_COEF_B_TI60.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U255.WI2.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U255.WI3.F_CV;9.840000153;100.0 +25/10/2020 02:06:30;U255.WI3.F_CV;9.860000610;100.0 +25/10/2020 02:06:35;U255.WI3.F_CV;9.860000610;100.0 +25/10/2020 02:06:36;U255.WI3.F_CV;9.840000153;100.0 +25/10/2020 02:06:59;U255.WI3.F_CV;9.840000153;100.0 +25/10/2020 02:06:06;U255.WI4.F_CV;0.059999999;100.0 +25/10/2020 02:06:17;U255.WI5.F_CV;0.120000005;100.0 +25/10/2020 02:06:18;U255.WI5.F_CV;0.129999995;100.0 +25/10/2020 02:06:23;U255.WI5.F_CV;0.129999995;100.0 +25/10/2020 02:06:24;U255.WI5.F_CV;0.120000005;100.0 +25/10/2020 02:06:56;U268.AI02A_PV.F_CV;0.032903638;100.0 +25/10/2020 02:06:45;U268.AI02B_PV.F_CV;-0.016004514;100.0 +25/10/2020 02:06:00;U268.AI03_PV.F_CV;144.666732788;100.0 +25/10/2020 02:06:01;U268.AI03_PV.F_CV;52.439155579;100.0 +25/10/2020 02:06:02;U268.AI03_PV.F_CV;17.140336990;100.0 +25/10/2020 02:06:03;U268.AI03_PV.F_CV;6.278063774;100.0 +25/10/2020 02:06:04;U268.AI03_PV.F_CV;4.481247902;100.0 +25/10/2020 02:06:05;U268.AI03_PV.F_CV;4.093404770;100.0 +25/10/2020 02:06:06;U268.AI03_PV.F_CV;3.107714891;100.0 +25/10/2020 02:06:07;U268.AI03_PV.F_CV;0.540235996;100.0 +25/10/2020 02:06:08;U268.AI03_PV.F_CV;3.378574848;100.0 +25/10/2020 02:06:09;U268.AI03_PV.F_CV;1.545443296;100.0 +25/10/2020 02:06:11;U268.AI03_PV.F_CV;4.405270576;100.0 +25/10/2020 02:06:12;U268.AI03_PV.F_CV;2.039595127;100.0 +25/10/2020 02:06:13;U268.AI03_PV.F_CV;1.714680433;100.0 +25/10/2020 02:06:14;U268.AI03_PV.F_CV;4.810102463;100.0 +25/10/2020 02:06:15;U268.AI03_PV.F_CV;1.701856375;100.0 +25/10/2020 02:06:16;U268.AI03_PV.F_CV;3.895328522;100.0 +25/10/2020 02:06:17;U268.AI03_PV.F_CV;11.923187256;100.0 +25/10/2020 02:06:18;U268.AI03_PV.F_CV;2.963998079;100.0 +25/10/2020 02:06:19;U268.AI03_PV.F_CV;9.130338669;100.0 +25/10/2020 02:06:20;U268.AI03_PV.F_CV;13.957673073;100.0 +25/10/2020 02:06:21;U268.AI03_PV.F_CV;10.997440338;100.0 +25/10/2020 02:06:22;U268.AI03_PV.F_CV;8.949267387;100.0 +25/10/2020 02:06:23;U268.AI03_PV.F_CV;11.999657631;100.0 +25/10/2020 02:06:24;U268.AI03_PV.F_CV;6.877639771;100.0 +25/10/2020 02:06:25;U268.AI03_PV.F_CV;2.472066879;100.0 +25/10/2020 02:06:26;U268.AI03_PV.F_CV;4.993707180;100.0 +25/10/2020 02:06:27;U268.AI03_PV.F_CV;3.242468119;100.0 +25/10/2020 02:06:28;U268.AI03_PV.F_CV;2.019627810;100.0 +25/10/2020 02:06:29;U268.AI03_PV.F_CV;4.293005466;100.0 +25/10/2020 02:06:30;U268.AI03_PV.F_CV;7.085097790;100.0 +25/10/2020 02:06:31;U268.AI03_PV.F_CV;4.725572586;100.0 +25/10/2020 02:06:32;U268.AI03_PV.F_CV;6.748719692;100.0 +25/10/2020 02:06:33;U268.AI03_PV.F_CV;8.644066811;100.0 +25/10/2020 02:06:34;U268.AI03_PV.F_CV;8.869031906;100.0 +25/10/2020 02:06:35;U268.AI03_PV.F_CV;15.247168541;100.0 +25/10/2020 02:06:36;U268.AI03_PV.F_CV;13.100098610;100.0 +25/10/2020 02:06:37;U268.AI03_PV.F_CV;5.114842415;100.0 +25/10/2020 02:06:38;U268.AI03_PV.F_CV;16.746582031;100.0 +25/10/2020 02:06:39;U268.AI03_PV.F_CV;442.714599609;100.0 +25/10/2020 02:06:40;U268.AI03_PV.F_CV;146.020034790;100.0 +25/10/2020 02:06:41;U268.AI03_PV.F_CV;41.574821472;100.0 +25/10/2020 02:06:42;U268.AI03_PV.F_CV;16.710828781;100.0 +25/10/2020 02:06:43;U268.AI03_PV.F_CV;7.091260433;100.0 +25/10/2020 02:06:44;U268.AI03_PV.F_CV;4.268812180;100.0 +25/10/2020 02:06:45;U268.AI03_PV.F_CV;3.472048044;100.0 +25/10/2020 02:06:46;U268.AI03_PV.F_CV;6.561139107;100.0 +25/10/2020 02:06:47;U268.AI03_PV.F_CV;7.803405762;100.0 +25/10/2020 02:06:48;U268.AI03_PV.F_CV;6.961456299;100.0 +25/10/2020 02:06:49;U268.AI03_PV.F_CV;2.810788155;100.0 +25/10/2020 02:06:50;U268.AI03_PV.F_CV;1.788208961;100.0 +25/10/2020 02:06:51;U268.AI03_PV.F_CV;4.324716091;100.0 +25/10/2020 02:06:52;U268.AI03_PV.F_CV;1.574414968;100.0 +25/10/2020 02:06:53;U268.AI03_PV.F_CV;7.051666260;100.0 +25/10/2020 02:06:54;U268.AI03_PV.F_CV;1.850244045;100.0 +25/10/2020 02:06:55;U268.AI03_PV.F_CV;3.336309910;100.0 +25/10/2020 02:06:56;U268.AI03_PV.F_CV;4.139509678;100.0 +25/10/2020 02:06:57;U268.AI03_PV.F_CV;0.813914657;100.0 +25/10/2020 02:06:58;U268.AI03_PV.F_CV;8.406578064;100.0 +25/10/2020 02:06:59;U268.AI03_PV.F_CV;10.537688255;100.0 +25/10/2020 02:06:00;U268.FC01_PV.F_CV;15.021111488;100.0 +25/10/2020 02:06:03;U268.FC01_PV.F_CV;14.928038597;100.0 +25/10/2020 02:06:06;U268.FC01_PV.F_CV;14.996797562;100.0 +25/10/2020 02:06:10;U268.FC01_PV.F_CV;14.979000092;100.0 +25/10/2020 02:06:15;U268.FC01_PV.F_CV;15.021012306;100.0 +25/10/2020 02:06:17;U268.FC01_PV.F_CV;14.996864319;100.0 +25/10/2020 02:06:20;U268.FC01_PV.F_CV;15.012661934;100.0 +25/10/2020 02:06:30;U268.FC01_PV.F_CV;14.977929115;100.0 +25/10/2020 02:06:43;U268.FC01_PV.F_CV;15.011919975;100.0 +25/10/2020 02:06:45;U268.FC01_PV.F_CV;14.982831955;100.0 +25/10/2020 02:06:49;U268.FC01_PV.F_CV;14.999279022;100.0 +25/10/2020 02:06:50;U268.FC01_PV.F_CV;15.023757935;100.0 +25/10/2020 02:06:52;U268.FC01_PV.F_CV;15.008165359;100.0 +25/10/2020 02:06:55;U268.FC01_PV.F_CV;15.026103973;100.0 +25/10/2020 02:06:45;U268.FC01_SP.F_CV;15.000000000;100.0 +25/10/2020 02:06:45;U268.FC02_CoefA.F_CV;0.991900027;100.0 +25/10/2020 02:06:45;U268.FC02_CoefB.F_CV;0.641799986;100.0 +25/10/2020 02:06:19;U268.FC05_PV.F_CV;5.000026703;100.0 +25/10/2020 02:06:45;U268.FC05_SP.F_CV;5.000000000;100.0 +25/10/2020 02:06:00;U268.FC06_PV.F_CV;15.623332977;100.0 +25/10/2020 02:06:01;U268.FC06_PV.F_CV;15.006567955;100.0 +25/10/2020 02:06:02;U268.FC06_PV.F_CV;15.164831161;100.0 +25/10/2020 02:06:03;U268.FC06_PV.F_CV;15.079420090;100.0 +25/10/2020 02:06:04;U268.FC06_PV.F_CV;15.215758324;100.0 +25/10/2020 02:06:05;U268.FC06_PV.F_CV;13.763680458;100.0 +25/10/2020 02:06:06;U268.FC06_PV.F_CV;15.247757912;100.0 +25/10/2020 02:06:07;U268.FC06_PV.F_CV;15.136075974;100.0 +25/10/2020 02:06:08;U268.FC06_PV.F_CV;15.565510750;100.0 +25/10/2020 02:06:09;U268.FC06_PV.F_CV;15.067498207;100.0 +25/10/2020 02:06:10;U268.FC06_PV.F_CV;14.688320160;100.0 +25/10/2020 02:06:12;U268.FC06_PV.F_CV;15.297895432;100.0 +25/10/2020 02:06:13;U268.FC06_PV.F_CV;14.177497864;100.0 +25/10/2020 02:06:14;U268.FC06_PV.F_CV;14.959757805;100.0 +25/10/2020 02:06:15;U268.FC06_PV.F_CV;15.091779709;100.0 +25/10/2020 02:06:16;U268.FC06_PV.F_CV;14.931303978;100.0 +25/10/2020 02:06:17;U268.FC06_PV.F_CV;15.311469078;100.0 +25/10/2020 02:06:18;U268.FC06_PV.F_CV;15.292847633;100.0 +25/10/2020 02:06:19;U268.FC06_PV.F_CV;15.520718575;100.0 +25/10/2020 02:06:20;U268.FC06_PV.F_CV;15.221310616;100.0 +25/10/2020 02:06:21;U268.FC06_PV.F_CV;15.020156860;100.0 +25/10/2020 02:06:22;U268.FC06_PV.F_CV;15.002473831;100.0 +25/10/2020 02:06:23;U268.FC06_PV.F_CV;15.073725700;100.0 +25/10/2020 02:06:24;U268.FC06_PV.F_CV;15.233407974;100.0 +25/10/2020 02:06:25;U268.FC06_PV.F_CV;14.392866135;100.0 +25/10/2020 02:06:26;U268.FC06_PV.F_CV;14.813297272;100.0 +25/10/2020 02:06:27;U268.FC06_PV.F_CV;15.133460045;100.0 +25/10/2020 02:06:29;U268.FC06_PV.F_CV;15.034451485;100.0 +25/10/2020 02:06:30;U268.FC06_PV.F_CV;14.673628807;100.0 +25/10/2020 02:06:31;U268.FC06_PV.F_CV;14.966736794;100.0 +25/10/2020 02:06:32;U268.FC06_PV.F_CV;14.570908546;100.0 +25/10/2020 02:06:33;U268.FC06_PV.F_CV;15.423668861;100.0 +25/10/2020 02:06:34;U268.FC06_PV.F_CV;15.232505798;100.0 +25/10/2020 02:06:37;U268.FC06_PV.F_CV;14.754304886;100.0 +25/10/2020 02:06:38;U268.FC06_PV.F_CV;14.962451935;100.0 +25/10/2020 02:06:39;U268.FC06_PV.F_CV;14.816218376;100.0 +25/10/2020 02:06:40;U268.FC06_PV.F_CV;15.200041771;100.0 +25/10/2020 02:06:41;U268.FC06_PV.F_CV;13.974626541;100.0 +25/10/2020 02:06:42;U268.FC06_PV.F_CV;15.115567207;100.0 +25/10/2020 02:06:43;U268.FC06_PV.F_CV;15.083917618;100.0 +25/10/2020 02:06:44;U268.FC06_PV.F_CV;15.237184525;100.0 +25/10/2020 02:06:45;U268.FC06_PV.F_CV;15.205218315;100.0 +25/10/2020 02:06:46;U268.FC06_PV.F_CV;15.399582863;100.0 +25/10/2020 02:06:47;U268.FC06_PV.F_CV;14.893344879;100.0 +25/10/2020 02:06:48;U268.FC06_PV.F_CV;14.183014870;100.0 +25/10/2020 02:06:49;U268.FC06_PV.F_CV;15.059356689;100.0 +25/10/2020 02:06:51;U268.FC06_PV.F_CV;15.215906143;100.0 +25/10/2020 02:06:52;U268.FC06_PV.F_CV;15.125046730;100.0 +25/10/2020 02:06:53;U268.FC06_PV.F_CV;14.397162437;100.0 +25/10/2020 02:06:54;U268.FC06_PV.F_CV;15.040636063;100.0 +25/10/2020 02:06:55;U268.FC06_PV.F_CV;15.097632408;100.0 +25/10/2020 02:06:56;U268.FC06_PV.F_CV;14.951573372;100.0 +25/10/2020 02:06:57;U268.FC06_PV.F_CV;14.907258034;100.0 +25/10/2020 02:06:58;U268.FC06_PV.F_CV;15.258907318;100.0 +25/10/2020 02:06:59;U268.FC06_PV.F_CV;15.138793945;100.0 +25/10/2020 02:06:45;U268.FC06_SP.F_CV;15.000000000;100.0 +25/10/2020 02:06:18;U268.FC12_PV.F_CV;0.147100002;100.0 +25/10/2020 02:06:45;U268.FC12_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U268.FC22_CoefA.F_CV;1.121899962;100.0 +25/10/2020 02:06:45;U268.FC22_CoefB.F_CV;0.200700000;100.0 +25/10/2020 02:06:45;U268.FC22_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U268.FC22_PV.F_CV;0.207699239;100.0 +25/10/2020 02:06:45;U268.FC22_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U268.FC30_PV.F_CV;-0.147481486;100.0 +25/10/2020 02:06:03;U268.FC30_PV.F_CV;-0.122768775;100.0 +25/10/2020 02:06:04;U268.FC30_PV.F_CV;0.027263321;100.0 +25/10/2020 02:06:05;U268.FC30_PV.F_CV;0.101387046;100.0 +25/10/2020 02:06:06;U268.FC30_PV.F_CV;0.228458911;100.0 +25/10/2020 02:06:07;U268.FC30_PV.F_CV;0.084483013;100.0 +25/10/2020 02:06:09;U268.FC30_PV.F_CV;0.012591008;100.0 +25/10/2020 02:06:11;U268.FC30_PV.F_CV;0.113713250;100.0 +25/10/2020 02:06:12;U268.FC30_PV.F_CV;0.151824474;100.0 +25/10/2020 02:06:13;U268.FC30_PV.F_CV;0.019626241;100.0 +25/10/2020 02:06:14;U268.FC30_PV.F_CV;-0.169230267;100.0 +25/10/2020 02:06:15;U268.FC30_PV.F_CV;-0.067585975;100.0 +25/10/2020 02:06:16;U268.FC30_PV.F_CV;0.122615427;100.0 +25/10/2020 02:06:17;U268.FC30_PV.F_CV;0.159618825;100.0 +25/10/2020 02:06:18;U268.FC30_PV.F_CV;0.053481694;100.0 +25/10/2020 02:06:20;U268.FC30_PV.F_CV;-0.055346735;100.0 +25/10/2020 02:06:22;U268.FC30_PV.F_CV;0.023673801;100.0 +25/10/2020 02:06:23;U268.FC30_PV.F_CV;0.039024629;100.0 +25/10/2020 02:06:24;U268.FC30_PV.F_CV;-0.058655612;100.0 +25/10/2020 02:06:25;U268.FC30_PV.F_CV;0.067524120;100.0 +25/10/2020 02:06:26;U268.FC30_PV.F_CV;-0.033204496;100.0 +25/10/2020 02:06:27;U268.FC30_PV.F_CV;-0.070463449;100.0 +25/10/2020 02:06:28;U268.FC30_PV.F_CV;-0.029497460;100.0 +25/10/2020 02:06:29;U268.FC30_PV.F_CV;0.116019867;100.0 +25/10/2020 02:06:30;U268.FC30_PV.F_CV;0.150934398;100.0 +25/10/2020 02:06:32;U268.FC30_PV.F_CV;0.008002594;100.0 +25/10/2020 02:06:33;U268.FC30_PV.F_CV;-0.074815221;100.0 +25/10/2020 02:06:34;U268.FC30_PV.F_CV;0.003970747;100.0 +25/10/2020 02:06:35;U268.FC30_PV.F_CV;-0.084249273;100.0 +25/10/2020 02:06:37;U268.FC30_PV.F_CV;0.076140419;100.0 +25/10/2020 02:06:38;U268.FC30_PV.F_CV;0.104176693;100.0 +25/10/2020 02:06:40;U268.FC30_PV.F_CV;-0.076702118;100.0 +25/10/2020 02:06:41;U268.FC30_PV.F_CV;-0.052335877;100.0 +25/10/2020 02:06:42;U268.FC30_PV.F_CV;-0.145819768;100.0 +25/10/2020 02:06:43;U268.FC30_PV.F_CV;0.016471773;100.0 +25/10/2020 02:06:44;U268.FC30_PV.F_CV;0.107929580;100.0 +25/10/2020 02:06:45;U268.FC30_PV.F_CV;0.251534373;100.0 +25/10/2020 02:06:46;U268.FC30_PV.F_CV;0.131292194;100.0 +25/10/2020 02:06:47;U268.FC30_PV.F_CV;0.149726421;100.0 +25/10/2020 02:06:48;U268.FC30_PV.F_CV;0.207736567;100.0 +25/10/2020 02:06:49;U268.FC30_PV.F_CV;-0.010597279;100.0 +25/10/2020 02:06:50;U268.FC30_PV.F_CV;-0.038751915;100.0 +25/10/2020 02:06:51;U268.FC30_PV.F_CV;-0.016681638;100.0 +25/10/2020 02:06:52;U268.FC30_PV.F_CV;-0.078143038;100.0 +25/10/2020 02:06:53;U268.FC30_PV.F_CV;-0.014103310;100.0 +25/10/2020 02:06:55;U268.FC30_PV.F_CV;0.024140185;100.0 +25/10/2020 02:06:56;U268.FC30_PV.F_CV;-0.053336546;100.0 +25/10/2020 02:06:58;U268.FC30_PV.F_CV;-0.014652956;100.0 +25/10/2020 02:06:59;U268.FC30_PV.F_CV;-0.054570280;100.0 +25/10/2020 02:06:45;U268.FC30_SP.F_CV;15.000000000;100.0 +25/10/2020 02:06:45;U268.FCV01_PV.F_CV;517.148254395;100.0 +25/10/2020 02:06:45;U268.FCV01_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U268.FCV12_CoefA.F_CV;0.976700008;100.0 +25/10/2020 02:06:45;U268.FCV12_CoefB.F_CV;0.147100002;100.0 +25/10/2020 02:06:45;U268.FCV5_CoefA.F_CV;0.985400021;100.0 +25/10/2020 02:06:45;U268.FCV5_CoefB.F_CV;0.078100003;100.0 +25/10/2020 02:06:45;U268.FI13_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U268.FI13_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U268.FI13_PV.F_CV;12.788230896;100.0 +25/10/2020 02:06:02;U268.FI13_PV.F_CV;11.344274521;100.0 +25/10/2020 02:06:03;U268.FI13_PV.F_CV;10.837265968;100.0 +25/10/2020 02:06:04;U268.FI13_PV.F_CV;10.478179932;100.0 +25/10/2020 02:06:08;U268.FI13_PV.F_CV;10.339342117;100.0 +25/10/2020 02:06:09;U268.FI13_PV.F_CV;10.125527382;100.0 +25/10/2020 02:06:10;U268.FI13_PV.F_CV;9.974093437;100.0 +25/10/2020 02:06:12;U268.FI13_PV.F_CV;9.866842270;100.0 +25/10/2020 02:06:14;U268.FI13_PV.F_CV;10.040964127;100.0 +25/10/2020 02:06:18;U268.FI13_PV.F_CV;10.229332924;100.0 +25/10/2020 02:06:20;U268.FI13_PV.F_CV;10.260895729;100.0 +25/10/2020 02:06:24;U268.FI13_PV.F_CV;9.842267036;100.0 +25/10/2020 02:06:25;U268.FI13_PV.F_CV;9.973672867;100.0 +25/10/2020 02:06:26;U268.FI13_PV.F_CV;7.063809395;100.0 +25/10/2020 02:06:27;U268.FI13_PV.F_CV;7.281639099;100.0 +25/10/2020 02:06:28;U268.FI13_PV.F_CV;7.598682404;100.0 +25/10/2020 02:06:29;U268.FI13_PV.F_CV;7.823226929;100.0 +25/10/2020 02:06:31;U268.FI13_PV.F_CV;8.094893456;100.0 +25/10/2020 02:06:32;U268.FI13_PV.F_CV;8.174666405;100.0 +25/10/2020 02:06:33;U268.FI13_PV.F_CV;11.071328163;100.0 +25/10/2020 02:06:34;U268.FI13_PV.F_CV;10.643953323;100.0 +25/10/2020 02:06:36;U268.FI13_PV.F_CV;9.633315086;100.0 +25/10/2020 02:06:37;U268.FI13_PV.F_CV;12.104410172;100.0 +25/10/2020 02:06:39;U268.FI13_PV.F_CV;10.672624588;100.0 +25/10/2020 02:06:40;U268.FI13_PV.F_CV;11.984461784;100.0 +25/10/2020 02:06:41;U268.FI13_PV.F_CV;11.896957397;100.0 +25/10/2020 02:06:42;U268.FI13_PV.F_CV;11.228701591;100.0 +25/10/2020 02:06:43;U268.FI13_PV.F_CV;12.503960609;100.0 +25/10/2020 02:06:44;U268.FI13_PV.F_CV;11.297368050;100.0 +25/10/2020 02:06:45;U268.FI13_PV.F_CV;13.282968521;100.0 +25/10/2020 02:06:46;U268.FI13_PV.F_CV;12.210338593;100.0 +25/10/2020 02:06:47;U268.FI13_PV.F_CV;11.263803482;100.0 +25/10/2020 02:06:48;U268.FI13_PV.F_CV;10.419032097;100.0 +25/10/2020 02:06:49;U268.FI13_PV.F_CV;9.657959938;100.0 +25/10/2020 02:06:50;U268.FI13_PV.F_CV;12.121864319;100.0 +25/10/2020 02:06:51;U268.FI13_PV.F_CV;11.588186264;100.0 +25/10/2020 02:06:52;U268.FI13_PV.F_CV;8.207282066;100.0 +25/10/2020 02:06:53;U268.FI13_PV.F_CV;11.094427109;100.0 +25/10/2020 02:06:55;U268.FI13_PV.F_CV;10.352854729;100.0 +25/10/2020 02:06:58;U268.FI13_PV.F_CV;7.463032722;100.0 +25/10/2020 02:06:40;U268.FQ13_PV.F_CV;261.375000000;100.0 +25/10/2020 02:06:45;U268.FY02_OP.F_CV;16.200218201;100.0 +25/10/2020 02:06:45;U268.FY02_PV.F_CV;0.641799986;100.0 +25/10/2020 02:06:45;U268.FY02_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U268.FY3A_PV.F_CV;-0.071288809;100.0 +25/10/2020 02:06:45;U268.FY3A_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U268.FY3B_PV.F_CV;1.104911566;100.0 +25/10/2020 02:06:45;U268.FY3B_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U268.LY02_OP.F_CV;9.038291931;100.0 +25/10/2020 02:06:12;U268.LY02_OP.F_CV;9.429620743;100.0 +25/10/2020 02:06:16;U268.LY02_OP.F_CV;9.801276207;100.0 +25/10/2020 02:06:18;U268.LY02_OP.F_CV;9.943614006;100.0 +25/10/2020 02:06:20;U268.LY02_OP.F_CV;10.345089912;100.0 +25/10/2020 02:06:22;U268.LY02_OP.F_CV;11.079007149;100.0 +25/10/2020 02:06:24;U268.LY02_OP.F_CV;12.053411484;100.0 +25/10/2020 02:06:26;U268.LY02_OP.F_CV;12.757893562;100.0 +25/10/2020 02:06:29;U268.LY02_OP.F_CV;13.455882072;100.0 +25/10/2020 02:06:31;U268.LY02_OP.F_CV;13.691407204;100.0 +25/10/2020 02:06:33;U268.LY02_OP.F_CV;13.594285965;100.0 +25/10/2020 02:06:36;U268.LY02_OP.F_CV;13.175359726;100.0 +25/10/2020 02:06:39;U268.LY02_OP.F_CV;12.415825844;100.0 +25/10/2020 02:06:43;U268.LY02_OP.F_CV;11.144889832;100.0 +25/10/2020 02:06:47;U268.LY02_OP.F_CV;9.527594566;100.0 +25/10/2020 02:06:48;U268.LY02_OP.F_CV;9.190940857;100.0 +25/10/2020 02:06:50;U268.LY02_OP.F_CV;8.838490486;100.0 +25/10/2020 02:06:51;U268.LY02_OP.F_CV;8.770107269;100.0 +25/10/2020 02:06:54;U268.LY02_OP.F_CV;9.067628860;100.0 +25/10/2020 02:06:57;U268.LY02_OP.F_CV;9.506221771;100.0 +25/10/2020 02:06:27;U268.LY02_PV.F_CV;50.053436279;100.0 +25/10/2020 02:06:44;U268.LY02_PV.F_CV;49.997230530;100.0 +25/10/2020 02:06:45;U268.LY02_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:45;U268.PC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U268.PC01_PV.F_CV;7.900949955;100.0 +25/10/2020 02:06:01;U268.PC01_PV.F_CV;7.889199257;100.0 +25/10/2020 02:06:02;U268.PC01_PV.F_CV;7.899316788;100.0 +25/10/2020 02:06:04;U268.PC01_PV.F_CV;7.894030571;100.0 +25/10/2020 02:06:06;U268.PC01_PV.F_CV;7.909976959;100.0 +25/10/2020 02:06:07;U268.PC01_PV.F_CV;7.904029369;100.0 +25/10/2020 02:06:08;U268.PC01_PV.F_CV;7.873296261;100.0 +25/10/2020 02:06:09;U268.PC01_PV.F_CV;7.884369850;100.0 +25/10/2020 02:06:10;U268.PC01_PV.F_CV;7.909638405;100.0 +25/10/2020 02:06:13;U268.PC01_PV.F_CV;7.850848675;100.0 +25/10/2020 02:06:15;U268.PC01_PV.F_CV;7.873294830;100.0 +25/10/2020 02:06:16;U268.PC01_PV.F_CV;7.893841267;100.0 +25/10/2020 02:06:18;U268.PC01_PV.F_CV;7.865051270;100.0 +25/10/2020 02:06:19;U268.PC01_PV.F_CV;7.859724045;100.0 +25/10/2020 02:06:22;U268.PC01_PV.F_CV;7.885192871;100.0 +25/10/2020 02:06:23;U268.PC01_PV.F_CV;7.874180317;100.0 +25/10/2020 02:06:27;U268.PC01_PV.F_CV;7.863873005;100.0 +25/10/2020 02:06:29;U268.PC01_PV.F_CV;7.846509457;100.0 +25/10/2020 02:06:31;U268.PC01_PV.F_CV;7.889960766;100.0 +25/10/2020 02:06:35;U268.PC01_PV.F_CV;7.853403091;100.0 +25/10/2020 02:06:36;U268.PC01_PV.F_CV;7.877914906;100.0 +25/10/2020 02:06:39;U268.PC01_PV.F_CV;7.860207558;100.0 +25/10/2020 02:06:40;U268.PC01_PV.F_CV;7.876912594;100.0 +25/10/2020 02:06:41;U268.PC01_PV.F_CV;7.864053249;100.0 +25/10/2020 02:06:42;U268.PC01_PV.F_CV;7.878876209;100.0 +25/10/2020 02:06:43;U268.PC01_PV.F_CV;7.871990204;100.0 +25/10/2020 02:06:47;U268.PC01_PV.F_CV;7.906618118;100.0 +25/10/2020 02:06:48;U268.PC01_PV.F_CV;7.901560783;100.0 +25/10/2020 02:06:50;U268.PC01_PV.F_CV;7.840124130;100.0 +25/10/2020 02:06:51;U268.PC01_PV.F_CV;7.852459908;100.0 +25/10/2020 02:06:52;U268.PC01_PV.F_CV;7.887646198;100.0 +25/10/2020 02:06:55;U268.PC01_PV.F_CV;7.907281876;100.0 +25/10/2020 02:06:57;U268.PC01_PV.F_CV;7.863489628;100.0 +25/10/2020 02:06:45;U268.PC01_SP.F_CV;10.000000000;100.0 +25/10/2020 02:06:00;U268.PC10_OP.F_CV;28.964481354;100.0 +25/10/2020 02:06:02;U268.PC10_OP.F_CV;29.184360504;100.0 +25/10/2020 02:06:04;U268.PC10_OP.F_CV;28.893209457;100.0 +25/10/2020 02:06:06;U268.PC10_OP.F_CV;29.082496643;100.0 +25/10/2020 02:06:07;U268.PC10_OP.F_CV;28.807479858;100.0 +25/10/2020 02:06:11;U268.PC10_OP.F_CV;29.054094315;100.0 +25/10/2020 02:06:12;U268.PC10_OP.F_CV;29.163951874;100.0 +25/10/2020 02:06:13;U268.PC10_OP.F_CV;28.945899963;100.0 +25/10/2020 02:06:14;U268.PC10_OP.F_CV;28.852464676;100.0 +25/10/2020 02:06:17;U268.PC10_OP.F_CV;29.038003922;100.0 +25/10/2020 02:06:18;U268.PC10_OP.F_CV;28.796957016;100.0 +25/10/2020 02:06:20;U268.PC10_OP.F_CV;28.591217041;100.0 +25/10/2020 02:06:21;U268.PC10_OP.F_CV;28.955665588;100.0 +25/10/2020 02:06:25;U268.PC10_OP.F_CV;28.741746902;100.0 +25/10/2020 02:06:27;U268.PC10_OP.F_CV;28.973260880;100.0 +25/10/2020 02:06:30;U268.PC10_OP.F_CV;28.724237442;100.0 +25/10/2020 02:06:33;U268.PC10_OP.F_CV;28.660745621;100.0 +25/10/2020 02:06:35;U268.PC10_OP.F_CV;28.751457214;100.0 +25/10/2020 02:06:36;U268.PC10_OP.F_CV;28.601373672;100.0 +25/10/2020 02:06:37;U268.PC10_OP.F_CV;28.722127914;100.0 +25/10/2020 02:06:39;U268.PC10_OP.F_CV;28.807203293;100.0 +25/10/2020 02:06:41;U268.PC10_OP.F_CV;28.622909546;100.0 +25/10/2020 02:06:42;U268.PC10_OP.F_CV;28.900913239;100.0 +25/10/2020 02:06:44;U268.PC10_OP.F_CV;28.727550507;100.0 +25/10/2020 02:06:45;U268.PC10_OP.F_CV;28.893863678;100.0 +25/10/2020 02:06:48;U268.PC10_OP.F_CV;28.681192398;100.0 +25/10/2020 02:06:49;U268.PC10_OP.F_CV;28.857490540;100.0 +25/10/2020 02:06:50;U268.PC10_OP.F_CV;28.782711029;100.0 +25/10/2020 02:06:51;U268.PC10_OP.F_CV;28.842960358;100.0 +25/10/2020 02:06:54;U268.PC10_OP.F_CV;28.626527786;100.0 +25/10/2020 02:06:55;U268.PC10_OP.F_CV;28.772994995;100.0 +25/10/2020 02:06:57;U268.PC10_OP.F_CV;28.708412170;100.0 +25/10/2020 02:06:45;U268.PC10_PV.F_CV;1.000017285;100.0 +25/10/2020 02:06:45;U268.PC10_SP.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U268.PC18_OP.F_CV;25.274209976;100.0 +25/10/2020 02:06:01;U268.PC18_OP.F_CV;25.360364914;100.0 +25/10/2020 02:06:02;U268.PC18_OP.F_CV;25.237260818;100.0 +25/10/2020 02:06:03;U268.PC18_OP.F_CV;25.311227798;100.0 +25/10/2020 02:06:04;U268.PC18_OP.F_CV;25.705692291;100.0 +25/10/2020 02:06:06;U268.PC18_OP.F_CV;26.016212463;100.0 +25/10/2020 02:06:07;U268.PC18_OP.F_CV;25.882385254;100.0 +25/10/2020 02:06:09;U268.PC18_OP.F_CV;25.353029251;100.0 +25/10/2020 02:06:10;U268.PC18_OP.F_CV;25.259262085;100.0 +25/10/2020 02:06:13;U268.PC18_OP.F_CV;25.469064713;100.0 +25/10/2020 02:06:15;U268.PC18_OP.F_CV;26.066846848;100.0 +25/10/2020 02:06:16;U268.PC18_OP.F_CV;26.148698807;100.0 +25/10/2020 02:06:17;U268.PC18_OP.F_CV;25.943603516;100.0 +25/10/2020 02:06:18;U268.PC18_OP.F_CV;25.493114471;100.0 +25/10/2020 02:06:19;U268.PC18_OP.F_CV;25.385419846;100.0 +25/10/2020 02:06:20;U268.PC18_OP.F_CV;25.467113495;100.0 +25/10/2020 02:06:21;U268.PC18_OP.F_CV;25.364326477;100.0 +25/10/2020 02:06:25;U268.PC18_OP.F_CV;25.856363297;100.0 +25/10/2020 02:06:27;U268.PC18_OP.F_CV;25.798759460;100.0 +25/10/2020 02:06:28;U268.PC18_OP.F_CV;25.503255844;100.0 +25/10/2020 02:06:29;U268.PC18_OP.F_CV;25.348772049;100.0 +25/10/2020 02:06:31;U268.PC18_OP.F_CV;25.256359100;100.0 +25/10/2020 02:06:33;U268.PC18_OP.F_CV;25.488780975;100.0 +25/10/2020 02:06:35;U268.PC18_OP.F_CV;25.544200897;100.0 +25/10/2020 02:06:38;U268.PC18_OP.F_CV;25.948009491;100.0 +25/10/2020 02:06:41;U268.PC18_OP.F_CV;25.223575592;100.0 +25/10/2020 02:06:44;U268.PC18_OP.F_CV;25.503124237;100.0 +25/10/2020 02:06:45;U268.PC18_OP.F_CV;25.805484772;100.0 +25/10/2020 02:06:46;U268.PC18_OP.F_CV;25.930271149;100.0 +25/10/2020 02:06:49;U268.PC18_OP.F_CV;25.629013062;100.0 +25/10/2020 02:06:51;U268.PC18_OP.F_CV;25.243732452;100.0 +25/10/2020 02:06:53;U268.PC18_OP.F_CV;25.399278641;100.0 +25/10/2020 02:06:54;U268.PC18_OP.F_CV;25.739519119;100.0 +25/10/2020 02:06:55;U268.PC18_OP.F_CV;25.968193054;100.0 +25/10/2020 02:06:56;U268.PC18_OP.F_CV;26.055768967;100.0 +25/10/2020 02:06:58;U268.PC18_OP.F_CV;25.805721283;100.0 +25/10/2020 02:06:59;U268.PC18_OP.F_CV;25.563564301;100.0 +25/10/2020 02:06:00;U268.PC18_PV.F_CV;0.599366069;100.0 +25/10/2020 02:06:45;U268.PC18_SP.F_CV;0.600000024;100.0 +25/10/2020 02:06:45;U268.PDT51_PV.F_CV;196.664291382;100.0 +25/10/2020 02:06:45;U268.PDT52_PV.F_CV;-3.810176134;100.0 +25/10/2020 02:06:45;U268.PI10_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U268.PI10_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U268.PI10_PV.F_CV;-0.010181330;100.0 +25/10/2020 02:06:45;U268.PI11_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U268.PI11_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U268.PI11_PV.F_CV;1.000651836;100.0 +25/10/2020 02:06:45;U268.PI20_PV.F_CV;-0.029096257;100.0 +25/10/2020 02:06:45;U268.PI35_PV.F_CV;0.132678896;100.0 +25/10/2020 02:06:10;U268.PI37_PV.F_CV;0.132363841;100.0 +25/10/2020 02:06:45;U268.TC02_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U268.TC02_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:45;U268.TC02_SP.F_CV;200.058410645;100.0 +25/10/2020 02:06:45;U268.TC03_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U268.TC03_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:45;U268.TC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:45;U268.TC04_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U268.TC04_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:45;U268.TC04_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:45;U268.TC05_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U268.TC05_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:45;U268.TC05_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:45;U268.TC06_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U268.TC06_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:45;U268.TC06_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:38;U268.TC10_PV.F_CV;249.892639160;100.0 +25/10/2020 02:06:46;U268.TC10_PV.F_CV;250.294876099;100.0 +25/10/2020 02:06:45;U268.TC10_SP.F_CV;250.000000000;100.0 +25/10/2020 02:06:01;U268.TC12_OP.F_CV;34.495498657;100.0 +25/10/2020 02:06:07;U268.TC12_OP.F_CV;34.684230804;100.0 +25/10/2020 02:06:12;U268.TC12_OP.F_CV;34.499935150;100.0 +25/10/2020 02:06:16;U268.TC12_OP.F_CV;34.684944153;100.0 +25/10/2020 02:06:21;U268.TC12_OP.F_CV;34.553085327;100.0 +25/10/2020 02:06:23;U268.TC12_OP.F_CV;34.496700287;100.0 +25/10/2020 02:06:26;U268.TC12_OP.F_CV;34.655021667;100.0 +25/10/2020 02:06:30;U268.TC12_OP.F_CV;34.441959381;100.0 +25/10/2020 02:06:31;U268.TC12_OP.F_CV;34.337890625;100.0 +25/10/2020 02:06:35;U268.TC12_OP.F_CV;34.502727509;100.0 +25/10/2020 02:06:37;U268.TC12_OP.F_CV;34.680671692;100.0 +25/10/2020 02:06:41;U268.TC12_OP.F_CV;34.497753143;100.0 +25/10/2020 02:06:45;U268.TC12_OP.F_CV;34.497753143;100.0 +25/10/2020 02:06:47;U268.TC12_OP.F_CV;34.121181488;100.0 +25/10/2020 02:06:50;U268.TC12_OP.F_CV;34.192119598;100.0 +25/10/2020 02:06:52;U268.TC12_OP.F_CV;34.394393921;100.0 +25/10/2020 02:06:57;U268.TC12_OP.F_CV;34.636962891;100.0 +25/10/2020 02:06:38;U268.TC12_PV.F_CV;270.015228271;100.0 +25/10/2020 02:06:45;U268.TC12_SP.F_CV;270.000000000;100.0 +25/10/2020 02:06:01;U268.TC13_OP.F_CV;21.902482986;100.0 +25/10/2020 02:06:07;U268.TC13_OP.F_CV;21.722816467;100.0 +25/10/2020 02:06:11;U268.TC13_OP.F_CV;21.943292618;100.0 +25/10/2020 02:06:13;U268.TC13_OP.F_CV;21.881917953;100.0 +25/10/2020 02:06:23;U268.TC13_OP.F_CV;22.064043045;100.0 +25/10/2020 02:06:24;U268.TC13_OP.F_CV;22.121158600;100.0 +25/10/2020 02:06:27;U268.TC13_OP.F_CV;21.900060654;100.0 +25/10/2020 02:06:29;U268.TC13_OP.F_CV;21.960866928;100.0 +25/10/2020 02:06:33;U268.TC13_OP.F_CV;21.827791214;100.0 +25/10/2020 02:06:42;U268.TC13_OP.F_CV;22.123151779;100.0 +25/10/2020 02:06:34;U268.TC13_PV.F_CV;269.922332764;100.0 +25/10/2020 02:06:45;U268.TC13_SP.F_CV;270.000000000;100.0 +25/10/2020 02:06:00;U268.TC14_OP.F_CV;24.805397034;100.0 +25/10/2020 02:06:02;U268.TC14_OP.F_CV;24.858842850;100.0 +25/10/2020 02:06:06;U268.TC14_OP.F_CV;24.628120422;100.0 +25/10/2020 02:06:08;U268.TC14_OP.F_CV;24.427145004;100.0 +25/10/2020 02:06:12;U268.TC14_OP.F_CV;24.574134827;100.0 +25/10/2020 02:06:14;U268.TC14_OP.F_CV;24.798025131;100.0 +25/10/2020 02:06:16;U268.TC14_OP.F_CV;24.741519928;100.0 +25/10/2020 02:06:18;U268.TC14_OP.F_CV;24.796957016;100.0 +25/10/2020 02:06:22;U268.TC14_OP.F_CV;24.593301773;100.0 +25/10/2020 02:06:25;U268.TC14_OP.F_CV;24.824396133;100.0 +25/10/2020 02:06:30;U268.TC14_OP.F_CV;24.700466156;100.0 +25/10/2020 02:06:32;U268.TC14_OP.F_CV;24.580785751;100.0 +25/10/2020 02:06:34;U268.TC14_OP.F_CV;24.633388519;100.0 +25/10/2020 02:06:37;U268.TC14_OP.F_CV;24.578117371;100.0 +25/10/2020 02:06:46;U268.TC14_OP.F_CV;24.827636719;100.0 +25/10/2020 02:06:52;U268.TC14_OP.F_CV;24.622806549;100.0 +25/10/2020 02:06:53;U268.TC14_OP.F_CV;24.571048737;100.0 +25/10/2020 02:06:36;U268.TC14_PV.F_CV;270.018310547;100.0 +25/10/2020 02:06:45;U268.TC14_SP.F_CV;270.000000000;100.0 +25/10/2020 02:06:00;U268.TC15_OP.F_CV;21.141788483;100.0 +25/10/2020 02:06:05;U268.TC15_OP.F_CV;21.386163712;100.0 +25/10/2020 02:06:07;U268.TC15_OP.F_CV;21.477872849;100.0 +25/10/2020 02:06:14;U268.TC15_OP.F_CV;21.528530121;100.0 +25/10/2020 02:06:17;U268.TC15_OP.F_CV;21.144908905;100.0 +25/10/2020 02:06:20;U268.TC15_OP.F_CV;21.464897156;100.0 +25/10/2020 02:06:23;U268.TC15_OP.F_CV;21.116764069;100.0 +25/10/2020 02:06:26;U268.TC15_OP.F_CV;21.064384460;100.0 +25/10/2020 02:06:32;U268.TC15_OP.F_CV;21.379358292;100.0 +25/10/2020 02:06:35;U268.TC15_OP.F_CV;21.513002396;100.0 +25/10/2020 02:06:37;U268.TC15_OP.F_CV;21.457845688;100.0 +25/10/2020 02:06:40;U268.TC15_OP.F_CV;21.511569977;100.0 +25/10/2020 02:06:49;U268.TC15_OP.F_CV;21.352531433;100.0 +25/10/2020 02:06:51;U268.TC15_OP.F_CV;21.129655838;100.0 +25/10/2020 02:06:54;U268.TC15_OP.F_CV;21.350860596;100.0 +25/10/2020 02:06:57;U268.TC15_OP.F_CV;21.283069611;100.0 +25/10/2020 02:06:33;U268.TC15_PV.F_CV;269.944580078;100.0 +25/10/2020 02:06:45;U268.TC15_SP.F_CV;270.000000000;100.0 +25/10/2020 02:06:00;U268.TC16_OP.F_CV;35.080173492;100.0 +25/10/2020 02:06:01;U268.TC16_OP.F_CV;34.928100586;100.0 +25/10/2020 02:06:04;U268.TC16_OP.F_CV;35.364601135;100.0 +25/10/2020 02:06:05;U268.TC16_OP.F_CV;35.972118378;100.0 +25/10/2020 02:06:06;U268.TC16_OP.F_CV;36.210048676;100.0 +25/10/2020 02:06:08;U268.TC16_OP.F_CV;35.532890320;100.0 +25/10/2020 02:06:09;U268.TC16_OP.F_CV;35.281410217;100.0 +25/10/2020 02:06:12;U268.TC16_OP.F_CV;34.898624420;100.0 +25/10/2020 02:06:14;U268.TC16_OP.F_CV;35.636589050;100.0 +25/10/2020 02:06:16;U268.TC16_OP.F_CV;35.274440765;100.0 +25/10/2020 02:06:17;U268.TC16_OP.F_CV;35.012023926;100.0 +25/10/2020 02:06:18;U268.TC16_OP.F_CV;35.121868134;100.0 +25/10/2020 02:06:19;U268.TC16_OP.F_CV;35.528945923;100.0 +25/10/2020 02:06:20;U268.TC16_OP.F_CV;35.756156921;100.0 +25/10/2020 02:06:21;U268.TC16_OP.F_CV;35.527004242;100.0 +25/10/2020 02:06:22;U268.TC16_OP.F_CV;35.144783020;100.0 +25/10/2020 02:06:23;U268.TC16_OP.F_CV;35.013351440;100.0 +25/10/2020 02:06:25;U268.TC16_OP.F_CV;35.299682617;100.0 +25/10/2020 02:06:26;U268.TC16_OP.F_CV;35.569896698;100.0 +25/10/2020 02:06:27;U268.TC16_OP.F_CV;36.018905640;100.0 +25/10/2020 02:06:28;U268.TC16_OP.F_CV;36.219585419;100.0 +25/10/2020 02:06:30;U268.TC16_OP.F_CV;35.904811859;100.0 +25/10/2020 02:06:33;U268.TC16_OP.F_CV;35.520679474;100.0 +25/10/2020 02:06:34;U268.TC16_OP.F_CV;35.369174957;100.0 +25/10/2020 02:06:35;U268.TC16_OP.F_CV;35.017063141;100.0 +25/10/2020 02:06:36;U268.TC16_OP.F_CV;34.894817352;100.0 +25/10/2020 02:06:38;U268.TC16_OP.F_CV;35.252590179;100.0 +25/10/2020 02:06:41;U268.TC16_OP.F_CV;34.926986694;100.0 +25/10/2020 02:06:46;U268.TC16_OP.F_CV;34.926986694;100.0 +25/10/2020 02:06:48;U268.TC16_OP.F_CV;35.693401337;100.0 +25/10/2020 02:06:49;U268.TC16_OP.F_CV;35.842308044;100.0 +25/10/2020 02:06:52;U268.TC16_OP.F_CV;35.688438416;100.0 +25/10/2020 02:06:54;U268.TC16_OP.F_CV;35.339920044;100.0 +25/10/2020 02:06:55;U268.TC16_OP.F_CV;35.080387115;100.0 +25/10/2020 02:06:56;U268.TC16_OP.F_CV;34.922210693;100.0 +25/10/2020 02:06:57;U268.TC16_OP.F_CV;34.869167328;100.0 +25/10/2020 02:06:04;U268.TC16_PV.F_CV;270.071929932;100.0 +25/10/2020 02:06:45;U268.TC16_SP.F_CV;270.000000000;100.0 +25/10/2020 02:06:02;U268.TC17_PV.F_CV;7.278648376;100.0 +25/10/2020 02:06:07;U268.TC17_PV.F_CV;7.314406872;100.0 +25/10/2020 02:06:09;U268.TC17_PV.F_CV;7.373776913;100.0 +25/10/2020 02:06:11;U268.TC17_PV.F_CV;7.391407013;100.0 +25/10/2020 02:06:13;U268.TC17_PV.F_CV;7.116190434;100.0 +25/10/2020 02:06:14;U268.TC17_PV.F_CV;7.172536850;100.0 +25/10/2020 02:06:16;U268.TC17_PV.F_CV;7.191000938;100.0 +25/10/2020 02:06:18;U268.TC17_PV.F_CV;7.106554985;100.0 +25/10/2020 02:06:19;U268.TC17_PV.F_CV;7.220228195;100.0 +25/10/2020 02:06:21;U268.TC17_PV.F_CV;7.291435242;100.0 +25/10/2020 02:06:25;U268.TC17_PV.F_CV;7.216678619;100.0 +25/10/2020 02:06:33;U268.TC17_PV.F_CV;7.386539936;100.0 +25/10/2020 02:06:39;U268.TC17_PV.F_CV;7.386539936;100.0 +25/10/2020 02:06:40;U268.TC17_PV.F_CV;7.326210022;100.0 +25/10/2020 02:06:47;U268.TC17_PV.F_CV;7.264010429;100.0 +25/10/2020 02:06:48;U268.TC17_PV.F_CV;7.220974922;100.0 +25/10/2020 02:06:54;U268.TC17_PV.F_CV;7.202251911;100.0 +25/10/2020 02:06:56;U268.TC17_PV.F_CV;7.366448402;100.0 +25/10/2020 02:06:58;U268.TC17_PV.F_CV;7.396397114;100.0 +25/10/2020 02:06:45;U268.TC17_SP.F_CV;5.000000000;100.0 +25/10/2020 02:06:45;U268.TI01_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:45;U268.TI02_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U268.TI02_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U268.TI02_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:45;U268.TI03_CoefA.F_CV;1.002400041;100.0 +25/10/2020 02:06:45;U268.TI03_CoefB.F_CV;-0.222499996;100.0 +25/10/2020 02:06:45;U268.TI03_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:45;U268.TI04_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U268.TI04_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U268.TI04_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:45;U268.TI05_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U268.TI05_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U268.TI05_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:45;U268.TI06_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U268.TI06_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U268.TI06_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:43;U268.TI09_PV.F_CV;21.151046753;100.0 +25/10/2020 02:06:45;U268.TI101_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:42;U268.TI102_PV.F_CV;21.799999237;100.0 +25/10/2020 02:06:30;U268.TI103_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:16;U268.TI104_PV.F_CV;21.899999619;100.0 +25/10/2020 02:06:24;U268.TI104_PV.F_CV;22.200000763;100.0 +25/10/2020 02:06:33;U268.TI104_PV.F_CV;21.899999619;100.0 +25/10/2020 02:06:36;U268.TI104_PV.F_CV;22.200000763;100.0 +25/10/2020 02:06:46;U268.TI104_PV.F_CV;21.899999619;100.0 +25/10/2020 02:06:05;U268.TI105_PV.F_CV;22.399999619;100.0 +25/10/2020 02:06:13;U268.TI105_PV.F_CV;22.705881119;100.0 +25/10/2020 02:06:19;U268.TI105_PV.F_CV;22.299999237;100.0 +25/10/2020 02:06:21;U268.TI105_PV.F_CV;22.600000381;100.0 +25/10/2020 02:06:11;U268.TI106_PV.F_CV;23.305881500;100.0 +25/10/2020 02:06:50;U268.TI106_PV.F_CV;23.000000000;100.0 +25/10/2020 02:06:59;U268.TI106_PV.F_CV;23.327272415;100.0 +25/10/2020 02:06:18;U268.TI110_PV.F_CV;253.015426636;100.0 +25/10/2020 02:06:36;U268.TI110_PV.F_CV;253.671569824;100.0 +25/10/2020 02:06:19;U268.TI112_PV.F_CV;217.500000000;100.0 +25/10/2020 02:06:21;U268.TI112_PV.F_CV;218.000000000;100.0 +25/10/2020 02:06:25;U268.TI112_PV.F_CV;217.699996948;100.0 +25/10/2020 02:06:27;U268.TI112_PV.F_CV;218.000000000;100.0 +25/10/2020 02:06:29;U268.TI112_PV.F_CV;217.699996948;100.0 +25/10/2020 02:06:37;U268.TI112_PV.F_CV;218.000000000;100.0 +25/10/2020 02:06:42;U268.TI112_PV.F_CV;217.699996948;100.0 +25/10/2020 02:06:47;U268.TI112_PV.F_CV;218.000000000;100.0 +25/10/2020 02:06:50;U268.TI112_PV.F_CV;217.699996948;100.0 +25/10/2020 02:06:06;U268.TI113_PV.F_CV;226.699996948;100.0 +25/10/2020 02:06:54;U268.TI114_PV.F_CV;242.300003052;100.0 +25/10/2020 02:06:58;U268.TI114_PV.F_CV;242.619995117;100.0 +25/10/2020 02:06:25;U268.TI115_PV.F_CV;269.010009766;100.0 +25/10/2020 02:06:16;U268.TI116_PV.F_CV;266.100006104;100.0 +25/10/2020 02:06:45;U268.TI12_CoefA.F_CV;1.000399947;100.0 +25/10/2020 02:06:45;U268.TI12_CoefB.F_CV;-1.990200043;100.0 +25/10/2020 02:06:32;U268.TI12_PV.F_CV;270.008361816;100.0 +25/10/2020 02:06:04;U268.TI130_PV.F_CV;27.014245987;100.0 +25/10/2020 02:06:07;U268.TI130_PV.F_CV;27.179025650;100.0 +25/10/2020 02:06:09;U268.TI130_PV.F_CV;27.114524841;100.0 +25/10/2020 02:06:15;U268.TI130_PV.F_CV;27.021026611;100.0 +25/10/2020 02:06:18;U268.TI130_PV.F_CV;27.167184830;100.0 +25/10/2020 02:06:19;U268.TI130_PV.F_CV;27.270261765;100.0 +25/10/2020 02:06:22;U268.TI130_PV.F_CV;27.169103622;100.0 +25/10/2020 02:06:23;U268.TI130_PV.F_CV;27.113401413;100.0 +25/10/2020 02:06:24;U268.TI130_PV.F_CV;27.171623230;100.0 +25/10/2020 02:06:27;U268.TI130_PV.F_CV;27.040945053;100.0 +25/10/2020 02:06:29;U268.TI130_PV.F_CV;27.072326660;100.0 +25/10/2020 02:06:32;U268.TI130_PV.F_CV;27.024929047;100.0 +25/10/2020 02:06:36;U268.TI130_PV.F_CV;27.124813080;100.0 +25/10/2020 02:06:37;U268.TI130_PV.F_CV;27.165525436;100.0 +25/10/2020 02:06:39;U268.TI130_PV.F_CV;27.132379532;100.0 +25/10/2020 02:06:42;U268.TI130_PV.F_CV;27.168930054;100.0 +25/10/2020 02:06:44;U268.TI130_PV.F_CV;27.268663406;100.0 +25/10/2020 02:06:45;U268.TI130_PV.F_CV;27.356964111;100.0 +25/10/2020 02:06:46;U268.TI130_PV.F_CV;27.385896683;100.0 +25/10/2020 02:06:47;U268.TI130_PV.F_CV;27.277297974;100.0 +25/10/2020 02:06:49;U268.TI130_PV.F_CV;27.168300629;100.0 +25/10/2020 02:06:50;U268.TI130_PV.F_CV;27.055149078;100.0 +25/10/2020 02:06:51;U268.TI130_PV.F_CV;27.018070221;100.0 +25/10/2020 02:06:57;U268.TI130_PV.F_CV;27.018070221;100.0 +25/10/2020 02:06:58;U268.TI130_PV.F_CV;27.237091064;100.0 +25/10/2020 02:06:59;U268.TI130_PV.F_CV;27.279384613;100.0 +25/10/2020 02:06:41;U268.TI134_PV.F_CV;19.200000763;100.0 +25/10/2020 02:06:44;U268.TI135_PV.F_CV;4.121119976;100.0 +25/10/2020 02:06:45;U268.TI13_CoefA.F_CV;1.002500057;100.0 +25/10/2020 02:06:45;U268.TI13_CoefB.F_CV;-2.170900106;100.0 +25/10/2020 02:06:56;U268.TI13_PV.F_CV;270.000640869;100.0 +25/10/2020 02:06:45;U268.TI14_CoefA.F_CV;1.015799999;100.0 +25/10/2020 02:06:45;U268.TI14_CoefB.F_CV;-2.823600054;100.0 +25/10/2020 02:06:22;U268.TI14_PV.F_CV;270.017150879;100.0 +25/10/2020 02:06:45;U268.TI15_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U268.TI15_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U268.TI15_PV.F_CV;269.991851807;100.0 +25/10/2020 02:06:45;U268.TI16_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U268.TI16_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U268.TI16_PV.F_CV;269.962799072;100.0 +25/10/2020 02:06:26;U268.TI19_PV.F_CV;22.153791428;100.0 +25/10/2020 02:06:15;U268.TI202_PV.F_CV;21.200000763;100.0 +25/10/2020 02:06:30;U268.TI202_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:40;U268.TI202_PV.F_CV;21.200000763;100.0 +25/10/2020 02:06:43;U268.TI202_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:50;U268.TI202_PV.F_CV;21.200000763;100.0 +25/10/2020 02:06:08;U268.TI203_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:19;U268.TI204_PV.F_CV;21.600000381;100.0 +25/10/2020 02:06:21;U268.TI204_PV.F_CV;21.299999237;100.0 +25/10/2020 02:06:00;U268.TI205_PV.F_CV;22.299999237;100.0 +25/10/2020 02:06:03;U268.TI205_PV.F_CV;22.600000381;100.0 +25/10/2020 02:06:06;U268.TI205_PV.F_CV;22.299999237;100.0 +25/10/2020 02:06:17;U268.TI205_PV.F_CV;22.600000381;100.0 +25/10/2020 02:06:24;U268.TI205_PV.F_CV;22.299999237;100.0 +25/10/2020 02:06:29;U268.TI205_PV.F_CV;22.600000381;100.0 +25/10/2020 02:06:40;U268.TI205_PV.F_CV;22.299999237;100.0 +25/10/2020 02:06:58;U268.TI205_PV.F_CV;22.600000381;100.0 +25/10/2020 02:06:27;U268.TI206_PV.F_CV;23.600000381;100.0 +25/10/2020 02:06:32;U268.TI206_PV.F_CV;23.266666412;100.0 +25/10/2020 02:06:40;U268.TI206_PV.F_CV;23.600000381;100.0 +25/10/2020 02:06:44;U268.TI206_PV.F_CV;23.280000687;100.0 +25/10/2020 02:06:01;U268.TI212_PV.F_CV;269.100006104;100.0 +25/10/2020 02:06:04;U268.TI212_PV.F_CV;268.799987793;100.0 +25/10/2020 02:06:19;U268.TI212_PV.F_CV;269.100006104;100.0 +25/10/2020 02:06:23;U268.TI212_PV.F_CV;268.799987793;100.0 +25/10/2020 02:06:27;U268.TI212_PV.F_CV;269.100006104;100.0 +25/10/2020 02:06:32;U268.TI212_PV.F_CV;268.799987793;100.0 +25/10/2020 02:06:50;U268.TI212_PV.F_CV;269.100006104;100.0 +25/10/2020 02:06:53;U268.TI212_PV.F_CV;268.799987793;100.0 +25/10/2020 02:06:58;U268.TI212_PV.F_CV;269.100006104;100.0 +25/10/2020 02:06:25;U268.TI213_PV.F_CV;270.600006104;100.0 +25/10/2020 02:06:27;U268.TI213_PV.F_CV;270.299987793;100.0 +25/10/2020 02:06:40;U268.TI213_PV.F_CV;270.600006104;100.0 +25/10/2020 02:06:51;U268.TI213_PV.F_CV;270.299987793;100.0 +25/10/2020 02:06:23;U268.TI214_PV.F_CV;268.899993896;100.0 +25/10/2020 02:06:25;U268.TI214_PV.F_CV;268.500000000;100.0 +25/10/2020 02:06:54;U268.TI214_PV.F_CV;268.813507080;100.0 +25/10/2020 02:06:10;U268.TI215_PV.F_CV;268.806671143;100.0 +25/10/2020 02:06:18;U268.TI215_PV.F_CV;268.500000000;100.0 +25/10/2020 02:06:23;U268.TI216_PV.F_CV;274.299987793;100.0 +25/10/2020 02:06:44;U268.TI216_PV.F_CV;274.600006104;100.0 +25/10/2020 02:06:49;U268.TI216_PV.F_CV;274.266662598;100.0 +25/10/2020 02:06:54;U268.TI216_PV.F_CV;274.600006104;100.0 +25/10/2020 02:06:46;U268.WI01_PV.F_CV;11.889387131;100.0 +25/10/2020 02:06:45;U268.WI02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U268.WI03_PV.F_CV;10.614987373;100.0 +25/10/2020 02:06:45;U268.WI06_PV.F_CV;11.356510162;100.0 +25/10/2020 02:06:16;U268.WI08_PV.F_CV;16.430736542;100.0 +25/10/2020 02:06:31;U312.C2DPC1_OP.F_CV;5.000381470;100.0 +25/10/2020 02:06:43;U312.C2DPC1_PV.F_CV;0.062561989;100.0 +25/10/2020 02:06:49;U312.C2DPC1_SP.F_CV;5.000381470;100.0 +25/10/2020 02:06:43;U312.C2DPI1.F_CV;0.062561989;100.0 +25/10/2020 02:06:07;U312.C2LI1A.F_CV;37.524986267;100.0 +25/10/2020 02:06:35;U312.C2LI1A.F_CV;37.320514679;100.0 +25/10/2020 02:06:36;U312.C2LI1A.F_CV;37.590599060;100.0 +25/10/2020 02:06:49;U312.C2LI1A.F_CV;37.500572205;100.0 +25/10/2020 02:06:49;U312.C2PI2.F_CV;1001.464843750;100.0 +25/10/2020 02:06:31;U312.C2TC1_OP.F_CV;5.000381470;100.0 +25/10/2020 02:06:07;U312.C2TC1_PV.F_CV;36.163883209;100.0 +25/10/2020 02:06:07;U312.C2TC1_SP.F_CV;36.163883209;100.0 +25/10/2020 02:06:07;U312.C2TI1A.F_CV;36.163883209;100.0 +25/10/2020 02:06:37;U312.C2TI1B.F_CV;36.444648743;100.0 +25/10/2020 02:06:01;U312.C2TI2A.F_CV;14.616617203;100.0 +25/10/2020 02:06:13;U312.C2TI2B.F_CV;13.366903305;100.0 +25/10/2020 02:06:43;U312.C2TI3.F_CV;-2.718547344;100.0 +25/10/2020 02:06:43;U312.C2TI4.F_CV;65.876251221;100.0 +25/10/2020 02:06:31;U312.C2TIMEF.F_CV;25.000381470;100.0 +25/10/2020 02:06:43;U312.C2TIMEO.F_CV;0.999465942;100.0 +25/10/2020 02:06:43;U312.C4AI11.F_CV;10.665415764;100.0 +25/10/2020 02:06:37;U312.C4FI11.F_CV;93.895172119;100.0 +25/10/2020 02:06:43;U312.C4FI22.F_CV;0.000000000;0.0 +25/10/2020 02:06:43;U312.C4LI19.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U312.C4LI4.F_CV;38.616004944;100.0 +25/10/2020 02:06:12;U312.C4LI5.F_CV;38.948654175;100.0 +25/10/2020 02:06:13;U312.C4LI5.F_CV;39.224842072;100.0 +25/10/2020 02:06:19;U312.C4LI5.F_CV;39.169910431;100.0 +25/10/2020 02:06:30;U312.C4LI5.F_CV;39.224842072;100.0 +25/10/2020 02:06:31;U312.C4LI5.F_CV;38.933395386;100.0 +25/10/2020 02:06:49;U312.C4LI5.F_CV;38.785381317;100.0 +25/10/2020 02:06:43;U312.C4PI3.F_CV;0.006430152;100.0 +25/10/2020 02:06:00;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:01;U312.C4TC04_PV.F_CV;94.749366760;100.0 +25/10/2020 02:06:02;U312.C4TC04_PV.F_CV;94.749366760;100.0 +25/10/2020 02:06:03;U312.C4TC04_PV.F_CV;94.749366760;100.0 +25/10/2020 02:06:04;U312.C4TC04_PV.F_CV;94.749366760;100.0 +25/10/2020 02:06:05;U312.C4TC04_PV.F_CV;94.749366760;100.0 +25/10/2020 02:06:06;U312.C4TC04_PV.F_CV;94.749366760;100.0 +25/10/2020 02:06:07;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:08;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:09;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:10;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:11;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:12;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:13;U312.C4TC04_PV.F_CV;94.706642151;100.0 +25/10/2020 02:06:14;U312.C4TC04_PV.F_CV;94.706642151;100.0 +25/10/2020 02:06:15;U312.C4TC04_PV.F_CV;94.706642151;100.0 +25/10/2020 02:06:16;U312.C4TC04_PV.F_CV;94.706642151;100.0 +25/10/2020 02:06:17;U312.C4TC04_PV.F_CV;94.706642151;100.0 +25/10/2020 02:06:18;U312.C4TC04_PV.F_CV;94.706642151;100.0 +25/10/2020 02:06:19;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:20;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:21;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:22;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:23;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:24;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:25;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:26;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:27;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:28;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:29;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:30;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:31;U312.C4TC04_PV.F_CV;94.749366760;100.0 +25/10/2020 02:06:32;U312.C4TC04_PV.F_CV;94.749366760;100.0 +25/10/2020 02:06:33;U312.C4TC04_PV.F_CV;94.749366760;100.0 +25/10/2020 02:06:34;U312.C4TC04_PV.F_CV;94.749366760;100.0 +25/10/2020 02:06:35;U312.C4TC04_PV.F_CV;94.749366760;100.0 +25/10/2020 02:06:36;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:37;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:38;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:39;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:40;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:41;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:42;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:43;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:44;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:45;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:46;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:47;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:48;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:49;U312.C4TC04_PV.F_CV;94.749366760;100.0 +25/10/2020 02:06:50;U312.C4TC04_PV.F_CV;94.749366760;100.0 +25/10/2020 02:06:51;U312.C4TC04_PV.F_CV;94.749366760;100.0 +25/10/2020 02:06:52;U312.C4TC04_PV.F_CV;94.749366760;100.0 +25/10/2020 02:06:53;U312.C4TC04_PV.F_CV;94.749366760;100.0 +25/10/2020 02:06:54;U312.C4TC04_PV.F_CV;94.749366760;100.0 +25/10/2020 02:06:55;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:56;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:57;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:58;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:59;U312.C4TC04_PV.F_CV;94.728004456;100.0 +25/10/2020 02:06:00;U312.C4TI3.F_CV;97.203018188;100.0 +25/10/2020 02:06:01;U312.C4TI3.F_CV;97.203018188;100.0 +25/10/2020 02:06:02;U312.C4TI3.F_CV;97.203018188;100.0 +25/10/2020 02:06:03;U312.C4TI3.F_CV;97.203018188;100.0 +25/10/2020 02:06:04;U312.C4TI3.F_CV;97.203018188;100.0 +25/10/2020 02:06:05;U312.C4TI3.F_CV;97.203018188;100.0 +25/10/2020 02:06:06;U312.C4TI3.F_CV;97.203018188;100.0 +25/10/2020 02:06:07;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:08;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:09;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:10;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:11;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:12;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:13;U312.C4TI3.F_CV;97.203018188;100.0 +25/10/2020 02:06:14;U312.C4TI3.F_CV;97.203018188;100.0 +25/10/2020 02:06:15;U312.C4TI3.F_CV;97.203018188;100.0 +25/10/2020 02:06:16;U312.C4TI3.F_CV;97.203018188;100.0 +25/10/2020 02:06:17;U312.C4TI3.F_CV;97.203018188;100.0 +25/10/2020 02:06:18;U312.C4TI3.F_CV;97.203018188;100.0 +25/10/2020 02:06:19;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:20;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:21;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:22;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:23;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:24;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:25;U312.C4TI3.F_CV;97.203018188;100.0 +25/10/2020 02:06:26;U312.C4TI3.F_CV;97.203018188;100.0 +25/10/2020 02:06:27;U312.C4TI3.F_CV;97.203018188;100.0 +25/10/2020 02:06:28;U312.C4TI3.F_CV;97.203018188;100.0 +25/10/2020 02:06:29;U312.C4TI3.F_CV;97.203018188;100.0 +25/10/2020 02:06:30;U312.C4TI3.F_CV;97.203018188;100.0 +25/10/2020 02:06:31;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:32;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:33;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:34;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:35;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:36;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:37;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:38;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:39;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:40;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:41;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:42;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:43;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:44;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:45;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:46;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:47;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:48;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:49;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:50;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:51;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:52;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:53;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:54;U312.C4TI3.F_CV;97.224380493;100.0 +25/10/2020 02:06:55;U312.C4TI3.F_CV;97.203018188;100.0 +25/10/2020 02:06:56;U312.C4TI3.F_CV;97.203018188;100.0 +25/10/2020 02:06:57;U312.C4TI3.F_CV;97.203018188;100.0 +25/10/2020 02:06:58;U312.C4TI3.F_CV;97.203018188;100.0 +25/10/2020 02:06:59;U312.C4TI3.F_CV;97.203018188;100.0 +25/10/2020 02:06:43;U312.C4TI4.F_CV;94.728004456;100.0 +25/10/2020 02:06:31;U312.C4TI5.F_CV;18.460365295;100.0 +25/10/2020 02:06:47;U315.DPC110_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.DPC110_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.DPI110.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U315.FC110_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.FC110_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.FC110_SP_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;U315.FC120_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U315.FC120_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.FC120_SP_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:30;U315.FC130_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U315.FC130_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.FC130_SP_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U315.FC150_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U315.FC150_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U315.FC150_SP_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:30;U315.FC170_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U315.FC170_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.FC170_SP_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:30;U315.FQ110.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.FQ120.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U315.FQ130.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U315.FQ150.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U315.FQ170.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.LC110_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U315.LC110_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.LC110_SP_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U315.LC112_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U315.LC112_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.LC112_SP_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U315.LI121.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.PC110_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.PC110_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.PC110_SP_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;U315.PI119.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.PI150.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.TC107_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.TC107_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.TC107_SP_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;U315.TC110_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.TC110_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.TC110_SP_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:30;U315.TC111_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.TC111_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.TC111_SP_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U315.TC155_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U315.TC155_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U315.TC155_SP_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U315.TC157_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U315.TC157_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U315.TC157_SP_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:30;U315.TC170_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.TC170_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.TC170_SP_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:30;U315.TC180_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.TC180_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.TC180_SP_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:30;U315.TC182_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.TC182_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.TC182_SP_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;U315.TI106.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.TI110.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.TI112.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U315.TI115.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U315.TI122.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U315.TI154.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U315.TI156.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.TI179.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U315.TI181.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:01;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:02;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:03;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:04;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:05;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:06;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:07;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:09;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:10;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:11;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:13;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:14;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:15;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:16;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:17;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:18;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:20;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:21;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:22;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:23;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:24;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:25;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:26;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:28;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:29;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:30;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:31;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:33;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:36;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:39;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:40;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:41;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:42;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:43;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:45;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:49;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:51;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:54;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:55;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:57;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:58;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U315.WDG_AI.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:01;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:02;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:03;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:04;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:05;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:06;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:07;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:09;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:10;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:11;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:13;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:14;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:15;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:16;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:17;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:18;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:20;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:21;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:22;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:23;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:24;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:25;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:26;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:28;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:29;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:30;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:31;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:33;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:36;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:39;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:40;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:41;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:42;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:43;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:45;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:49;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:51;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:54;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:55;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:57;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:58;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U315.WDG_C2.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:01;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:02;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:03;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:04;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:05;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:06;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:07;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:09;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:10;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:11;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:13;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:14;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:15;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:16;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:17;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:18;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:20;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:21;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:22;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:23;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:24;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:25;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:26;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:28;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:29;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:30;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:31;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:33;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:36;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:39;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:40;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:41;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:42;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:43;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:45;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:49;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:51;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:54;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:55;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:57;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:58;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U315.WDG_C4.F_CV;0.000000000;0.0 +25/10/2020 02:06:42;U39.ANIM_R100.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U39.ANIM_R200.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U39.ANIM_R300.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U39.ANIM_R400.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U39.AUTO_MANU_R100.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U39.AUTO_MANU_R200.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U39.AUTO_MANU_R300.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U39.AUTO_MANU_R400.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U39.COMPT_DEBI_CA1.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U39.COMPT_DEBM_CA1.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U39.COMPT_TR_CA1.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U39.COMPT_VOL_CA1.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U39.FI_P100.F_CV;-0.000049591;100.0 +25/10/2020 02:06:42;U39.FI_P200.F_CV;-0.000049591;100.0 +25/10/2020 02:06:42;U39.FI_P300.F_CV;-0.000049591;100.0 +25/10/2020 02:06:42;U39.FI_P400.F_CV;-0.000049591;100.0 +25/10/2020 02:06:01;U39.FT100.F_CV;0.016000267;100.0 +25/10/2020 02:06:15;U39.FT100.F_CV;0.116000272;100.0 +25/10/2020 02:06:26;U39.FT100.F_CV;0.003000267;100.0 +25/10/2020 02:06:32;U39.FT100.F_CV;0.116000272;100.0 +25/10/2020 02:06:33;U39.FT100.F_CV;0.061000269;100.0 +25/10/2020 02:06:41;U39.FT100.F_CV;0.099000275;100.0 +25/10/2020 02:06:42;U39.FT100.F_CV;0.014000268;100.0 +25/10/2020 02:06:50;U39.FT100.F_CV;0.076000273;100.0 +25/10/2020 02:06:57;U39.FT100.F_CV;0.034000270;100.0 +25/10/2020 02:06:42;U39.FT111.F_CV;0.028000269;100.0 +25/10/2020 02:06:42;U39.FT121.F_CV;-0.013999734;100.0 +25/10/2020 02:06:21;U39.FT200.F_CV;0.132000268;100.0 +25/10/2020 02:06:30;U39.FT200.F_CV;0.081000268;100.0 +25/10/2020 02:06:35;U39.FT200.F_CV;0.127000272;100.0 +25/10/2020 02:06:44;U39.FT200.F_CV;0.088000275;100.0 +25/10/2020 02:06:55;U39.FT200.F_CV;0.154000282;100.0 +25/10/2020 02:06:40;U39.FT211.F_CV;-0.024999734;100.0 +25/10/2020 02:06:42;U39.FT221.F_CV;-0.000999733;100.0 +25/10/2020 02:06:06;U39.FT300.F_CV;-0.077999741;100.0 +25/10/2020 02:06:08;U39.FT300.F_CV;-0.141999736;100.0 +25/10/2020 02:06:10;U39.FT300.F_CV;-0.066999733;100.0 +25/10/2020 02:06:19;U39.FT300.F_CV;-0.151999742;100.0 +25/10/2020 02:06:21;U39.FT300.F_CV;-0.067999735;100.0 +25/10/2020 02:06:26;U39.FT300.F_CV;0.016000267;100.0 +25/10/2020 02:06:30;U39.FT300.F_CV;-0.093999736;100.0 +25/10/2020 02:06:39;U39.FT300.F_CV;0.008000268;100.0 +25/10/2020 02:06:42;U39.FT300.F_CV;-0.084999740;100.0 +25/10/2020 02:06:42;U39.FT311.F_CV;0.083000273;100.0 +25/10/2020 02:06:42;U39.FT321.F_CV;-0.016999735;100.0 +25/10/2020 02:06:02;U39.FT400.F_CV;0.119000271;100.0 +25/10/2020 02:06:04;U39.FT400.F_CV;0.012000267;100.0 +25/10/2020 02:06:06;U39.FT400.F_CV;0.060000271;100.0 +25/10/2020 02:06:08;U39.FT400.F_CV;0.017000267;100.0 +25/10/2020 02:06:10;U39.FT400.F_CV;0.076000273;100.0 +25/10/2020 02:06:15;U39.FT400.F_CV;0.030000269;100.0 +25/10/2020 02:06:17;U39.FT400.F_CV;0.099000275;100.0 +25/10/2020 02:06:21;U39.FT400.F_CV;0.055000272;100.0 +25/10/2020 02:06:22;U39.FT400.F_CV;-0.004999733;100.0 +25/10/2020 02:06:28;U39.FT400.F_CV;0.081000268;100.0 +25/10/2020 02:06:35;U39.FT400.F_CV;0.002000267;100.0 +25/10/2020 02:06:41;U39.FT400.F_CV;0.103000276;100.0 +25/10/2020 02:06:44;U39.FT400.F_CV;0.018000267;100.0 +25/10/2020 02:06:52;U39.FT400.F_CV;0.094000272;100.0 +25/10/2020 02:06:57;U39.FT400.F_CV;-0.035999734;100.0 +25/10/2020 02:06:42;U39.FT411.F_CV;0.116000272;100.0 +25/10/2020 02:06:42;U39.FT421.F_CV;-0.009999733;100.0 +25/10/2020 02:06:42;U39.KTY100.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U39.KTY200.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U39.KTY300.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U39.KTY400.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U39.LT161.F_CV;92.699951172;100.0 +25/10/2020 02:06:47;U39.LT171.F_CV;22.499950409;100.0 +25/10/2020 02:06:58;U39.LT261.F_CV;83.599952698;100.0 +25/10/2020 02:06:58;U39.LT271.F_CV;28.599950790;100.0 +25/10/2020 02:06:35;U39.LT361.F_CV;96.399948120;100.0 +25/10/2020 02:06:54;U39.LT371.F_CV;39.599948883;100.0 +25/10/2020 02:06:01;U39.LT461.F_CV;86.399948120;100.0 +25/10/2020 02:06:54;U39.LT471.F_CV;32.699951172;100.0 +25/10/2020 02:06:42;U39.MV171_1.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U39.MV171_2.F_CV;9.000000000;100.0 +25/10/2020 02:06:42;U39.MV271_1.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U39.MV271_2.F_CV;9.000000000;100.0 +25/10/2020 02:06:42;U39.MV371_1.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U39.MV371_2.F_CV;9.000000000;100.0 +25/10/2020 02:06:42;U39.MV471_1.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U39.MV471_2.F_CV;9.000000000;100.0 +25/10/2020 02:06:42;U39.MV71.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U39.OPPIC161.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U39.OPPIC161.F_CV;11.999992371;100.0 +25/10/2020 02:06:05;U39.OPPIC161.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U39.OPPIC161.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U39.OPPIC161.F_CV;11.999992371;100.0 +25/10/2020 02:06:20;U39.OPPIC161.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U39.OPPIC161.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U39.OPPIC161.F_CV;11.999992371;100.0 +25/10/2020 02:06:38;U39.OPPIC161.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U39.OPPIC161.F_CV;11.999992371;100.0 +25/10/2020 02:06:42;U39.OPPIC161.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U39.OPPIC161.F_CV;11.999992371;100.0 +25/10/2020 02:06:45;U39.OPPIC161.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U39.OPPIC261.F_CV;99.999992371;100.0 +25/10/2020 02:06:42;U39.OPPIC361.F_CV;99.999992371;100.0 +25/10/2020 02:06:42;U39.OPPIC461.F_CV;99.999992371;100.0 +25/10/2020 02:06:42;U39.OPTIC101.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U39.OPTIC102.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U39.OPTIC103.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U39.OPTIC108.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U39.OPTIC108.F_CV;39.999992371;100.0 +25/10/2020 02:06:03;U39.OPTIC108.F_CV;33.999992371;100.0 +25/10/2020 02:06:05;U39.OPTIC108.F_CV;30.999992371;100.0 +25/10/2020 02:06:07;U39.OPTIC108.F_CV;32.999992371;100.0 +25/10/2020 02:06:09;U39.OPTIC108.F_CV;35.999992371;100.0 +25/10/2020 02:06:11;U39.OPTIC108.F_CV;90.999992371;100.0 +25/10/2020 02:06:12;U39.OPTIC108.F_CV;37.999992371;100.0 +25/10/2020 02:06:14;U39.OPTIC108.F_CV;93.999992371;100.0 +25/10/2020 02:06:16;U39.OPTIC108.F_CV;40.999992371;100.0 +25/10/2020 02:06:18;U39.OPTIC108.F_CV;45.999992371;100.0 +25/10/2020 02:06:21;U39.OPTIC108.F_CV;50.999992371;100.0 +25/10/2020 02:06:23;U39.OPTIC108.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U39.OPTIC108.F_CV;51.999992371;100.0 +25/10/2020 02:06:27;U39.OPTIC108.F_CV;46.999992371;100.0 +25/10/2020 02:06:31;U39.OPTIC108.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U39.OPTIC108.F_CV;41.999992371;100.0 +25/10/2020 02:06:34;U39.OPTIC108.F_CV;40.999992371;100.0 +25/10/2020 02:06:38;U39.OPTIC108.F_CV;39.999992371;100.0 +25/10/2020 02:06:40;U39.OPTIC108.F_CV;96.999992371;100.0 +25/10/2020 02:06:42;U39.OPTIC108.F_CV;99.999992371;100.0 +25/10/2020 02:06:45;U39.OPTIC108.F_CV;65.999992371;100.0 +25/10/2020 02:06:47;U39.OPTIC108.F_CV;14.999992371;100.0 +25/10/2020 02:06:49;U39.OPTIC108.F_CV;69.999992371;100.0 +25/10/2020 02:06:51;U39.OPTIC108.F_CV;71.999992371;100.0 +25/10/2020 02:06:52;U39.OPTIC108.F_CV;74.999992371;100.0 +25/10/2020 02:06:54;U39.OPTIC108.F_CV;76.999992371;100.0 +25/10/2020 02:06:56;U39.OPTIC108.F_CV;16.999992371;100.0 +25/10/2020 02:06:58;U39.OPTIC108.F_CV;64.999992371;100.0 +25/10/2020 02:06:42;U39.OPTIC120.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U39.OPTIC201.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U39.OPTIC202.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U39.OPTIC203.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U39.OPTIC208.F_CV;22.999992371;100.0 +25/10/2020 02:06:01;U39.OPTIC208.F_CV;23.999992371;100.0 +25/10/2020 02:06:03;U39.OPTIC208.F_CV;24.999992371;100.0 +25/10/2020 02:06:05;U39.OPTIC208.F_CV;19.999992371;100.0 +25/10/2020 02:06:22;U39.OPTIC208.F_CV;19.999992371;100.0 +25/10/2020 02:06:23;U39.OPTIC208.F_CV;76.999992371;100.0 +25/10/2020 02:06:25;U39.OPTIC208.F_CV;25.999992371;100.0 +25/10/2020 02:06:29;U39.OPTIC208.F_CV;26.999992371;100.0 +25/10/2020 02:06:31;U39.OPTIC208.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U39.OPTIC208.F_CV;22.999992371;100.0 +25/10/2020 02:06:34;U39.OPTIC208.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U39.OPTIC208.F_CV;16.999992371;100.0 +25/10/2020 02:06:40;U39.OPTIC208.F_CV;15.999992371;100.0 +25/10/2020 02:06:42;U39.OPTIC208.F_CV;14.999992371;100.0 +25/10/2020 02:06:45;U39.OPTIC208.F_CV;13.999992371;100.0 +25/10/2020 02:06:47;U39.OPTIC208.F_CV;12.999992371;100.0 +25/10/2020 02:06:49;U39.OPTIC208.F_CV;69.999992371;100.0 +25/10/2020 02:06:51;U39.OPTIC208.F_CV;17.999992371;100.0 +25/10/2020 02:06:54;U39.OPTIC208.F_CV;22.999992371;100.0 +25/10/2020 02:06:58;U39.OPTIC208.F_CV;24.999992371;100.0 +25/10/2020 02:06:42;U39.OPTIC301.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U39.OPTIC302.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U39.OPTIC303.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U39.OPTIC308.F_CV;36.999992371;100.0 +25/10/2020 02:06:01;U39.OPTIC308.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U39.OPTIC308.F_CV;40.999992371;100.0 +25/10/2020 02:06:05;U39.OPTIC308.F_CV;37.999992371;100.0 +25/10/2020 02:06:07;U39.OPTIC308.F_CV;33.999992371;100.0 +25/10/2020 02:06:09;U39.OPTIC308.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U39.OPTIC308.F_CV;23.999992371;100.0 +25/10/2020 02:06:16;U39.OPTIC308.F_CV;11.999992371;100.0 +25/10/2020 02:06:18;U39.OPTIC308.F_CV;9.999992371;100.0 +25/10/2020 02:06:20;U39.OPTIC308.F_CV;3.999992371;100.0 +25/10/2020 02:06:21;U39.OPTIC308.F_CV;1.999992371;100.0 +25/10/2020 02:06:23;U39.OPTIC308.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U39.OPTIC308.F_CV;55.999992371;100.0 +25/10/2020 02:06:29;U39.OPTIC308.F_CV;0.999992371;100.0 +25/10/2020 02:06:31;U39.OPTIC308.F_CV;4.999992371;100.0 +25/10/2020 02:06:32;U39.OPTIC308.F_CV;60.999992371;100.0 +25/10/2020 02:06:34;U39.OPTIC308.F_CV;13.999992371;100.0 +25/10/2020 02:06:36;U39.OPTIC308.F_CV;18.999992371;100.0 +25/10/2020 02:06:38;U39.OPTIC308.F_CV;24.999992371;100.0 +25/10/2020 02:06:40;U39.OPTIC308.F_CV;82.999992371;100.0 +25/10/2020 02:06:42;U39.OPTIC308.F_CV;33.999992371;100.0 +25/10/2020 02:06:43;U39.OPTIC308.F_CV;41.999992371;100.0 +25/10/2020 02:06:45;U39.OPTIC308.F_CV;43.999992371;100.0 +25/10/2020 02:06:47;U39.OPTIC308.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U39.OPTIC308.F_CV;42.999992371;100.0 +25/10/2020 02:06:51;U39.OPTIC308.F_CV;39.999992371;100.0 +25/10/2020 02:06:52;U39.OPTIC308.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U39.OPTIC308.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U39.OPTIC308.F_CV;20.999992371;100.0 +25/10/2020 02:06:42;U39.OPTIC320.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U39.OPTIC401.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U39.OPTIC402.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U39.OPTIC403.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U39.OPTIC408.F_CV;99.999992371;100.0 +25/10/2020 02:06:05;U39.OPTIC408.F_CV;96.999992371;100.0 +25/10/2020 02:06:07;U39.OPTIC408.F_CV;99.999992371;100.0 +25/10/2020 02:06:11;U39.OPTIC408.F_CV;43.999992371;100.0 +25/10/2020 02:06:12;U39.OPTIC408.F_CV;97.999992371;100.0 +25/10/2020 02:06:14;U39.OPTIC408.F_CV;41.999992371;100.0 +25/10/2020 02:06:16;U39.OPTIC408.F_CV;95.999992371;100.0 +25/10/2020 02:06:18;U39.OPTIC408.F_CV;39.999992371;100.0 +25/10/2020 02:06:20;U39.OPTIC408.F_CV;92.999992371;100.0 +25/10/2020 02:06:21;U39.OPTIC408.F_CV;87.999992371;100.0 +25/10/2020 02:06:25;U39.OPTIC408.F_CV;29.999992371;100.0 +25/10/2020 02:06:27;U39.OPTIC408.F_CV;81.999992371;100.0 +25/10/2020 02:06:29;U39.OPTIC408.F_CV;74.999992371;100.0 +25/10/2020 02:06:31;U39.OPTIC408.F_CV;73.999992371;100.0 +25/10/2020 02:06:34;U39.OPTIC408.F_CV;65.999992371;100.0 +25/10/2020 02:06:38;U39.OPTIC408.F_CV;61.999992371;100.0 +25/10/2020 02:06:40;U39.OPTIC408.F_CV;60.999992371;100.0 +25/10/2020 02:06:42;U39.OPTIC408.F_CV;57.999992371;100.0 +25/10/2020 02:06:43;U39.OPTIC408.F_CV;55.999992371;100.0 +25/10/2020 02:06:45;U39.OPTIC408.F_CV;53.999992371;100.0 +25/10/2020 02:06:47;U39.OPTIC408.F_CV;99.999992371;100.0 +25/10/2020 02:06:49;U39.OPTIC408.F_CV;55.999992371;100.0 +25/10/2020 02:06:51;U39.OPTIC408.F_CV;54.999992371;100.0 +25/10/2020 02:06:52;U39.OPTIC408.F_CV;58.999992371;100.0 +25/10/2020 02:06:56;U39.OPTIC408.F_CV;62.999992371;100.0 +25/10/2020 02:06:58;U39.OPTIC408.F_CV;99.999992371;100.0 +25/10/2020 02:06:42;U39.OPTIC61.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U39.PI_P100.F_CV;-0.000007629;100.0 +25/10/2020 02:06:42;U39.PI_P200.F_CV;-0.000007629;100.0 +25/10/2020 02:06:42;U39.PI_P300.F_CV;-0.000007629;100.0 +25/10/2020 02:06:42;U39.PI_P400.F_CV;-0.000007629;100.0 +25/10/2020 02:06:59;U39.PT11.F_CV;72.299949646;100.0 +25/10/2020 02:06:42;U39.PT132.F_CV;-0.200049594;100.0 +25/10/2020 02:06:42;U39.PT161.F_CV;-0.200049594;100.0 +25/10/2020 02:06:42;U39.PT21.F_CV;63.699951172;100.0 +25/10/2020 02:06:42;U39.PT232.F_CV;0.099950410;100.0 +25/10/2020 02:06:42;U39.PT261.F_CV;0.199950412;100.0 +25/10/2020 02:06:42;U39.PT332.F_CV;0.199950412;100.0 +25/10/2020 02:06:42;U39.PT361.F_CV;0.599950433;100.0 +25/10/2020 02:06:42;U39.PT432.F_CV;0.199950412;100.0 +25/10/2020 02:06:42;U39.PT461.F_CV;1.199950457;100.0 +25/10/2020 02:06:42;U39.SEQ_ACT_R100.F_CV;127.999992371;100.0 +25/10/2020 02:06:42;U39.SEQ_ACT_R200.F_CV;87.999992371;100.0 +25/10/2020 02:06:42;U39.SEQ_ACT_R300.F_CV;87.999992371;100.0 +25/10/2020 02:06:42;U39.SEQ_ACT_R400.F_CV;87.999992371;100.0 +25/10/2020 02:06:42;U39.TI100.F_CV;29.499950409;100.0 +25/10/2020 02:06:04;U39.TI101.F_CV;23.999992371;100.0 +25/10/2020 02:06:04;U39.TI102.F_CV;23.999992371;100.0 +25/10/2020 02:06:34;U39.TI103.F_CV;23.999992371;100.0 +25/10/2020 02:06:42;U39.TI104.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U39.TI105.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U39.TI106.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U39.TI107.F_CV;600.000000000;100.0 +25/10/2020 02:06:28;U39.TI108.F_CV;179.999984741;100.0 +25/10/2020 02:06:32;U39.TI110.F_CV;21.999992371;100.0 +25/10/2020 02:06:04;U39.TI121.F_CV;23.999992371;100.0 +25/10/2020 02:06:03;U39.TI201.F_CV;23.999992371;100.0 +25/10/2020 02:06:56;U39.TI202.F_CV;23.999992371;100.0 +25/10/2020 02:06:04;U39.TI203.F_CV;23.999992371;100.0 +25/10/2020 02:06:42;U39.TI204.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U39.TI205.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U39.TI206.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U39.TI207.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U39.TI208.F_CV;179.999984741;100.0 +25/10/2020 02:06:50;U39.TI210.F_CV;21.999992371;100.0 +25/10/2020 02:06:01;U39.TI301.F_CV;24.999992371;100.0 +25/10/2020 02:06:02;U39.TI301.F_CV;23.999992371;100.0 +25/10/2020 02:06:04;U39.TI301.F_CV;24.999992371;100.0 +25/10/2020 02:06:30;U39.TI302.F_CV;23.999992371;100.0 +25/10/2020 02:06:24;U39.TI303.F_CV;23.999992371;100.0 +25/10/2020 02:06:42;U39.TI304.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U39.TI305.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U39.TI306.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U39.TI307.F_CV;600.000000000;100.0 +25/10/2020 02:06:55;U39.TI308.F_CV;179.999984741;100.0 +25/10/2020 02:06:41;U39.TI310.F_CV;23.999992371;100.0 +25/10/2020 02:06:42;U39.TI310.F_CV;24.999992371;100.0 +25/10/2020 02:06:56;U39.TI321.F_CV;23.999992371;100.0 +25/10/2020 02:06:05;U39.TI401.F_CV;23.999992371;100.0 +25/10/2020 02:06:06;U39.TI402.F_CV;23.999992371;100.0 +25/10/2020 02:06:02;U39.TI403.F_CV;23.999992371;100.0 +25/10/2020 02:06:42;U39.TI404.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U39.TI405.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U39.TI406.F_CV;600.000000000;100.0 +25/10/2020 02:06:42;U39.TI407.F_CV;600.000000000;100.0 +25/10/2020 02:06:30;U39.TI408.F_CV;179.999984741;100.0 +25/10/2020 02:06:19;U39.TI410.F_CV;23.999992371;100.0 +25/10/2020 02:06:43;U39.TI42.F_CV;21.999992371;100.0 +25/10/2020 02:06:05;U39.TI52.F_CV;21.999992371;100.0 +25/10/2020 02:06:02;U39.TI61.F_CV;22.999992371;100.0 +25/10/2020 02:06:23;U39.TI62.F_CV;19.999992371;100.0 +25/10/2020 02:06:42;U39.U39_RUN1.F_CV;-0.000000000;100.0 +25/10/2020 02:06:42;U39.U39_RUN2.F_CV;-0.000000000;100.0 +25/10/2020 02:06:42;U39.UV71.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U453.FC01_OP.F_CV;13.057145119;100.0 +25/10/2020 02:06:45;U453.FC01_PV.F_CV;3.866025686;100.0 +25/10/2020 02:06:57;U453.FC01_PV.F_CV;3.876401901;100.0 +25/10/2020 02:06:47;U453.FC03_OP.F_CV;28.305484772;100.0 +25/10/2020 02:06:05;U453.FC03_PV.F_CV;5.213092327;100.0 +25/10/2020 02:06:07;U453.FC03_PV.F_CV;5.224078655;100.0 +25/10/2020 02:06:10;U453.FC03_PV.F_CV;5.213702679;100.0 +25/10/2020 02:06:19;U453.FC03_PV.F_CV;5.227130413;100.0 +25/10/2020 02:06:22;U453.FC03_PV.F_CV;5.214313030;100.0 +25/10/2020 02:06:25;U453.FC03_PV.F_CV;5.225909710;100.0 +25/10/2020 02:06:28;U453.FC03_PV.F_CV;5.211871624;100.0 +25/10/2020 02:06:30;U453.FC03_PV.F_CV;5.224689007;100.0 +25/10/2020 02:06:32;U453.FC03_PV.F_CV;5.213702679;100.0 +25/10/2020 02:06:18;U453.FC05_OP.F_CV;20.975051880;100.0 +25/10/2020 02:06:00;U453.FC05_PV.F_CV;9.283589363;100.0 +25/10/2020 02:06:01;U453.FC05_PV.F_CV;9.181658745;100.0 +25/10/2020 02:06:02;U453.FC05_PV.F_CV;9.312886238;100.0 +25/10/2020 02:06:03;U453.FC05_PV.F_CV;9.394063950;100.0 +25/10/2020 02:06:04;U453.FC05_PV.F_CV;9.252460480;100.0 +25/10/2020 02:06:06;U453.FC05_PV.F_CV;9.378194809;100.0 +25/10/2020 02:06:07;U453.FC05_PV.F_CV;9.188982964;100.0 +25/10/2020 02:06:08;U453.FC05_PV.F_CV;9.361715317;100.0 +25/10/2020 02:06:09;U453.FC05_PV.F_CV;9.211565971;100.0 +25/10/2020 02:06:10;U453.FC05_PV.F_CV;9.289082527;100.0 +25/10/2020 02:06:11;U453.FC05_PV.F_CV;9.342183113;100.0 +25/10/2020 02:06:12;U453.FC05_PV.F_CV;9.250629425;100.0 +25/10/2020 02:06:13;U453.FC05_PV.F_CV;9.272602081;100.0 +25/10/2020 02:06:15;U453.FC05_PV.F_CV;9.365987778;100.0 +25/10/2020 02:06:17;U453.FC05_PV.F_CV;9.291523933;100.0 +25/10/2020 02:06:19;U453.FC05_PV.F_CV;9.241474152;100.0 +25/10/2020 02:06:22;U453.FC05_PV.F_CV;9.320820808;100.0 +25/10/2020 02:06:23;U453.FC05_PV.F_CV;9.251850128;100.0 +25/10/2020 02:06:24;U453.FC05_PV.F_CV;9.313496590;100.0 +25/10/2020 02:06:25;U453.FC05_PV.F_CV;9.221942902;100.0 +25/10/2020 02:06:26;U453.FC05_PV.F_CV;9.206683159;100.0 +25/10/2020 02:06:27;U453.FC05_PV.F_CV;9.257343292;100.0 +25/10/2020 02:06:28;U453.FC05_PV.F_CV;9.395895004;100.0 +25/10/2020 02:06:29;U453.FC05_PV.F_CV;9.198138237;100.0 +25/10/2020 02:06:30;U453.FC05_PV.F_CV;9.281147003;100.0 +25/10/2020 02:06:31;U453.FC05_PV.F_CV;9.214617729;100.0 +25/10/2020 02:06:32;U453.FC05_PV.F_CV;9.267719269;100.0 +25/10/2020 02:06:33;U453.FC05_PV.F_CV;9.171282768;100.0 +25/10/2020 02:06:34;U453.FC05_PV.F_CV;9.252460480;100.0 +25/10/2020 02:06:35;U453.FC05_PV.F_CV;9.284810066;100.0 +25/10/2020 02:06:37;U453.FC05_PV.F_CV;9.267719269;100.0 +25/10/2020 02:06:39;U453.FC05_PV.F_CV;9.118181229;100.0 +25/10/2020 02:06:40;U453.FC05_PV.F_CV;9.258563995;100.0 +25/10/2020 02:06:41;U453.FC05_PV.F_CV;9.222553253;100.0 +25/10/2020 02:06:42;U453.FC05_PV.F_CV;9.297017097;100.0 +25/10/2020 02:06:43;U453.FC05_PV.F_CV;9.314106941;100.0 +25/10/2020 02:06:44;U453.FC05_PV.F_CV;9.378805161;100.0 +25/10/2020 02:06:45;U453.FC05_PV.F_CV;9.254291534;100.0 +25/10/2020 02:06:47;U453.FC05_PV.F_CV;9.326313972;100.0 +25/10/2020 02:06:48;U453.FC05_PV.F_CV;9.251850128;100.0 +25/10/2020 02:06:49;U453.FC05_PV.F_CV;9.220722198;100.0 +25/10/2020 02:06:50;U453.FC05_PV.F_CV;9.297627449;100.0 +25/10/2020 02:06:52;U453.FC05_PV.F_CV;9.226215363;100.0 +25/10/2020 02:06:55;U453.FC05_PV.F_CV;9.242694855;100.0 +25/10/2020 02:06:56;U453.FC05_PV.F_CV;9.223163605;100.0 +25/10/2020 02:06:57;U453.FC05_PV.F_CV;9.409323692;100.0 +25/10/2020 02:06:58;U453.FC05_PV.F_CV;9.264667511;100.0 +25/10/2020 02:06:59;U453.FC05_PV.F_CV;9.199358940;100.0 +25/10/2020 02:06:24;U453.FC07_OP.F_CV;28.854810715;100.0 +25/10/2020 02:06:00;U453.FC07_PV.F_CV;1.926298976;100.0 +25/10/2020 02:06:05;U453.FC07_PV.F_CV;1.929045558;100.0 +25/10/2020 02:06:06;U453.FC07_PV.F_CV;1.925383329;100.0 +25/10/2020 02:06:08;U453.FC07_PV.F_CV;1.928435206;100.0 +25/10/2020 02:06:09;U453.FC07_PV.F_CV;1.925078154;100.0 +25/10/2020 02:06:15;U453.FC07_PV.F_CV;1.928435206;100.0 +25/10/2020 02:06:17;U453.FC07_PV.F_CV;1.918059111;100.0 +25/10/2020 02:06:18;U453.FC07_PV.F_CV;1.924467802;100.0 +25/10/2020 02:06:21;U453.FC07_PV.F_CV;1.929045558;100.0 +25/10/2020 02:06:22;U453.FC07_PV.F_CV;1.925688505;100.0 +25/10/2020 02:06:25;U453.FC07_PV.F_CV;1.928435206;100.0 +25/10/2020 02:06:30;U453.FC07_PV.F_CV;1.922331572;100.0 +25/10/2020 02:06:31;U453.FC07_PV.F_CV;1.926604152;100.0 +25/10/2020 02:06:34;U453.FC07_PV.F_CV;1.923857450;100.0 +25/10/2020 02:06:35;U453.FC07_PV.F_CV;1.927824855;100.0 +25/10/2020 02:06:40;U453.FC07_PV.F_CV;1.923552275;100.0 +25/10/2020 02:06:42;U453.FC07_PV.F_CV;1.926604152;100.0 +25/10/2020 02:06:46;U453.FC07_PV.F_CV;1.922941923;100.0 +25/10/2020 02:06:47;U453.FC07_PV.F_CV;1.926604152;100.0 +25/10/2020 02:06:49;U453.FC07_PV.F_CV;1.923247099;100.0 +25/10/2020 02:06:51;U453.FC07_PV.F_CV;1.926298976;100.0 +25/10/2020 02:06:47;U453.FC08_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;U453.FC08_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;U453.FC09_OP.F_CV;16.913099289;100.0 +25/10/2020 02:06:03;U453.FC09_PV.F_CV;2.598611355;100.0 +25/10/2020 02:06:05;U453.FC09_PV.F_CV;2.602273703;100.0 +25/10/2020 02:06:10;U453.FC09_PV.F_CV;2.598001003;100.0 +25/10/2020 02:06:12;U453.FC09_PV.F_CV;2.601968527;100.0 +25/10/2020 02:06:19;U453.FC09_PV.F_CV;2.598916531;100.0 +25/10/2020 02:06:22;U453.FC09_PV.F_CV;2.602578878;100.0 +25/10/2020 02:06:26;U453.FC09_PV.F_CV;2.599221706;100.0 +25/10/2020 02:06:32;U453.FC09_PV.F_CV;2.602273703;100.0 +25/10/2020 02:06:35;U453.FC09_PV.F_CV;2.599221706;100.0 +25/10/2020 02:06:37;U453.FC09_PV.F_CV;2.601968527;100.0 +25/10/2020 02:06:38;U453.FC09_PV.F_CV;2.598306179;100.0 +25/10/2020 02:06:40;U453.FC09_PV.F_CV;2.601968527;100.0 +25/10/2020 02:06:42;U453.FC09_PV.F_CV;2.599221706;100.0 +25/10/2020 02:06:44;U453.FC09_PV.F_CV;2.601968527;100.0 +25/10/2020 02:06:45;U453.FC09_PV.F_CV;2.599221706;100.0 +25/10/2020 02:06:47;U453.FC09_PV.F_CV;2.602578878;100.0 +25/10/2020 02:06:52;U453.FC09_PV.F_CV;2.599221706;100.0 +25/10/2020 02:06:58;U453.FC09_PV.F_CV;2.602884054;100.0 +25/10/2020 02:06:59;U453.FC09_PV.F_CV;2.599526882;100.0 +25/10/2020 02:06:47;U453.FC10_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;U453.FC10_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:20;U453.FC11_OP.F_CV;22.432287216;100.0 +25/10/2020 02:06:00;U453.FC11_PV.F_CV;4.645456791;100.0 +25/10/2020 02:06:01;U453.FC11_PV.F_CV;4.656443119;100.0 +25/10/2020 02:06:03;U453.FC11_PV.F_CV;4.640268326;100.0 +25/10/2020 02:06:05;U453.FC11_PV.F_CV;4.644236088;100.0 +25/10/2020 02:06:06;U453.FC11_PV.F_CV;4.654917240;100.0 +25/10/2020 02:06:07;U453.FC11_PV.F_CV;4.652170658;100.0 +25/10/2020 02:06:08;U453.FC11_PV.F_CV;4.629281998;100.0 +25/10/2020 02:06:09;U453.FC11_PV.F_CV;4.650034428;100.0 +25/10/2020 02:06:10;U453.FC11_PV.F_CV;4.625925064;100.0 +25/10/2020 02:06:12;U453.FC11_PV.F_CV;4.631418228;100.0 +25/10/2020 02:06:13;U453.FC11_PV.F_CV;4.646982670;100.0 +25/10/2020 02:06:16;U453.FC11_PV.F_CV;4.625619888;100.0 +25/10/2020 02:06:17;U453.FC11_PV.F_CV;4.630197525;100.0 +25/10/2020 02:06:18;U453.FC11_PV.F_CV;4.617685318;100.0 +25/10/2020 02:06:19;U453.FC11_PV.F_CV;4.610666275;100.0 +25/10/2020 02:06:21;U453.FC11_PV.F_CV;4.630197525;100.0 +25/10/2020 02:06:22;U453.FC11_PV.F_CV;4.610055923;100.0 +25/10/2020 02:06:23;U453.FC11_PV.F_CV;4.643015385;100.0 +25/10/2020 02:06:24;U453.FC11_PV.F_CV;4.621957779;100.0 +25/10/2020 02:06:25;U453.FC11_PV.F_CV;4.639963150;100.0 +25/10/2020 02:06:27;U453.FC11_PV.F_CV;4.649729252;100.0 +25/10/2020 02:06:29;U453.FC11_PV.F_CV;4.572823524;100.0 +25/10/2020 02:06:30;U453.FC11_PV.F_CV;4.641184330;100.0 +25/10/2020 02:06:31;U453.FC11_PV.F_CV;4.567025185;100.0 +25/10/2020 02:06:32;U453.FC11_PV.F_CV;4.611276627;100.0 +25/10/2020 02:06:33;U453.FC11_PV.F_CV;4.599069118;100.0 +25/10/2020 02:06:34;U453.FC11_PV.F_CV;4.645761967;100.0 +25/10/2020 02:06:35;U453.FC11_PV.F_CV;4.635080338;100.0 +25/10/2020 02:06:37;U453.FC11_PV.F_CV;4.628671646;100.0 +25/10/2020 02:06:38;U453.FC11_PV.F_CV;4.645761967;100.0 +25/10/2020 02:06:39;U453.FC11_PV.F_CV;4.627756119;100.0 +25/10/2020 02:06:40;U453.FC11_PV.F_CV;4.641489506;100.0 +25/10/2020 02:06:41;U453.FC11_PV.F_CV;4.614938736;100.0 +25/10/2020 02:06:42;U453.FC11_PV.F_CV;4.603341579;100.0 +25/10/2020 02:06:43;U453.FC11_PV.F_CV;4.628061295;100.0 +25/10/2020 02:06:46;U453.FC11_PV.F_CV;4.643930912;100.0 +25/10/2020 02:06:47;U453.FC11_PV.F_CV;4.633249283;100.0 +25/10/2020 02:06:50;U453.FC11_PV.F_CV;4.643320560;100.0 +25/10/2020 02:06:51;U453.FC11_PV.F_CV;4.636301041;100.0 +25/10/2020 02:06:52;U453.FC11_PV.F_CV;4.598153591;100.0 +25/10/2020 02:06:53;U453.FC11_PV.F_CV;4.613107681;100.0 +25/10/2020 02:06:55;U453.FC11_PV.F_CV;4.572823524;100.0 +25/10/2020 02:06:56;U453.FC11_PV.F_CV;4.624399185;100.0 +25/10/2020 02:06:57;U453.FC11_PV.F_CV;4.610666275;100.0 +25/10/2020 02:06:59;U453.FC11_PV.F_CV;4.660410404;100.0 +25/10/2020 02:06:47;U453.FC12_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;U453.FC12_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;U453.FC13_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U453.FC13_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U453.FC14_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:58;U453.FC14_PV.F_CV;0.033264667;100.0 +25/10/2020 02:06:21;U453.FC15_OP.F_CV;25.435262680;100.0 +25/10/2020 02:06:01;U453.FC15_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U453.FC15_PV.F_CV;0.072938122;100.0 +25/10/2020 02:06:03;U453.FC15_PV.F_CV;0.013427939;100.0 +25/10/2020 02:06:04;U453.FC15_PV.F_CV;0.079041734;100.0 +25/10/2020 02:06:05;U453.FC15_PV.F_CV;0.196536198;100.0 +25/10/2020 02:06:06;U453.FC15_PV.F_CV;0.275577933;100.0 +25/10/2020 02:06:07;U453.FC15_PV.F_CV;0.027771421;100.0 +25/10/2020 02:06:08;U453.FC15_PV.F_CV;0.052796215;100.0 +25/10/2020 02:06:09;U453.FC15_PV.F_CV;0.162050813;100.0 +25/10/2020 02:06:10;U453.FC15_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U453.FC15_PV.F_CV;0.152590215;100.0 +25/10/2020 02:06:12;U453.FC15_PV.F_CV;0.063477531;100.0 +25/10/2020 02:06:13;U453.FC15_PV.F_CV;0.214236662;100.0 +25/10/2020 02:06:15;U453.FC15_PV.F_CV;0.120546274;100.0 +25/10/2020 02:06:16;U453.FC15_PV.F_CV;0.101014726;100.0 +25/10/2020 02:06:17;U453.FC15_PV.F_CV;0.218814373;100.0 +25/10/2020 02:06:18;U453.FC15_PV.F_CV;0.079041734;100.0 +25/10/2020 02:06:19;U453.FC15_PV.F_CV;0.214236662;100.0 +25/10/2020 02:06:20;U453.FC15_PV.F_CV;0.017395286;100.0 +25/10/2020 02:06:21;U453.FC15_PV.F_CV;0.065613791;100.0 +25/10/2020 02:06:22;U453.FC15_PV.F_CV;0.192568853;100.0 +25/10/2020 02:06:25;U453.FC15_PV.F_CV;0.028076600;100.0 +25/10/2020 02:06:26;U453.FC15_PV.F_CV;0.086976424;100.0 +25/10/2020 02:06:27;U453.FC15_PV.F_CV;0.063782714;100.0 +25/10/2020 02:06:28;U453.FC15_PV.F_CV;0.305790812;100.0 +25/10/2020 02:06:29;U453.FC15_PV.F_CV;0.046387427;100.0 +25/10/2020 02:06:30;U453.FC15_PV.F_CV;0.129701689;100.0 +25/10/2020 02:06:32;U453.FC15_PV.F_CV;0.200198367;100.0 +25/10/2020 02:06:33;U453.FC15_PV.F_CV;0.126344696;100.0 +25/10/2020 02:06:34;U453.FC15_PV.F_CV;0.157473102;100.0 +25/10/2020 02:06:35;U453.FC15_PV.F_CV;0.055542842;100.0 +25/10/2020 02:06:37;U453.FC15_PV.F_CV;0.147096977;100.0 +25/10/2020 02:06:39;U453.FC15_PV.F_CV;0.111696042;100.0 +25/10/2020 02:06:40;U453.FC15_PV.F_CV;0.255436033;100.0 +25/10/2020 02:06:41;U453.FC15_PV.F_CV;0.137941554;100.0 +25/10/2020 02:06:42;U453.FC15_PV.F_CV;0.093385212;100.0 +25/10/2020 02:06:43;U453.FC15_PV.F_CV;0.210269317;100.0 +25/10/2020 02:06:44;U453.FC15_PV.F_CV;0.085755706;100.0 +25/10/2020 02:06:45;U453.FC15_PV.F_CV;0.029907683;100.0 +25/10/2020 02:06:46;U453.FC15_PV.F_CV;0.296940565;100.0 +25/10/2020 02:06:47;U453.FC15_PV.F_CV;0.150759131;100.0 +25/10/2020 02:06:48;U453.FC15_PV.F_CV;0.115358204;100.0 +25/10/2020 02:06:49;U453.FC15_PV.F_CV;0.028076600;100.0 +25/10/2020 02:06:50;U453.FC15_PV.F_CV;0.094911113;100.0 +25/10/2020 02:06:51;U453.FC15_PV.F_CV;0.139467463;100.0 +25/10/2020 02:06:52;U453.FC15_PV.F_CV;0.033875030;100.0 +25/10/2020 02:06:53;U453.FC15_PV.F_CV;0.097047381;100.0 +25/10/2020 02:06:55;U453.FC15_PV.F_CV;0.115053028;100.0 +25/10/2020 02:06:56;U453.FC15_PV.F_CV;0.037537195;100.0 +25/10/2020 02:06:58;U453.FC15_PV.F_CV;0.167544067;100.0 +25/10/2020 02:06:59;U453.FC15_PV.F_CV;0.133363858;100.0 +25/10/2020 02:06:47;U453.FC16_OP.F_CV;23.265430450;100.0 +25/10/2020 02:06:47;U453.FC16_PV.F_CV;0.052185856;100.0 +25/10/2020 02:06:47;U453.FQ17.F_CV;10678.752929688;100.0 +25/10/2020 02:06:47;U453.FQ17_PV.F_CV;9999.000000000;100.0 +25/10/2020 02:06:47;U453.FQ18.F_CV;8343.022460938;100.0 +25/10/2020 02:06:47;U453.FQ18_PV.F_CV;8342.951171875;100.0 +25/10/2020 02:06:47;U453.FQ19.F_CV;9143.429687500;100.0 +25/10/2020 02:06:47;U453.FQ19_PV.F_CV;9143.359375000;100.0 +25/10/2020 02:06:47;U453.LI10.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U453.LI20.F_CV;999.000000000;100.0 +25/10/2020 02:06:47;U453.LI30.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U453.PI10.F_CV;21.691843033;100.0 +25/10/2020 02:06:16;U453.PI10.F_CV;21.743780136;100.0 +25/10/2020 02:06:19;U453.PI10.F_CV;21.440481186;100.0 +25/10/2020 02:06:22;U453.PI10.F_CV;21.339498520;100.0 +25/10/2020 02:06:28;U453.PI10.F_CV;21.312837601;100.0 +25/10/2020 02:06:37;U453.PI10.F_CV;21.375249863;100.0 +25/10/2020 02:06:05;U453.PI20.F_CV;21.696958542;100.0 +25/10/2020 02:06:13;U453.PI20.F_CV;21.723768234;100.0 +25/10/2020 02:06:20;U453.PI30.F_CV;20.509809494;100.0 +25/10/2020 02:06:24;U453.PI30.F_CV;20.433111191;100.0 +25/10/2020 02:06:28;U453.PI30.F_CV;20.465669632;100.0 +25/10/2020 02:06:35;U453.PI30.F_CV;20.439237595;100.0 +25/10/2020 02:06:02;U453.SC01_PV.F_CV;822.995361328;100.0 +25/10/2020 02:06:05;U453.SC01_PV.F_CV;827.992675781;100.0 +25/10/2020 02:06:06;U453.SC01_PV.F_CV;822.995361328;100.0 +25/10/2020 02:06:11;U453.SC01_PV.F_CV;827.000854492;100.0 +25/10/2020 02:06:13;U453.SC01_PV.F_CV;831.006347656;100.0 +25/10/2020 02:06:17;U453.SC01_PV.F_CV;819.981689453;100.0 +25/10/2020 02:06:18;U453.SC01_PV.F_CV;825.017150879;100.0 +25/10/2020 02:06:19;U453.SC01_PV.F_CV;821.011657715;100.0 +25/10/2020 02:06:24;U453.SC01_PV.F_CV;827.992675781;100.0 +25/10/2020 02:06:29;U453.SC01_PV.F_CV;822.003540039;100.0 +25/10/2020 02:06:30;U453.SC01_PV.F_CV;823.987182617;100.0 +25/10/2020 02:06:31;U453.SC01_PV.F_CV;819.981689453;100.0 +25/10/2020 02:06:32;U453.SC01_PV.F_CV;822.003540039;100.0 +25/10/2020 02:06:34;U453.SC01_PV.F_CV;819.981689453;100.0 +25/10/2020 02:06:35;U453.SC01_PV.F_CV;822.995361328;100.0 +25/10/2020 02:06:39;U453.SC01_PV.F_CV;821.011657715;100.0 +25/10/2020 02:06:44;U453.SC01_PV.F_CV;827.000854492;100.0 +25/10/2020 02:06:45;U453.SC01_PV.F_CV;821.011657715;100.0 +25/10/2020 02:06:47;U453.SC01_PV.F_CV;822.995361328;100.0 +25/10/2020 02:06:48;U453.SC01_PV.F_CV;817.997985840;100.0 +25/10/2020 02:06:55;U453.SC01_PV.F_CV;823.987182617;100.0 +25/10/2020 02:06:56;U453.SC01_PV.F_CV;821.011657715;100.0 +25/10/2020 02:06:04;U453.SC02_PV.F_CV;811.017028809;100.0 +25/10/2020 02:06:10;U453.SC02_PV.F_CV;808.995178223;100.0 +25/10/2020 02:06:13;U453.SC02_PV.F_CV;811.017028809;100.0 +25/10/2020 02:06:23;U453.SC02_PV.F_CV;807.011535645;100.0 +25/10/2020 02:06:47;U453.SC02_PV.F_CV;813.000671387;100.0 +25/10/2020 02:06:50;U453.SC02_PV.F_CV;811.017028809;100.0 +25/10/2020 02:06:53;U453.SC02_PV.F_CV;822.003540039;100.0 +25/10/2020 02:06:58;U453.SC02_PV.F_CV;813.992492676;100.0 +25/10/2020 02:06:06;U453.SC03_PV.F_CV;855.992980957;100.0 +25/10/2020 02:06:16;U453.SC03_PV.F_CV;864.003967285;100.0 +25/10/2020 02:06:20;U453.SC03_PV.F_CV;860.990295410;100.0 +25/10/2020 02:06:28;U453.SC03_PV.F_CV;865.987609863;100.0 +25/10/2020 02:06:39;U453.SC03_PV.F_CV;863.012145996;100.0 +25/10/2020 02:06:41;U453.SC03_PV.F_CV;860.990295410;100.0 +25/10/2020 02:06:47;U453.SC03_PV.F_CV;864.995788574;100.0 +25/10/2020 02:06:48;U453.SC03_PV.F_CV;863.012145996;100.0 +25/10/2020 02:06:51;U453.SC03_PV.F_CV;865.987609863;100.0 +25/10/2020 02:06:53;U453.SC03_PV.F_CV;864.003967285;100.0 +25/10/2020 02:06:02;U453.TC11_OP.F_CV;8.999771118;100.0 +25/10/2020 02:06:03;U453.TC11_OP.F_CV;7.600518703;100.0 +25/10/2020 02:06:07;U453.TC11_OP.F_CV;7.600518703;100.0 +25/10/2020 02:06:08;U453.TC11_OP.F_CV;8.499275208;100.0 +25/10/2020 02:06:12;U453.TC11_OP.F_CV;8.499275208;100.0 +25/10/2020 02:06:13;U453.TC11_OP.F_CV;8.700694084;100.0 +25/10/2020 02:06:18;U453.TC11_OP.F_CV;8.700694084;100.0 +25/10/2020 02:06:19;U453.TC11_OP.F_CV;6.900129795;100.0 +25/10/2020 02:06:23;U453.TC11_OP.F_CV;6.900129795;100.0 +25/10/2020 02:06:24;U453.TC11_OP.F_CV;8.200198174;100.0 +25/10/2020 02:06:29;U453.TC11_OP.F_CV;8.200198174;100.0 +25/10/2020 02:06:30;U453.TC11_OP.F_CV;10.000762939;100.0 +25/10/2020 02:06:34;U453.TC11_OP.F_CV;10.000762939;100.0 +25/10/2020 02:06:35;U453.TC11_OP.F_CV;9.799344063;100.0 +25/10/2020 02:06:40;U453.TC11_OP.F_CV;9.799344063;100.0 +25/10/2020 02:06:41;U453.TC11_OP.F_CV;8.000305176;100.0 +25/10/2020 02:06:45;U453.TC11_OP.F_CV;8.000305176;100.0 +25/10/2020 02:06:46;U453.TC11_OP.F_CV;8.499275208;100.0 +25/10/2020 02:06:50;U453.TC11_OP.F_CV;8.499275208;100.0 +25/10/2020 02:06:51;U453.TC11_OP.F_CV;10.299839973;100.0 +25/10/2020 02:06:55;U453.TC11_OP.F_CV;10.299839973;100.0 +25/10/2020 02:06:56;U453.TC11_OP.F_CV;8.599985123;100.0 +25/10/2020 02:06:12;U453.TC11_PV.F_CV;217.402908325;100.0 +25/10/2020 02:06:01;U453.TC21_OP.F_CV;9.199664116;100.0 +25/10/2020 02:06:02;U453.TC21_OP.F_CV;9.799344063;100.0 +25/10/2020 02:06:06;U453.TC21_OP.F_CV;9.799344063;100.0 +25/10/2020 02:06:07;U453.TC21_OP.F_CV;9.399557114;100.0 +25/10/2020 02:06:12;U453.TC21_OP.F_CV;9.599451065;100.0 +25/10/2020 02:06:19;U453.TC21_OP.F_CV;9.399557114;100.0 +25/10/2020 02:06:23;U453.TC21_OP.F_CV;9.399557114;100.0 +25/10/2020 02:06:24;U453.TC21_OP.F_CV;9.700160027;100.0 +25/10/2020 02:06:29;U453.TC21_OP.F_CV;9.500267029;100.0 +25/10/2020 02:06:40;U453.TC21_OP.F_CV;9.399557114;100.0 +25/10/2020 02:06:50;U453.TC21_OP.F_CV;9.599451065;100.0 +25/10/2020 02:06:54;U453.TC21_OP.F_CV;9.599451065;100.0 +25/10/2020 02:06:55;U453.TC21_OP.F_CV;9.199664116;100.0 +25/10/2020 02:06:30;U453.TC21_PV.F_CV;217.196914673;100.0 +25/10/2020 02:06:02;U453.TC31_OP.F_CV;9.599451065;100.0 +25/10/2020 02:06:06;U453.TC31_OP.F_CV;9.300374031;100.0 +25/10/2020 02:06:17;U453.TC31_OP.F_CV;9.100481033;100.0 +25/10/2020 02:06:22;U453.TC31_OP.F_CV;9.100481033;100.0 +25/10/2020 02:06:23;U453.TC31_OP.F_CV;9.399557114;100.0 +25/10/2020 02:06:28;U453.TC31_OP.F_CV;9.399557114;100.0 +25/10/2020 02:06:29;U453.TC31_OP.F_CV;9.700160027;100.0 +25/10/2020 02:06:33;U453.TC31_OP.F_CV;9.700160027;100.0 +25/10/2020 02:06:34;U453.TC31_OP.F_CV;9.399557114;100.0 +25/10/2020 02:06:40;U453.TC31_OP.F_CV;9.599451065;100.0 +25/10/2020 02:06:55;U453.TC31_OP.F_CV;9.300374031;100.0 +25/10/2020 02:06:59;U453.TC31_OP.F_CV;9.300374031;100.0 +25/10/2020 02:06:18;U453.TC31_PV.F_CV;228.496215820;100.0 +25/10/2020 02:06:17;U453.TC47.F_CV;88.699996948;100.0 +25/10/2020 02:06:59;U453.TC47.F_CV;88.000000000;100.0 +25/10/2020 02:06:09;U453.TC52_PV.F_CV;89.196609497;100.0 +25/10/2020 02:06:47;U453.TC52_PV.F_CV;89.799346924;100.0 +25/10/2020 02:06:52;U453.TC52_PV.F_CV;90.302894592;100.0 +25/10/2020 02:06:35;U453.TC53_PV.F_CV;93.896392822;100.0 +25/10/2020 02:06:46;U453.TC53_PV.F_CV;94.499122620;100.0 +25/10/2020 02:06:39;U453.TI12.F_CV;216.600006104;100.0 +25/10/2020 02:06:23;U453.TI13.F_CV;213.699996948;100.0 +25/10/2020 02:06:24;U453.TI14.F_CV;207.600006104;100.0 +25/10/2020 02:06:28;U453.TI15.F_CV;195.100006104;100.0 +25/10/2020 02:06:37;U453.TI15.F_CV;194.800003052;100.0 +25/10/2020 02:06:39;U453.TI15.F_CV;195.100006104;100.0 +25/10/2020 02:06:35;U453.TI22.F_CV;218.500000000;100.0 +25/10/2020 02:06:35;U453.TI23.F_CV;217.899993896;100.0 +25/10/2020 02:06:49;U453.TI24.F_CV;213.699996948;100.0 +25/10/2020 02:06:36;U453.TI25.F_CV;196.899993896;100.0 +25/10/2020 02:06:41;U453.TI32.F_CV;228.100006104;100.0 +25/10/2020 02:06:47;U453.TI33.F_CV;227.699996948;100.0 +25/10/2020 02:06:55;U453.TI34.F_CV;218.899993896;100.0 +25/10/2020 02:06:23;U453.TI35.F_CV;207.199996948;100.0 +25/10/2020 02:06:47;U453.TI41.F_CV;25.200000763;100.0 +25/10/2020 02:06:19;U453.TI42.F_CV;25.799999237;100.0 +25/10/2020 02:06:48;U453.TI43.F_CV;25.600000381;100.0 +25/10/2020 02:06:00;U454.AI01_PV.F_CV;0.065854251;100.0 +25/10/2020 02:06:01;U454.AI01_PV.F_CV;0.065854788;100.0 +25/10/2020 02:06:02;U454.AI01_PV.F_CV;0.065854922;100.0 +25/10/2020 02:06:03;U454.AI01_PV.F_CV;0.065854952;100.0 +25/10/2020 02:06:04;U454.AI01_PV.F_CV;0.065872386;100.0 +25/10/2020 02:06:05;U454.AI01_PV.F_CV;0.065876737;100.0 +25/10/2020 02:06:06;U454.AI01_PV.F_CV;0.065877825;100.0 +25/10/2020 02:06:07;U454.AI01_PV.F_CV;0.065878093;100.0 +25/10/2020 02:06:08;U454.AI01_PV.F_CV;0.065881342;100.0 +25/10/2020 02:06:09;U454.AI01_PV.F_CV;0.065882146;100.0 +25/10/2020 02:06:10;U454.AI01_PV.F_CV;0.065882355;100.0 +25/10/2020 02:06:11;U454.AI01_PV.F_CV;0.065882400;100.0 +25/10/2020 02:06:12;U454.AI01_PV.F_CV;0.065854460;100.0 +25/10/2020 02:06:13;U454.AI01_PV.F_CV;0.065847486;100.0 +25/10/2020 02:06:14;U454.AI01_PV.F_CV;0.065845743;100.0 +25/10/2020 02:06:15;U454.AI01_PV.F_CV;0.065845296;100.0 +25/10/2020 02:06:16;U454.AI01_PV.F_CV;0.065864623;100.0 +25/10/2020 02:06:17;U454.AI01_PV.F_CV;0.065869451;100.0 +25/10/2020 02:06:18;U454.AI01_PV.F_CV;0.065870658;100.0 +25/10/2020 02:06:19;U454.AI01_PV.F_CV;0.065870970;100.0 +25/10/2020 02:06:20;U454.AI01_PV.F_CV;0.065842003;100.0 +25/10/2020 02:06:21;U454.AI01_PV.F_CV;0.065834761;100.0 +25/10/2020 02:06:22;U454.AI01_PV.F_CV;0.065832950;100.0 +25/10/2020 02:06:23;U454.AI01_PV.F_CV;0.065832496;100.0 +25/10/2020 02:06:24;U454.AI01_PV.F_CV;0.065792598;100.0 +25/10/2020 02:06:25;U454.AI01_PV.F_CV;0.065782622;100.0 +25/10/2020 02:06:26;U454.AI01_PV.F_CV;0.065780133;100.0 +25/10/2020 02:06:27;U454.AI01_PV.F_CV;0.065779507;100.0 +25/10/2020 02:06:28;U454.AI01_PV.F_CV;0.065769300;100.0 +25/10/2020 02:06:29;U454.AI01_PV.F_CV;0.065766752;100.0 +25/10/2020 02:06:30;U454.AI01_PV.F_CV;0.065766111;100.0 +25/10/2020 02:06:31;U454.AI01_PV.F_CV;0.065765947;100.0 +25/10/2020 02:06:32;U454.AI01_PV.F_CV;0.065762743;100.0 +25/10/2020 02:06:33;U454.AI01_PV.F_CV;0.065761939;100.0 +25/10/2020 02:06:34;U454.AI01_PV.F_CV;0.065761738;100.0 +25/10/2020 02:06:35;U454.AI01_PV.F_CV;0.065761685;100.0 +25/10/2020 02:06:36;U454.AI01_PV.F_CV;0.065772727;100.0 +25/10/2020 02:06:37;U454.AI01_PV.F_CV;0.065775499;100.0 +25/10/2020 02:06:38;U454.AI01_PV.F_CV;0.065776184;100.0 +25/10/2020 02:06:39;U454.AI01_PV.F_CV;0.065776363;100.0 +25/10/2020 02:06:40;U454.AI01_PV.F_CV;0.065797314;100.0 +25/10/2020 02:06:41;U454.AI01_PV.F_CV;0.065802544;100.0 +25/10/2020 02:06:42;U454.AI01_PV.F_CV;0.065803424;100.0 +25/10/2020 02:06:43;U454.AI01_PV.F_CV;0.065804183;100.0 +25/10/2020 02:06:44;U454.AI01_PV.F_CV;0.065818056;100.0 +25/10/2020 02:06:45;U454.AI01_PV.F_CV;0.065821528;100.0 +25/10/2020 02:06:46;U454.AI01_PV.F_CV;0.065822110;100.0 +25/10/2020 02:06:47;U454.AI01_PV.F_CV;0.065822616;100.0 +25/10/2020 02:06:48;U454.AI01_PV.F_CV;0.065853953;100.0 +25/10/2020 02:06:49;U454.AI01_PV.F_CV;0.065861791;100.0 +25/10/2020 02:06:50;U454.AI01_PV.F_CV;0.065863758;100.0 +25/10/2020 02:06:51;U454.AI01_PV.F_CV;0.065864250;100.0 +25/10/2020 02:06:52;U454.AI01_PV.F_CV;0.065859392;100.0 +25/10/2020 02:06:53;U454.AI01_PV.F_CV;0.065858588;100.0 +25/10/2020 02:06:54;U454.AI01_PV.F_CV;0.065857977;100.0 +25/10/2020 02:06:55;U454.AI01_PV.F_CV;0.065857828;100.0 +25/10/2020 02:06:56;U454.AI01_PV.F_CV;0.065809429;100.0 +25/10/2020 02:06:57;U454.AI01_PV.F_CV;0.065773144;100.0 +25/10/2020 02:06:58;U454.AI01_PV.F_CV;0.065764070;100.0 +25/10/2020 02:06:59;U454.AI01_PV.F_CV;0.065761805;100.0 +25/10/2020 02:06:00;U454.AI02_PV.F_CV;0.044213548;100.0 +25/10/2020 02:06:01;U454.AI02_PV.F_CV;0.044213586;100.0 +25/10/2020 02:06:02;U454.AI02_PV.F_CV;0.044213593;100.0 +25/10/2020 02:06:03;U454.AI02_PV.F_CV;0.044165477;100.0 +25/10/2020 02:06:04;U454.AI02_PV.F_CV;0.044153452;100.0 +25/10/2020 02:06:05;U454.AI02_PV.F_CV;0.044150442;100.0 +25/10/2020 02:06:06;U454.AI02_PV.F_CV;0.044149689;100.0 +25/10/2020 02:06:07;U454.AI02_PV.F_CV;0.044149503;100.0 +25/10/2020 02:06:08;U454.AI02_PV.F_CV;0.044149458;100.0 +25/10/2020 02:06:09;U454.AI02_PV.F_CV;0.044149444;100.0 +25/10/2020 02:06:10;U454.AI02_PV.F_CV;0.044124655;100.0 +25/10/2020 02:06:11;U454.AI02_PV.F_CV;0.044118457;100.0 +25/10/2020 02:06:12;U454.AI02_PV.F_CV;0.044116907;100.0 +25/10/2020 02:06:13;U454.AI02_PV.F_CV;0.044116519;100.0 +25/10/2020 02:06:14;U454.AI02_PV.F_CV;0.044116423;100.0 +25/10/2020 02:06:15;U454.AI02_PV.F_CV;0.044116400;100.0 +25/10/2020 02:06:16;U454.AI02_PV.F_CV;0.044116393;100.0 +25/10/2020 02:06:17;U454.AI02_PV.F_CV;0.044104092;100.0 +25/10/2020 02:06:18;U454.AI02_PV.F_CV;0.044101015;100.0 +25/10/2020 02:06:19;U454.AI02_PV.F_CV;0.044100247;100.0 +25/10/2020 02:06:20;U454.AI02_PV.F_CV;0.044100054;100.0 +25/10/2020 02:06:21;U454.AI02_PV.F_CV;0.044100009;100.0 +25/10/2020 02:06:22;U454.AI02_PV.F_CV;0.044099994;100.0 +25/10/2020 02:06:23;U454.AI02_PV.F_CV;0.044099994;100.0 +25/10/2020 02:06:24;U454.AI02_PV.F_CV;0.044099994;100.0 +25/10/2020 02:06:25;U454.AI02_PV.F_CV;0.044084586;100.0 +25/10/2020 02:06:26;U454.AI02_PV.F_CV;0.044080734;100.0 +25/10/2020 02:06:27;U454.AI02_PV.F_CV;0.044079773;100.0 +25/10/2020 02:06:28;U454.AI02_PV.F_CV;0.044079527;100.0 +25/10/2020 02:06:29;U454.AI02_PV.F_CV;0.044079468;100.0 +25/10/2020 02:06:30;U454.AI02_PV.F_CV;0.044079453;100.0 +25/10/2020 02:06:31;U454.AI02_PV.F_CV;0.044079453;100.0 +25/10/2020 02:06:32;U454.AI02_PV.F_CV;0.044075899;100.0 +25/10/2020 02:06:33;U454.AI02_PV.F_CV;0.044075012;100.0 +25/10/2020 02:06:34;U454.AI02_PV.F_CV;0.044074789;100.0 +25/10/2020 02:06:35;U454.AI02_PV.F_CV;0.044074733;100.0 +25/10/2020 02:06:36;U454.AI02_PV.F_CV;0.044074718;100.0 +25/10/2020 02:06:37;U454.AI02_PV.F_CV;0.044074714;100.0 +25/10/2020 02:06:38;U454.AI02_PV.F_CV;0.044074714;100.0 +25/10/2020 02:06:39;U454.AI02_PV.F_CV;0.043985166;100.0 +25/10/2020 02:06:40;U454.AI02_PV.F_CV;0.043962777;100.0 +25/10/2020 02:06:41;U454.AI02_PV.F_CV;0.043957181;100.0 +25/10/2020 02:06:42;U454.AI02_PV.F_CV;0.043956250;100.0 +25/10/2020 02:06:43;U454.AI02_PV.F_CV;0.043955430;100.0 +25/10/2020 02:06:44;U454.AI02_PV.F_CV;0.043955341;100.0 +25/10/2020 02:06:45;U454.AI02_PV.F_CV;0.043955319;100.0 +25/10/2020 02:06:46;U454.AI02_PV.F_CV;0.043955319;100.0 +25/10/2020 02:06:47;U454.AI02_PV.F_CV;0.043987282;100.0 +25/10/2020 02:06:48;U454.AI02_PV.F_CV;0.043995272;100.0 +25/10/2020 02:06:49;U454.AI02_PV.F_CV;0.043997269;100.0 +25/10/2020 02:06:50;U454.AI02_PV.F_CV;0.043997768;100.0 +25/10/2020 02:06:51;U454.AI02_PV.F_CV;0.043997895;100.0 +25/10/2020 02:06:52;U454.AI02_PV.F_CV;0.043997925;100.0 +25/10/2020 02:06:53;U454.AI02_PV.F_CV;0.043997929;100.0 +25/10/2020 02:06:54;U454.AI02_PV.F_CV;0.043998394;100.0 +25/10/2020 02:06:55;U454.AI02_PV.F_CV;0.043998741;100.0 +25/10/2020 02:06:56;U454.AI02_PV.F_CV;0.043998830;100.0 +25/10/2020 02:06:57;U454.AI02_PV.F_CV;0.043998852;100.0 +25/10/2020 02:06:58;U454.AI02_PV.F_CV;0.043998852;100.0 +25/10/2020 02:06:59;U454.AI02_PV.F_CV;0.043998852;100.0 +25/10/2020 02:06:00;U454.AI03_EBZ_PV.F_CV;-1.496339560;100.0 +25/10/2020 02:06:01;U454.AI03_EBZ_PV.F_CV;-1.520216227;100.0 +25/10/2020 02:06:02;U454.AI03_EBZ_PV.F_CV;-1.526185274;100.0 +25/10/2020 02:06:03;U454.AI03_EBZ_PV.F_CV;-1.527677536;100.0 +25/10/2020 02:06:04;U454.AI03_EBZ_PV.F_CV;-1.528050661;100.0 +25/10/2020 02:06:05;U454.AI03_EBZ_PV.F_CV;-1.528143883;100.0 +25/10/2020 02:06:06;U454.AI03_EBZ_PV.F_CV;-1.528167248;100.0 +25/10/2020 02:06:07;U454.AI03_EBZ_PV.F_CV;-1.528172970;100.0 +25/10/2020 02:06:08;U454.AI03_EBZ_PV.F_CV;-1.528174400;100.0 +25/10/2020 02:06:09;U454.AI03_EBZ_PV.F_CV;-1.528174877;100.0 +25/10/2020 02:06:10;U454.AI03_EBZ_PV.F_CV;-1.528174877;100.0 +25/10/2020 02:06:11;U454.AI03_EBZ_PV.F_CV;-1.528174877;100.0 +25/10/2020 02:06:12;U454.AI03_EBZ_PV.F_CV;-1.528174877;100.0 +25/10/2020 02:06:13;U454.AI03_EBZ_PV.F_CV;-1.528174877;100.0 +25/10/2020 02:06:14;U454.AI03_EBZ_PV.F_CV;-1.528174877;100.0 +25/10/2020 02:06:15;U454.AI03_EBZ_PV.F_CV;-1.528174877;100.0 +25/10/2020 02:06:16;U454.AI03_EBZ_PV.F_CV;-1.528174877;100.0 +25/10/2020 02:06:17;U454.AI03_EBZ_PV.F_CV;-1.908187389;100.0 +25/10/2020 02:06:18;U454.AI03_EBZ_PV.F_CV;-2.193196774;100.0 +25/10/2020 02:06:19;U454.AI03_EBZ_PV.F_CV;-2.264449120;100.0 +25/10/2020 02:06:20;U454.AI03_EBZ_PV.F_CV;-2.282262325;100.0 +25/10/2020 02:06:21;U454.AI03_EBZ_PV.F_CV;-2.286715508;100.0 +25/10/2020 02:06:22;U454.AI03_EBZ_PV.F_CV;-2.287828922;100.0 +25/10/2020 02:06:23;U454.AI03_EBZ_PV.F_CV;-2.288107157;100.0 +25/10/2020 02:06:24;U454.AI03_EBZ_PV.F_CV;-2.288176775;100.0 +25/10/2020 02:06:25;U454.AI03_EBZ_PV.F_CV;-2.288194180;100.0 +25/10/2020 02:06:26;U454.AI03_EBZ_PV.F_CV;-2.288198471;100.0 +25/10/2020 02:06:27;U454.AI03_EBZ_PV.F_CV;-2.288199425;100.0 +25/10/2020 02:06:28;U454.AI03_EBZ_PV.F_CV;-2.288199902;100.0 +25/10/2020 02:06:29;U454.AI03_EBZ_PV.F_CV;-2.288199902;100.0 +25/10/2020 02:06:30;U454.AI03_EBZ_PV.F_CV;-2.288199902;100.0 +25/10/2020 02:06:31;U454.AI03_EBZ_PV.F_CV;-2.288199902;100.0 +25/10/2020 02:06:32;U454.AI03_EBZ_PV.F_CV;-2.288199902;100.0 +25/10/2020 02:06:33;U454.AI03_EBZ_PV.F_CV;-2.288199902;100.0 +25/10/2020 02:06:34;U454.AI03_EBZ_PV.F_CV;-2.288199902;100.0 +25/10/2020 02:06:35;U454.AI03_EBZ_PV.F_CV;-2.288199902;100.0 +25/10/2020 02:06:36;U454.AI03_EBZ_PV.F_CV;-2.555912495;100.0 +25/10/2020 02:06:37;U454.AI03_EBZ_PV.F_CV;-2.756696939;100.0 +25/10/2020 02:06:38;U454.AI03_EBZ_PV.F_CV;-2.806893110;100.0 +25/10/2020 02:06:39;U454.AI03_EBZ_PV.F_CV;-2.819442034;100.0 +25/10/2020 02:06:40;U454.AI03_EBZ_PV.F_CV;-2.822579384;100.0 +25/10/2020 02:06:41;U454.AI03_EBZ_PV.F_CV;-2.823363781;100.0 +25/10/2020 02:06:42;U454.AI03_EBZ_PV.F_CV;-2.823494434;100.0 +25/10/2020 02:06:43;U454.AI03_EBZ_PV.F_CV;-2.823608875;100.0 +25/10/2020 02:06:44;U454.AI03_EBZ_PV.F_CV;-2.823621035;100.0 +25/10/2020 02:06:45;U454.AI03_EBZ_PV.F_CV;-2.823624134;100.0 +25/10/2020 02:06:46;U454.AI03_EBZ_PV.F_CV;-2.823624611;100.0 +25/10/2020 02:06:47;U454.AI03_EBZ_PV.F_CV;-2.823625088;100.0 +25/10/2020 02:06:48;U454.AI03_EBZ_PV.F_CV;-2.823625088;100.0 +25/10/2020 02:06:49;U454.AI03_EBZ_PV.F_CV;-2.823625088;100.0 +25/10/2020 02:06:50;U454.AI03_EBZ_PV.F_CV;-2.823625088;100.0 +25/10/2020 02:06:51;U454.AI03_EBZ_PV.F_CV;-2.823625088;100.0 +25/10/2020 02:06:52;U454.AI03_EBZ_PV.F_CV;-2.823625088;100.0 +25/10/2020 02:06:53;U454.AI03_EBZ_PV.F_CV;-2.823625088;100.0 +25/10/2020 02:06:54;U454.AI03_EBZ_PV.F_CV;-2.982375145;100.0 +25/10/2020 02:06:55;U454.AI03_EBZ_PV.F_CV;-3.101437569;100.0 +25/10/2020 02:06:56;U454.AI03_EBZ_PV.F_CV;-3.131203175;100.0 +25/10/2020 02:06:57;U454.AI03_EBZ_PV.F_CV;-3.138644695;100.0 +25/10/2020 02:06:58;U454.AI03_EBZ_PV.F_CV;-3.140814781;100.0 +25/10/2020 02:06:59;U454.AI03_EBZ_PV.F_CV;-3.141047478;100.0 +25/10/2020 02:06:00;U454.AI03_MX_PV.F_CV;-0.198998243;100.0 +25/10/2020 02:06:01;U454.AI03_MX_PV.F_CV;-0.205840975;100.0 +25/10/2020 02:06:02;U454.AI03_MX_PV.F_CV;-0.207551658;100.0 +25/10/2020 02:06:03;U454.AI03_MX_PV.F_CV;-0.207979321;100.0 +25/10/2020 02:06:04;U454.AI03_MX_PV.F_CV;-0.208086252;100.0 +25/10/2020 02:06:05;U454.AI03_MX_PV.F_CV;-0.208112985;100.0 +25/10/2020 02:06:06;U454.AI03_MX_PV.F_CV;-0.208119661;100.0 +25/10/2020 02:06:07;U454.AI03_MX_PV.F_CV;-0.208121330;100.0 +25/10/2020 02:06:08;U454.AI03_MX_PV.F_CV;-0.208121747;100.0 +25/10/2020 02:06:09;U454.AI03_MX_PV.F_CV;-0.208121836;100.0 +25/10/2020 02:06:10;U454.AI03_MX_PV.F_CV;-0.208121866;100.0 +25/10/2020 02:06:11;U454.AI03_MX_PV.F_CV;-0.208121866;100.0 +25/10/2020 02:06:12;U454.AI03_MX_PV.F_CV;-0.208121866;100.0 +25/10/2020 02:06:13;U454.AI03_MX_PV.F_CV;-0.208121866;100.0 +25/10/2020 02:06:14;U454.AI03_MX_PV.F_CV;-0.208121866;100.0 +25/10/2020 02:06:15;U454.AI03_MX_PV.F_CV;-0.208121866;100.0 +25/10/2020 02:06:16;U454.AI03_MX_PV.F_CV;-0.208121866;100.0 +25/10/2020 02:06:17;U454.AI03_MX_PV.F_CV;-0.270410955;100.0 +25/10/2020 02:06:18;U454.AI03_MX_PV.F_CV;-0.317127764;100.0 +25/10/2020 02:06:19;U454.AI03_MX_PV.F_CV;-0.328806937;100.0 +25/10/2020 02:06:20;U454.AI03_MX_PV.F_CV;-0.331726730;100.0 +25/10/2020 02:06:21;U454.AI03_MX_PV.F_CV;-0.332456708;100.0 +25/10/2020 02:06:22;U454.AI03_MX_PV.F_CV;-0.332639188;100.0 +25/10/2020 02:06:23;U454.AI03_MX_PV.F_CV;-0.332684815;100.0 +25/10/2020 02:06:24;U454.AI03_MX_PV.F_CV;-0.332696199;100.0 +25/10/2020 02:06:25;U454.AI03_MX_PV.F_CV;-0.332699060;100.0 +25/10/2020 02:06:26;U454.AI03_MX_PV.F_CV;-0.332699776;100.0 +25/10/2020 02:06:27;U454.AI03_MX_PV.F_CV;-0.332699955;100.0 +25/10/2020 02:06:28;U454.AI03_MX_PV.F_CV;-0.332700014;100.0 +25/10/2020 02:06:29;U454.AI03_MX_PV.F_CV;-0.332700014;100.0 +25/10/2020 02:06:30;U454.AI03_MX_PV.F_CV;-0.332700014;100.0 +25/10/2020 02:06:31;U454.AI03_MX_PV.F_CV;-0.332700014;100.0 +25/10/2020 02:06:32;U454.AI03_MX_PV.F_CV;-0.332700014;100.0 +25/10/2020 02:06:33;U454.AI03_MX_PV.F_CV;-0.332700014;100.0 +25/10/2020 02:06:34;U454.AI03_MX_PV.F_CV;-0.332700014;100.0 +25/10/2020 02:06:35;U454.AI03_MX_PV.F_CV;-0.332700014;100.0 +25/10/2020 02:06:36;U454.AI03_MX_PV.F_CV;-0.403759360;100.0 +25/10/2020 02:06:37;U454.AI03_MX_PV.F_CV;-0.457053900;100.0 +25/10/2020 02:06:38;U454.AI03_MX_PV.F_CV;-0.470377505;100.0 +25/10/2020 02:06:39;U454.AI03_MX_PV.F_CV;-0.473708451;100.0 +25/10/2020 02:06:40;U454.AI03_MX_PV.F_CV;-0.474541187;100.0 +25/10/2020 02:06:41;U454.AI03_MX_PV.F_CV;-0.474749327;100.0 +25/10/2020 02:06:42;U454.AI03_MX_PV.F_CV;-0.474784017;100.0 +25/10/2020 02:06:43;U454.AI03_MX_PV.F_CV;-0.474814415;100.0 +25/10/2020 02:06:44;U454.AI03_MX_PV.F_CV;-0.474817634;100.0 +25/10/2020 02:06:45;U454.AI03_MX_PV.F_CV;-0.474818468;100.0 +25/10/2020 02:06:46;U454.AI03_MX_PV.F_CV;-0.474818587;100.0 +25/10/2020 02:06:47;U454.AI03_MX_PV.F_CV;-0.474818707;100.0 +25/10/2020 02:06:48;U454.AI03_MX_PV.F_CV;-0.474818707;100.0 +25/10/2020 02:06:49;U454.AI03_MX_PV.F_CV;-0.474818707;100.0 +25/10/2020 02:06:50;U454.AI03_MX_PV.F_CV;-0.474818707;100.0 +25/10/2020 02:06:51;U454.AI03_MX_PV.F_CV;-0.474818707;100.0 +25/10/2020 02:06:52;U454.AI03_MX_PV.F_CV;-0.474818707;100.0 +25/10/2020 02:06:53;U454.AI03_MX_PV.F_CV;-0.474818707;100.0 +25/10/2020 02:06:54;U454.AI03_MX_PV.F_CV;-0.512356222;100.0 +25/10/2020 02:06:55;U454.AI03_MX_PV.F_CV;-0.540509343;100.0 +25/10/2020 02:06:56;U454.AI03_MX_PV.F_CV;-0.547547638;100.0 +25/10/2020 02:06:57;U454.AI03_MX_PV.F_CV;-0.549307227;100.0 +25/10/2020 02:06:58;U454.AI03_MX_PV.F_CV;-0.549820423;100.0 +25/10/2020 02:06:59;U454.AI03_MX_PV.F_CV;-0.549875379;100.0 +25/10/2020 02:06:00;U454.AI03_OX_PV.F_CV;-0.077624798;100.0 +25/10/2020 02:06:01;U454.AI03_OX_PV.F_CV;-0.080634326;100.0 +25/10/2020 02:06:02;U454.AI03_OX_PV.F_CV;-0.081386708;100.0 +25/10/2020 02:06:03;U454.AI03_OX_PV.F_CV;-0.081574805;100.0 +25/10/2020 02:06:04;U454.AI03_OX_PV.F_CV;-0.081621826;100.0 +25/10/2020 02:06:05;U454.AI03_OX_PV.F_CV;-0.081633583;100.0 +25/10/2020 02:06:06;U454.AI03_OX_PV.F_CV;-0.081636518;100.0 +25/10/2020 02:06:07;U454.AI03_OX_PV.F_CV;-0.081637256;100.0 +25/10/2020 02:06:08;U454.AI03_OX_PV.F_CV;-0.081637442;100.0 +25/10/2020 02:06:09;U454.AI03_OX_PV.F_CV;-0.081637487;100.0 +25/10/2020 02:06:10;U454.AI03_OX_PV.F_CV;-0.081637502;100.0 +25/10/2020 02:06:11;U454.AI03_OX_PV.F_CV;-0.081637502;100.0 +25/10/2020 02:06:12;U454.AI03_OX_PV.F_CV;-0.081637502;100.0 +25/10/2020 02:06:13;U454.AI03_OX_PV.F_CV;-0.081637502;100.0 +25/10/2020 02:06:14;U454.AI03_OX_PV.F_CV;-0.081637502;100.0 +25/10/2020 02:06:15;U454.AI03_OX_PV.F_CV;-0.081637502;100.0 +25/10/2020 02:06:16;U454.AI03_OX_PV.F_CV;-0.081637502;100.0 +25/10/2020 02:06:17;U454.AI03_OX_PV.F_CV;-0.108289845;100.0 +25/10/2020 02:06:18;U454.AI03_OX_PV.F_CV;-0.128279105;100.0 +25/10/2020 02:06:19;U454.AI03_OX_PV.F_CV;-0.133276418;100.0 +25/10/2020 02:06:20;U454.AI03_OX_PV.F_CV;-0.134525746;100.0 +25/10/2020 02:06:21;U454.AI03_OX_PV.F_CV;-0.134838074;100.0 +25/10/2020 02:06:22;U454.AI03_OX_PV.F_CV;-0.134916157;100.0 +25/10/2020 02:06:23;U454.AI03_OX_PV.F_CV;-0.134935677;100.0 +25/10/2020 02:06:24;U454.AI03_OX_PV.F_CV;-0.134940565;100.0 +25/10/2020 02:06:25;U454.AI03_OX_PV.F_CV;-0.134941787;100.0 +25/10/2020 02:06:26;U454.AI03_OX_PV.F_CV;-0.134942085;100.0 +25/10/2020 02:06:27;U454.AI03_OX_PV.F_CV;-0.134942174;100.0 +25/10/2020 02:06:28;U454.AI03_OX_PV.F_CV;-0.134942174;100.0 +25/10/2020 02:06:29;U454.AI03_OX_PV.F_CV;-0.134942174;100.0 +25/10/2020 02:06:30;U454.AI03_OX_PV.F_CV;-0.134942174;100.0 +25/10/2020 02:06:31;U454.AI03_OX_PV.F_CV;-0.134942174;100.0 +25/10/2020 02:06:32;U454.AI03_OX_PV.F_CV;-0.134942174;100.0 +25/10/2020 02:06:33;U454.AI03_OX_PV.F_CV;-0.134942174;100.0 +25/10/2020 02:06:34;U454.AI03_OX_PV.F_CV;-0.134942174;100.0 +25/10/2020 02:06:35;U454.AI03_OX_PV.F_CV;-0.134942174;100.0 +25/10/2020 02:06:36;U454.AI03_OX_PV.F_CV;-0.167659566;100.0 +25/10/2020 02:06:37;U454.AI03_OX_PV.F_CV;-0.192197606;100.0 +25/10/2020 02:06:38;U454.AI03_OX_PV.F_CV;-0.198332116;100.0 +25/10/2020 02:06:39;U454.AI03_OX_PV.F_CV;-0.199865744;100.0 +25/10/2020 02:06:40;U454.AI03_OX_PV.F_CV;-0.200249150;100.0 +25/10/2020 02:06:41;U454.AI03_OX_PV.F_CV;-0.200345010;100.0 +25/10/2020 02:06:42;U454.AI03_OX_PV.F_CV;-0.200360984;100.0 +25/10/2020 02:06:43;U454.AI03_OX_PV.F_CV;-0.200374961;100.0 +25/10/2020 02:06:44;U454.AI03_OX_PV.F_CV;-0.200376451;100.0 +25/10/2020 02:06:45;U454.AI03_OX_PV.F_CV;-0.200376838;100.0 +25/10/2020 02:06:46;U454.AI03_OX_PV.F_CV;-0.200376898;100.0 +25/10/2020 02:06:47;U454.AI03_OX_PV.F_CV;-0.200376958;100.0 +25/10/2020 02:06:48;U454.AI03_OX_PV.F_CV;-0.200376958;100.0 +25/10/2020 02:06:49;U454.AI03_OX_PV.F_CV;-0.200376958;100.0 +25/10/2020 02:06:50;U454.AI03_OX_PV.F_CV;-0.200376958;100.0 +25/10/2020 02:06:51;U454.AI03_OX_PV.F_CV;-0.200376958;100.0 +25/10/2020 02:06:52;U454.AI03_OX_PV.F_CV;-0.200376958;100.0 +25/10/2020 02:06:53;U454.AI03_OX_PV.F_CV;-0.200376958;100.0 +25/10/2020 02:06:54;U454.AI03_OX_PV.F_CV;-0.216209382;100.0 +25/10/2020 02:06:55;U454.AI03_OX_PV.F_CV;-0.228083700;100.0 +25/10/2020 02:06:56;U454.AI03_OX_PV.F_CV;-0.231052279;100.0 +25/10/2020 02:06:57;U454.AI03_OX_PV.F_CV;-0.231794417;100.0 +25/10/2020 02:06:58;U454.AI03_OX_PV.F_CV;-0.232010871;100.0 +25/10/2020 02:06:59;U454.AI03_OX_PV.F_CV;-0.232034057;100.0 +25/10/2020 02:06:00;U454.AI03_PDEB_PV.F_CV;47.681930542;100.0 +25/10/2020 02:06:01;U454.AI03_PDEB_PV.F_CV;47.700660706;100.0 +25/10/2020 02:06:02;U454.AI03_PDEB_PV.F_CV;47.705341339;100.0 +25/10/2020 02:06:03;U454.AI03_PDEB_PV.F_CV;47.706512451;100.0 +25/10/2020 02:06:04;U454.AI03_PDEB_PV.F_CV;47.706802368;100.0 +25/10/2020 02:06:05;U454.AI03_PDEB_PV.F_CV;47.706878662;100.0 +25/10/2020 02:06:06;U454.AI03_PDEB_PV.F_CV;47.706893921;100.0 +25/10/2020 02:06:07;U454.AI03_PDEB_PV.F_CV;47.706901550;100.0 +25/10/2020 02:06:08;U454.AI03_PDEB_PV.F_CV;47.706901550;100.0 +25/10/2020 02:06:09;U454.AI03_PDEB_PV.F_CV;47.706901550;100.0 +25/10/2020 02:06:10;U454.AI03_PDEB_PV.F_CV;47.706901550;100.0 +25/10/2020 02:06:11;U454.AI03_PDEB_PV.F_CV;47.706901550;100.0 +25/10/2020 02:06:12;U454.AI03_PDEB_PV.F_CV;47.706901550;100.0 +25/10/2020 02:06:13;U454.AI03_PDEB_PV.F_CV;47.706901550;100.0 +25/10/2020 02:06:14;U454.AI03_PDEB_PV.F_CV;47.706901550;100.0 +25/10/2020 02:06:15;U454.AI03_PDEB_PV.F_CV;47.706901550;100.0 +25/10/2020 02:06:16;U454.AI03_PDEB_PV.F_CV;47.706901550;100.0 +25/10/2020 02:06:17;U454.AI03_PDEB_PV.F_CV;48.035148621;100.0 +25/10/2020 02:06:18;U454.AI03_PDEB_PV.F_CV;48.281333923;100.0 +25/10/2020 02:06:19;U454.AI03_PDEB_PV.F_CV;48.342880249;100.0 +25/10/2020 02:06:20;U454.AI03_PDEB_PV.F_CV;48.358268738;100.0 +25/10/2020 02:06:21;U454.AI03_PDEB_PV.F_CV;48.362113953;100.0 +25/10/2020 02:06:22;U454.AI03_PDEB_PV.F_CV;48.363075256;100.0 +25/10/2020 02:06:23;U454.AI03_PDEB_PV.F_CV;48.363319397;100.0 +25/10/2020 02:06:24;U454.AI03_PDEB_PV.F_CV;48.363380432;100.0 +25/10/2020 02:06:25;U454.AI03_PDEB_PV.F_CV;48.363395691;100.0 +25/10/2020 02:06:26;U454.AI03_PDEB_PV.F_CV;48.363395691;100.0 +25/10/2020 02:06:27;U454.AI03_PDEB_PV.F_CV;48.363395691;100.0 +25/10/2020 02:06:28;U454.AI03_PDEB_PV.F_CV;48.363395691;100.0 +25/10/2020 02:06:29;U454.AI03_PDEB_PV.F_CV;48.363395691;100.0 +25/10/2020 02:06:30;U454.AI03_PDEB_PV.F_CV;48.363395691;100.0 +25/10/2020 02:06:31;U454.AI03_PDEB_PV.F_CV;48.363395691;100.0 +25/10/2020 02:06:32;U454.AI03_PDEB_PV.F_CV;48.363395691;100.0 +25/10/2020 02:06:33;U454.AI03_PDEB_PV.F_CV;48.363395691;100.0 +25/10/2020 02:06:34;U454.AI03_PDEB_PV.F_CV;48.363395691;100.0 +25/10/2020 02:06:35;U454.AI03_PDEB_PV.F_CV;48.363395691;100.0 +25/10/2020 02:06:36;U454.AI03_PDEB_PV.F_CV;48.656250000;100.0 +25/10/2020 02:06:37;U454.AI03_PDEB_PV.F_CV;48.875885010;100.0 +25/10/2020 02:06:38;U454.AI03_PDEB_PV.F_CV;48.930793762;100.0 +25/10/2020 02:06:39;U454.AI03_PDEB_PV.F_CV;48.944526672;100.0 +25/10/2020 02:06:40;U454.AI03_PDEB_PV.F_CV;48.947959900;100.0 +25/10/2020 02:06:41;U454.AI03_PDEB_PV.F_CV;48.948814392;100.0 +25/10/2020 02:06:42;U454.AI03_PDEB_PV.F_CV;48.948959351;100.0 +25/10/2020 02:06:43;U454.AI03_PDEB_PV.F_CV;48.949081421;100.0 +25/10/2020 02:06:44;U454.AI03_PDEB_PV.F_CV;48.949096680;100.0 +25/10/2020 02:06:45;U454.AI03_PDEB_PV.F_CV;48.949096680;100.0 +25/10/2020 02:06:46;U454.AI03_PDEB_PV.F_CV;48.949096680;100.0 +25/10/2020 02:06:47;U454.AI03_PDEB_PV.F_CV;48.949096680;100.0 +25/10/2020 02:06:48;U454.AI03_PDEB_PV.F_CV;48.949096680;100.0 +25/10/2020 02:06:49;U454.AI03_PDEB_PV.F_CV;48.949096680;100.0 +25/10/2020 02:06:50;U454.AI03_PDEB_PV.F_CV;48.949096680;100.0 +25/10/2020 02:06:51;U454.AI03_PDEB_PV.F_CV;48.949096680;100.0 +25/10/2020 02:06:52;U454.AI03_PDEB_PV.F_CV;48.949096680;100.0 +25/10/2020 02:06:53;U454.AI03_PDEB_PV.F_CV;48.949096680;100.0 +25/10/2020 02:06:54;U454.AI03_PDEB_PV.F_CV;49.026699066;100.0 +25/10/2020 02:06:55;U454.AI03_PDEB_PV.F_CV;49.084899902;100.0 +25/10/2020 02:06:56;U454.AI03_PDEB_PV.F_CV;49.099449158;100.0 +25/10/2020 02:06:57;U454.AI03_PDEB_PV.F_CV;49.103088379;100.0 +25/10/2020 02:06:58;U454.AI03_PDEB_PV.F_CV;49.104148865;100.0 +25/10/2020 02:06:59;U454.AI03_PDEB_PV.F_CV;49.104263306;100.0 +25/10/2020 02:06:00;U454.AI03_PX_PV.F_CV;54.277599335;100.0 +25/10/2020 02:06:01;U454.AI03_PX_PV.F_CV;54.289897919;100.0 +25/10/2020 02:06:02;U454.AI03_PX_PV.F_CV;54.292976379;100.0 +25/10/2020 02:06:03;U454.AI03_PX_PV.F_CV;54.293743134;100.0 +25/10/2020 02:06:04;U454.AI03_PX_PV.F_CV;54.293933868;100.0 +25/10/2020 02:06:05;U454.AI03_PX_PV.F_CV;54.293983459;100.0 +25/10/2020 02:06:06;U454.AI03_PX_PV.F_CV;54.293994904;100.0 +25/10/2020 02:06:07;U454.AI03_PX_PV.F_CV;54.293998718;100.0 +25/10/2020 02:06:08;U454.AI03_PX_PV.F_CV;54.293998718;100.0 +25/10/2020 02:06:09;U454.AI03_PX_PV.F_CV;54.293998718;100.0 +25/10/2020 02:06:10;U454.AI03_PX_PV.F_CV;54.293998718;100.0 +25/10/2020 02:06:11;U454.AI03_PX_PV.F_CV;54.293998718;100.0 +25/10/2020 02:06:12;U454.AI03_PX_PV.F_CV;54.293998718;100.0 +25/10/2020 02:06:13;U454.AI03_PX_PV.F_CV;54.293998718;100.0 +25/10/2020 02:06:14;U454.AI03_PX_PV.F_CV;54.293998718;100.0 +25/10/2020 02:06:15;U454.AI03_PX_PV.F_CV;54.293998718;100.0 +25/10/2020 02:06:16;U454.AI03_PX_PV.F_CV;54.293998718;100.0 +25/10/2020 02:06:17;U454.AI03_PX_PV.F_CV;54.505199432;100.0 +25/10/2020 02:06:18;U454.AI03_PX_PV.F_CV;54.663600922;100.0 +25/10/2020 02:06:19;U454.AI03_PX_PV.F_CV;54.703201294;100.0 +25/10/2020 02:06:20;U454.AI03_PX_PV.F_CV;54.713100433;100.0 +25/10/2020 02:06:21;U454.AI03_PX_PV.F_CV;54.715576172;100.0 +25/10/2020 02:06:22;U454.AI03_PX_PV.F_CV;54.716194153;100.0 +25/10/2020 02:06:23;U454.AI03_PX_PV.F_CV;54.716346741;100.0 +25/10/2020 02:06:24;U454.AI03_PX_PV.F_CV;54.716384888;100.0 +25/10/2020 02:06:25;U454.AI03_PX_PV.F_CV;54.716396332;100.0 +25/10/2020 02:06:26;U454.AI03_PX_PV.F_CV;54.716400146;100.0 +25/10/2020 02:06:27;U454.AI03_PX_PV.F_CV;54.716400146;100.0 +25/10/2020 02:06:28;U454.AI03_PX_PV.F_CV;54.716400146;100.0 +25/10/2020 02:06:29;U454.AI03_PX_PV.F_CV;54.716400146;100.0 +25/10/2020 02:06:30;U454.AI03_PX_PV.F_CV;54.716400146;100.0 +25/10/2020 02:06:31;U454.AI03_PX_PV.F_CV;54.716400146;100.0 +25/10/2020 02:06:32;U454.AI03_PX_PV.F_CV;54.716400146;100.0 +25/10/2020 02:06:33;U454.AI03_PX_PV.F_CV;54.716400146;100.0 +25/10/2020 02:06:34;U454.AI03_PX_PV.F_CV;54.716400146;100.0 +25/10/2020 02:06:35;U454.AI03_PX_PV.F_CV;54.716400146;100.0 +25/10/2020 02:06:36;U454.AI03_PX_PV.F_CV;54.638801575;100.0 +25/10/2020 02:06:37;U454.AI03_PX_PV.F_CV;54.580596924;100.0 +25/10/2020 02:06:38;U454.AI03_PX_PV.F_CV;54.566047668;100.0 +25/10/2020 02:06:39;U454.AI03_PX_PV.F_CV;54.562408447;100.0 +25/10/2020 02:06:40;U454.AI03_PX_PV.F_CV;54.561500549;100.0 +25/10/2020 02:06:41;U454.AI03_PX_PV.F_CV;54.561271667;100.0 +25/10/2020 02:06:42;U454.AI03_PX_PV.F_CV;54.561233521;100.0 +25/10/2020 02:06:43;U454.AI03_PX_PV.F_CV;54.561203003;100.0 +25/10/2020 02:06:44;U454.AI03_PX_PV.F_CV;54.561203003;100.0 +25/10/2020 02:06:45;U454.AI03_PX_PV.F_CV;54.561203003;100.0 +25/10/2020 02:06:46;U454.AI03_PX_PV.F_CV;54.561203003;100.0 +25/10/2020 02:06:47;U454.AI03_PX_PV.F_CV;54.561203003;100.0 +25/10/2020 02:06:48;U454.AI03_PX_PV.F_CV;54.561203003;100.0 +25/10/2020 02:06:49;U454.AI03_PX_PV.F_CV;54.561203003;100.0 +25/10/2020 02:06:50;U454.AI03_PX_PV.F_CV;54.561203003;100.0 +25/10/2020 02:06:51;U454.AI03_PX_PV.F_CV;54.561203003;100.0 +25/10/2020 02:06:52;U454.AI03_PX_PV.F_CV;54.561203003;100.0 +25/10/2020 02:06:53;U454.AI03_PX_PV.F_CV;54.561203003;100.0 +25/10/2020 02:06:54;U454.AI03_PX_PV.F_CV;54.606002808;100.0 +25/10/2020 02:06:55;U454.AI03_PX_PV.F_CV;54.639602661;100.0 +25/10/2020 02:06:56;U454.AI03_PX_PV.F_CV;54.648002625;100.0 +25/10/2020 02:06:57;U454.AI03_PX_PV.F_CV;54.650100708;100.0 +25/10/2020 02:06:58;U454.AI03_PX_PV.F_CV;54.650711060;100.0 +25/10/2020 02:06:59;U454.AI03_PX_PV.F_CV;54.650779724;100.0 +25/10/2020 02:06:00;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.AI03_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.AI05_EBZ_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.AI05_MX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.AI05_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.AI05_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.AI05_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.AI05_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:01;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:02;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:03;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:04;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:05;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:06;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:07;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:08;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:09;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:10;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:11;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:12;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:13;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:14;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:15;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:16;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:17;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:18;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:19;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:20;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:21;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:22;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:23;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:24;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:25;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:26;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:27;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:28;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:29;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:30;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:31;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:32;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:33;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:34;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:35;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:36;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:37;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:38;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:39;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:40;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:41;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:42;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:43;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:44;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:45;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:46;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:47;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:48;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:49;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:50;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:51;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:52;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:53;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:54;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:55;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:56;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:57;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:58;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:59;U454.AI06_EBZ_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:00;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:01;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:02;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:03;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:04;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:05;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:06;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:07;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:08;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:09;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:10;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:11;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:12;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:13;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:14;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:15;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:16;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:17;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:18;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:19;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:20;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:21;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:22;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:23;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:24;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:25;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:26;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:27;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:28;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:29;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:30;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:31;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:32;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:33;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:34;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:35;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:36;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:37;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:38;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:39;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:40;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:41;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:42;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:43;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:44;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:45;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:46;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:47;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:48;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:49;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:50;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:51;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:52;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:53;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:54;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:55;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:56;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:57;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:58;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:59;U454.AI06_MX_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:00;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.AI06_OX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.AI06_PDEB_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.AI06_PX_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.AI06_TLN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.AI18_PV.F_CV;247.781021118;100.0 +25/10/2020 02:06:01;U454.AI18_PV.F_CV;247.783004761;100.0 +25/10/2020 02:06:02;U454.AI18_PV.F_CV;247.783493042;100.0 +25/10/2020 02:06:03;U454.AI18_PV.F_CV;247.783615112;100.0 +25/10/2020 02:06:04;U454.AI18_PV.F_CV;247.783645630;100.0 +25/10/2020 02:06:05;U454.AI18_PV.F_CV;247.820983887;100.0 +25/10/2020 02:06:06;U454.AI18_PV.F_CV;247.830322266;100.0 +25/10/2020 02:06:07;U454.AI18_PV.F_CV;247.832656860;100.0 +25/10/2020 02:06:08;U454.AI18_PV.F_CV;247.833236694;100.0 +25/10/2020 02:06:09;U454.AI18_PV.F_CV;247.833389282;100.0 +25/10/2020 02:06:10;U454.AI18_PV.F_CV;247.833419800;100.0 +25/10/2020 02:06:11;U454.AI18_PV.F_CV;247.833435059;100.0 +25/10/2020 02:06:12;U454.AI18_PV.F_CV;247.679687500;100.0 +25/10/2020 02:06:13;U454.AI18_PV.F_CV;247.641235352;100.0 +25/10/2020 02:06:14;U454.AI18_PV.F_CV;247.631622314;100.0 +25/10/2020 02:06:15;U454.AI18_PV.F_CV;247.629241943;100.0 +25/10/2020 02:06:16;U454.AI18_PV.F_CV;247.628631592;100.0 +25/10/2020 02:06:17;U454.AI18_PV.F_CV;247.628479004;100.0 +25/10/2020 02:06:18;U454.AI18_PV.F_CV;247.628448486;100.0 +25/10/2020 02:06:19;U454.AI18_PV.F_CV;247.628448486;100.0 +25/10/2020 02:06:20;U454.AI18_PV.F_CV;247.623901367;100.0 +25/10/2020 02:06:21;U454.AI18_PV.F_CV;247.622756958;100.0 +25/10/2020 02:06:22;U454.AI18_PV.F_CV;247.622467041;100.0 +25/10/2020 02:06:23;U454.AI18_PV.F_CV;247.622406006;100.0 +25/10/2020 02:06:24;U454.AI18_PV.F_CV;247.622375488;100.0 +25/10/2020 02:06:25;U454.AI18_PV.F_CV;247.622375488;100.0 +25/10/2020 02:06:26;U454.AI18_PV.F_CV;247.622375488;100.0 +25/10/2020 02:06:27;U454.AI18_PV.F_CV;247.717132568;100.0 +25/10/2020 02:06:28;U454.AI18_PV.F_CV;247.740814209;100.0 +25/10/2020 02:06:29;U454.AI18_PV.F_CV;247.746734619;100.0 +25/10/2020 02:06:30;U454.AI18_PV.F_CV;247.748229980;100.0 +25/10/2020 02:06:31;U454.AI18_PV.F_CV;247.748596191;100.0 +25/10/2020 02:06:32;U454.AI18_PV.F_CV;247.748687744;100.0 +25/10/2020 02:06:33;U454.AI18_PV.F_CV;247.748718262;100.0 +25/10/2020 02:06:34;U454.AI18_PV.F_CV;247.799468994;100.0 +25/10/2020 02:06:35;U454.AI18_PV.F_CV;247.812164307;100.0 +25/10/2020 02:06:36;U454.AI18_PV.F_CV;247.815338135;100.0 +25/10/2020 02:06:37;U454.AI18_PV.F_CV;247.816131592;100.0 +25/10/2020 02:06:38;U454.AI18_PV.F_CV;247.816314697;100.0 +25/10/2020 02:06:39;U454.AI18_PV.F_CV;247.816375732;100.0 +25/10/2020 02:06:40;U454.AI18_PV.F_CV;247.816375732;100.0 +25/10/2020 02:06:41;U454.AI18_PV.F_CV;247.733673096;100.0 +25/10/2020 02:06:42;U454.AI18_PV.F_CV;247.719894409;100.0 +25/10/2020 02:06:43;U454.AI18_PV.F_CV;247.707839966;100.0 +25/10/2020 02:06:44;U454.AI18_PV.F_CV;247.706542969;100.0 +25/10/2020 02:06:45;U454.AI18_PV.F_CV;247.706222534;100.0 +25/10/2020 02:06:46;U454.AI18_PV.F_CV;247.706176758;100.0 +25/10/2020 02:06:47;U454.AI18_PV.F_CV;247.706115723;100.0 +25/10/2020 02:06:48;U454.AI18_PV.F_CV;247.706115723;100.0 +25/10/2020 02:06:49;U454.AI18_PV.F_CV;247.731231689;100.0 +25/10/2020 02:06:50;U454.AI18_PV.F_CV;247.737518311;100.0 +25/10/2020 02:06:51;U454.AI18_PV.F_CV;247.739074707;100.0 +25/10/2020 02:06:52;U454.AI18_PV.F_CV;247.739471436;100.0 +25/10/2020 02:06:53;U454.AI18_PV.F_CV;247.739532471;100.0 +25/10/2020 02:06:54;U454.AI18_PV.F_CV;247.739593506;100.0 +25/10/2020 02:06:55;U454.AI18_PV.F_CV;247.739593506;100.0 +25/10/2020 02:06:56;U454.AI18_PV.F_CV;247.719421387;100.0 +25/10/2020 02:06:57;U454.AI18_PV.F_CV;247.704284668;100.0 +25/10/2020 02:06:58;U454.AI18_PV.F_CV;247.700500488;100.0 +25/10/2020 02:06:59;U454.AI18_PV.F_CV;247.699554443;100.0 +25/10/2020 02:06:00;U454.AI21_PV.F_CV;154.167053223;100.0 +25/10/2020 02:06:01;U454.AI21_PV.F_CV;154.166931152;100.0 +25/10/2020 02:06:02;U454.AI21_PV.F_CV;154.166900635;100.0 +25/10/2020 02:06:03;U454.AI21_PV.F_CV;154.166900635;100.0 +25/10/2020 02:06:04;U454.AI21_PV.F_CV;154.199478149;100.0 +25/10/2020 02:06:05;U454.AI21_PV.F_CV;154.207611084;100.0 +25/10/2020 02:06:06;U454.AI21_PV.F_CV;154.209655762;100.0 +25/10/2020 02:06:07;U454.AI21_PV.F_CV;154.210159302;100.0 +25/10/2020 02:06:08;U454.AI21_PV.F_CV;154.210281372;100.0 +25/10/2020 02:06:09;U454.AI21_PV.F_CV;154.210311890;100.0 +25/10/2020 02:06:10;U454.AI21_PV.F_CV;154.210327148;100.0 +25/10/2020 02:06:11;U454.AI21_PV.F_CV;154.152053833;100.0 +25/10/2020 02:06:12;U454.AI21_PV.F_CV;154.137481689;100.0 +25/10/2020 02:06:13;U454.AI21_PV.F_CV;154.133850098;100.0 +25/10/2020 02:06:14;U454.AI21_PV.F_CV;154.132934570;100.0 +25/10/2020 02:06:15;U454.AI21_PV.F_CV;154.132705688;100.0 +25/10/2020 02:06:16;U454.AI21_PV.F_CV;154.132644653;100.0 +25/10/2020 02:06:17;U454.AI21_PV.F_CV;154.132629395;100.0 +25/10/2020 02:06:18;U454.AI21_PV.F_CV;154.132629395;100.0 +25/10/2020 02:06:19;U454.AI21_PV.F_CV;153.997711182;100.0 +25/10/2020 02:06:20;U454.AI21_PV.F_CV;153.963989258;100.0 +25/10/2020 02:06:21;U454.AI21_PV.F_CV;153.955566406;100.0 +25/10/2020 02:06:22;U454.AI21_PV.F_CV;153.953460693;100.0 +25/10/2020 02:06:23;U454.AI21_PV.F_CV;153.952911377;100.0 +25/10/2020 02:06:24;U454.AI21_PV.F_CV;153.952789307;100.0 +25/10/2020 02:06:25;U454.AI21_PV.F_CV;153.952758789;100.0 +25/10/2020 02:06:26;U454.AI21_PV.F_CV;153.734222412;100.0 +25/10/2020 02:06:27;U454.AI21_PV.F_CV;153.679595947;100.0 +25/10/2020 02:06:28;U454.AI21_PV.F_CV;153.665954590;100.0 +25/10/2020 02:06:29;U454.AI21_PV.F_CV;153.662536621;100.0 +25/10/2020 02:06:30;U454.AI21_PV.F_CV;153.661682129;100.0 +25/10/2020 02:06:31;U454.AI21_PV.F_CV;153.661468506;100.0 +25/10/2020 02:06:32;U454.AI21_PV.F_CV;153.661407471;100.0 +25/10/2020 02:06:33;U454.AI21_PV.F_CV;153.637878418;100.0 +25/10/2020 02:06:34;U454.AI21_PV.F_CV;153.631988525;100.0 +25/10/2020 02:06:35;U454.AI21_PV.F_CV;153.630523682;100.0 +25/10/2020 02:06:36;U454.AI21_PV.F_CV;153.630157471;100.0 +25/10/2020 02:06:37;U454.AI21_PV.F_CV;153.630065918;100.0 +25/10/2020 02:06:38;U454.AI21_PV.F_CV;153.630035400;100.0 +25/10/2020 02:06:39;U454.AI21_PV.F_CV;153.630035400;100.0 +25/10/2020 02:06:40;U454.AI21_PV.F_CV;153.476959229;100.0 +25/10/2020 02:06:41;U454.AI21_PV.F_CV;153.438690186;100.0 +25/10/2020 02:06:42;U454.AI21_PV.F_CV;153.432312012;100.0 +25/10/2020 02:06:43;U454.AI21_PV.F_CV;153.426727295;100.0 +25/10/2020 02:06:44;U454.AI21_PV.F_CV;153.426116943;100.0 +25/10/2020 02:06:45;U454.AI21_PV.F_CV;153.425964355;100.0 +25/10/2020 02:06:46;U454.AI21_PV.F_CV;153.425933838;100.0 +25/10/2020 02:06:47;U454.AI21_PV.F_CV;153.425933838;100.0 +25/10/2020 02:06:48;U454.AI21_PV.F_CV;153.383819580;100.0 +25/10/2020 02:06:49;U454.AI21_PV.F_CV;153.373291016;100.0 +25/10/2020 02:06:50;U454.AI21_PV.F_CV;153.370666504;100.0 +25/10/2020 02:06:51;U454.AI21_PV.F_CV;153.369995117;100.0 +25/10/2020 02:06:52;U454.AI21_PV.F_CV;153.369842529;100.0 +25/10/2020 02:06:53;U454.AI21_PV.F_CV;153.369812012;100.0 +25/10/2020 02:06:54;U454.AI21_PV.F_CV;153.369781494;100.0 +25/10/2020 02:06:55;U454.AI21_PV.F_CV;153.330307007;100.0 +25/10/2020 02:06:56;U454.AI21_PV.F_CV;153.300704956;100.0 +25/10/2020 02:06:57;U454.AI21_PV.F_CV;153.293304443;100.0 +25/10/2020 02:06:58;U454.AI21_PV.F_CV;153.291442871;100.0 +25/10/2020 02:06:59;U454.AI21_PV.F_CV;153.290985107;100.0 +25/10/2020 02:06:37;U454.CCS_Duree.F_CV;1044.000000000;100.0 +25/10/2020 02:06:03;U454.CCS_Nb_Col_Z1.F_CV;3.000000000;100.0 +25/10/2020 02:06:03;U454.CCS_Nb_Col_Z2.F_CV;6.000000000;100.0 +25/10/2020 02:06:03;U454.CCS_Nb_Col_Z3.F_CV;4.000000000;100.0 +25/10/2020 02:06:03;U454.CCS_Nb_Col_Z4.F_CV;2.000000000;100.0 +25/10/2020 02:06:49;U454.CCS_Timer.F_CV;713.599975586;100.0 +25/10/2020 02:06:00;U454.D_FT01_PV.F_CV;0.866743028;100.0 +25/10/2020 02:06:01;U454.D_FT01_PV.F_CV;0.866743207;100.0 +25/10/2020 02:06:02;U454.D_FT01_PV.F_CV;0.866753280;100.0 +25/10/2020 02:06:03;U454.D_FT01_PV.F_CV;0.866737902;100.0 +25/10/2020 02:06:04;U454.D_FT01_PV.F_CV;0.866790771;100.0 +25/10/2020 02:06:05;U454.D_FT01_PV.F_CV;0.866774023;100.0 +25/10/2020 02:06:06;U454.D_FT01_PV.F_CV;0.866703272;100.0 +25/10/2020 02:06:07;U454.D_FT01_PV.F_CV;0.866677403;100.0 +25/10/2020 02:06:08;U454.D_FT01_PV.F_CV;0.866732299;100.0 +25/10/2020 02:06:09;U454.D_FT01_PV.F_CV;0.866755188;100.0 +25/10/2020 02:06:10;U454.D_FT01_PV.F_CV;0.866738915;100.0 +25/10/2020 02:06:11;U454.D_FT01_PV.F_CV;0.866757035;100.0 +25/10/2020 02:06:12;U454.D_FT01_PV.F_CV;0.866695940;100.0 +25/10/2020 02:06:13;U454.D_FT01_PV.F_CV;0.866712213;100.0 +25/10/2020 02:06:14;U454.D_FT01_PV.F_CV;0.866700649;100.0 +25/10/2020 02:06:15;U454.D_FT01_PV.F_CV;0.866627932;100.0 +25/10/2020 02:06:16;U454.D_FT01_PV.F_CV;0.866662979;100.0 +25/10/2020 02:06:17;U454.D_FT01_PV.F_CV;0.866692662;100.0 +25/10/2020 02:06:18;U454.D_FT01_PV.F_CV;0.866775751;100.0 +25/10/2020 02:06:19;U454.D_FT01_PV.F_CV;0.866779208;100.0 +25/10/2020 02:06:20;U454.D_FT01_PV.F_CV;0.866830826;100.0 +25/10/2020 02:06:21;U454.D_FT01_PV.F_CV;0.866816401;100.0 +25/10/2020 02:06:22;U454.D_FT01_PV.F_CV;0.866759539;100.0 +25/10/2020 02:06:23;U454.D_FT01_PV.F_CV;0.866814017;100.0 +25/10/2020 02:06:24;U454.D_FT01_PV.F_CV;0.866888463;100.0 +25/10/2020 02:06:25;U454.D_FT01_PV.F_CV;0.866861939;100.0 +25/10/2020 02:06:26;U454.D_FT01_PV.F_CV;0.866795242;100.0 +25/10/2020 02:06:27;U454.D_FT01_PV.F_CV;0.866816759;100.0 +25/10/2020 02:06:28;U454.D_FT01_PV.F_CV;0.866768479;100.0 +25/10/2020 02:06:29;U454.D_FT01_PV.F_CV;0.866747618;100.0 +25/10/2020 02:06:30;U454.D_FT01_PV.F_CV;0.866834044;100.0 +25/10/2020 02:06:31;U454.D_FT01_PV.F_CV;0.866840541;100.0 +25/10/2020 02:06:32;U454.D_FT01_PV.F_CV;0.866725802;100.0 +25/10/2020 02:06:33;U454.D_FT01_PV.F_CV;0.866735697;100.0 +25/10/2020 02:06:34;U454.D_FT01_PV.F_CV;0.866734505;100.0 +25/10/2020 02:06:35;U454.D_FT01_PV.F_CV;0.866784513;100.0 +25/10/2020 02:06:36;U454.D_FT01_PV.F_CV;0.866913915;100.0 +25/10/2020 02:06:37;U454.D_FT01_PV.F_CV;0.866904020;100.0 +25/10/2020 02:06:38;U454.D_FT01_PV.F_CV;0.866740704;100.0 +25/10/2020 02:06:39;U454.D_FT01_PV.F_CV;0.866772830;100.0 +25/10/2020 02:06:40;U454.D_FT01_PV.F_CV;0.866876066;100.0 +25/10/2020 02:06:41;U454.D_FT01_PV.F_CV;0.866827905;100.0 +25/10/2020 02:06:42;U454.D_FT01_PV.F_CV;0.866790414;100.0 +25/10/2020 02:06:43;U454.D_FT01_PV.F_CV;0.866748571;100.0 +25/10/2020 02:06:44;U454.D_FT01_PV.F_CV;0.866818428;100.0 +25/10/2020 02:06:45;U454.D_FT01_PV.F_CV;0.866931379;100.0 +25/10/2020 02:06:46;U454.D_FT01_PV.F_CV;0.866958976;100.0 +25/10/2020 02:06:47;U454.D_FT01_PV.F_CV;0.866730511;100.0 +25/10/2020 02:06:48;U454.D_FT01_PV.F_CV;0.866790414;100.0 +25/10/2020 02:06:49;U454.D_FT01_PV.F_CV;0.866833568;100.0 +25/10/2020 02:06:50;U454.D_FT01_PV.F_CV;0.866721332;100.0 +25/10/2020 02:06:51;U454.D_FT01_PV.F_CV;0.866635561;100.0 +25/10/2020 02:06:52;U454.D_FT01_PV.F_CV;0.866600275;100.0 +25/10/2020 02:06:53;U454.D_FT01_PV.F_CV;0.866588593;100.0 +25/10/2020 02:06:54;U454.D_FT01_PV.F_CV;0.866717935;100.0 +25/10/2020 02:06:55;U454.D_FT01_PV.F_CV;0.866900682;100.0 +25/10/2020 02:06:56;U454.D_FT01_PV.F_CV;0.866607547;100.0 +25/10/2020 02:06:57;U454.D_FT01_PV.F_CV;0.866716087;100.0 +25/10/2020 02:06:58;U454.D_FT01_PV.F_CV;0.866693437;100.0 +25/10/2020 02:06:59;U454.D_FT01_PV.F_CV;0.866735637;100.0 +25/10/2020 02:06:00;U454.D_FT02_PV.F_CV;0.860523582;100.0 +25/10/2020 02:06:01;U454.D_FT02_PV.F_CV;0.860476255;100.0 +25/10/2020 02:06:02;U454.D_FT02_PV.F_CV;0.860452056;100.0 +25/10/2020 02:06:03;U454.D_FT02_PV.F_CV;0.860425234;100.0 +25/10/2020 02:06:04;U454.D_FT02_PV.F_CV;0.860433578;100.0 +25/10/2020 02:06:05;U454.D_FT02_PV.F_CV;0.860547781;100.0 +25/10/2020 02:06:06;U454.D_FT02_PV.F_CV;0.860586762;100.0 +25/10/2020 02:06:07;U454.D_FT02_PV.F_CV;0.860622644;100.0 +25/10/2020 02:06:08;U454.D_FT02_PV.F_CV;0.860636055;100.0 +25/10/2020 02:06:09;U454.D_FT02_PV.F_CV;0.860639334;100.0 +25/10/2020 02:06:10;U454.D_FT02_PV.F_CV;0.860587597;100.0 +25/10/2020 02:06:11;U454.D_FT02_PV.F_CV;0.860594571;100.0 +25/10/2020 02:06:12;U454.D_FT02_PV.F_CV;0.860584617;100.0 +25/10/2020 02:06:13;U454.D_FT02_PV.F_CV;0.860546708;100.0 +25/10/2020 02:06:14;U454.D_FT02_PV.F_CV;0.860562682;100.0 +25/10/2020 02:06:15;U454.D_FT02_PV.F_CV;0.860497713;100.0 +25/10/2020 02:06:16;U454.D_FT02_PV.F_CV;0.860511661;100.0 +25/10/2020 02:06:17;U454.D_FT02_PV.F_CV;0.860534668;100.0 +25/10/2020 02:06:18;U454.D_FT02_PV.F_CV;0.860591233;100.0 +25/10/2020 02:06:19;U454.D_FT02_PV.F_CV;0.860579789;100.0 +25/10/2020 02:06:20;U454.D_FT02_PV.F_CV;0.860552073;100.0 +25/10/2020 02:06:21;U454.D_FT02_PV.F_CV;0.860561311;100.0 +25/10/2020 02:06:22;U454.D_FT02_PV.F_CV;0.860601127;100.0 +25/10/2020 02:06:23;U454.D_FT02_PV.F_CV;0.860595345;100.0 +25/10/2020 02:06:24;U454.D_FT02_PV.F_CV;0.860567570;100.0 +25/10/2020 02:06:25;U454.D_FT02_PV.F_CV;0.860585332;100.0 +25/10/2020 02:06:26;U454.D_FT02_PV.F_CV;0.860569477;100.0 +25/10/2020 02:06:27;U454.D_FT02_PV.F_CV;0.860569179;100.0 +25/10/2020 02:06:28;U454.D_FT02_PV.F_CV;0.860577822;100.0 +25/10/2020 02:06:29;U454.D_FT02_PV.F_CV;0.860578537;100.0 +25/10/2020 02:06:30;U454.D_FT02_PV.F_CV;0.860563278;100.0 +25/10/2020 02:06:31;U454.D_FT02_PV.F_CV;0.860533357;100.0 +25/10/2020 02:06:32;U454.D_FT02_PV.F_CV;0.860526204;100.0 +25/10/2020 02:06:33;U454.D_FT02_PV.F_CV;0.860517383;100.0 +25/10/2020 02:06:34;U454.D_FT02_PV.F_CV;0.860535741;100.0 +25/10/2020 02:06:35;U454.D_FT02_PV.F_CV;0.860602140;100.0 +25/10/2020 02:06:36;U454.D_FT02_PV.F_CV;0.860607505;100.0 +25/10/2020 02:06:37;U454.D_FT02_PV.F_CV;0.860565364;100.0 +25/10/2020 02:06:38;U454.D_FT02_PV.F_CV;0.860542297;100.0 +25/10/2020 02:06:39;U454.D_FT02_PV.F_CV;0.860548258;100.0 +25/10/2020 02:06:40;U454.D_FT02_PV.F_CV;0.860538125;100.0 +25/10/2020 02:06:41;U454.D_FT02_PV.F_CV;0.860520482;100.0 +25/10/2020 02:06:42;U454.D_FT02_PV.F_CV;0.860515475;100.0 +25/10/2020 02:06:43;U454.D_FT02_PV.F_CV;0.860521972;100.0 +25/10/2020 02:06:44;U454.D_FT02_PV.F_CV;0.860511541;100.0 +25/10/2020 02:06:45;U454.D_FT02_PV.F_CV;0.860541523;100.0 +25/10/2020 02:06:46;U454.D_FT02_PV.F_CV;0.860554934;100.0 +25/10/2020 02:06:47;U454.D_FT02_PV.F_CV;0.860531747;100.0 +25/10/2020 02:06:48;U454.D_FT02_PV.F_CV;0.860442519;100.0 +25/10/2020 02:06:49;U454.D_FT02_PV.F_CV;0.860517144;100.0 +25/10/2020 02:06:50;U454.D_FT02_PV.F_CV;0.860589147;100.0 +25/10/2020 02:06:51;U454.D_FT02_PV.F_CV;0.860548019;100.0 +25/10/2020 02:06:52;U454.D_FT02_PV.F_CV;0.860521913;100.0 +25/10/2020 02:06:53;U454.D_FT02_PV.F_CV;0.860520720;100.0 +25/10/2020 02:06:54;U454.D_FT02_PV.F_CV;0.860539854;100.0 +25/10/2020 02:06:55;U454.D_FT02_PV.F_CV;0.860430360;100.0 +25/10/2020 02:06:56;U454.D_FT02_PV.F_CV;0.860497475;100.0 +25/10/2020 02:06:57;U454.D_FT02_PV.F_CV;0.860460281;100.0 +25/10/2020 02:06:58;U454.D_FT02_PV.F_CV;0.860487342;100.0 +25/10/2020 02:06:59;U454.D_FT02_PV.F_CV;0.860654056;100.0 +25/10/2020 02:06:00;U454.D_FT03_PV.F_CV;0.859091341;100.0 +25/10/2020 02:06:01;U454.D_FT03_PV.F_CV;0.859081924;100.0 +25/10/2020 02:06:02;U454.D_FT03_PV.F_CV;0.859059334;100.0 +25/10/2020 02:06:03;U454.D_FT03_PV.F_CV;0.859036684;100.0 +25/10/2020 02:06:04;U454.D_FT03_PV.F_CV;0.859035492;100.0 +25/10/2020 02:06:05;U454.D_FT03_PV.F_CV;0.859075069;100.0 +25/10/2020 02:06:06;U454.D_FT03_PV.F_CV;0.859072328;100.0 +25/10/2020 02:06:07;U454.D_FT03_PV.F_CV;0.859087646;100.0 +25/10/2020 02:06:08;U454.D_FT03_PV.F_CV;0.859085560;100.0 +25/10/2020 02:06:09;U454.D_FT03_PV.F_CV;0.859097779;100.0 +25/10/2020 02:06:10;U454.D_FT03_PV.F_CV;0.859088957;100.0 +25/10/2020 02:06:11;U454.D_FT03_PV.F_CV;0.859087646;100.0 +25/10/2020 02:06:12;U454.D_FT03_PV.F_CV;0.859083891;100.0 +25/10/2020 02:06:13;U454.D_FT03_PV.F_CV;0.859082460;100.0 +25/10/2020 02:06:14;U454.D_FT03_PV.F_CV;0.859081745;100.0 +25/10/2020 02:06:15;U454.D_FT03_PV.F_CV;0.859072924;100.0 +25/10/2020 02:06:16;U454.D_FT03_PV.F_CV;0.859063983;100.0 +25/10/2020 02:06:17;U454.D_FT03_PV.F_CV;0.859069645;100.0 +25/10/2020 02:06:18;U454.D_FT03_PV.F_CV;0.859083414;100.0 +25/10/2020 02:06:19;U454.D_FT03_PV.F_CV;0.859099448;100.0 +25/10/2020 02:06:20;U454.D_FT03_PV.F_CV;0.859089792;100.0 +25/10/2020 02:06:21;U454.D_FT03_PV.F_CV;0.859083235;100.0 +25/10/2020 02:06:22;U454.D_FT03_PV.F_CV;0.859048367;100.0 +25/10/2020 02:06:23;U454.D_FT03_PV.F_CV;0.859058142;100.0 +25/10/2020 02:06:24;U454.D_FT03_PV.F_CV;0.859091103;100.0 +25/10/2020 02:06:25;U454.D_FT03_PV.F_CV;0.859066308;100.0 +25/10/2020 02:06:26;U454.D_FT03_PV.F_CV;0.859059572;100.0 +25/10/2020 02:06:27;U454.D_FT03_PV.F_CV;0.859054565;100.0 +25/10/2020 02:06:28;U454.D_FT03_PV.F_CV;0.859055817;100.0 +25/10/2020 02:06:29;U454.D_FT03_PV.F_CV;0.859072566;100.0 +25/10/2020 02:06:30;U454.D_FT03_PV.F_CV;0.859061837;100.0 +25/10/2020 02:06:31;U454.D_FT03_PV.F_CV;0.859044909;100.0 +25/10/2020 02:06:32;U454.D_FT03_PV.F_CV;0.859063864;100.0 +25/10/2020 02:06:33;U454.D_FT03_PV.F_CV;0.859100223;100.0 +25/10/2020 02:06:34;U454.D_FT03_PV.F_CV;0.859095216;100.0 +25/10/2020 02:06:35;U454.D_FT03_PV.F_CV;0.859059215;100.0 +25/10/2020 02:06:36;U454.D_FT03_PV.F_CV;0.859077990;100.0 +25/10/2020 02:06:37;U454.D_FT03_PV.F_CV;0.859071016;100.0 +25/10/2020 02:06:38;U454.D_FT03_PV.F_CV;0.859047771;100.0 +25/10/2020 02:06:39;U454.D_FT03_PV.F_CV;0.859046340;100.0 +25/10/2020 02:06:40;U454.D_FT03_PV.F_CV;0.859057844;100.0 +25/10/2020 02:06:41;U454.D_FT03_PV.F_CV;0.859061480;100.0 +25/10/2020 02:06:42;U454.D_FT03_PV.F_CV;0.859061003;100.0 +25/10/2020 02:06:43;U454.D_FT03_PV.F_CV;0.859073520;100.0 +25/10/2020 02:06:44;U454.D_FT03_PV.F_CV;0.859069943;100.0 +25/10/2020 02:06:45;U454.D_FT03_PV.F_CV;0.859094620;100.0 +25/10/2020 02:06:46;U454.D_FT03_PV.F_CV;0.859105587;100.0 +25/10/2020 02:06:47;U454.D_FT03_PV.F_CV;0.859079123;100.0 +25/10/2020 02:06:48;U454.D_FT03_PV.F_CV;0.859062791;100.0 +25/10/2020 02:06:49;U454.D_FT03_PV.F_CV;0.859053016;100.0 +25/10/2020 02:06:50;U454.D_FT03_PV.F_CV;0.859037578;100.0 +25/10/2020 02:06:51;U454.D_FT03_PV.F_CV;0.859055936;100.0 +25/10/2020 02:06:52;U454.D_FT03_PV.F_CV;0.859072387;100.0 +25/10/2020 02:06:53;U454.D_FT03_PV.F_CV;0.859074235;100.0 +25/10/2020 02:06:54;U454.D_FT03_PV.F_CV;0.859084010;100.0 +25/10/2020 02:06:55;U454.D_FT03_PV.F_CV;0.859051824;100.0 +25/10/2020 02:06:56;U454.D_FT03_PV.F_CV;0.859058857;100.0 +25/10/2020 02:06:57;U454.D_FT03_PV.F_CV;0.859035969;100.0 +25/10/2020 02:06:58;U454.D_FT03_PV.F_CV;0.859051228;100.0 +25/10/2020 02:06:59;U454.D_FT03_PV.F_CV;0.859034300;100.0 +25/10/2020 02:06:00;U454.D_FT06_PV.F_CV;0.862668991;100.0 +25/10/2020 02:06:01;U454.D_FT06_PV.F_CV;0.862619460;100.0 +25/10/2020 02:06:02;U454.D_FT06_PV.F_CV;0.862714767;100.0 +25/10/2020 02:06:03;U454.D_FT06_PV.F_CV;0.862927437;100.0 +25/10/2020 02:06:04;U454.D_FT06_PV.F_CV;0.863155484;100.0 +25/10/2020 02:06:05;U454.D_FT06_PV.F_CV;0.863003850;100.0 +25/10/2020 02:06:06;U454.D_FT06_PV.F_CV;0.862825990;100.0 +25/10/2020 02:06:07;U454.D_FT06_PV.F_CV;0.862760901;100.0 +25/10/2020 02:06:08;U454.D_FT06_PV.F_CV;0.862859368;100.0 +25/10/2020 02:06:09;U454.D_FT06_PV.F_CV;0.862950087;100.0 +25/10/2020 02:06:10;U454.D_FT06_PV.F_CV;0.862817883;100.0 +25/10/2020 02:06:11;U454.D_FT06_PV.F_CV;0.862808824;100.0 +25/10/2020 02:06:12;U454.D_FT06_PV.F_CV;0.862792373;100.0 +25/10/2020 02:06:13;U454.D_FT06_PV.F_CV;0.862718880;100.0 +25/10/2020 02:06:14;U454.D_FT06_PV.F_CV;0.862720370;100.0 +25/10/2020 02:06:15;U454.D_FT06_PV.F_CV;0.862926722;100.0 +25/10/2020 02:06:16;U454.D_FT06_PV.F_CV;0.862769008;100.0 +25/10/2020 02:06:17;U454.D_FT06_PV.F_CV;0.862636328;100.0 +25/10/2020 02:06:18;U454.D_FT06_PV.F_CV;0.862868190;100.0 +25/10/2020 02:06:19;U454.D_FT06_PV.F_CV;0.862882018;100.0 +25/10/2020 02:06:20;U454.D_FT06_PV.F_CV;0.862657964;100.0 +25/10/2020 02:06:21;U454.D_FT06_PV.F_CV;0.862615168;100.0 +25/10/2020 02:06:22;U454.D_FT06_PV.F_CV;0.862753153;100.0 +25/10/2020 02:06:23;U454.D_FT06_PV.F_CV;0.862885952;100.0 +25/10/2020 02:06:24;U454.D_FT06_PV.F_CV;0.862908721;100.0 +25/10/2020 02:06:25;U454.D_FT06_PV.F_CV;0.862939000;100.0 +25/10/2020 02:06:26;U454.D_FT06_PV.F_CV;0.862817645;100.0 +25/10/2020 02:06:27;U454.D_FT06_PV.F_CV;0.862648845;100.0 +25/10/2020 02:06:28;U454.D_FT06_PV.F_CV;0.862611592;100.0 +25/10/2020 02:06:29;U454.D_FT06_PV.F_CV;0.862868726;100.0 +25/10/2020 02:06:30;U454.D_FT06_PV.F_CV;0.862950623;100.0 +25/10/2020 02:06:31;U454.D_FT06_PV.F_CV;0.862970114;100.0 +25/10/2020 02:06:32;U454.D_FT06_PV.F_CV;0.863041639;100.0 +25/10/2020 02:06:33;U454.D_FT06_PV.F_CV;0.862803221;100.0 +25/10/2020 02:06:34;U454.D_FT06_PV.F_CV;0.862810075;100.0 +25/10/2020 02:06:35;U454.D_FT06_PV.F_CV;0.862788379;100.0 +25/10/2020 02:06:36;U454.D_FT06_PV.F_CV;0.863142431;100.0 +25/10/2020 02:06:37;U454.D_FT06_PV.F_CV;0.863052130;100.0 +25/10/2020 02:06:38;U454.D_FT06_PV.F_CV;0.863157153;100.0 +25/10/2020 02:06:39;U454.D_FT06_PV.F_CV;0.863218069;100.0 +25/10/2020 02:06:40;U454.D_FT06_PV.F_CV;0.863123417;100.0 +25/10/2020 02:06:41;U454.D_FT06_PV.F_CV;0.863321126;100.0 +25/10/2020 02:06:42;U454.D_FT06_PV.F_CV;0.863435626;100.0 +25/10/2020 02:06:43;U454.D_FT06_PV.F_CV;0.862944901;100.0 +25/10/2020 02:06:44;U454.D_FT06_PV.F_CV;0.862902582;100.0 +25/10/2020 02:06:45;U454.D_FT06_PV.F_CV;0.862889528;100.0 +25/10/2020 02:06:46;U454.D_FT06_PV.F_CV;0.862908125;100.0 +25/10/2020 02:06:47;U454.D_FT06_PV.F_CV;0.863064647;100.0 +25/10/2020 02:06:48;U454.D_FT06_PV.F_CV;0.863017559;100.0 +25/10/2020 02:06:49;U454.D_FT06_PV.F_CV;0.863344252;100.0 +25/10/2020 02:06:50;U454.D_FT06_PV.F_CV;0.863124549;100.0 +25/10/2020 02:06:51;U454.D_FT06_PV.F_CV;0.862900794;100.0 +25/10/2020 02:06:52;U454.D_FT06_PV.F_CV;0.862884283;100.0 +25/10/2020 02:06:53;U454.D_FT06_PV.F_CV;0.862884879;100.0 +25/10/2020 02:06:54;U454.D_FT06_PV.F_CV;0.863073707;100.0 +25/10/2020 02:06:55;U454.D_FT06_PV.F_CV;0.862959862;100.0 +25/10/2020 02:06:56;U454.D_FT06_PV.F_CV;0.862754822;100.0 +25/10/2020 02:06:57;U454.D_FT06_PV.F_CV;0.863077641;100.0 +25/10/2020 02:06:58;U454.D_FT06_PV.F_CV;0.863052428;100.0 +25/10/2020 02:06:59;U454.D_FT06_PV.F_CV;0.863191962;100.0 +25/10/2020 02:06:00;U454.EBZ_HoT2.F_CV;15.254699707;100.0 +25/10/2020 02:06:01;U454.EBZ_HoT2.F_CV;15.254699707;100.0 +25/10/2020 02:06:02;U454.EBZ_HoT2.F_CV;15.254699707;100.0 +25/10/2020 02:06:03;U454.EBZ_HoT2.F_CV;15.254699707;100.0 +25/10/2020 02:06:04;U454.EBZ_HoT2.F_CV;15.254699707;100.0 +25/10/2020 02:06:05;U454.EBZ_HoT2.F_CV;15.254699707;100.0 +25/10/2020 02:06:06;U454.EBZ_HoT2.F_CV;15.254699707;100.0 +25/10/2020 02:06:07;U454.EBZ_HoT2.F_CV;15.254699707;100.0 +25/10/2020 02:06:08;U454.EBZ_HoT2.F_CV;15.254699707;100.0 +25/10/2020 02:06:09;U454.EBZ_HoT2.F_CV;15.254699707;100.0 +25/10/2020 02:06:10;U454.EBZ_HoT2.F_CV;15.254699707;100.0 +25/10/2020 02:06:11;U454.EBZ_HoT2.F_CV;15.254699707;100.0 +25/10/2020 02:06:12;U454.EBZ_HoT2.F_CV;15.254699707;100.0 +25/10/2020 02:06:13;U454.EBZ_HoT2.F_CV;15.254699707;100.0 +25/10/2020 02:06:14;U454.EBZ_HoT2.F_CV;15.254699707;100.0 +25/10/2020 02:06:15;U454.EBZ_HoT2.F_CV;15.254699707;100.0 +25/10/2020 02:06:16;U454.EBZ_HoT2.F_CV;15.254699707;100.0 +25/10/2020 02:06:17;U454.EBZ_HoT2.F_CV;15.187299728;100.0 +25/10/2020 02:06:18;U454.EBZ_HoT2.F_CV;15.187299728;100.0 +25/10/2020 02:06:19;U454.EBZ_HoT2.F_CV;15.187299728;100.0 +25/10/2020 02:06:20;U454.EBZ_HoT2.F_CV;15.187299728;100.0 +25/10/2020 02:06:21;U454.EBZ_HoT2.F_CV;15.187299728;100.0 +25/10/2020 02:06:22;U454.EBZ_HoT2.F_CV;15.187299728;100.0 +25/10/2020 02:06:23;U454.EBZ_HoT2.F_CV;15.187299728;100.0 +25/10/2020 02:06:24;U454.EBZ_HoT2.F_CV;15.187299728;100.0 +25/10/2020 02:06:25;U454.EBZ_HoT2.F_CV;15.187299728;100.0 +25/10/2020 02:06:26;U454.EBZ_HoT2.F_CV;15.187299728;100.0 +25/10/2020 02:06:27;U454.EBZ_HoT2.F_CV;15.187299728;100.0 +25/10/2020 02:06:28;U454.EBZ_HoT2.F_CV;15.187299728;100.0 +25/10/2020 02:06:29;U454.EBZ_HoT2.F_CV;15.187299728;100.0 +25/10/2020 02:06:30;U454.EBZ_HoT2.F_CV;15.187299728;100.0 +25/10/2020 02:06:31;U454.EBZ_HoT2.F_CV;15.187299728;100.0 +25/10/2020 02:06:32;U454.EBZ_HoT2.F_CV;15.187299728;100.0 +25/10/2020 02:06:33;U454.EBZ_HoT2.F_CV;15.187299728;100.0 +25/10/2020 02:06:34;U454.EBZ_HoT2.F_CV;15.187299728;100.0 +25/10/2020 02:06:35;U454.EBZ_HoT2.F_CV;15.187299728;100.0 +25/10/2020 02:06:36;U454.EBZ_HoT2.F_CV;15.216099739;100.0 +25/10/2020 02:06:37;U454.EBZ_HoT2.F_CV;15.216099739;100.0 +25/10/2020 02:06:38;U454.EBZ_HoT2.F_CV;15.216099739;100.0 +25/10/2020 02:06:39;U454.EBZ_HoT2.F_CV;15.216099739;100.0 +25/10/2020 02:06:40;U454.EBZ_HoT2.F_CV;15.216099739;100.0 +25/10/2020 02:06:41;U454.EBZ_HoT2.F_CV;15.216099739;100.0 +25/10/2020 02:06:42;U454.EBZ_HoT2.F_CV;15.216099739;100.0 +25/10/2020 02:06:43;U454.EBZ_HoT2.F_CV;15.216099739;100.0 +25/10/2020 02:06:44;U454.EBZ_HoT2.F_CV;15.216099739;100.0 +25/10/2020 02:06:45;U454.EBZ_HoT2.F_CV;15.216099739;100.0 +25/10/2020 02:06:46;U454.EBZ_HoT2.F_CV;15.216099739;100.0 +25/10/2020 02:06:47;U454.EBZ_HoT2.F_CV;15.216099739;100.0 +25/10/2020 02:06:48;U454.EBZ_HoT2.F_CV;15.216099739;100.0 +25/10/2020 02:06:49;U454.EBZ_HoT2.F_CV;15.216099739;100.0 +25/10/2020 02:06:50;U454.EBZ_HoT2.F_CV;15.216099739;100.0 +25/10/2020 02:06:51;U454.EBZ_HoT2.F_CV;15.216099739;100.0 +25/10/2020 02:06:52;U454.EBZ_HoT2.F_CV;15.216099739;100.0 +25/10/2020 02:06:53;U454.EBZ_HoT2.F_CV;15.216099739;100.0 +25/10/2020 02:06:54;U454.EBZ_HoT2.F_CV;15.036700249;100.0 +25/10/2020 02:06:55;U454.EBZ_HoT2.F_CV;15.036700249;100.0 +25/10/2020 02:06:56;U454.EBZ_HoT2.F_CV;15.036700249;100.0 +25/10/2020 02:06:57;U454.EBZ_HoT2.F_CV;15.036700249;100.0 +25/10/2020 02:06:58;U454.EBZ_HoT2.F_CV;15.036700249;100.0 +25/10/2020 02:06:59;U454.EBZ_HoT2.F_CV;15.036700249;100.0 +25/10/2020 02:06:00;U454.EBZ_Qresidual.F_CV;50.230998993;100.0 +25/10/2020 02:06:01;U454.EBZ_Qresidual.F_CV;50.230998993;100.0 +25/10/2020 02:06:02;U454.EBZ_Qresidual.F_CV;50.230998993;100.0 +25/10/2020 02:06:03;U454.EBZ_Qresidual.F_CV;50.230998993;100.0 +25/10/2020 02:06:04;U454.EBZ_Qresidual.F_CV;50.230998993;100.0 +25/10/2020 02:06:05;U454.EBZ_Qresidual.F_CV;50.230998993;100.0 +25/10/2020 02:06:06;U454.EBZ_Qresidual.F_CV;50.230998993;100.0 +25/10/2020 02:06:07;U454.EBZ_Qresidual.F_CV;50.230998993;100.0 +25/10/2020 02:06:08;U454.EBZ_Qresidual.F_CV;50.230998993;100.0 +25/10/2020 02:06:09;U454.EBZ_Qresidual.F_CV;50.230998993;100.0 +25/10/2020 02:06:10;U454.EBZ_Qresidual.F_CV;50.230998993;100.0 +25/10/2020 02:06:11;U454.EBZ_Qresidual.F_CV;50.230998993;100.0 +25/10/2020 02:06:12;U454.EBZ_Qresidual.F_CV;50.230998993;100.0 +25/10/2020 02:06:13;U454.EBZ_Qresidual.F_CV;50.230998993;100.0 +25/10/2020 02:06:14;U454.EBZ_Qresidual.F_CV;50.230998993;100.0 +25/10/2020 02:06:15;U454.EBZ_Qresidual.F_CV;50.230998993;100.0 +25/10/2020 02:06:16;U454.EBZ_Qresidual.F_CV;50.230998993;100.0 +25/10/2020 02:06:17;U454.EBZ_Qresidual.F_CV;51.374099731;100.0 +25/10/2020 02:06:18;U454.EBZ_Qresidual.F_CV;51.374099731;100.0 +25/10/2020 02:06:19;U454.EBZ_Qresidual.F_CV;51.374099731;100.0 +25/10/2020 02:06:20;U454.EBZ_Qresidual.F_CV;51.374099731;100.0 +25/10/2020 02:06:21;U454.EBZ_Qresidual.F_CV;51.374099731;100.0 +25/10/2020 02:06:22;U454.EBZ_Qresidual.F_CV;51.374099731;100.0 +25/10/2020 02:06:23;U454.EBZ_Qresidual.F_CV;51.374099731;100.0 +25/10/2020 02:06:24;U454.EBZ_Qresidual.F_CV;51.374099731;100.0 +25/10/2020 02:06:25;U454.EBZ_Qresidual.F_CV;51.374099731;100.0 +25/10/2020 02:06:26;U454.EBZ_Qresidual.F_CV;51.374099731;100.0 +25/10/2020 02:06:27;U454.EBZ_Qresidual.F_CV;51.374099731;100.0 +25/10/2020 02:06:28;U454.EBZ_Qresidual.F_CV;51.374099731;100.0 +25/10/2020 02:06:29;U454.EBZ_Qresidual.F_CV;51.374099731;100.0 +25/10/2020 02:06:30;U454.EBZ_Qresidual.F_CV;51.374099731;100.0 +25/10/2020 02:06:31;U454.EBZ_Qresidual.F_CV;51.374099731;100.0 +25/10/2020 02:06:32;U454.EBZ_Qresidual.F_CV;51.374099731;100.0 +25/10/2020 02:06:33;U454.EBZ_Qresidual.F_CV;51.374099731;100.0 +25/10/2020 02:06:34;U454.EBZ_Qresidual.F_CV;51.374099731;100.0 +25/10/2020 02:06:35;U454.EBZ_Qresidual.F_CV;51.374099731;100.0 +25/10/2020 02:06:36;U454.EBZ_Qresidual.F_CV;51.220600128;100.0 +25/10/2020 02:06:37;U454.EBZ_Qresidual.F_CV;51.220600128;100.0 +25/10/2020 02:06:38;U454.EBZ_Qresidual.F_CV;51.220600128;100.0 +25/10/2020 02:06:39;U454.EBZ_Qresidual.F_CV;51.220600128;100.0 +25/10/2020 02:06:40;U454.EBZ_Qresidual.F_CV;51.220600128;100.0 +25/10/2020 02:06:41;U454.EBZ_Qresidual.F_CV;51.220600128;100.0 +25/10/2020 02:06:42;U454.EBZ_Qresidual.F_CV;51.220600128;100.0 +25/10/2020 02:06:43;U454.EBZ_Qresidual.F_CV;51.220600128;100.0 +25/10/2020 02:06:44;U454.EBZ_Qresidual.F_CV;51.220600128;100.0 +25/10/2020 02:06:45;U454.EBZ_Qresidual.F_CV;51.220600128;100.0 +25/10/2020 02:06:46;U454.EBZ_Qresidual.F_CV;51.220600128;100.0 +25/10/2020 02:06:47;U454.EBZ_Qresidual.F_CV;51.220600128;100.0 +25/10/2020 02:06:48;U454.EBZ_Qresidual.F_CV;51.220600128;100.0 +25/10/2020 02:06:49;U454.EBZ_Qresidual.F_CV;51.220600128;100.0 +25/10/2020 02:06:50;U454.EBZ_Qresidual.F_CV;51.220600128;100.0 +25/10/2020 02:06:51;U454.EBZ_Qresidual.F_CV;51.220600128;100.0 +25/10/2020 02:06:52;U454.EBZ_Qresidual.F_CV;51.220600128;100.0 +25/10/2020 02:06:53;U454.EBZ_Qresidual.F_CV;51.220600128;100.0 +25/10/2020 02:06:54;U454.EBZ_Qresidual.F_CV;51.389198303;100.0 +25/10/2020 02:06:55;U454.EBZ_Qresidual.F_CV;51.389198303;100.0 +25/10/2020 02:06:56;U454.EBZ_Qresidual.F_CV;51.389198303;100.0 +25/10/2020 02:06:57;U454.EBZ_Qresidual.F_CV;51.389198303;100.0 +25/10/2020 02:06:58;U454.EBZ_Qresidual.F_CV;51.389198303;100.0 +25/10/2020 02:06:59;U454.EBZ_Qresidual.F_CV;51.389198303;100.0 +25/10/2020 02:06:00;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.F101_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.F201_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.F301_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.F401_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.F41_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.F42_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.F501_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.F90_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.F98_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.FC01_OP.F_CV;39.241683960;100.0 +25/10/2020 02:06:00;U454.FC01_PV.F_CV;8.399155617;100.0 +25/10/2020 02:06:01;U454.FC01_PV.F_CV;8.649498940;100.0 +25/10/2020 02:06:02;U454.FC01_PV.F_CV;8.683326721;100.0 +25/10/2020 02:06:04;U454.FC01_PV.F_CV;8.433962822;100.0 +25/10/2020 02:06:05;U454.FC01_PV.F_CV;8.493856430;100.0 +25/10/2020 02:06:07;U454.FC01_PV.F_CV;8.450885773;100.0 +25/10/2020 02:06:08;U454.FC01_PV.F_CV;8.531535149;100.0 +25/10/2020 02:06:09;U454.FC01_PV.F_CV;8.371851921;100.0 +25/10/2020 02:06:12;U454.FC01_PV.F_CV;8.529267311;100.0 +25/10/2020 02:06:13;U454.FC01_PV.F_CV;8.486146927;100.0 +25/10/2020 02:06:14;U454.FC01_PV.F_CV;8.632747650;100.0 +25/10/2020 02:06:18;U454.FC01_PV.F_CV;8.366426468;100.0 +25/10/2020 02:06:19;U454.FC01_PV.F_CV;8.291338921;100.0 +25/10/2020 02:06:20;U454.FC01_PV.F_CV;8.487087250;100.0 +25/10/2020 02:06:21;U454.FC01_PV.F_CV;8.517624855;100.0 +25/10/2020 02:06:23;U454.FC01_PV.F_CV;8.679300308;100.0 +25/10/2020 02:06:24;U454.FC01_PV.F_CV;8.552188873;100.0 +25/10/2020 02:06:25;U454.FC01_PV.F_CV;8.516609192;100.0 +25/10/2020 02:06:27;U454.FC01_PV.F_CV;8.358139992;100.0 +25/10/2020 02:06:28;U454.FC01_PV.F_CV;8.403388023;100.0 +25/10/2020 02:06:29;U454.FC01_PV.F_CV;8.544953346;100.0 +25/10/2020 02:06:31;U454.FC01_PV.F_CV;8.340202332;100.0 +25/10/2020 02:06:32;U454.FC01_PV.F_CV;8.543035507;100.0 +25/10/2020 02:06:33;U454.FC01_PV.F_CV;8.639720917;100.0 +25/10/2020 02:06:35;U454.FC01_PV.F_CV;8.460495949;100.0 +25/10/2020 02:06:37;U454.FC01_PV.F_CV;8.367897034;100.0 +25/10/2020 02:06:38;U454.FC01_PV.F_CV;8.443212509;100.0 +25/10/2020 02:06:39;U454.FC01_PV.F_CV;8.594932556;100.0 +25/10/2020 02:06:41;U454.FC01_PV.F_CV;8.527284622;100.0 +25/10/2020 02:06:43;U454.FC01_PV.F_CV;8.652635574;100.0 +25/10/2020 02:06:45;U454.FC01_PV.F_CV;8.378851891;100.0 +25/10/2020 02:06:48;U454.FC01_PV.F_CV;8.477391243;100.0 +25/10/2020 02:06:51;U454.FC01_PV.F_CV;8.302290916;100.0 +25/10/2020 02:06:52;U454.FC01_PV.F_CV;8.390224457;100.0 +25/10/2020 02:06:54;U454.FC01_PV.F_CV;8.432659149;100.0 +25/10/2020 02:06:55;U454.FC01_PV.F_CV;8.492210388;100.0 +25/10/2020 02:06:56;U454.FC01_PV.F_CV;8.464435577;100.0 +25/10/2020 02:06:58;U454.FC01_PV.F_CV;8.542507172;100.0 +25/10/2020 02:06:03;U454.FC01_SP.F_CV;8.420000076;100.0 +25/10/2020 02:06:00;U454.FC02_OP.F_CV;35.107910156;100.0 +25/10/2020 02:06:22;U454.FC02_PV.F_CV;11.385441780;100.0 +25/10/2020 02:06:33;U454.FC02_PV.F_CV;11.311751366;100.0 +25/10/2020 02:06:44;U454.FC02_PV.F_CV;11.363579750;100.0 +25/10/2020 02:06:49;U454.FC02_PV.F_CV;11.292474747;100.0 +25/10/2020 02:06:54;U454.FC02_PV.F_CV;11.346856117;100.0 +25/10/2020 02:06:03;U454.FC02_SP.F_CV;11.270000458;100.0 +25/10/2020 02:06:00;U454.FC03_OP.F_CV;26.109859467;100.0 +25/10/2020 02:06:37;U454.FC03_PV.F_CV;4.954342842;100.0 +25/10/2020 02:06:51;U454.FC03_PV.F_CV;4.944180012;100.0 +25/10/2020 02:06:45;U454.FC03_SP.F_CV;4.960000038;100.0 +25/10/2020 02:06:09;U454.FC05_PV.F_CV;31.084632874;100.0 +25/10/2020 02:06:11;U454.FC05_PV.F_CV;31.224874496;100.0 +25/10/2020 02:06:15;U454.FC05_PV.F_CV;31.098497391;100.0 +25/10/2020 02:06:18;U454.FC05_PV.F_CV;31.264137268;100.0 +25/10/2020 02:06:22;U454.FC05_PV.F_CV;31.106647491;100.0 +25/10/2020 02:06:25;U454.FC05_PV.F_CV;31.311542511;100.0 +25/10/2020 02:06:27;U454.FC05_PV.F_CV;31.183702469;100.0 +25/10/2020 02:06:31;U454.FC05_PV.F_CV;31.121925354;100.0 +25/10/2020 02:06:33;U454.FC05_PV.F_CV;31.251415253;100.0 +25/10/2020 02:06:36;U454.FC05_PV.F_CV;31.110195160;100.0 +25/10/2020 02:06:40;U454.FC05_PV.F_CV;31.292547226;100.0 +25/10/2020 02:06:42;U454.FC05_PV.F_CV;31.219287872;100.0 +25/10/2020 02:06:43;U454.FC05_PV.F_CV;31.070531845;100.0 +25/10/2020 02:06:47;U454.FC05_PV.F_CV;31.293252945;100.0 +25/10/2020 02:06:49;U454.FC05_PV.F_CV;31.079088211;100.0 +25/10/2020 02:06:52;U454.FC05_PV.F_CV;31.263362885;100.0 +25/10/2020 02:06:57;U454.FC05_PV.F_CV;31.083587646;100.0 +25/10/2020 02:06:59;U454.FC05_PV.F_CV;31.188558578;100.0 +25/10/2020 02:06:55;U454.FC05_SP.F_CV;31.180000305;100.0 +25/10/2020 02:06:45;U454.FC05_SP_Z1.F_CV;36.139999390;100.0 +25/10/2020 02:06:01;U454.FI06_PV.F_CV;14.895362854;100.0 +25/10/2020 02:06:04;U454.FI06_PV.F_CV;14.856521606;100.0 +25/10/2020 02:06:06;U454.FI06_PV.F_CV;14.891303062;100.0 +25/10/2020 02:06:15;U454.FI06_PV.F_CV;14.794609070;100.0 +25/10/2020 02:06:21;U454.FI06_PV.F_CV;14.885844231;100.0 +25/10/2020 02:06:27;U454.FI06_PV.F_CV;14.819387436;100.0 +25/10/2020 02:06:29;U454.FI06_PV.F_CV;14.855628967;100.0 +25/10/2020 02:06:33;U454.FI06_PV.F_CV;14.807989120;100.0 +25/10/2020 02:06:36;U454.FI06_PV.F_CV;15.113144875;100.0 +25/10/2020 02:06:37;U454.FI06_PV.F_CV;15.317553520;100.0 +25/10/2020 02:06:38;U454.FI06_PV.F_CV;15.401374817;100.0 +25/10/2020 02:06:39;U454.FI06_PV.F_CV;15.427427292;100.0 +25/10/2020 02:06:41;U454.FI06_PV.F_CV;15.352178574;100.0 +25/10/2020 02:06:50;U454.FI06_PV.F_CV;15.294715881;100.0 +25/10/2020 02:06:51;U454.FI06_PV.F_CV;15.334196091;100.0 +25/10/2020 02:06:00;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV01C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV01E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV01R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV01S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV02C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV02E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV02R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV02S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV03C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV03E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV03R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV03S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.HEV04C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV04C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV04E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV04R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV04S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV05C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.HEV05C_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV05E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV05R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV05S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV06C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV06E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV06R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV06S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV07C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV07E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV07R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV07S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV08C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV08E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.HEV08R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV08R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV08S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV09C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV09E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV09R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.HEV09R_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV09S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV10C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV10E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV10R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.HEV10S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV10S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV11C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV11E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV11R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV11S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.HEV11S_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV12C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV12E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV12R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV12S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV13C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.HEV13E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV13E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV13R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV13S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV14C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV14E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.HEV14E_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV14R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV14S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV15C_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV15E_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV15R_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV15S_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV16_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV17_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV20_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV25_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV29_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV35_OUT.F_CV; +25/10/2020 02:06:58;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV35_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV36_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.HEV50_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV55_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.HEV75_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.HEV76_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV85_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV86_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV87_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.HEV96_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.HEV99_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.LEV01_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.LEV02_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.MX_HoT2.F_CV;0.568612516;100.0 +25/10/2020 02:06:01;U454.MX_HoT2.F_CV;0.568612516;100.0 +25/10/2020 02:06:02;U454.MX_HoT2.F_CV;0.568612516;100.0 +25/10/2020 02:06:03;U454.MX_HoT2.F_CV;0.568612516;100.0 +25/10/2020 02:06:04;U454.MX_HoT2.F_CV;0.568612516;100.0 +25/10/2020 02:06:05;U454.MX_HoT2.F_CV;0.568612516;100.0 +25/10/2020 02:06:06;U454.MX_HoT2.F_CV;0.568612516;100.0 +25/10/2020 02:06:07;U454.MX_HoT2.F_CV;0.568612516;100.0 +25/10/2020 02:06:08;U454.MX_HoT2.F_CV;0.568612516;100.0 +25/10/2020 02:06:09;U454.MX_HoT2.F_CV;0.568612516;100.0 +25/10/2020 02:06:10;U454.MX_HoT2.F_CV;0.568612516;100.0 +25/10/2020 02:06:11;U454.MX_HoT2.F_CV;0.568612516;100.0 +25/10/2020 02:06:12;U454.MX_HoT2.F_CV;0.568612516;100.0 +25/10/2020 02:06:13;U454.MX_HoT2.F_CV;0.568612516;100.0 +25/10/2020 02:06:14;U454.MX_HoT2.F_CV;0.568612516;100.0 +25/10/2020 02:06:15;U454.MX_HoT2.F_CV;0.568612516;100.0 +25/10/2020 02:06:16;U454.MX_HoT2.F_CV;0.568612516;100.0 +25/10/2020 02:06:17;U454.MX_HoT2.F_CV;0.568106234;100.0 +25/10/2020 02:06:18;U454.MX_HoT2.F_CV;0.568106234;100.0 +25/10/2020 02:06:19;U454.MX_HoT2.F_CV;0.568106234;100.0 +25/10/2020 02:06:20;U454.MX_HoT2.F_CV;0.568106234;100.0 +25/10/2020 02:06:21;U454.MX_HoT2.F_CV;0.568106234;100.0 +25/10/2020 02:06:22;U454.MX_HoT2.F_CV;0.568106234;100.0 +25/10/2020 02:06:23;U454.MX_HoT2.F_CV;0.568106234;100.0 +25/10/2020 02:06:24;U454.MX_HoT2.F_CV;0.568106234;100.0 +25/10/2020 02:06:25;U454.MX_HoT2.F_CV;0.568106234;100.0 +25/10/2020 02:06:26;U454.MX_HoT2.F_CV;0.568106234;100.0 +25/10/2020 02:06:27;U454.MX_HoT2.F_CV;0.568106234;100.0 +25/10/2020 02:06:28;U454.MX_HoT2.F_CV;0.568106234;100.0 +25/10/2020 02:06:29;U454.MX_HoT2.F_CV;0.568106234;100.0 +25/10/2020 02:06:30;U454.MX_HoT2.F_CV;0.568106234;100.0 +25/10/2020 02:06:31;U454.MX_HoT2.F_CV;0.568106234;100.0 +25/10/2020 02:06:32;U454.MX_HoT2.F_CV;0.568106234;100.0 +25/10/2020 02:06:33;U454.MX_HoT2.F_CV;0.568106234;100.0 +25/10/2020 02:06:34;U454.MX_HoT2.F_CV;0.568106234;100.0 +25/10/2020 02:06:35;U454.MX_HoT2.F_CV;0.568106234;100.0 +25/10/2020 02:06:36;U454.MX_HoT2.F_CV;0.574012518;100.0 +25/10/2020 02:06:37;U454.MX_HoT2.F_CV;0.574012518;100.0 +25/10/2020 02:06:38;U454.MX_HoT2.F_CV;0.574012518;100.0 +25/10/2020 02:06:39;U454.MX_HoT2.F_CV;0.574012518;100.0 +25/10/2020 02:06:40;U454.MX_HoT2.F_CV;0.574012518;100.0 +25/10/2020 02:06:41;U454.MX_HoT2.F_CV;0.574012518;100.0 +25/10/2020 02:06:42;U454.MX_HoT2.F_CV;0.574012518;100.0 +25/10/2020 02:06:43;U454.MX_HoT2.F_CV;0.574012518;100.0 +25/10/2020 02:06:44;U454.MX_HoT2.F_CV;0.574012518;100.0 +25/10/2020 02:06:45;U454.MX_HoT2.F_CV;0.574012518;100.0 +25/10/2020 02:06:46;U454.MX_HoT2.F_CV;0.574012518;100.0 +25/10/2020 02:06:47;U454.MX_HoT2.F_CV;0.574012518;100.0 +25/10/2020 02:06:48;U454.MX_HoT2.F_CV;0.574012518;100.0 +25/10/2020 02:06:49;U454.MX_HoT2.F_CV;0.574012518;100.0 +25/10/2020 02:06:50;U454.MX_HoT2.F_CV;0.574012518;100.0 +25/10/2020 02:06:51;U454.MX_HoT2.F_CV;0.574012518;100.0 +25/10/2020 02:06:52;U454.MX_HoT2.F_CV;0.574012518;100.0 +25/10/2020 02:06:53;U454.MX_HoT2.F_CV;0.574012518;100.0 +25/10/2020 02:06:54;U454.MX_HoT2.F_CV;0.566806257;100.0 +25/10/2020 02:06:55;U454.MX_HoT2.F_CV;0.566806257;100.0 +25/10/2020 02:06:56;U454.MX_HoT2.F_CV;0.566806257;100.0 +25/10/2020 02:06:57;U454.MX_HoT2.F_CV;0.566806257;100.0 +25/10/2020 02:06:58;U454.MX_HoT2.F_CV;0.566806257;100.0 +25/10/2020 02:06:59;U454.MX_HoT2.F_CV;0.566806257;100.0 +25/10/2020 02:06:00;U454.MX_QResidual.F_CV;42.419498444;100.0 +25/10/2020 02:06:01;U454.MX_QResidual.F_CV;42.419498444;100.0 +25/10/2020 02:06:02;U454.MX_QResidual.F_CV;42.419498444;100.0 +25/10/2020 02:06:03;U454.MX_QResidual.F_CV;42.419498444;100.0 +25/10/2020 02:06:04;U454.MX_QResidual.F_CV;42.419498444;100.0 +25/10/2020 02:06:05;U454.MX_QResidual.F_CV;42.419498444;100.0 +25/10/2020 02:06:06;U454.MX_QResidual.F_CV;42.419498444;100.0 +25/10/2020 02:06:07;U454.MX_QResidual.F_CV;42.419498444;100.0 +25/10/2020 02:06:08;U454.MX_QResidual.F_CV;42.419498444;100.0 +25/10/2020 02:06:09;U454.MX_QResidual.F_CV;42.419498444;100.0 +25/10/2020 02:06:10;U454.MX_QResidual.F_CV;42.419498444;100.0 +25/10/2020 02:06:11;U454.MX_QResidual.F_CV;42.419498444;100.0 +25/10/2020 02:06:12;U454.MX_QResidual.F_CV;42.419498444;100.0 +25/10/2020 02:06:13;U454.MX_QResidual.F_CV;42.419498444;100.0 +25/10/2020 02:06:14;U454.MX_QResidual.F_CV;42.419498444;100.0 +25/10/2020 02:06:15;U454.MX_QResidual.F_CV;42.419498444;100.0 +25/10/2020 02:06:16;U454.MX_QResidual.F_CV;42.419498444;100.0 +25/10/2020 02:06:17;U454.MX_QResidual.F_CV;42.823101044;100.0 +25/10/2020 02:06:18;U454.MX_QResidual.F_CV;42.823101044;100.0 +25/10/2020 02:06:19;U454.MX_QResidual.F_CV;42.823101044;100.0 +25/10/2020 02:06:20;U454.MX_QResidual.F_CV;42.823101044;100.0 +25/10/2020 02:06:21;U454.MX_QResidual.F_CV;42.823101044;100.0 +25/10/2020 02:06:22;U454.MX_QResidual.F_CV;42.823101044;100.0 +25/10/2020 02:06:23;U454.MX_QResidual.F_CV;42.823101044;100.0 +25/10/2020 02:06:24;U454.MX_QResidual.F_CV;42.823101044;100.0 +25/10/2020 02:06:25;U454.MX_QResidual.F_CV;42.823101044;100.0 +25/10/2020 02:06:26;U454.MX_QResidual.F_CV;42.823101044;100.0 +25/10/2020 02:06:27;U454.MX_QResidual.F_CV;42.823101044;100.0 +25/10/2020 02:06:28;U454.MX_QResidual.F_CV;42.823101044;100.0 +25/10/2020 02:06:29;U454.MX_QResidual.F_CV;42.823101044;100.0 +25/10/2020 02:06:30;U454.MX_QResidual.F_CV;42.823101044;100.0 +25/10/2020 02:06:31;U454.MX_QResidual.F_CV;42.823101044;100.0 +25/10/2020 02:06:32;U454.MX_QResidual.F_CV;42.823101044;100.0 +25/10/2020 02:06:33;U454.MX_QResidual.F_CV;42.823101044;100.0 +25/10/2020 02:06:34;U454.MX_QResidual.F_CV;42.823101044;100.0 +25/10/2020 02:06:35;U454.MX_QResidual.F_CV;42.823101044;100.0 +25/10/2020 02:06:36;U454.MX_QResidual.F_CV;42.686798096;100.0 +25/10/2020 02:06:37;U454.MX_QResidual.F_CV;42.686798096;100.0 +25/10/2020 02:06:38;U454.MX_QResidual.F_CV;42.686798096;100.0 +25/10/2020 02:06:39;U454.MX_QResidual.F_CV;42.686798096;100.0 +25/10/2020 02:06:40;U454.MX_QResidual.F_CV;42.686798096;100.0 +25/10/2020 02:06:41;U454.MX_QResidual.F_CV;42.686798096;100.0 +25/10/2020 02:06:42;U454.MX_QResidual.F_CV;42.686798096;100.0 +25/10/2020 02:06:43;U454.MX_QResidual.F_CV;42.686798096;100.0 +25/10/2020 02:06:44;U454.MX_QResidual.F_CV;42.686798096;100.0 +25/10/2020 02:06:45;U454.MX_QResidual.F_CV;42.686798096;100.0 +25/10/2020 02:06:46;U454.MX_QResidual.F_CV;42.686798096;100.0 +25/10/2020 02:06:47;U454.MX_QResidual.F_CV;42.686798096;100.0 +25/10/2020 02:06:48;U454.MX_QResidual.F_CV;42.686798096;100.0 +25/10/2020 02:06:49;U454.MX_QResidual.F_CV;42.686798096;100.0 +25/10/2020 02:06:50;U454.MX_QResidual.F_CV;42.686798096;100.0 +25/10/2020 02:06:51;U454.MX_QResidual.F_CV;42.686798096;100.0 +25/10/2020 02:06:52;U454.MX_QResidual.F_CV;42.686798096;100.0 +25/10/2020 02:06:53;U454.MX_QResidual.F_CV;42.686798096;100.0 +25/10/2020 02:06:54;U454.MX_QResidual.F_CV;42.621700287;100.0 +25/10/2020 02:06:55;U454.MX_QResidual.F_CV;42.621700287;100.0 +25/10/2020 02:06:56;U454.MX_QResidual.F_CV;42.621700287;100.0 +25/10/2020 02:06:57;U454.MX_QResidual.F_CV;42.621700287;100.0 +25/10/2020 02:06:58;U454.MX_QResidual.F_CV;42.621700287;100.0 +25/10/2020 02:06:59;U454.MX_QResidual.F_CV;42.621700287;100.0 +25/10/2020 02:06:00;U454.OX_HoT2.F_CV;0.559062481;100.0 +25/10/2020 02:06:01;U454.OX_HoT2.F_CV;0.559062481;100.0 +25/10/2020 02:06:02;U454.OX_HoT2.F_CV;0.559062481;100.0 +25/10/2020 02:06:03;U454.OX_HoT2.F_CV;0.559062481;100.0 +25/10/2020 02:06:04;U454.OX_HoT2.F_CV;0.559062481;100.0 +25/10/2020 02:06:05;U454.OX_HoT2.F_CV;0.559062481;100.0 +25/10/2020 02:06:06;U454.OX_HoT2.F_CV;0.559062481;100.0 +25/10/2020 02:06:07;U454.OX_HoT2.F_CV;0.559062481;100.0 +25/10/2020 02:06:08;U454.OX_HoT2.F_CV;0.559062481;100.0 +25/10/2020 02:06:09;U454.OX_HoT2.F_CV;0.559062481;100.0 +25/10/2020 02:06:10;U454.OX_HoT2.F_CV;0.559062481;100.0 +25/10/2020 02:06:11;U454.OX_HoT2.F_CV;0.559062481;100.0 +25/10/2020 02:06:12;U454.OX_HoT2.F_CV;0.559062481;100.0 +25/10/2020 02:06:13;U454.OX_HoT2.F_CV;0.559062481;100.0 +25/10/2020 02:06:14;U454.OX_HoT2.F_CV;0.559062481;100.0 +25/10/2020 02:06:15;U454.OX_HoT2.F_CV;0.559062481;100.0 +25/10/2020 02:06:16;U454.OX_HoT2.F_CV;0.559062481;100.0 +25/10/2020 02:06:17;U454.OX_HoT2.F_CV;0.565537512;100.0 +25/10/2020 02:06:18;U454.OX_HoT2.F_CV;0.565537512;100.0 +25/10/2020 02:06:19;U454.OX_HoT2.F_CV;0.565537512;100.0 +25/10/2020 02:06:20;U454.OX_HoT2.F_CV;0.565537512;100.0 +25/10/2020 02:06:21;U454.OX_HoT2.F_CV;0.565537512;100.0 +25/10/2020 02:06:22;U454.OX_HoT2.F_CV;0.565537512;100.0 +25/10/2020 02:06:23;U454.OX_HoT2.F_CV;0.565537512;100.0 +25/10/2020 02:06:24;U454.OX_HoT2.F_CV;0.565537512;100.0 +25/10/2020 02:06:25;U454.OX_HoT2.F_CV;0.565537512;100.0 +25/10/2020 02:06:26;U454.OX_HoT2.F_CV;0.565537512;100.0 +25/10/2020 02:06:27;U454.OX_HoT2.F_CV;0.565537512;100.0 +25/10/2020 02:06:28;U454.OX_HoT2.F_CV;0.565537512;100.0 +25/10/2020 02:06:29;U454.OX_HoT2.F_CV;0.565537512;100.0 +25/10/2020 02:06:30;U454.OX_HoT2.F_CV;0.565537512;100.0 +25/10/2020 02:06:31;U454.OX_HoT2.F_CV;0.565537512;100.0 +25/10/2020 02:06:32;U454.OX_HoT2.F_CV;0.565537512;100.0 +25/10/2020 02:06:33;U454.OX_HoT2.F_CV;0.565537512;100.0 +25/10/2020 02:06:34;U454.OX_HoT2.F_CV;0.565537512;100.0 +25/10/2020 02:06:35;U454.OX_HoT2.F_CV;0.565537512;100.0 +25/10/2020 02:06:36;U454.OX_HoT2.F_CV;0.565500021;100.0 +25/10/2020 02:06:37;U454.OX_HoT2.F_CV;0.565500021;100.0 +25/10/2020 02:06:38;U454.OX_HoT2.F_CV;0.565500021;100.0 +25/10/2020 02:06:39;U454.OX_HoT2.F_CV;0.565500021;100.0 +25/10/2020 02:06:40;U454.OX_HoT2.F_CV;0.565500021;100.0 +25/10/2020 02:06:41;U454.OX_HoT2.F_CV;0.565500021;100.0 +25/10/2020 02:06:42;U454.OX_HoT2.F_CV;0.565500021;100.0 +25/10/2020 02:06:43;U454.OX_HoT2.F_CV;0.565500021;100.0 +25/10/2020 02:06:44;U454.OX_HoT2.F_CV;0.565500021;100.0 +25/10/2020 02:06:45;U454.OX_HoT2.F_CV;0.565500021;100.0 +25/10/2020 02:06:46;U454.OX_HoT2.F_CV;0.565500021;100.0 +25/10/2020 02:06:47;U454.OX_HoT2.F_CV;0.565500021;100.0 +25/10/2020 02:06:48;U454.OX_HoT2.F_CV;0.565500021;100.0 +25/10/2020 02:06:49;U454.OX_HoT2.F_CV;0.565500021;100.0 +25/10/2020 02:06:50;U454.OX_HoT2.F_CV;0.565500021;100.0 +25/10/2020 02:06:51;U454.OX_HoT2.F_CV;0.565500021;100.0 +25/10/2020 02:06:52;U454.OX_HoT2.F_CV;0.565500021;100.0 +25/10/2020 02:06:53;U454.OX_HoT2.F_CV;0.565500021;100.0 +25/10/2020 02:06:54;U454.OX_HoT2.F_CV;0.565468729;100.0 +25/10/2020 02:06:55;U454.OX_HoT2.F_CV;0.565468729;100.0 +25/10/2020 02:06:56;U454.OX_HoT2.F_CV;0.565468729;100.0 +25/10/2020 02:06:57;U454.OX_HoT2.F_CV;0.565468729;100.0 +25/10/2020 02:06:58;U454.OX_HoT2.F_CV;0.565468729;100.0 +25/10/2020 02:06:59;U454.OX_HoT2.F_CV;0.565468729;100.0 +25/10/2020 02:06:00;U454.OX_QResidual.F_CV;40.016799927;100.0 +25/10/2020 02:06:01;U454.OX_QResidual.F_CV;40.016799927;100.0 +25/10/2020 02:06:02;U454.OX_QResidual.F_CV;40.016799927;100.0 +25/10/2020 02:06:03;U454.OX_QResidual.F_CV;40.016799927;100.0 +25/10/2020 02:06:04;U454.OX_QResidual.F_CV;40.016799927;100.0 +25/10/2020 02:06:05;U454.OX_QResidual.F_CV;40.016799927;100.0 +25/10/2020 02:06:06;U454.OX_QResidual.F_CV;40.016799927;100.0 +25/10/2020 02:06:07;U454.OX_QResidual.F_CV;40.016799927;100.0 +25/10/2020 02:06:08;U454.OX_QResidual.F_CV;40.016799927;100.0 +25/10/2020 02:06:09;U454.OX_QResidual.F_CV;40.016799927;100.0 +25/10/2020 02:06:10;U454.OX_QResidual.F_CV;40.016799927;100.0 +25/10/2020 02:06:11;U454.OX_QResidual.F_CV;40.016799927;100.0 +25/10/2020 02:06:12;U454.OX_QResidual.F_CV;40.016799927;100.0 +25/10/2020 02:06:13;U454.OX_QResidual.F_CV;40.016799927;100.0 +25/10/2020 02:06:14;U454.OX_QResidual.F_CV;40.016799927;100.0 +25/10/2020 02:06:15;U454.OX_QResidual.F_CV;40.016799927;100.0 +25/10/2020 02:06:16;U454.OX_QResidual.F_CV;40.016799927;100.0 +25/10/2020 02:06:17;U454.OX_QResidual.F_CV;40.687099457;100.0 +25/10/2020 02:06:18;U454.OX_QResidual.F_CV;40.687099457;100.0 +25/10/2020 02:06:19;U454.OX_QResidual.F_CV;40.687099457;100.0 +25/10/2020 02:06:20;U454.OX_QResidual.F_CV;40.687099457;100.0 +25/10/2020 02:06:21;U454.OX_QResidual.F_CV;40.687099457;100.0 +25/10/2020 02:06:22;U454.OX_QResidual.F_CV;40.687099457;100.0 +25/10/2020 02:06:23;U454.OX_QResidual.F_CV;40.687099457;100.0 +25/10/2020 02:06:24;U454.OX_QResidual.F_CV;40.687099457;100.0 +25/10/2020 02:06:25;U454.OX_QResidual.F_CV;40.687099457;100.0 +25/10/2020 02:06:26;U454.OX_QResidual.F_CV;40.687099457;100.0 +25/10/2020 02:06:27;U454.OX_QResidual.F_CV;40.687099457;100.0 +25/10/2020 02:06:28;U454.OX_QResidual.F_CV;40.687099457;100.0 +25/10/2020 02:06:29;U454.OX_QResidual.F_CV;40.687099457;100.0 +25/10/2020 02:06:30;U454.OX_QResidual.F_CV;40.687099457;100.0 +25/10/2020 02:06:31;U454.OX_QResidual.F_CV;40.687099457;100.0 +25/10/2020 02:06:32;U454.OX_QResidual.F_CV;40.687099457;100.0 +25/10/2020 02:06:33;U454.OX_QResidual.F_CV;40.687099457;100.0 +25/10/2020 02:06:34;U454.OX_QResidual.F_CV;40.687099457;100.0 +25/10/2020 02:06:35;U454.OX_QResidual.F_CV;40.687099457;100.0 +25/10/2020 02:06:36;U454.OX_QResidual.F_CV;40.490001678;100.0 +25/10/2020 02:06:37;U454.OX_QResidual.F_CV;40.490001678;100.0 +25/10/2020 02:06:38;U454.OX_QResidual.F_CV;40.490001678;100.0 +25/10/2020 02:06:39;U454.OX_QResidual.F_CV;40.490001678;100.0 +25/10/2020 02:06:40;U454.OX_QResidual.F_CV;40.490001678;100.0 +25/10/2020 02:06:41;U454.OX_QResidual.F_CV;40.490001678;100.0 +25/10/2020 02:06:42;U454.OX_QResidual.F_CV;40.490001678;100.0 +25/10/2020 02:06:43;U454.OX_QResidual.F_CV;40.490001678;100.0 +25/10/2020 02:06:44;U454.OX_QResidual.F_CV;40.490001678;100.0 +25/10/2020 02:06:45;U454.OX_QResidual.F_CV;40.490001678;100.0 +25/10/2020 02:06:46;U454.OX_QResidual.F_CV;40.490001678;100.0 +25/10/2020 02:06:47;U454.OX_QResidual.F_CV;40.490001678;100.0 +25/10/2020 02:06:48;U454.OX_QResidual.F_CV;40.490001678;100.0 +25/10/2020 02:06:49;U454.OX_QResidual.F_CV;40.490001678;100.0 +25/10/2020 02:06:50;U454.OX_QResidual.F_CV;40.490001678;100.0 +25/10/2020 02:06:51;U454.OX_QResidual.F_CV;40.490001678;100.0 +25/10/2020 02:06:52;U454.OX_QResidual.F_CV;40.490001678;100.0 +25/10/2020 02:06:53;U454.OX_QResidual.F_CV;40.490001678;100.0 +25/10/2020 02:06:54;U454.OX_QResidual.F_CV;40.304599762;100.0 +25/10/2020 02:06:55;U454.OX_QResidual.F_CV;40.304599762;100.0 +25/10/2020 02:06:56;U454.OX_QResidual.F_CV;40.304599762;100.0 +25/10/2020 02:06:57;U454.OX_QResidual.F_CV;40.304599762;100.0 +25/10/2020 02:06:58;U454.OX_QResidual.F_CV;40.304599762;100.0 +25/10/2020 02:06:59;U454.OX_QResidual.F_CV;40.304599762;100.0 +25/10/2020 02:06:00;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.P01_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.P02_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.P05_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.P06_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.P10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.P11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.P12_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U454.P81_Retour_Etat.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U454.PC03_PV.F_CV;19.960437775;100.0 +25/10/2020 02:06:01;U454.PC03_PV.F_CV;19.978496552;100.0 +25/10/2020 02:06:02;U454.PC03_PV.F_CV;20.037319183;100.0 +25/10/2020 02:06:03;U454.PC03_PV.F_CV;20.069999695;100.0 +25/10/2020 02:06:04;U454.PC03_PV.F_CV;19.981748581;100.0 +25/10/2020 02:06:05;U454.PC03_PV.F_CV;19.962341309;100.0 +25/10/2020 02:06:06;U454.PC03_PV.F_CV;19.971145630;100.0 +25/10/2020 02:06:07;U454.PC03_PV.F_CV;19.941852570;100.0 +25/10/2020 02:06:08;U454.PC03_PV.F_CV;19.952014923;100.0 +25/10/2020 02:06:09;U454.PC03_PV.F_CV;19.963375092;100.0 +25/10/2020 02:06:10;U454.PC03_PV.F_CV;19.994506836;100.0 +25/10/2020 02:06:11;U454.PC03_PV.F_CV;19.969848633;100.0 +25/10/2020 02:06:12;U454.PC03_PV.F_CV;19.994064331;100.0 +25/10/2020 02:06:13;U454.PC03_PV.F_CV;20.019023895;100.0 +25/10/2020 02:06:14;U454.PC03_PV.F_CV;20.011592865;100.0 +25/10/2020 02:06:15;U454.PC03_PV.F_CV;20.009948730;100.0 +25/10/2020 02:06:16;U454.PC03_PV.F_CV;19.971786499;100.0 +25/10/2020 02:06:17;U454.PC03_PV.F_CV;20.085002899;100.0 +25/10/2020 02:06:18;U454.PC03_PV.F_CV;20.059383392;100.0 +25/10/2020 02:06:19;U454.PC03_PV.F_CV;20.023193359;100.0 +25/10/2020 02:06:20;U454.PC03_PV.F_CV;20.042160034;100.0 +25/10/2020 02:06:21;U454.PC03_PV.F_CV;19.953502655;100.0 +25/10/2020 02:06:22;U454.PC03_PV.F_CV;19.956653595;100.0 +25/10/2020 02:06:23;U454.PC03_PV.F_CV;19.953258514;100.0 +25/10/2020 02:06:24;U454.PC03_PV.F_CV;19.986667633;100.0 +25/10/2020 02:06:25;U454.PC03_PV.F_CV;20.027183533;100.0 +25/10/2020 02:06:26;U454.PC03_PV.F_CV;19.984411240;100.0 +25/10/2020 02:06:27;U454.PC03_PV.F_CV;19.966867447;100.0 +25/10/2020 02:06:28;U454.PC03_PV.F_CV;19.971498489;100.0 +25/10/2020 02:06:29;U454.PC03_PV.F_CV;20.005020142;100.0 +25/10/2020 02:06:30;U454.PC03_PV.F_CV;19.951053619;100.0 +25/10/2020 02:06:31;U454.PC03_PV.F_CV;19.952911377;100.0 +25/10/2020 02:06:32;U454.PC03_PV.F_CV;20.010810852;100.0 +25/10/2020 02:06:33;U454.PC03_PV.F_CV;20.263185501;100.0 +25/10/2020 02:06:34;U454.PC03_PV.F_CV;20.199890137;100.0 +25/10/2020 02:06:35;U454.PC03_PV.F_CV;20.149688721;100.0 +25/10/2020 02:06:36;U454.PC03_PV.F_CV;20.146934509;100.0 +25/10/2020 02:06:37;U454.PC03_PV.F_CV;20.090719223;100.0 +25/10/2020 02:06:38;U454.PC03_PV.F_CV;20.038961411;100.0 +25/10/2020 02:06:39;U454.PC03_PV.F_CV;20.074575424;100.0 +25/10/2020 02:06:40;U454.PC03_PV.F_CV;20.157100677;100.0 +25/10/2020 02:06:41;U454.PC03_PV.F_CV;20.124938965;100.0 +25/10/2020 02:06:42;U454.PC03_PV.F_CV;20.105255127;100.0 +25/10/2020 02:06:43;U454.PC03_PV.F_CV;20.092853546;100.0 +25/10/2020 02:06:44;U454.PC03_PV.F_CV;20.038166046;100.0 +25/10/2020 02:06:45;U454.PC03_PV.F_CV;19.999668121;100.0 +25/10/2020 02:06:46;U454.PC03_PV.F_CV;19.992967606;100.0 +25/10/2020 02:06:47;U454.PC03_PV.F_CV;20.094678879;100.0 +25/10/2020 02:06:48;U454.PC03_PV.F_CV;20.131549835;100.0 +25/10/2020 02:06:49;U454.PC03_PV.F_CV;20.025501251;100.0 +25/10/2020 02:06:50;U454.PC03_PV.F_CV;20.010738373;100.0 +25/10/2020 02:06:51;U454.PC03_PV.F_CV;19.990707397;100.0 +25/10/2020 02:06:52;U454.PC03_PV.F_CV;19.967418671;100.0 +25/10/2020 02:06:53;U454.PC03_PV.F_CV;19.976964951;100.0 +25/10/2020 02:06:54;U454.PC03_PV.F_CV;20.031961441;100.0 +25/10/2020 02:06:55;U454.PC03_PV.F_CV;20.055246353;100.0 +25/10/2020 02:06:56;U454.PC03_PV.F_CV;20.017076492;100.0 +25/10/2020 02:06:57;U454.PC03_PV.F_CV;19.995815277;100.0 +25/10/2020 02:06:58;U454.PC03_PV.F_CV;19.953163147;100.0 +25/10/2020 02:06:59;U454.PC03_PV.F_CV;20.014047623;100.0 +25/10/2020 02:06:00;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:01;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:02;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:03;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:04;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:05;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:06;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:07;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:08;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:09;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:10;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:11;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:12;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:13;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:14;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:15;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:16;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:17;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:18;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:19;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:20;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:21;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:22;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:23;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:24;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:25;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:26;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:27;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:28;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:29;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:30;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:31;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:32;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:33;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:34;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:35;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:36;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:37;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:38;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:39;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:40;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:41;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:42;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:43;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:44;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:45;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:46;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:47;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:48;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:49;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:50;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:51;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:52;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:53;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:54;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:55;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:56;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:57;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:58;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:59;U454.PC03_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:00;U454.PDEB_HoT2.F_CV;1.981724977;100.0 +25/10/2020 02:06:01;U454.PDEB_HoT2.F_CV;1.981724977;100.0 +25/10/2020 02:06:02;U454.PDEB_HoT2.F_CV;1.981724977;100.0 +25/10/2020 02:06:03;U454.PDEB_HoT2.F_CV;1.981724977;100.0 +25/10/2020 02:06:04;U454.PDEB_HoT2.F_CV;1.981724977;100.0 +25/10/2020 02:06:05;U454.PDEB_HoT2.F_CV;1.981724977;100.0 +25/10/2020 02:06:06;U454.PDEB_HoT2.F_CV;1.981724977;100.0 +25/10/2020 02:06:07;U454.PDEB_HoT2.F_CV;1.981724977;100.0 +25/10/2020 02:06:08;U454.PDEB_HoT2.F_CV;1.981724977;100.0 +25/10/2020 02:06:09;U454.PDEB_HoT2.F_CV;1.981724977;100.0 +25/10/2020 02:06:10;U454.PDEB_HoT2.F_CV;1.981724977;100.0 +25/10/2020 02:06:11;U454.PDEB_HoT2.F_CV;1.981724977;100.0 +25/10/2020 02:06:12;U454.PDEB_HoT2.F_CV;1.981724977;100.0 +25/10/2020 02:06:13;U454.PDEB_HoT2.F_CV;1.981724977;100.0 +25/10/2020 02:06:14;U454.PDEB_HoT2.F_CV;1.981724977;100.0 +25/10/2020 02:06:15;U454.PDEB_HoT2.F_CV;1.981724977;100.0 +25/10/2020 02:06:16;U454.PDEB_HoT2.F_CV;1.981724977;100.0 +25/10/2020 02:06:17;U454.PDEB_HoT2.F_CV;2.406524897;100.0 +25/10/2020 02:06:18;U454.PDEB_HoT2.F_CV;2.406524897;100.0 +25/10/2020 02:06:19;U454.PDEB_HoT2.F_CV;2.406524897;100.0 +25/10/2020 02:06:20;U454.PDEB_HoT2.F_CV;2.406524897;100.0 +25/10/2020 02:06:21;U454.PDEB_HoT2.F_CV;2.406524897;100.0 +25/10/2020 02:06:22;U454.PDEB_HoT2.F_CV;2.406524897;100.0 +25/10/2020 02:06:23;U454.PDEB_HoT2.F_CV;2.406524897;100.0 +25/10/2020 02:06:24;U454.PDEB_HoT2.F_CV;2.406524897;100.0 +25/10/2020 02:06:25;U454.PDEB_HoT2.F_CV;2.406524897;100.0 +25/10/2020 02:06:26;U454.PDEB_HoT2.F_CV;2.406524897;100.0 +25/10/2020 02:06:27;U454.PDEB_HoT2.F_CV;2.406524897;100.0 +25/10/2020 02:06:28;U454.PDEB_HoT2.F_CV;2.406524897;100.0 +25/10/2020 02:06:29;U454.PDEB_HoT2.F_CV;2.406524897;100.0 +25/10/2020 02:06:30;U454.PDEB_HoT2.F_CV;2.406524897;100.0 +25/10/2020 02:06:31;U454.PDEB_HoT2.F_CV;2.406524897;100.0 +25/10/2020 02:06:32;U454.PDEB_HoT2.F_CV;2.406524897;100.0 +25/10/2020 02:06:33;U454.PDEB_HoT2.F_CV;2.406524897;100.0 +25/10/2020 02:06:34;U454.PDEB_HoT2.F_CV;2.406524897;100.0 +25/10/2020 02:06:35;U454.PDEB_HoT2.F_CV;2.406524897;100.0 +25/10/2020 02:06:36;U454.PDEB_HoT2.F_CV;2.638474941;100.0 +25/10/2020 02:06:37;U454.PDEB_HoT2.F_CV;2.638474941;100.0 +25/10/2020 02:06:38;U454.PDEB_HoT2.F_CV;2.638474941;100.0 +25/10/2020 02:06:39;U454.PDEB_HoT2.F_CV;2.638474941;100.0 +25/10/2020 02:06:40;U454.PDEB_HoT2.F_CV;2.638474941;100.0 +25/10/2020 02:06:41;U454.PDEB_HoT2.F_CV;2.638474941;100.0 +25/10/2020 02:06:42;U454.PDEB_HoT2.F_CV;2.638474941;100.0 +25/10/2020 02:06:43;U454.PDEB_HoT2.F_CV;2.638474941;100.0 +25/10/2020 02:06:44;U454.PDEB_HoT2.F_CV;2.638474941;100.0 +25/10/2020 02:06:45;U454.PDEB_HoT2.F_CV;2.638474941;100.0 +25/10/2020 02:06:46;U454.PDEB_HoT2.F_CV;2.638474941;100.0 +25/10/2020 02:06:47;U454.PDEB_HoT2.F_CV;2.638474941;100.0 +25/10/2020 02:06:48;U454.PDEB_HoT2.F_CV;2.638474941;100.0 +25/10/2020 02:06:49;U454.PDEB_HoT2.F_CV;2.638474941;100.0 +25/10/2020 02:06:50;U454.PDEB_HoT2.F_CV;2.638474941;100.0 +25/10/2020 02:06:51;U454.PDEB_HoT2.F_CV;2.638474941;100.0 +25/10/2020 02:06:52;U454.PDEB_HoT2.F_CV;2.638474941;100.0 +25/10/2020 02:06:53;U454.PDEB_HoT2.F_CV;2.638474941;100.0 +25/10/2020 02:06:54;U454.PDEB_HoT2.F_CV;2.708199978;100.0 +25/10/2020 02:06:55;U454.PDEB_HoT2.F_CV;2.708199978;100.0 +25/10/2020 02:06:56;U454.PDEB_HoT2.F_CV;2.708199978;100.0 +25/10/2020 02:06:57;U454.PDEB_HoT2.F_CV;2.708199978;100.0 +25/10/2020 02:06:58;U454.PDEB_HoT2.F_CV;2.708199978;100.0 +25/10/2020 02:06:59;U454.PDEB_HoT2.F_CV;2.708199978;100.0 +25/10/2020 02:06:00;U454.PDEB_QResidual.F_CV;57.779998779;100.0 +25/10/2020 02:06:01;U454.PDEB_QResidual.F_CV;57.779998779;100.0 +25/10/2020 02:06:02;U454.PDEB_QResidual.F_CV;57.779998779;100.0 +25/10/2020 02:06:03;U454.PDEB_QResidual.F_CV;57.779998779;100.0 +25/10/2020 02:06:04;U454.PDEB_QResidual.F_CV;57.779998779;100.0 +25/10/2020 02:06:05;U454.PDEB_QResidual.F_CV;57.779998779;100.0 +25/10/2020 02:06:06;U454.PDEB_QResidual.F_CV;57.779998779;100.0 +25/10/2020 02:06:07;U454.PDEB_QResidual.F_CV;57.779998779;100.0 +25/10/2020 02:06:08;U454.PDEB_QResidual.F_CV;57.779998779;100.0 +25/10/2020 02:06:09;U454.PDEB_QResidual.F_CV;57.779998779;100.0 +25/10/2020 02:06:10;U454.PDEB_QResidual.F_CV;57.779998779;100.0 +25/10/2020 02:06:11;U454.PDEB_QResidual.F_CV;57.779998779;100.0 +25/10/2020 02:06:12;U454.PDEB_QResidual.F_CV;57.779998779;100.0 +25/10/2020 02:06:13;U454.PDEB_QResidual.F_CV;57.779998779;100.0 +25/10/2020 02:06:14;U454.PDEB_QResidual.F_CV;57.779998779;100.0 +25/10/2020 02:06:15;U454.PDEB_QResidual.F_CV;57.779998779;100.0 +25/10/2020 02:06:16;U454.PDEB_QResidual.F_CV;57.779998779;100.0 +25/10/2020 02:06:17;U454.PDEB_QResidual.F_CV;57.792800903;100.0 +25/10/2020 02:06:18;U454.PDEB_QResidual.F_CV;57.792800903;100.0 +25/10/2020 02:06:19;U454.PDEB_QResidual.F_CV;57.792800903;100.0 +25/10/2020 02:06:20;U454.PDEB_QResidual.F_CV;57.792800903;100.0 +25/10/2020 02:06:21;U454.PDEB_QResidual.F_CV;57.792800903;100.0 +25/10/2020 02:06:22;U454.PDEB_QResidual.F_CV;57.792800903;100.0 +25/10/2020 02:06:23;U454.PDEB_QResidual.F_CV;57.792800903;100.0 +25/10/2020 02:06:24;U454.PDEB_QResidual.F_CV;57.792800903;100.0 +25/10/2020 02:06:25;U454.PDEB_QResidual.F_CV;57.792800903;100.0 +25/10/2020 02:06:26;U454.PDEB_QResidual.F_CV;57.792800903;100.0 +25/10/2020 02:06:27;U454.PDEB_QResidual.F_CV;57.792800903;100.0 +25/10/2020 02:06:28;U454.PDEB_QResidual.F_CV;57.792800903;100.0 +25/10/2020 02:06:29;U454.PDEB_QResidual.F_CV;57.792800903;100.0 +25/10/2020 02:06:30;U454.PDEB_QResidual.F_CV;57.792800903;100.0 +25/10/2020 02:06:31;U454.PDEB_QResidual.F_CV;57.792800903;100.0 +25/10/2020 02:06:32;U454.PDEB_QResidual.F_CV;57.792800903;100.0 +25/10/2020 02:06:33;U454.PDEB_QResidual.F_CV;57.792800903;100.0 +25/10/2020 02:06:34;U454.PDEB_QResidual.F_CV;57.792800903;100.0 +25/10/2020 02:06:35;U454.PDEB_QResidual.F_CV;57.792800903;100.0 +25/10/2020 02:06:36;U454.PDEB_QResidual.F_CV;57.432800293;100.0 +25/10/2020 02:06:37;U454.PDEB_QResidual.F_CV;57.432800293;100.0 +25/10/2020 02:06:38;U454.PDEB_QResidual.F_CV;57.432800293;100.0 +25/10/2020 02:06:39;U454.PDEB_QResidual.F_CV;57.432800293;100.0 +25/10/2020 02:06:40;U454.PDEB_QResidual.F_CV;57.432800293;100.0 +25/10/2020 02:06:41;U454.PDEB_QResidual.F_CV;57.432800293;100.0 +25/10/2020 02:06:42;U454.PDEB_QResidual.F_CV;57.432800293;100.0 +25/10/2020 02:06:43;U454.PDEB_QResidual.F_CV;57.432800293;100.0 +25/10/2020 02:06:44;U454.PDEB_QResidual.F_CV;57.432800293;100.0 +25/10/2020 02:06:45;U454.PDEB_QResidual.F_CV;57.432800293;100.0 +25/10/2020 02:06:46;U454.PDEB_QResidual.F_CV;57.432800293;100.0 +25/10/2020 02:06:47;U454.PDEB_QResidual.F_CV;57.432800293;100.0 +25/10/2020 02:06:48;U454.PDEB_QResidual.F_CV;57.432800293;100.0 +25/10/2020 02:06:49;U454.PDEB_QResidual.F_CV;57.432800293;100.0 +25/10/2020 02:06:50;U454.PDEB_QResidual.F_CV;57.432800293;100.0 +25/10/2020 02:06:51;U454.PDEB_QResidual.F_CV;57.432800293;100.0 +25/10/2020 02:06:52;U454.PDEB_QResidual.F_CV;57.432800293;100.0 +25/10/2020 02:06:53;U454.PDEB_QResidual.F_CV;57.432800293;100.0 +25/10/2020 02:06:54;U454.PDEB_QResidual.F_CV;57.437599182;100.0 +25/10/2020 02:06:55;U454.PDEB_QResidual.F_CV;57.437599182;100.0 +25/10/2020 02:06:56;U454.PDEB_QResidual.F_CV;57.437599182;100.0 +25/10/2020 02:06:57;U454.PDEB_QResidual.F_CV;57.437599182;100.0 +25/10/2020 02:06:58;U454.PDEB_QResidual.F_CV;57.437599182;100.0 +25/10/2020 02:06:59;U454.PDEB_QResidual.F_CV;57.437599182;100.0 +25/10/2020 02:06:00;U454.PI01_PV.F_CV;23.334274292;100.0 +25/10/2020 02:06:01;U454.PI01_PV.F_CV;23.317943573;100.0 +25/10/2020 02:06:02;U454.PI01_PV.F_CV;23.332611084;100.0 +25/10/2020 02:06:03;U454.PI01_PV.F_CV;23.303464890;100.0 +25/10/2020 02:06:04;U454.PI01_PV.F_CV;23.284460068;100.0 +25/10/2020 02:06:05;U454.PI01_PV.F_CV;23.296113968;100.0 +25/10/2020 02:06:06;U454.PI01_PV.F_CV;23.277935028;100.0 +25/10/2020 02:06:07;U454.PI01_PV.F_CV;23.296829224;100.0 +25/10/2020 02:06:08;U454.PI01_PV.F_CV;23.282802582;100.0 +25/10/2020 02:06:09;U454.PI01_PV.F_CV;23.295700073;100.0 +25/10/2020 02:06:10;U454.PI01_PV.F_CV;23.273143768;100.0 +25/10/2020 02:06:11;U454.PI01_PV.F_CV;23.300315857;100.0 +25/10/2020 02:06:12;U454.PI01_PV.F_CV;23.318828583;100.0 +25/10/2020 02:06:13;U454.PI01_PV.F_CV;23.314081192;100.0 +25/10/2020 02:06:14;U454.PI01_PV.F_CV;23.324613571;100.0 +25/10/2020 02:06:15;U454.PI01_PV.F_CV;23.322559357;100.0 +25/10/2020 02:06:16;U454.PI01_PV.F_CV;23.343139648;100.0 +25/10/2020 02:06:17;U454.PI01_PV.F_CV;23.322502136;100.0 +25/10/2020 02:06:18;U454.PI01_PV.F_CV;23.317344666;100.0 +25/10/2020 02:06:19;U454.PI01_PV.F_CV;23.325429916;100.0 +25/10/2020 02:06:20;U454.PI01_PV.F_CV;23.304012299;100.0 +25/10/2020 02:06:21;U454.PI01_PV.F_CV;23.310379028;100.0 +25/10/2020 02:06:22;U454.PI01_PV.F_CV;23.316656113;100.0 +25/10/2020 02:06:23;U454.PI01_PV.F_CV;23.311195374;100.0 +25/10/2020 02:06:24;U454.PI01_PV.F_CV;23.298110962;100.0 +25/10/2020 02:06:25;U454.PI01_PV.F_CV;23.308902740;100.0 +25/10/2020 02:06:26;U454.PI01_PV.F_CV;23.302225113;100.0 +25/10/2020 02:06:27;U454.PI01_PV.F_CV;23.274776459;100.0 +25/10/2020 02:06:28;U454.PI01_PV.F_CV;23.298381805;100.0 +25/10/2020 02:06:29;U454.PI01_PV.F_CV;23.323032379;100.0 +25/10/2020 02:06:30;U454.PI01_PV.F_CV;23.310445786;100.0 +25/10/2020 02:06:31;U454.PI01_PV.F_CV;23.304954529;100.0 +25/10/2020 02:06:32;U454.PI01_PV.F_CV;23.235612869;100.0 +25/10/2020 02:06:33;U454.PI01_PV.F_CV;23.180778503;100.0 +25/10/2020 02:06:34;U454.PI01_PV.F_CV;23.232694626;100.0 +25/10/2020 02:06:35;U454.PI01_PV.F_CV;23.236297607;100.0 +25/10/2020 02:06:36;U454.PI01_PV.F_CV;23.239543915;100.0 +25/10/2020 02:06:37;U454.PI01_PV.F_CV;23.214572906;100.0 +25/10/2020 02:06:38;U454.PI01_PV.F_CV;23.201299667;100.0 +25/10/2020 02:06:39;U454.PI01_PV.F_CV;23.212043762;100.0 +25/10/2020 02:06:40;U454.PI01_PV.F_CV;23.207698822;100.0 +25/10/2020 02:06:41;U454.PI01_PV.F_CV;23.171455383;100.0 +25/10/2020 02:06:42;U454.PI01_PV.F_CV;23.182601929;100.0 +25/10/2020 02:06:43;U454.PI01_PV.F_CV;23.174777985;100.0 +25/10/2020 02:06:44;U454.PI01_PV.F_CV;23.163225174;100.0 +25/10/2020 02:06:45;U454.PI01_PV.F_CV;23.146274567;100.0 +25/10/2020 02:06:46;U454.PI01_PV.F_CV;23.160636902;100.0 +25/10/2020 02:06:47;U454.PI01_PV.F_CV;23.150939941;100.0 +25/10/2020 02:06:48;U454.PI01_PV.F_CV;23.112735748;100.0 +25/10/2020 02:06:49;U454.PI01_PV.F_CV;23.098495483;100.0 +25/10/2020 02:06:50;U454.PI01_PV.F_CV;23.116031647;100.0 +25/10/2020 02:06:51;U454.PI01_PV.F_CV;23.101665497;100.0 +25/10/2020 02:06:52;U454.PI01_PV.F_CV;23.102760315;100.0 +25/10/2020 02:06:53;U454.PI01_PV.F_CV;23.110755920;100.0 +25/10/2020 02:06:54;U454.PI01_PV.F_CV;23.098001480;100.0 +25/10/2020 02:06:55;U454.PI01_PV.F_CV;23.090126038;100.0 +25/10/2020 02:06:56;U454.PI01_PV.F_CV;23.099876404;100.0 +25/10/2020 02:06:57;U454.PI01_PV.F_CV;23.074188232;100.0 +25/10/2020 02:06:58;U454.PI01_PV.F_CV;23.093547821;100.0 +25/10/2020 02:06:59;U454.PI01_PV.F_CV;23.110105515;100.0 +25/10/2020 02:06:00;U454.PI02_PV.F_CV;21.689002991;100.0 +25/10/2020 02:06:01;U454.PI02_PV.F_CV;21.701938629;100.0 +25/10/2020 02:06:02;U454.PI02_PV.F_CV;21.695796967;100.0 +25/10/2020 02:06:03;U454.PI02_PV.F_CV;21.680198669;100.0 +25/10/2020 02:06:04;U454.PI02_PV.F_CV;21.688018799;100.0 +25/10/2020 02:06:05;U454.PI02_PV.F_CV;21.671222687;100.0 +25/10/2020 02:06:06;U454.PI02_PV.F_CV;21.664680481;100.0 +25/10/2020 02:06:07;U454.PI02_PV.F_CV;21.658357620;100.0 +25/10/2020 02:06:08;U454.PI02_PV.F_CV;21.673183441;100.0 +25/10/2020 02:06:09;U454.PI02_PV.F_CV;21.665170670;100.0 +25/10/2020 02:06:10;U454.PI02_PV.F_CV;21.672542572;100.0 +25/10/2020 02:06:11;U454.PI02_PV.F_CV;21.688449860;100.0 +25/10/2020 02:06:12;U454.PI02_PV.F_CV;21.701799393;100.0 +25/10/2020 02:06:13;U454.PI02_PV.F_CV;21.688730240;100.0 +25/10/2020 02:06:14;U454.PI02_PV.F_CV;21.701869965;100.0 +25/10/2020 02:06:15;U454.PI02_PV.F_CV;21.712184906;100.0 +25/10/2020 02:06:16;U454.PI02_PV.F_CV;21.712421417;100.0 +25/10/2020 02:06:17;U454.PI02_PV.F_CV;21.707794189;100.0 +25/10/2020 02:06:18;U454.PI02_PV.F_CV;21.718353271;100.0 +25/10/2020 02:06:19;U454.PI02_PV.F_CV;21.711620331;100.0 +25/10/2020 02:06:20;U454.PI02_PV.F_CV;21.693529129;100.0 +25/10/2020 02:06:21;U454.PI02_PV.F_CV;21.691350937;100.0 +25/10/2020 02:06:22;U454.PI02_PV.F_CV;21.693149567;100.0 +25/10/2020 02:06:23;U454.PI02_PV.F_CV;21.688911438;100.0 +25/10/2020 02:06:24;U454.PI02_PV.F_CV;21.680820465;100.0 +25/10/2020 02:06:25;U454.PI02_PV.F_CV;21.699893951;100.0 +25/10/2020 02:06:26;U454.PI02_PV.F_CV;21.688255310;100.0 +25/10/2020 02:06:27;U454.PI02_PV.F_CV;21.683000565;100.0 +25/10/2020 02:06:28;U454.PI02_PV.F_CV;21.698093414;100.0 +25/10/2020 02:06:29;U454.PI02_PV.F_CV;21.694835663;100.0 +25/10/2020 02:06:30;U454.PI02_PV.F_CV;21.698709488;100.0 +25/10/2020 02:06:31;U454.PI02_PV.F_CV;21.699676514;100.0 +25/10/2020 02:06:32;U454.PI02_PV.F_CV;21.653045654;100.0 +25/10/2020 02:06:33;U454.PI02_PV.F_CV;21.671855927;100.0 +25/10/2020 02:06:34;U454.PI02_PV.F_CV;21.641401291;100.0 +25/10/2020 02:06:35;U454.PI02_PV.F_CV;21.617382050;100.0 +25/10/2020 02:06:36;U454.PI02_PV.F_CV;21.592626572;100.0 +25/10/2020 02:06:37;U454.PI02_PV.F_CV;21.555969238;100.0 +25/10/2020 02:06:38;U454.PI02_PV.F_CV;21.551492691;100.0 +25/10/2020 02:06:39;U454.PI02_PV.F_CV;21.562091827;100.0 +25/10/2020 02:06:40;U454.PI02_PV.F_CV;21.553024292;100.0 +25/10/2020 02:06:41;U454.PI02_PV.F_CV;21.543724060;100.0 +25/10/2020 02:06:42;U454.PI02_PV.F_CV;21.543737411;100.0 +25/10/2020 02:06:43;U454.PI02_PV.F_CV;21.535545349;100.0 +25/10/2020 02:06:44;U454.PI02_PV.F_CV;21.527637482;100.0 +25/10/2020 02:06:45;U454.PI02_PV.F_CV;21.516284943;100.0 +25/10/2020 02:06:46;U454.PI02_PV.F_CV;21.511268616;100.0 +25/10/2020 02:06:47;U454.PI02_PV.F_CV;21.509220123;100.0 +25/10/2020 02:06:48;U454.PI02_PV.F_CV;21.497615814;100.0 +25/10/2020 02:06:49;U454.PI02_PV.F_CV;21.497060776;100.0 +25/10/2020 02:06:50;U454.PI02_PV.F_CV;21.478172302;100.0 +25/10/2020 02:06:51;U454.PI02_PV.F_CV;21.459386826;100.0 +25/10/2020 02:06:52;U454.PI02_PV.F_CV;21.471096039;100.0 +25/10/2020 02:06:53;U454.PI02_PV.F_CV;21.479297638;100.0 +25/10/2020 02:06:54;U454.PI02_PV.F_CV;21.480762482;100.0 +25/10/2020 02:06:55;U454.PI02_PV.F_CV;21.488159180;100.0 +25/10/2020 02:06:56;U454.PI02_PV.F_CV;21.471258163;100.0 +25/10/2020 02:06:57;U454.PI02_PV.F_CV;21.462345123;100.0 +25/10/2020 02:06:58;U454.PI02_PV.F_CV;21.469491959;100.0 +25/10/2020 02:06:59;U454.PI02_PV.F_CV;21.471279144;100.0 +25/10/2020 02:06:00;U454.PI17_PV.F_CV;22.175563812;100.0 +25/10/2020 02:06:01;U454.PI17_PV.F_CV;22.172798157;100.0 +25/10/2020 02:06:02;U454.PI17_PV.F_CV;22.181480408;100.0 +25/10/2020 02:06:03;U454.PI17_PV.F_CV;22.162557602;100.0 +25/10/2020 02:06:04;U454.PI17_PV.F_CV;22.155483246;100.0 +25/10/2020 02:06:05;U454.PI17_PV.F_CV;22.153713226;100.0 +25/10/2020 02:06:06;U454.PI17_PV.F_CV;22.146240234;100.0 +25/10/2020 02:06:07;U454.PI17_PV.F_CV;22.144371033;100.0 +25/10/2020 02:06:08;U454.PI17_PV.F_CV;22.153280258;100.0 +25/10/2020 02:06:09;U454.PI17_PV.F_CV;22.157852173;100.0 +25/10/2020 02:06:10;U454.PI17_PV.F_CV;22.151962280;100.0 +25/10/2020 02:06:11;U454.PI17_PV.F_CV;22.162208557;100.0 +25/10/2020 02:06:12;U454.PI17_PV.F_CV;22.174144745;100.0 +25/10/2020 02:06:13;U454.PI17_PV.F_CV;22.170099258;100.0 +25/10/2020 02:06:14;U454.PI17_PV.F_CV;22.171432495;100.0 +25/10/2020 02:06:15;U454.PI17_PV.F_CV;22.183483124;100.0 +25/10/2020 02:06:16;U454.PI17_PV.F_CV;22.181808472;100.0 +25/10/2020 02:06:17;U454.PI17_PV.F_CV;22.183732986;100.0 +25/10/2020 02:06:18;U454.PI17_PV.F_CV;22.186557770;100.0 +25/10/2020 02:06:19;U454.PI17_PV.F_CV;22.182577133;100.0 +25/10/2020 02:06:20;U454.PI17_PV.F_CV;22.162832260;100.0 +25/10/2020 02:06:21;U454.PI17_PV.F_CV;22.164926529;100.0 +25/10/2020 02:06:22;U454.PI17_PV.F_CV;22.167793274;100.0 +25/10/2020 02:06:23;U454.PI17_PV.F_CV;22.161479950;100.0 +25/10/2020 02:06:24;U454.PI17_PV.F_CV;22.150526047;100.0 +25/10/2020 02:06:25;U454.PI17_PV.F_CV;22.166538239;100.0 +25/10/2020 02:06:26;U454.PI17_PV.F_CV;22.158821106;100.0 +25/10/2020 02:06:27;U454.PI17_PV.F_CV;22.147518158;100.0 +25/10/2020 02:06:28;U454.PI17_PV.F_CV;22.165786743;100.0 +25/10/2020 02:06:29;U454.PI17_PV.F_CV;22.170352936;100.0 +25/10/2020 02:06:30;U454.PI17_PV.F_CV;22.164463043;100.0 +25/10/2020 02:06:31;U454.PI17_PV.F_CV;22.162990570;100.0 +25/10/2020 02:06:32;U454.PI17_PV.F_CV;22.169654846;100.0 +25/10/2020 02:06:33;U454.PI17_PV.F_CV;22.159601212;100.0 +25/10/2020 02:06:34;U454.PI17_PV.F_CV;22.119586945;100.0 +25/10/2020 02:06:35;U454.PI17_PV.F_CV;22.109584808;100.0 +25/10/2020 02:06:36;U454.PI17_PV.F_CV;22.090677261;100.0 +25/10/2020 02:06:37;U454.PI17_PV.F_CV;22.062513351;100.0 +25/10/2020 02:06:38;U454.PI17_PV.F_CV;22.053127289;100.0 +25/10/2020 02:06:39;U454.PI17_PV.F_CV;22.057813644;100.0 +25/10/2020 02:06:40;U454.PI17_PV.F_CV;22.061328888;100.0 +25/10/2020 02:06:41;U454.PI17_PV.F_CV;22.045801163;100.0 +25/10/2020 02:06:42;U454.PI17_PV.F_CV;22.052589417;100.0 +25/10/2020 02:06:43;U454.PI17_PV.F_CV;22.042119980;100.0 +25/10/2020 02:06:44;U454.PI17_PV.F_CV;22.015216827;100.0 +25/10/2020 02:06:45;U454.PI17_PV.F_CV;22.003803253;100.0 +25/10/2020 02:06:46;U454.PI17_PV.F_CV;22.008152008;100.0 +25/10/2020 02:06:47;U454.PI17_PV.F_CV;22.009613037;100.0 +25/10/2020 02:06:48;U454.PI17_PV.F_CV;21.995372772;100.0 +25/10/2020 02:06:49;U454.PI17_PV.F_CV;21.982437134;100.0 +25/10/2020 02:06:50;U454.PI17_PV.F_CV;21.981546402;100.0 +25/10/2020 02:06:51;U454.PI17_PV.F_CV;21.967262268;100.0 +25/10/2020 02:06:52;U454.PI17_PV.F_CV;21.970722198;100.0 +25/10/2020 02:06:53;U454.PI17_PV.F_CV;21.977548599;100.0 +25/10/2020 02:06:54;U454.PI17_PV.F_CV;21.968605042;100.0 +25/10/2020 02:06:55;U454.PI17_PV.F_CV;21.971057892;100.0 +25/10/2020 02:06:56;U454.PI17_PV.F_CV;21.966983795;100.0 +25/10/2020 02:06:57;U454.PI17_PV.F_CV;21.949558258;100.0 +25/10/2020 02:06:58;U454.PI17_PV.F_CV;21.967132568;100.0 +25/10/2020 02:06:59;U454.PI17_PV.F_CV;21.961315155;100.0 +25/10/2020 02:06:00;U454.PI20_PV.F_CV;20.837224960;100.0 +25/10/2020 02:06:01;U454.PI20_PV.F_CV;20.853837967;100.0 +25/10/2020 02:06:02;U454.PI20_PV.F_CV;20.857990265;100.0 +25/10/2020 02:06:03;U454.PI20_PV.F_CV;20.863716125;100.0 +25/10/2020 02:06:04;U454.PI20_PV.F_CV;20.834678650;100.0 +25/10/2020 02:06:05;U454.PI20_PV.F_CV;20.839139938;100.0 +25/10/2020 02:06:06;U454.PI20_PV.F_CV;20.830879211;100.0 +25/10/2020 02:06:07;U454.PI20_PV.F_CV;20.810062408;100.0 +25/10/2020 02:06:08;U454.PI20_PV.F_CV;20.816577911;100.0 +25/10/2020 02:06:09;U454.PI20_PV.F_CV;20.825237274;100.0 +25/10/2020 02:06:10;U454.PI20_PV.F_CV;20.850841522;100.0 +25/10/2020 02:06:11;U454.PI20_PV.F_CV;20.852554321;100.0 +25/10/2020 02:06:12;U454.PI20_PV.F_CV;20.850639343;100.0 +25/10/2020 02:06:13;U454.PI20_PV.F_CV;20.859535217;100.0 +25/10/2020 02:06:14;U454.PI20_PV.F_CV;20.852382660;100.0 +25/10/2020 02:06:15;U454.PI20_PV.F_CV;20.862314224;100.0 +25/10/2020 02:06:16;U454.PI20_PV.F_CV;20.848390579;100.0 +25/10/2020 02:06:17;U454.PI20_PV.F_CV;20.873035431;100.0 +25/10/2020 02:06:18;U454.PI20_PV.F_CV;20.883884430;100.0 +25/10/2020 02:06:19;U454.PI20_PV.F_CV;20.872531891;100.0 +25/10/2020 02:06:20;U454.PI20_PV.F_CV;20.860321045;100.0 +25/10/2020 02:06:21;U454.PI20_PV.F_CV;20.836174011;100.0 +25/10/2020 02:06:22;U454.PI20_PV.F_CV;20.851230621;100.0 +25/10/2020 02:06:23;U454.PI20_PV.F_CV;20.826869965;100.0 +25/10/2020 02:06:24;U454.PI20_PV.F_CV;20.841875076;100.0 +25/10/2020 02:06:25;U454.PI20_PV.F_CV;20.859687805;100.0 +25/10/2020 02:06:26;U454.PI20_PV.F_CV;20.861797333;100.0 +25/10/2020 02:06:27;U454.PI20_PV.F_CV;20.852949142;100.0 +25/10/2020 02:06:28;U454.PI20_PV.F_CV;20.834331512;100.0 +25/10/2020 02:06:29;U454.PI20_PV.F_CV;20.857801437;100.0 +25/10/2020 02:06:30;U454.PI20_PV.F_CV;20.833200455;100.0 +25/10/2020 02:06:31;U454.PI20_PV.F_CV;20.857519150;100.0 +25/10/2020 02:06:32;U454.PI20_PV.F_CV;20.891723633;100.0 +25/10/2020 02:06:33;U454.PI20_PV.F_CV;20.881525040;100.0 +25/10/2020 02:06:34;U454.PI20_PV.F_CV;20.787569046;100.0 +25/10/2020 02:06:35;U454.PI20_PV.F_CV;20.717205048;100.0 +25/10/2020 02:06:36;U454.PI20_PV.F_CV;20.708988190;100.0 +25/10/2020 02:06:37;U454.PI20_PV.F_CV;20.657716751;100.0 +25/10/2020 02:06:38;U454.PI20_PV.F_CV;20.630836487;100.0 +25/10/2020 02:06:39;U454.PI20_PV.F_CV;20.659271240;100.0 +25/10/2020 02:06:40;U454.PI20_PV.F_CV;20.682785034;100.0 +25/10/2020 02:06:41;U454.PI20_PV.F_CV;20.676946640;100.0 +25/10/2020 02:06:42;U454.PI20_PV.F_CV;20.669723511;100.0 +25/10/2020 02:06:43;U454.PI20_PV.F_CV;20.654027939;100.0 +25/10/2020 02:06:44;U454.PI20_PV.F_CV;20.618194580;100.0 +25/10/2020 02:06:45;U454.PI20_PV.F_CV;20.588142395;100.0 +25/10/2020 02:06:46;U454.PI20_PV.F_CV;20.592508316;100.0 +25/10/2020 02:06:47;U454.PI20_PV.F_CV;20.630313873;100.0 +25/10/2020 02:06:48;U454.PI20_PV.F_CV;20.623985291;100.0 +25/10/2020 02:06:49;U454.PI20_PV.F_CV;20.582557678;100.0 +25/10/2020 02:06:50;U454.PI20_PV.F_CV;20.583919525;100.0 +25/10/2020 02:06:51;U454.PI20_PV.F_CV;20.563167572;100.0 +25/10/2020 02:06:52;U454.PI20_PV.F_CV;20.546260834;100.0 +25/10/2020 02:06:53;U454.PI20_PV.F_CV;20.562192917;100.0 +25/10/2020 02:06:54;U454.PI20_PV.F_CV;20.585861206;100.0 +25/10/2020 02:06:55;U454.PI20_PV.F_CV;20.582403183;100.0 +25/10/2020 02:06:56;U454.PI20_PV.F_CV;20.590911865;100.0 +25/10/2020 02:06:57;U454.PI20_PV.F_CV;20.571947098;100.0 +25/10/2020 02:06:58;U454.PI20_PV.F_CV;20.580867767;100.0 +25/10/2020 02:06:59;U454.PI20_PV.F_CV;20.555374146;100.0 +25/10/2020 02:06:00;U454.PI44_PV.F_CV;24.113937378;100.0 +25/10/2020 02:06:01;U454.PI44_PV.F_CV;24.079830170;100.0 +25/10/2020 02:06:02;U454.PI44_PV.F_CV;24.135482788;100.0 +25/10/2020 02:06:03;U454.PI44_PV.F_CV;24.094036102;100.0 +25/10/2020 02:06:04;U454.PI44_PV.F_CV;24.161281586;100.0 +25/10/2020 02:06:05;U454.PI44_PV.F_CV;24.178703308;100.0 +25/10/2020 02:06:06;U454.PI44_PV.F_CV;24.069547653;100.0 +25/10/2020 02:06:07;U454.PI44_PV.F_CV;23.995094299;100.0 +25/10/2020 02:06:08;U454.PI44_PV.F_CV;24.073617935;100.0 +25/10/2020 02:06:09;U454.PI44_PV.F_CV;24.079927444;100.0 +25/10/2020 02:06:10;U454.PI44_PV.F_CV;24.025993347;100.0 +25/10/2020 02:06:11;U454.PI44_PV.F_CV;24.117536545;100.0 +25/10/2020 02:06:12;U454.PI44_PV.F_CV;24.160823822;100.0 +25/10/2020 02:06:13;U454.PI44_PV.F_CV;24.140014648;100.0 +25/10/2020 02:06:14;U454.PI44_PV.F_CV;24.077850342;100.0 +25/10/2020 02:06:15;U454.PI44_PV.F_CV;24.111228943;100.0 +25/10/2020 02:06:16;U454.PI44_PV.F_CV;24.188573837;100.0 +25/10/2020 02:06:17;U454.PI44_PV.F_CV;24.073984146;100.0 +25/10/2020 02:06:18;U454.PI44_PV.F_CV;24.129121780;100.0 +25/10/2020 02:06:19;U454.PI44_PV.F_CV;24.188179016;100.0 +25/10/2020 02:06:20;U454.PI44_PV.F_CV;24.132280350;100.0 +25/10/2020 02:06:21;U454.PI44_PV.F_CV;24.086322784;100.0 +25/10/2020 02:06:22;U454.PI44_PV.F_CV;24.112735748;100.0 +25/10/2020 02:06:23;U454.PI44_PV.F_CV;24.133300781;100.0 +25/10/2020 02:06:24;U454.PI44_PV.F_CV;24.033920288;100.0 +25/10/2020 02:06:25;U454.PI44_PV.F_CV;24.098217010;100.0 +25/10/2020 02:06:26;U454.PI44_PV.F_CV;24.161136627;100.0 +25/10/2020 02:06:27;U454.PI44_PV.F_CV;24.143951416;100.0 +25/10/2020 02:06:28;U454.PI44_PV.F_CV;24.045494080;100.0 +25/10/2020 02:06:29;U454.PI44_PV.F_CV;23.996389389;100.0 +25/10/2020 02:06:30;U454.PI44_PV.F_CV;24.135618210;100.0 +25/10/2020 02:06:31;U454.PI44_PV.F_CV;24.094802856;100.0 +25/10/2020 02:06:32;U454.PI44_PV.F_CV;24.077411652;100.0 +25/10/2020 02:06:33;U454.PI44_PV.F_CV;24.157962799;100.0 +25/10/2020 02:06:34;U454.PI44_PV.F_CV;24.297943115;100.0 +25/10/2020 02:06:35;U454.PI44_PV.F_CV;24.299430847;100.0 +25/10/2020 02:06:36;U454.PI44_PV.F_CV;24.170560837;100.0 +25/10/2020 02:06:37;U454.PI44_PV.F_CV;24.233543396;100.0 +25/10/2020 02:06:38;U454.PI44_PV.F_CV;24.212148666;100.0 +25/10/2020 02:06:39;U454.PI44_PV.F_CV;24.170454025;100.0 +25/10/2020 02:06:40;U454.PI44_PV.F_CV;24.210887909;100.0 +25/10/2020 02:06:41;U454.PI44_PV.F_CV;24.251544952;100.0 +25/10/2020 02:06:42;U454.PI44_PV.F_CV;24.265542984;100.0 +25/10/2020 02:06:43;U454.PI44_PV.F_CV;24.221050262;100.0 +25/10/2020 02:06:44;U454.PI44_PV.F_CV;24.228984833;100.0 +25/10/2020 02:06:45;U454.PI44_PV.F_CV;24.163173676;100.0 +25/10/2020 02:06:46;U454.PI44_PV.F_CV;24.231611252;100.0 +25/10/2020 02:06:47;U454.PI44_PV.F_CV;24.151052475;100.0 +25/10/2020 02:06:48;U454.PI44_PV.F_CV;24.120008469;100.0 +25/10/2020 02:06:49;U454.PI44_PV.F_CV;24.183994293;100.0 +25/10/2020 02:06:50;U454.PI44_PV.F_CV;24.100440979;100.0 +25/10/2020 02:06:51;U454.PI44_PV.F_CV;24.101999283;100.0 +25/10/2020 02:06:52;U454.PI44_PV.F_CV;24.122621536;100.0 +25/10/2020 02:06:53;U454.PI44_PV.F_CV;24.197479248;100.0 +25/10/2020 02:06:54;U454.PI44_PV.F_CV;24.077171326;100.0 +25/10/2020 02:06:55;U454.PI44_PV.F_CV;24.063726425;100.0 +25/10/2020 02:06:56;U454.PI44_PV.F_CV;24.147523880;100.0 +25/10/2020 02:06:57;U454.PI44_PV.F_CV;24.189102173;100.0 +25/10/2020 02:06:58;U454.PI44_PV.F_CV;24.110553741;100.0 +25/10/2020 02:06:59;U454.PI44_PV.F_CV;24.065341949;100.0 +25/10/2020 02:06:00;U454.PX_HoT2.F_CV;0.515395284;100.0 +25/10/2020 02:06:01;U454.PX_HoT2.F_CV;0.515395284;100.0 +25/10/2020 02:06:02;U454.PX_HoT2.F_CV;0.515395284;100.0 +25/10/2020 02:06:03;U454.PX_HoT2.F_CV;0.515395284;100.0 +25/10/2020 02:06:04;U454.PX_HoT2.F_CV;0.515395284;100.0 +25/10/2020 02:06:05;U454.PX_HoT2.F_CV;0.515395284;100.0 +25/10/2020 02:06:06;U454.PX_HoT2.F_CV;0.515395284;100.0 +25/10/2020 02:06:07;U454.PX_HoT2.F_CV;0.515395284;100.0 +25/10/2020 02:06:08;U454.PX_HoT2.F_CV;0.515395284;100.0 +25/10/2020 02:06:09;U454.PX_HoT2.F_CV;0.515395284;100.0 +25/10/2020 02:06:10;U454.PX_HoT2.F_CV;0.515395284;100.0 +25/10/2020 02:06:11;U454.PX_HoT2.F_CV;0.515395284;100.0 +25/10/2020 02:06:12;U454.PX_HoT2.F_CV;0.515395284;100.0 +25/10/2020 02:06:13;U454.PX_HoT2.F_CV;0.515395284;100.0 +25/10/2020 02:06:14;U454.PX_HoT2.F_CV;0.515395284;100.0 +25/10/2020 02:06:15;U454.PX_HoT2.F_CV;0.515395284;100.0 +25/10/2020 02:06:16;U454.PX_HoT2.F_CV;0.515395284;100.0 +25/10/2020 02:06:17;U454.PX_HoT2.F_CV;0.520717204;100.0 +25/10/2020 02:06:18;U454.PX_HoT2.F_CV;0.520717204;100.0 +25/10/2020 02:06:19;U454.PX_HoT2.F_CV;0.520717204;100.0 +25/10/2020 02:06:20;U454.PX_HoT2.F_CV;0.520717204;100.0 +25/10/2020 02:06:21;U454.PX_HoT2.F_CV;0.520717204;100.0 +25/10/2020 02:06:22;U454.PX_HoT2.F_CV;0.520717204;100.0 +25/10/2020 02:06:23;U454.PX_HoT2.F_CV;0.520717204;100.0 +25/10/2020 02:06:24;U454.PX_HoT2.F_CV;0.520717204;100.0 +25/10/2020 02:06:25;U454.PX_HoT2.F_CV;0.520717204;100.0 +25/10/2020 02:06:26;U454.PX_HoT2.F_CV;0.520717204;100.0 +25/10/2020 02:06:27;U454.PX_HoT2.F_CV;0.520717204;100.0 +25/10/2020 02:06:28;U454.PX_HoT2.F_CV;0.520717204;100.0 +25/10/2020 02:06:29;U454.PX_HoT2.F_CV;0.520717204;100.0 +25/10/2020 02:06:30;U454.PX_HoT2.F_CV;0.520717204;100.0 +25/10/2020 02:06:31;U454.PX_HoT2.F_CV;0.520717204;100.0 +25/10/2020 02:06:32;U454.PX_HoT2.F_CV;0.520717204;100.0 +25/10/2020 02:06:33;U454.PX_HoT2.F_CV;0.520717204;100.0 +25/10/2020 02:06:34;U454.PX_HoT2.F_CV;0.520717204;100.0 +25/10/2020 02:06:35;U454.PX_HoT2.F_CV;0.520717204;100.0 +25/10/2020 02:06:36;U454.PX_HoT2.F_CV;0.519710958;100.0 +25/10/2020 02:06:37;U454.PX_HoT2.F_CV;0.519710958;100.0 +25/10/2020 02:06:38;U454.PX_HoT2.F_CV;0.519710958;100.0 +25/10/2020 02:06:39;U454.PX_HoT2.F_CV;0.519710958;100.0 +25/10/2020 02:06:40;U454.PX_HoT2.F_CV;0.519710958;100.0 +25/10/2020 02:06:41;U454.PX_HoT2.F_CV;0.519710958;100.0 +25/10/2020 02:06:42;U454.PX_HoT2.F_CV;0.519710958;100.0 +25/10/2020 02:06:43;U454.PX_HoT2.F_CV;0.519710958;100.0 +25/10/2020 02:06:44;U454.PX_HoT2.F_CV;0.519710958;100.0 +25/10/2020 02:06:45;U454.PX_HoT2.F_CV;0.519710958;100.0 +25/10/2020 02:06:46;U454.PX_HoT2.F_CV;0.519710958;100.0 +25/10/2020 02:06:47;U454.PX_HoT2.F_CV;0.519710958;100.0 +25/10/2020 02:06:48;U454.PX_HoT2.F_CV;0.519710958;100.0 +25/10/2020 02:06:49;U454.PX_HoT2.F_CV;0.519710958;100.0 +25/10/2020 02:06:50;U454.PX_HoT2.F_CV;0.519710958;100.0 +25/10/2020 02:06:51;U454.PX_HoT2.F_CV;0.519710958;100.0 +25/10/2020 02:06:52;U454.PX_HoT2.F_CV;0.519710958;100.0 +25/10/2020 02:06:53;U454.PX_HoT2.F_CV;0.519710958;100.0 +25/10/2020 02:06:54;U454.PX_HoT2.F_CV;0.522828102;100.0 +25/10/2020 02:06:55;U454.PX_HoT2.F_CV;0.522828102;100.0 +25/10/2020 02:06:56;U454.PX_HoT2.F_CV;0.522828102;100.0 +25/10/2020 02:06:57;U454.PX_HoT2.F_CV;0.522828102;100.0 +25/10/2020 02:06:58;U454.PX_HoT2.F_CV;0.522828102;100.0 +25/10/2020 02:06:59;U454.PX_HoT2.F_CV;0.522828102;100.0 +25/10/2020 02:06:00;U454.PX_QResidual.F_CV;14.250000000;100.0 +25/10/2020 02:06:01;U454.PX_QResidual.F_CV;14.250000000;100.0 +25/10/2020 02:06:02;U454.PX_QResidual.F_CV;14.250000000;100.0 +25/10/2020 02:06:03;U454.PX_QResidual.F_CV;14.250000000;100.0 +25/10/2020 02:06:04;U454.PX_QResidual.F_CV;14.250000000;100.0 +25/10/2020 02:06:05;U454.PX_QResidual.F_CV;14.250000000;100.0 +25/10/2020 02:06:06;U454.PX_QResidual.F_CV;14.250000000;100.0 +25/10/2020 02:06:07;U454.PX_QResidual.F_CV;14.250000000;100.0 +25/10/2020 02:06:08;U454.PX_QResidual.F_CV;14.250000000;100.0 +25/10/2020 02:06:09;U454.PX_QResidual.F_CV;14.250000000;100.0 +25/10/2020 02:06:10;U454.PX_QResidual.F_CV;14.250000000;100.0 +25/10/2020 02:06:11;U454.PX_QResidual.F_CV;14.250000000;100.0 +25/10/2020 02:06:12;U454.PX_QResidual.F_CV;14.250000000;100.0 +25/10/2020 02:06:13;U454.PX_QResidual.F_CV;14.250000000;100.0 +25/10/2020 02:06:14;U454.PX_QResidual.F_CV;14.250000000;100.0 +25/10/2020 02:06:15;U454.PX_QResidual.F_CV;14.250000000;100.0 +25/10/2020 02:06:16;U454.PX_QResidual.F_CV;14.250000000;100.0 +25/10/2020 02:06:17;U454.PX_QResidual.F_CV;14.375000000;100.0 +25/10/2020 02:06:18;U454.PX_QResidual.F_CV;14.375000000;100.0 +25/10/2020 02:06:19;U454.PX_QResidual.F_CV;14.375000000;100.0 +25/10/2020 02:06:20;U454.PX_QResidual.F_CV;14.375000000;100.0 +25/10/2020 02:06:21;U454.PX_QResidual.F_CV;14.375000000;100.0 +25/10/2020 02:06:22;U454.PX_QResidual.F_CV;14.375000000;100.0 +25/10/2020 02:06:23;U454.PX_QResidual.F_CV;14.375000000;100.0 +25/10/2020 02:06:24;U454.PX_QResidual.F_CV;14.375000000;100.0 +25/10/2020 02:06:25;U454.PX_QResidual.F_CV;14.375000000;100.0 +25/10/2020 02:06:26;U454.PX_QResidual.F_CV;14.375000000;100.0 +25/10/2020 02:06:27;U454.PX_QResidual.F_CV;14.375000000;100.0 +25/10/2020 02:06:28;U454.PX_QResidual.F_CV;14.375000000;100.0 +25/10/2020 02:06:29;U454.PX_QResidual.F_CV;14.375000000;100.0 +25/10/2020 02:06:30;U454.PX_QResidual.F_CV;14.375000000;100.0 +25/10/2020 02:06:31;U454.PX_QResidual.F_CV;14.375000000;100.0 +25/10/2020 02:06:32;U454.PX_QResidual.F_CV;14.375000000;100.0 +25/10/2020 02:06:33;U454.PX_QResidual.F_CV;14.375000000;100.0 +25/10/2020 02:06:34;U454.PX_QResidual.F_CV;14.375000000;100.0 +25/10/2020 02:06:35;U454.PX_QResidual.F_CV;14.375000000;100.0 +25/10/2020 02:06:36;U454.PX_QResidual.F_CV;14.312500000;100.0 +25/10/2020 02:06:37;U454.PX_QResidual.F_CV;14.312500000;100.0 +25/10/2020 02:06:38;U454.PX_QResidual.F_CV;14.312500000;100.0 +25/10/2020 02:06:39;U454.PX_QResidual.F_CV;14.312500000;100.0 +25/10/2020 02:06:40;U454.PX_QResidual.F_CV;14.312500000;100.0 +25/10/2020 02:06:41;U454.PX_QResidual.F_CV;14.312500000;100.0 +25/10/2020 02:06:42;U454.PX_QResidual.F_CV;14.312500000;100.0 +25/10/2020 02:06:43;U454.PX_QResidual.F_CV;14.312500000;100.0 +25/10/2020 02:06:44;U454.PX_QResidual.F_CV;14.312500000;100.0 +25/10/2020 02:06:45;U454.PX_QResidual.F_CV;14.312500000;100.0 +25/10/2020 02:06:46;U454.PX_QResidual.F_CV;14.312500000;100.0 +25/10/2020 02:06:47;U454.PX_QResidual.F_CV;14.312500000;100.0 +25/10/2020 02:06:48;U454.PX_QResidual.F_CV;14.312500000;100.0 +25/10/2020 02:06:49;U454.PX_QResidual.F_CV;14.312500000;100.0 +25/10/2020 02:06:50;U454.PX_QResidual.F_CV;14.312500000;100.0 +25/10/2020 02:06:51;U454.PX_QResidual.F_CV;14.312500000;100.0 +25/10/2020 02:06:52;U454.PX_QResidual.F_CV;14.312500000;100.0 +25/10/2020 02:06:53;U454.PX_QResidual.F_CV;14.312500000;100.0 +25/10/2020 02:06:54;U454.PX_QResidual.F_CV;14.312500000;100.0 +25/10/2020 02:06:55;U454.PX_QResidual.F_CV;14.312500000;100.0 +25/10/2020 02:06:56;U454.PX_QResidual.F_CV;14.312500000;100.0 +25/10/2020 02:06:57;U454.PX_QResidual.F_CV;14.312500000;100.0 +25/10/2020 02:06:58;U454.PX_QResidual.F_CV;14.312500000;100.0 +25/10/2020 02:06:59;U454.PX_QResidual.F_CV;14.312500000;100.0 +25/10/2020 02:06:00;U454.TI111_PV.F_CV;156.106201172;100.0 +25/10/2020 02:06:01;U454.TI111_PV.F_CV;156.101562500;100.0 +25/10/2020 02:06:02;U454.TI111_PV.F_CV;156.100402832;100.0 +25/10/2020 02:06:03;U454.TI111_PV.F_CV;156.150100708;100.0 +25/10/2020 02:06:04;U454.TI111_PV.F_CV;156.187530518;100.0 +25/10/2020 02:06:05;U454.TI111_PV.F_CV;156.196868896;100.0 +25/10/2020 02:06:06;U454.TI111_PV.F_CV;156.199218750;100.0 +25/10/2020 02:06:07;U454.TI111_PV.F_CV;156.199798584;100.0 +25/10/2020 02:06:08;U454.TI111_PV.F_CV;156.199951172;100.0 +25/10/2020 02:06:09;U454.TI111_PV.F_CV;156.199981689;100.0 +25/10/2020 02:06:10;U454.TI111_PV.F_CV;156.199981689;100.0 +25/10/2020 02:06:11;U454.TI111_PV.F_CV;156.250000000;100.0 +25/10/2020 02:06:12;U454.TI111_PV.F_CV;156.287506104;100.0 +25/10/2020 02:06:13;U454.TI111_PV.F_CV;156.296875000;100.0 +25/10/2020 02:06:14;U454.TI111_PV.F_CV;156.224212646;100.0 +25/10/2020 02:06:15;U454.TI111_PV.F_CV;156.206054688;100.0 +25/10/2020 02:06:16;U454.TI111_PV.F_CV;156.251525879;100.0 +25/10/2020 02:06:17;U454.TI111_PV.F_CV;156.287872314;100.0 +25/10/2020 02:06:18;U454.TI111_PV.F_CV;156.296966553;100.0 +25/10/2020 02:06:19;U454.TI111_PV.F_CV;156.149246216;100.0 +25/10/2020 02:06:20;U454.TI111_PV.F_CV;156.112319946;100.0 +25/10/2020 02:06:21;U454.TI111_PV.F_CV;156.153076172;100.0 +25/10/2020 02:06:22;U454.TI111_PV.F_CV;156.188262939;100.0 +25/10/2020 02:06:23;U454.TI111_PV.F_CV;156.197052002;100.0 +25/10/2020 02:06:24;U454.TI111_PV.F_CV;156.149261475;100.0 +25/10/2020 02:06:25;U454.TI111_PV.F_CV;156.112319946;100.0 +25/10/2020 02:06:26;U454.TI111_PV.F_CV;156.103088379;100.0 +25/10/2020 02:06:27;U454.TI111_PV.F_CV;156.175781250;100.0 +25/10/2020 02:06:28;U454.TI111_PV.F_CV;156.193939209;100.0 +25/10/2020 02:06:29;U454.TI111_PV.F_CV;156.348480225;100.0 +25/10/2020 02:06:30;U454.TI111_PV.F_CV;156.462127686;100.0 +25/10/2020 02:06:31;U454.TI111_PV.F_CV;156.490524292;100.0 +25/10/2020 02:06:32;U454.TI111_PV.F_CV;156.272628784;100.0 +25/10/2020 02:06:33;U454.TI111_PV.F_CV;156.218154907;100.0 +25/10/2020 02:06:34;U454.TI111_PV.F_CV;156.204528809;100.0 +25/10/2020 02:06:35;U454.TI111_PV.F_CV;156.201141357;100.0 +25/10/2020 02:06:36;U454.TI111_PV.F_CV;156.200286865;100.0 +25/10/2020 02:06:37;U454.TI111_PV.F_CV;156.200073242;100.0 +25/10/2020 02:06:38;U454.TI111_PV.F_CV;156.200012207;100.0 +25/10/2020 02:06:39;U454.TI111_PV.F_CV;156.200012207;100.0 +25/10/2020 02:06:40;U454.TI111_PV.F_CV;156.200012207;100.0 +25/10/2020 02:06:41;U454.TI111_PV.F_CV;156.200012207;100.0 +25/10/2020 02:06:42;U454.TI111_PV.F_CV;156.200012207;100.0 +25/10/2020 02:06:43;U454.TI111_PV.F_CV;156.375000000;100.0 +25/10/2020 02:06:44;U454.TI111_PV.F_CV;156.393737793;100.0 +25/10/2020 02:06:45;U454.TI111_PV.F_CV;156.248443604;100.0 +25/10/2020 02:06:46;U454.TI111_PV.F_CV;156.224212646;100.0 +25/10/2020 02:06:47;U454.TI111_PV.F_CV;156.203033447;100.0 +25/10/2020 02:06:48;U454.TI111_PV.F_CV;156.200744629;100.0 +25/10/2020 02:06:49;U454.TI111_PV.F_CV;156.200195313;100.0 +25/10/2020 02:06:50;U454.TI111_PV.F_CV;156.425048828;100.0 +25/10/2020 02:06:51;U454.TI111_PV.F_CV;156.481262207;100.0 +25/10/2020 02:06:52;U454.TI111_PV.F_CV;156.495315552;100.0 +25/10/2020 02:06:53;U454.TI111_PV.F_CV;156.347656250;100.0 +25/10/2020 02:06:54;U454.TI111_PV.F_CV;156.236907959;100.0 +25/10/2020 02:06:55;U454.TI111_PV.F_CV;156.209228516;100.0 +25/10/2020 02:06:56;U454.TI111_PV.F_CV;156.277313232;100.0 +25/10/2020 02:06:57;U454.TI111_PV.F_CV;156.294342041;100.0 +25/10/2020 02:06:58;U454.TI111_PV.F_CV;156.298583984;100.0 +25/10/2020 02:06:59;U454.TI111_PV.F_CV;156.224639893;100.0 +25/10/2020 02:06:00;U454.TI160_PV.F_CV;174.799255371;100.0 +25/10/2020 02:06:01;U454.TI160_PV.F_CV;174.799804688;100.0 +25/10/2020 02:06:02;U454.TI160_PV.F_CV;174.799957275;100.0 +25/10/2020 02:06:03;U454.TI160_PV.F_CV;174.724975586;100.0 +25/10/2020 02:06:04;U454.TI160_PV.F_CV;174.706237793;100.0 +25/10/2020 02:06:05;U454.TI160_PV.F_CV;174.751556396;100.0 +25/10/2020 02:06:06;U454.TI160_PV.F_CV;174.787902832;100.0 +25/10/2020 02:06:07;U454.TI160_PV.F_CV;174.796966553;100.0 +25/10/2020 02:06:08;U454.TI160_PV.F_CV;174.799255371;100.0 +25/10/2020 02:06:09;U454.TI160_PV.F_CV;174.799804688;100.0 +25/10/2020 02:06:10;U454.TI160_PV.F_CV;174.749938965;100.0 +25/10/2020 02:06:11;U454.TI160_PV.F_CV;174.712493896;100.0 +25/10/2020 02:06:12;U454.TI160_PV.F_CV;174.703125000;100.0 +25/10/2020 02:06:13;U454.TI160_PV.F_CV;174.700775146;100.0 +25/10/2020 02:06:14;U454.TI160_PV.F_CV;174.700195313;100.0 +25/10/2020 02:06:15;U454.TI160_PV.F_CV;174.700042725;100.0 +25/10/2020 02:06:16;U454.TI160_PV.F_CV;174.850006104;100.0 +25/10/2020 02:06:17;U454.TI160_PV.F_CV;174.887496948;100.0 +25/10/2020 02:06:18;U454.TI160_PV.F_CV;174.896865845;100.0 +25/10/2020 02:06:19;U454.TI160_PV.F_CV;174.899215698;100.0 +25/10/2020 02:06:20;U454.TI160_PV.F_CV;174.899795532;100.0 +25/10/2020 02:06:21;U454.TI160_PV.F_CV;174.899948120;100.0 +25/10/2020 02:06:22;U454.TI160_PV.F_CV;174.899978638;100.0 +25/10/2020 02:06:23;U454.TI160_PV.F_CV;174.799987793;100.0 +25/10/2020 02:06:24;U454.TI160_PV.F_CV;174.725006104;100.0 +25/10/2020 02:06:25;U454.TI160_PV.F_CV;174.706237793;100.0 +25/10/2020 02:06:26;U454.TI160_PV.F_CV;174.776550293;100.0 +25/10/2020 02:06:27;U454.TI160_PV.F_CV;174.794128418;100.0 +25/10/2020 02:06:28;U454.TI160_PV.F_CV;174.798522949;100.0 +25/10/2020 02:06:29;U454.TI160_PV.F_CV;174.799621582;100.0 +25/10/2020 02:06:30;U454.TI160_PV.F_CV;174.799896240;100.0 +25/10/2020 02:06:31;U454.TI160_PV.F_CV;174.799987793;100.0 +25/10/2020 02:06:32;U454.TI160_PV.F_CV;174.799987793;100.0 +25/10/2020 02:06:33;U454.TI160_PV.F_CV;174.799987793;100.0 +25/10/2020 02:06:34;U454.TI160_PV.F_CV;174.875000000;100.0 +25/10/2020 02:06:35;U454.TI160_PV.F_CV;174.893737793;100.0 +25/10/2020 02:06:36;U454.TI160_PV.F_CV;174.848434448;100.0 +25/10/2020 02:06:37;U454.TI160_PV.F_CV;174.812103271;100.0 +25/10/2020 02:06:38;U454.TI160_PV.F_CV;174.803039551;100.0 +25/10/2020 02:06:39;U454.TI160_PV.F_CV;174.875762939;100.0 +25/10/2020 02:06:40;U454.TI160_PV.F_CV;174.893936157;100.0 +25/10/2020 02:06:41;U454.TI160_PV.F_CV;174.898483276;100.0 +25/10/2020 02:06:42;U454.TI160_PV.F_CV;174.799240112;100.0 +25/10/2020 02:06:43;U454.TI160_PV.F_CV;174.712402344;100.0 +25/10/2020 02:06:44;U454.TI160_PV.F_CV;174.703094482;100.0 +25/10/2020 02:06:45;U454.TI160_PV.F_CV;174.700775146;100.0 +25/10/2020 02:06:46;U454.TI160_PV.F_CV;174.700378418;100.0 +25/10/2020 02:06:47;U454.TI160_PV.F_CV;174.700042725;100.0 +25/10/2020 02:06:48;U454.TI160_PV.F_CV;174.700012207;100.0 +25/10/2020 02:06:49;U454.TI160_PV.F_CV;174.800003052;100.0 +25/10/2020 02:06:50;U454.TI160_PV.F_CV;174.875000000;100.0 +25/10/2020 02:06:51;U454.TI160_PV.F_CV;174.893737793;100.0 +25/10/2020 02:06:52;U454.TI160_PV.F_CV;174.823425293;100.0 +25/10/2020 02:06:53;U454.TI160_PV.F_CV;174.811706543;100.0 +25/10/2020 02:06:54;U454.TI160_PV.F_CV;174.802917480;100.0 +25/10/2020 02:06:55;U454.TI160_PV.F_CV;174.750732422;100.0 +25/10/2020 02:06:56;U454.TI160_PV.F_CV;174.712677002;100.0 +25/10/2020 02:06:57;U454.TI160_PV.F_CV;174.703155518;100.0 +25/10/2020 02:06:58;U454.TI160_PV.F_CV;174.700775146;100.0 +25/10/2020 02:06:59;U454.TI160_PV.F_CV;174.700195313;100.0 +25/10/2020 02:06:00;U454.TI260_PV.F_CV;174.312500000;100.0 +25/10/2020 02:06:01;U454.TI260_PV.F_CV;174.303131104;100.0 +25/10/2020 02:06:02;U454.TI260_PV.F_CV;174.300781250;100.0 +25/10/2020 02:06:03;U454.TI260_PV.F_CV;174.300201416;100.0 +25/10/2020 02:06:04;U454.TI260_PV.F_CV;174.300048828;100.0 +25/10/2020 02:06:05;U454.TI260_PV.F_CV;174.300018311;100.0 +25/10/2020 02:06:06;U454.TI260_PV.F_CV;174.300018311;100.0 +25/10/2020 02:06:07;U454.TI260_PV.F_CV;174.350006104;100.0 +25/10/2020 02:06:08;U454.TI260_PV.F_CV;174.387496948;100.0 +25/10/2020 02:06:09;U454.TI260_PV.F_CV;174.396865845;100.0 +25/10/2020 02:06:10;U454.TI260_PV.F_CV;174.399215698;100.0 +25/10/2020 02:06:11;U454.TI260_PV.F_CV;174.399795532;100.0 +25/10/2020 02:06:12;U454.TI260_PV.F_CV;174.349945068;100.0 +25/10/2020 02:06:13;U454.TI260_PV.F_CV;174.312500000;100.0 +25/10/2020 02:06:14;U454.TI260_PV.F_CV;174.303131104;100.0 +25/10/2020 02:06:15;U454.TI260_PV.F_CV;174.375778198;100.0 +25/10/2020 02:06:16;U454.TI260_PV.F_CV;174.393951416;100.0 +25/10/2020 02:06:17;U454.TI260_PV.F_CV;174.398483276;100.0 +25/10/2020 02:06:18;U454.TI260_PV.F_CV;174.399612427;100.0 +25/10/2020 02:06:19;U454.TI260_PV.F_CV;174.399902344;100.0 +25/10/2020 02:06:20;U454.TI260_PV.F_CV;174.349975586;100.0 +25/10/2020 02:06:21;U454.TI260_PV.F_CV;174.312500000;100.0 +25/10/2020 02:06:22;U454.TI260_PV.F_CV;174.303131104;100.0 +25/10/2020 02:06:23;U454.TI260_PV.F_CV;174.300781250;100.0 +25/10/2020 02:06:24;U454.TI260_PV.F_CV;174.300201416;100.0 +25/10/2020 02:06:25;U454.TI260_PV.F_CV;174.350051880;100.0 +25/10/2020 02:06:26;U454.TI260_PV.F_CV;174.387512207;100.0 +25/10/2020 02:06:27;U454.TI260_PV.F_CV;174.396881104;100.0 +25/10/2020 02:06:28;U454.TI260_PV.F_CV;174.324218750;100.0 +25/10/2020 02:06:29;U454.TI260_PV.F_CV;174.306060791;100.0 +25/10/2020 02:06:30;U454.TI260_PV.F_CV;174.301513672;100.0 +25/10/2020 02:06:31;U454.TI260_PV.F_CV;174.300384521;100.0 +25/10/2020 02:06:32;U454.TI260_PV.F_CV;174.300109863;100.0 +25/10/2020 02:06:33;U454.TI260_PV.F_CV;174.350021362;100.0 +25/10/2020 02:06:34;U454.TI260_PV.F_CV;174.387496948;100.0 +25/10/2020 02:06:35;U454.TI260_PV.F_CV;174.396865845;100.0 +25/10/2020 02:06:36;U454.TI260_PV.F_CV;174.399215698;100.0 +25/10/2020 02:06:37;U454.TI260_PV.F_CV;174.399795532;100.0 +25/10/2020 02:06:38;U454.TI260_PV.F_CV;174.399948120;100.0 +25/10/2020 02:06:39;U454.TI260_PV.F_CV;174.399978638;100.0 +25/10/2020 02:06:40;U454.TI260_PV.F_CV;174.399993896;100.0 +25/10/2020 02:06:41;U454.TI260_PV.F_CV;174.399993896;100.0 +25/10/2020 02:06:42;U454.TI260_PV.F_CV;174.399993896;100.0 +25/10/2020 02:06:43;U454.TI260_PV.F_CV;174.399993896;100.0 +25/10/2020 02:06:44;U454.TI260_PV.F_CV;174.399993896;100.0 +25/10/2020 02:06:45;U454.TI260_PV.F_CV;174.399993896;100.0 +25/10/2020 02:06:46;U454.TI260_PV.F_CV;174.399993896;100.0 +25/10/2020 02:06:47;U454.TI260_PV.F_CV;174.399993896;100.0 +25/10/2020 02:06:48;U454.TI260_PV.F_CV;174.399993896;100.0 +25/10/2020 02:06:49;U454.TI260_PV.F_CV;174.250000000;100.0 +25/10/2020 02:06:50;U454.TI260_PV.F_CV;174.212493896;100.0 +25/10/2020 02:06:51;U454.TI260_PV.F_CV;174.303115845;100.0 +25/10/2020 02:06:52;U454.TI260_PV.F_CV;174.375778198;100.0 +25/10/2020 02:06:53;U454.TI260_PV.F_CV;174.387893677;100.0 +25/10/2020 02:06:54;U454.TI260_PV.F_CV;174.346984863;100.0 +25/10/2020 02:06:55;U454.TI260_PV.F_CV;174.311737061;100.0 +25/10/2020 02:06:56;U454.TI260_PV.F_CV;174.302947998;100.0 +25/10/2020 02:06:57;U454.TI260_PV.F_CV;174.375732422;100.0 +25/10/2020 02:06:58;U454.TI260_PV.F_CV;174.393920898;100.0 +25/10/2020 02:06:59;U454.TI260_PV.F_CV;174.398468018;100.0 +25/10/2020 02:06:00;U454.TI32_PV.F_CV;92.897064209;100.0 +25/10/2020 02:06:01;U454.TI32_PV.F_CV;92.899261475;100.0 +25/10/2020 02:06:02;U454.TI32_PV.F_CV;92.899810791;100.0 +25/10/2020 02:06:03;U454.TI32_PV.F_CV;92.899948120;100.0 +25/10/2020 02:06:04;U454.TI32_PV.F_CV;92.899993896;100.0 +25/10/2020 02:06:05;U454.TI32_PV.F_CV;92.899993896;100.0 +25/10/2020 02:06:06;U454.TI32_PV.F_CV;92.949996948;100.0 +25/10/2020 02:06:07;U454.TI32_PV.F_CV;92.987503052;100.0 +25/10/2020 02:06:08;U454.TI32_PV.F_CV;92.996871948;100.0 +25/10/2020 02:06:09;U454.TI32_PV.F_CV;92.924224854;100.0 +25/10/2020 02:06:10;U454.TI32_PV.F_CV;92.906051636;100.0 +25/10/2020 02:06:11;U454.TI32_PV.F_CV;92.951515198;100.0 +25/10/2020 02:06:12;U454.TI32_PV.F_CV;92.987876892;100.0 +25/10/2020 02:06:13;U454.TI32_PV.F_CV;92.996963501;100.0 +25/10/2020 02:06:14;U454.TI32_PV.F_CV;92.924240112;100.0 +25/10/2020 02:06:15;U454.TI32_PV.F_CV;92.906066895;100.0 +25/10/2020 02:06:16;U454.TI32_PV.F_CV;92.901519775;100.0 +25/10/2020 02:06:17;U454.TI32_PV.F_CV;92.900375366;100.0 +25/10/2020 02:06:18;U454.TI32_PV.F_CV;92.900100708;100.0 +25/10/2020 02:06:19;U454.TI32_PV.F_CV;92.900024414;100.0 +25/10/2020 02:06:20;U454.TI32_PV.F_CV;92.900009155;100.0 +25/10/2020 02:06:21;U454.TI32_PV.F_CV;92.900009155;100.0 +25/10/2020 02:06:22;U454.TI32_PV.F_CV;92.900009155;100.0 +25/10/2020 02:06:23;U454.TI32_PV.F_CV;92.900009155;100.0 +25/10/2020 02:06:24;U454.TI32_PV.F_CV;92.800003052;100.0 +25/10/2020 02:06:25;U454.TI32_PV.F_CV;92.724998474;100.0 +25/10/2020 02:06:26;U454.TI32_PV.F_CV;92.706245422;100.0 +25/10/2020 02:06:27;U454.TI32_PV.F_CV;92.701560974;100.0 +25/10/2020 02:06:28;U454.TI32_PV.F_CV;92.700386047;100.0 +25/10/2020 02:06:29;U454.TI32_PV.F_CV;92.700096130;100.0 +25/10/2020 02:06:30;U454.TI32_PV.F_CV;92.700019836;100.0 +25/10/2020 02:06:31;U454.TI32_PV.F_CV;92.700004578;100.0 +25/10/2020 02:06:32;U454.TI32_PV.F_CV;92.750000000;100.0 +25/10/2020 02:06:33;U454.TI32_PV.F_CV;92.787506104;100.0 +25/10/2020 02:06:34;U454.TI32_PV.F_CV;92.796875000;100.0 +25/10/2020 02:06:35;U454.TI32_PV.F_CV;92.799224854;100.0 +25/10/2020 02:06:36;U454.TI32_PV.F_CV;92.799804688;100.0 +25/10/2020 02:06:37;U454.TI32_PV.F_CV;92.799957275;100.0 +25/10/2020 02:06:38;U454.TI32_PV.F_CV;92.649993896;100.0 +25/10/2020 02:06:39;U454.TI32_PV.F_CV;92.612503052;100.0 +25/10/2020 02:06:40;U454.TI32_PV.F_CV;92.603118896;100.0 +25/10/2020 02:06:41;U454.TI32_PV.F_CV;92.600784302;100.0 +25/10/2020 02:06:42;U454.TI32_PV.F_CV;92.600387573;100.0 +25/10/2020 02:06:43;U454.TI32_PV.F_CV;92.675048828;100.0 +25/10/2020 02:06:44;U454.TI32_PV.F_CV;92.693763733;100.0 +25/10/2020 02:06:45;U454.TI32_PV.F_CV;92.698440552;100.0 +25/10/2020 02:06:46;U454.TI32_PV.F_CV;92.699218750;100.0 +25/10/2020 02:06:47;U454.TI32_PV.F_CV;92.699897766;100.0 +25/10/2020 02:06:48;U454.TI32_PV.F_CV;92.699974060;100.0 +25/10/2020 02:06:49;U454.TI32_PV.F_CV;92.699989319;100.0 +25/10/2020 02:06:50;U454.TI32_PV.F_CV;92.699996948;100.0 +25/10/2020 02:06:51;U454.TI32_PV.F_CV;92.699996948;100.0 +25/10/2020 02:06:52;U454.TI32_PV.F_CV;92.699996948;100.0 +25/10/2020 02:06:53;U454.TI32_PV.F_CV;92.699996948;100.0 +25/10/2020 02:06:54;U454.TI32_PV.F_CV;92.699996948;100.0 +25/10/2020 02:06:55;U454.TI32_PV.F_CV;92.699996948;100.0 +25/10/2020 02:06:56;U454.TI32_PV.F_CV;92.649993896;100.0 +25/10/2020 02:06:57;U454.TI32_PV.F_CV;92.612503052;100.0 +25/10/2020 02:06:58;U454.TI32_PV.F_CV;92.603118896;100.0 +25/10/2020 02:06:59;U454.TI32_PV.F_CV;92.675781250;100.0 +25/10/2020 02:06:00;U454.TI360_PV.F_CV;174.150817871;100.0 +25/10/2020 02:06:01;U454.TI360_PV.F_CV;174.187713623;100.0 +25/10/2020 02:06:02;U454.TI360_PV.F_CV;174.196929932;100.0 +25/10/2020 02:06:03;U454.TI360_PV.F_CV;174.274230957;100.0 +25/10/2020 02:06:04;U454.TI360_PV.F_CV;174.293548584;100.0 +25/10/2020 02:06:05;U454.TI360_PV.F_CV;174.198394775;100.0 +25/10/2020 02:06:06;U454.TI360_PV.F_CV;174.124603271;100.0 +25/10/2020 02:06:07;U454.TI360_PV.F_CV;174.106155396;100.0 +25/10/2020 02:06:08;U454.TI360_PV.F_CV;174.176544189;100.0 +25/10/2020 02:06:09;U454.TI360_PV.F_CV;174.194122314;100.0 +25/10/2020 02:06:10;U454.TI360_PV.F_CV;174.198516846;100.0 +25/10/2020 02:06:11;U454.TI360_PV.F_CV;174.199615479;100.0 +25/10/2020 02:06:12;U454.TI360_PV.F_CV;174.199890137;100.0 +25/10/2020 02:06:13;U454.TI360_PV.F_CV;174.299972534;100.0 +25/10/2020 02:06:14;U454.TI360_PV.F_CV;174.374984741;100.0 +25/10/2020 02:06:15;U454.TI360_PV.F_CV;174.393737793;100.0 +25/10/2020 02:06:16;U454.TI360_PV.F_CV;174.248443604;100.0 +25/10/2020 02:06:17;U454.TI360_PV.F_CV;174.212097168;100.0 +25/10/2020 02:06:18;U454.TI360_PV.F_CV;174.303024292;100.0 +25/10/2020 02:06:19;U454.TI360_PV.F_CV;174.375747681;100.0 +25/10/2020 02:06:20;U454.TI360_PV.F_CV;174.393920898;100.0 +25/10/2020 02:06:21;U454.TI360_PV.F_CV;174.323486328;100.0 +25/10/2020 02:06:22;U454.TI360_PV.F_CV;174.305877686;100.0 +25/10/2020 02:06:23;U454.TI360_PV.F_CV;174.251464844;100.0 +25/10/2020 02:06:24;U454.TI360_PV.F_CV;174.212860107;100.0 +25/10/2020 02:06:25;U454.TI360_PV.F_CV;174.203216553;100.0 +25/10/2020 02:06:26;U454.TI360_PV.F_CV;174.200805664;100.0 +25/10/2020 02:06:27;U454.TI360_PV.F_CV;174.200195313;100.0 +25/10/2020 02:06:28;U454.TI360_PV.F_CV;174.200042725;100.0 +25/10/2020 02:06:29;U454.TI360_PV.F_CV;174.125015259;100.0 +25/10/2020 02:06:30;U454.TI360_PV.F_CV;174.106262207;100.0 +25/10/2020 02:06:31;U454.TI360_PV.F_CV;174.101562500;100.0 +25/10/2020 02:06:32;U454.TI360_PV.F_CV;174.100402832;100.0 +25/10/2020 02:06:33;U454.TI360_PV.F_CV;174.100097656;100.0 +25/10/2020 02:06:34;U454.TI360_PV.F_CV;174.325012207;100.0 +25/10/2020 02:06:35;U454.TI360_PV.F_CV;174.381256104;100.0 +25/10/2020 02:06:36;U454.TI360_PV.F_CV;174.295318604;100.0 +25/10/2020 02:06:37;U454.TI360_PV.F_CV;174.223815918;100.0 +25/10/2020 02:06:38;U454.TI360_PV.F_CV;174.205963135;100.0 +25/10/2020 02:06:39;U454.TI360_PV.F_CV;174.276489258;100.0 +25/10/2020 02:06:40;U454.TI360_PV.F_CV;174.294128418;100.0 +25/10/2020 02:06:41;U454.TI360_PV.F_CV;174.298522949;100.0 +25/10/2020 02:06:42;U454.TI360_PV.F_CV;174.399261475;100.0 +25/10/2020 02:06:43;U454.TI360_PV.F_CV;174.487411499;100.0 +25/10/2020 02:06:44;U454.TI360_PV.F_CV;174.346862793;100.0 +25/10/2020 02:06:45;U454.TI360_PV.F_CV;174.236724854;100.0 +25/10/2020 02:06:46;U454.TI360_PV.F_CV;174.209167480;100.0 +25/10/2020 02:06:47;U454.TI360_PV.F_CV;174.277282715;100.0 +25/10/2020 02:06:48;U454.TI360_PV.F_CV;174.294311523;100.0 +25/10/2020 02:06:49;U454.TI360_PV.F_CV;174.298583984;100.0 +25/10/2020 02:06:50;U454.TI360_PV.F_CV;174.299652100;100.0 +25/10/2020 02:06:51;U454.TI360_PV.F_CV;174.299926758;100.0 +25/10/2020 02:06:52;U454.TI360_PV.F_CV;174.149993896;100.0 +25/10/2020 02:06:53;U454.TI360_PV.F_CV;174.125000000;100.0 +25/10/2020 02:06:54;U454.TI360_PV.F_CV;174.106262207;100.0 +25/10/2020 02:06:55;U454.TI360_PV.F_CV;174.151565552;100.0 +25/10/2020 02:06:56;U454.TI360_PV.F_CV;174.187896729;100.0 +25/10/2020 02:06:57;U454.TI360_PV.F_CV;174.196960449;100.0 +25/10/2020 02:06:58;U454.TI360_PV.F_CV;174.199249268;100.0 +25/10/2020 02:06:59;U454.TI360_PV.F_CV;174.199798584;100.0 +25/10/2020 02:06:00;U454.TI460_PV.F_CV;173.696960449;100.0 +25/10/2020 02:06:01;U454.TI460_PV.F_CV;173.699249268;100.0 +25/10/2020 02:06:02;U454.TI460_PV.F_CV;173.699798584;100.0 +25/10/2020 02:06:03;U454.TI460_PV.F_CV;173.699951172;100.0 +25/10/2020 02:06:04;U454.TI460_PV.F_CV;173.699981689;100.0 +25/10/2020 02:06:05;U454.TI460_PV.F_CV;173.699981689;100.0 +25/10/2020 02:06:06;U454.TI460_PV.F_CV;173.649993896;100.0 +25/10/2020 02:06:07;U454.TI460_PV.F_CV;173.612503052;100.0 +25/10/2020 02:06:08;U454.TI460_PV.F_CV;173.603134155;100.0 +25/10/2020 02:06:09;U454.TI460_PV.F_CV;173.600784302;100.0 +25/10/2020 02:06:10;U454.TI460_PV.F_CV;173.600204468;100.0 +25/10/2020 02:06:11;U454.TI460_PV.F_CV;173.600051880;100.0 +25/10/2020 02:06:12;U454.TI460_PV.F_CV;173.525009155;100.0 +25/10/2020 02:06:13;U454.TI460_PV.F_CV;173.506256104;100.0 +25/10/2020 02:06:14;U454.TI460_PV.F_CV;173.701568604;100.0 +25/10/2020 02:06:15;U454.TI460_PV.F_CV;173.850387573;100.0 +25/10/2020 02:06:16;U454.TI460_PV.F_CV;173.887588501;100.0 +25/10/2020 02:06:17;U454.TI460_PV.F_CV;173.746887207;100.0 +25/10/2020 02:06:18;U454.TI460_PV.F_CV;173.711730957;100.0 +25/10/2020 02:06:19;U454.TI460_PV.F_CV;173.802932739;100.0 +25/10/2020 02:06:20;U454.TI460_PV.F_CV;173.875732422;100.0 +25/10/2020 02:06:21;U454.TI460_PV.F_CV;173.893920898;100.0 +25/10/2020 02:06:22;U454.TI460_PV.F_CV;173.598480225;100.0 +25/10/2020 02:06:23;U454.TI460_PV.F_CV;173.524627686;100.0 +25/10/2020 02:06:24;U454.TI460_PV.F_CV;173.506164551;100.0 +25/10/2020 02:06:25;U454.TI460_PV.F_CV;173.576538086;100.0 +25/10/2020 02:06:26;U454.TI460_PV.F_CV;173.594146729;100.0 +25/10/2020 02:06:27;U454.TI460_PV.F_CV;173.598541260;100.0 +25/10/2020 02:06:28;U454.TI460_PV.F_CV;173.599639893;100.0 +25/10/2020 02:06:29;U454.TI460_PV.F_CV;173.599914551;100.0 +25/10/2020 02:06:30;U454.TI460_PV.F_CV;173.749969482;100.0 +25/10/2020 02:06:31;U454.TI460_PV.F_CV;173.787506104;100.0 +25/10/2020 02:06:32;U454.TI460_PV.F_CV;173.696884155;100.0 +25/10/2020 02:06:33;U454.TI460_PV.F_CV;173.624221802;100.0 +25/10/2020 02:06:34;U454.TI460_PV.F_CV;173.606048584;100.0 +25/10/2020 02:06:35;U454.TI460_PV.F_CV;173.676513672;100.0 +25/10/2020 02:06:36;U454.TI460_PV.F_CV;173.694122314;100.0 +25/10/2020 02:06:37;U454.TI460_PV.F_CV;173.698516846;100.0 +25/10/2020 02:06:38;U454.TI460_PV.F_CV;173.774627686;100.0 +25/10/2020 02:06:39;U454.TI460_PV.F_CV;173.793670654;100.0 +25/10/2020 02:06:40;U454.TI460_PV.F_CV;173.848419189;100.0 +25/10/2020 02:06:41;U454.TI460_PV.F_CV;173.887100220;100.0 +25/10/2020 02:06:42;U454.TI460_PV.F_CV;173.893554688;100.0 +25/10/2020 02:06:43;U454.TI460_PV.F_CV;173.749191284;100.0 +25/10/2020 02:06:44;U454.TI460_PV.F_CV;173.712295532;100.0 +25/10/2020 02:06:45;U454.TI460_PV.F_CV;173.653076172;100.0 +25/10/2020 02:06:46;U454.TI460_PV.F_CV;173.613265991;100.0 +25/10/2020 02:06:47;U454.TI460_PV.F_CV;173.603317261;100.0 +25/10/2020 02:06:48;U454.TI460_PV.F_CV;173.600830078;100.0 +25/10/2020 02:06:49;U454.TI460_PV.F_CV;173.600219727;100.0 +25/10/2020 02:06:50;U454.TI460_PV.F_CV;173.550048828;100.0 +25/10/2020 02:06:51;U454.TI460_PV.F_CV;173.512512207;100.0 +25/10/2020 02:06:52;U454.TI460_PV.F_CV;173.503128052;100.0 +25/10/2020 02:06:53;U454.TI460_PV.F_CV;173.501556396;100.0 +25/10/2020 02:06:54;U454.TI460_PV.F_CV;173.725402832;100.0 +25/10/2020 02:06:55;U454.TI460_PV.F_CV;173.781341553;100.0 +25/10/2020 02:06:56;U454.TI460_PV.F_CV;173.645339966;100.0 +25/10/2020 02:06:57;U454.TI460_PV.F_CV;173.536331177;100.0 +25/10/2020 02:06:58;U454.TI460_PV.F_CV;173.509078979;100.0 +25/10/2020 02:06:59;U454.TI460_PV.F_CV;173.577270508;100.0 +25/10/2020 02:06:00;U454.TI560_PV.F_CV;174.006164551;100.0 +25/10/2020 02:06:01;U454.TI560_PV.F_CV;174.151550293;100.0 +25/10/2020 02:06:02;U454.TI560_PV.F_CV;174.262878418;100.0 +25/10/2020 02:06:03;U454.TI560_PV.F_CV;174.290710449;100.0 +25/10/2020 02:06:04;U454.TI560_PV.F_CV;174.147674561;100.0 +25/10/2020 02:06:05;U454.TI560_PV.F_CV;174.111923218;100.0 +25/10/2020 02:06:06;U454.TI560_PV.F_CV;174.152984619;100.0 +25/10/2020 02:06:07;U454.TI560_PV.F_CV;174.188232422;100.0 +25/10/2020 02:06:08;U454.TI560_PV.F_CV;174.197052002;100.0 +25/10/2020 02:06:09;U454.TI560_PV.F_CV;174.124267578;100.0 +25/10/2020 02:06:10;U454.TI560_PV.F_CV;174.106079102;100.0 +25/10/2020 02:06:11;U454.TI560_PV.F_CV;174.101531982;100.0 +25/10/2020 02:06:12;U454.TI560_PV.F_CV;174.100387573;100.0 +25/10/2020 02:06:13;U454.TI560_PV.F_CV;174.100097656;100.0 +25/10/2020 02:06:14;U454.TI560_PV.F_CV;174.200027466;100.0 +25/10/2020 02:06:15;U454.TI560_PV.F_CV;174.275009155;100.0 +25/10/2020 02:06:16;U454.TI560_PV.F_CV;174.293762207;100.0 +25/10/2020 02:06:17;U454.TI560_PV.F_CV;174.148437500;100.0 +25/10/2020 02:06:18;U454.TI560_PV.F_CV;174.112106323;100.0 +25/10/2020 02:06:19;U454.TI560_PV.F_CV;174.153015137;100.0 +25/10/2020 02:06:20;U454.TI560_PV.F_CV;174.188262939;100.0 +25/10/2020 02:06:21;U454.TI560_PV.F_CV;174.197052002;100.0 +25/10/2020 02:06:22;U454.TI560_PV.F_CV;174.049255371;100.0 +25/10/2020 02:06:23;U454.TI560_PV.F_CV;174.012313843;100.0 +25/10/2020 02:06:24;U454.TI560_PV.F_CV;174.053085327;100.0 +25/10/2020 02:06:25;U454.TI560_PV.F_CV;174.088272095;100.0 +25/10/2020 02:06:26;U454.TI560_PV.F_CV;174.097076416;100.0 +25/10/2020 02:06:27;U454.TI560_PV.F_CV;174.149261475;100.0 +25/10/2020 02:06:28;U454.TI560_PV.F_CV;174.187316895;100.0 +25/10/2020 02:06:29;U454.TI560_PV.F_CV;174.196838379;100.0 +25/10/2020 02:06:30;U454.TI560_PV.F_CV;174.124206543;100.0 +25/10/2020 02:06:31;U454.TI560_PV.F_CV;174.106048584;100.0 +25/10/2020 02:06:32;U454.TI560_PV.F_CV;174.201507568;100.0 +25/10/2020 02:06:33;U454.TI560_PV.F_CV;174.275390625;100.0 +25/10/2020 02:06:34;U454.TI560_PV.F_CV;174.293853760;100.0 +25/10/2020 02:06:35;U454.TI560_PV.F_CV;174.148468018;100.0 +25/10/2020 02:06:36;U454.TI560_PV.F_CV;174.112121582;100.0 +25/10/2020 02:06:37;U454.TI560_PV.F_CV;174.103027344;100.0 +25/10/2020 02:06:38;U454.TI560_PV.F_CV;174.100769043;100.0 +25/10/2020 02:06:39;U454.TI560_PV.F_CV;174.100189209;100.0 +25/10/2020 02:06:40;U454.TI560_PV.F_CV;174.200042725;100.0 +25/10/2020 02:06:41;U454.TI560_PV.F_CV;174.275024414;100.0 +25/10/2020 02:06:42;U454.TI560_PV.F_CV;174.287506104;100.0 +25/10/2020 02:06:43;U454.TI560_PV.F_CV;174.148437500;100.0 +25/10/2020 02:06:44;U454.TI560_PV.F_CV;174.112106323;100.0 +25/10/2020 02:06:45;U454.TI560_PV.F_CV;174.203033447;100.0 +25/10/2020 02:06:46;U454.TI560_PV.F_CV;174.251525879;100.0 +25/10/2020 02:06:47;U454.TI560_PV.F_CV;174.293945313;100.0 +25/10/2020 02:06:48;U454.TI560_PV.F_CV;174.148498535;100.0 +25/10/2020 02:06:49;U454.TI560_PV.F_CV;174.112136841;100.0 +25/10/2020 02:06:50;U454.TI560_PV.F_CV;174.103042603;100.0 +25/10/2020 02:06:51;U454.TI560_PV.F_CV;174.100769043;100.0 +25/10/2020 02:06:52;U454.TI560_PV.F_CV;174.100189209;100.0 +25/10/2020 02:06:53;U454.TI560_PV.F_CV;174.100097656;100.0 +25/10/2020 02:06:54;U454.TI560_PV.F_CV;174.100036621;100.0 +25/10/2020 02:06:55;U454.TI560_PV.F_CV;174.100006104;100.0 +25/10/2020 02:06:56;U454.TI560_PV.F_CV;174.149993896;100.0 +25/10/2020 02:06:57;U454.TI560_PV.F_CV;174.187500000;100.0 +25/10/2020 02:06:58;U454.TI560_PV.F_CV;174.196868896;100.0 +25/10/2020 02:06:59;U454.TI560_PV.F_CV;174.274230957;100.0 +25/10/2020 02:06:00;U454.TI_FT01_PV.F_CV;28.251625061;100.0 +25/10/2020 02:06:01;U454.TI_FT01_PV.F_CV;28.251899719;100.0 +25/10/2020 02:06:02;U454.TI_FT01_PV.F_CV;28.251194000;100.0 +25/10/2020 02:06:03;U454.TI_FT01_PV.F_CV;28.251522064;100.0 +25/10/2020 02:06:04;U454.TI_FT01_PV.F_CV;28.250946045;100.0 +25/10/2020 02:06:05;U454.TI_FT01_PV.F_CV;28.250982285;100.0 +25/10/2020 02:06:06;U454.TI_FT01_PV.F_CV;28.251892090;100.0 +25/10/2020 02:06:07;U454.TI_FT01_PV.F_CV;28.252529144;100.0 +25/10/2020 02:06:08;U454.TI_FT01_PV.F_CV;28.252723694;100.0 +25/10/2020 02:06:09;U454.TI_FT01_PV.F_CV;28.251691818;100.0 +25/10/2020 02:06:10;U454.TI_FT01_PV.F_CV;28.251331329;100.0 +25/10/2020 02:06:11;U454.TI_FT01_PV.F_CV;28.250247955;100.0 +25/10/2020 02:06:12;U454.TI_FT01_PV.F_CV;28.250301361;100.0 +25/10/2020 02:06:13;U454.TI_FT01_PV.F_CV;28.250696182;100.0 +25/10/2020 02:06:14;U454.TI_FT01_PV.F_CV;28.250724792;100.0 +25/10/2020 02:06:15;U454.TI_FT01_PV.F_CV;28.251457214;100.0 +25/10/2020 02:06:16;U454.TI_FT01_PV.F_CV;28.250988007;100.0 +25/10/2020 02:06:17;U454.TI_FT01_PV.F_CV;28.250076294;100.0 +25/10/2020 02:06:18;U454.TI_FT01_PV.F_CV;28.250753403;100.0 +25/10/2020 02:06:19;U454.TI_FT01_PV.F_CV;28.250648499;100.0 +25/10/2020 02:06:20;U454.TI_FT01_PV.F_CV;28.250869751;100.0 +25/10/2020 02:06:21;U454.TI_FT01_PV.F_CV;28.251110077;100.0 +25/10/2020 02:06:22;U454.TI_FT01_PV.F_CV;28.251512527;100.0 +25/10/2020 02:06:23;U454.TI_FT01_PV.F_CV;28.250997543;100.0 +25/10/2020 02:06:24;U454.TI_FT01_PV.F_CV;28.250308990;100.0 +25/10/2020 02:06:25;U454.TI_FT01_PV.F_CV;28.251167297;100.0 +25/10/2020 02:06:26;U454.TI_FT01_PV.F_CV;28.250972748;100.0 +25/10/2020 02:06:27;U454.TI_FT01_PV.F_CV;28.251350403;100.0 +25/10/2020 02:06:28;U454.TI_FT01_PV.F_CV;28.251106262;100.0 +25/10/2020 02:06:29;U454.TI_FT01_PV.F_CV;28.251384735;100.0 +25/10/2020 02:06:30;U454.TI_FT01_PV.F_CV;28.252269745;100.0 +25/10/2020 02:06:31;U454.TI_FT01_PV.F_CV;28.251976013;100.0 +25/10/2020 02:06:32;U454.TI_FT01_PV.F_CV;28.251941681;100.0 +25/10/2020 02:06:33;U454.TI_FT01_PV.F_CV;28.251550674;100.0 +25/10/2020 02:06:34;U454.TI_FT01_PV.F_CV;28.251205444;100.0 +25/10/2020 02:06:35;U454.TI_FT01_PV.F_CV;28.250892639;100.0 +25/10/2020 02:06:36;U454.TI_FT01_PV.F_CV;28.251190186;100.0 +25/10/2020 02:06:37;U454.TI_FT01_PV.F_CV;28.251464844;100.0 +25/10/2020 02:06:38;U454.TI_FT01_PV.F_CV;28.251499176;100.0 +25/10/2020 02:06:39;U454.TI_FT01_PV.F_CV;28.252002716;100.0 +25/10/2020 02:06:40;U454.TI_FT01_PV.F_CV;28.251968384;100.0 +25/10/2020 02:06:41;U454.TI_FT01_PV.F_CV;28.251300812;100.0 +25/10/2020 02:06:42;U454.TI_FT01_PV.F_CV;28.251037598;100.0 +25/10/2020 02:06:43;U454.TI_FT01_PV.F_CV;28.250942230;100.0 +25/10/2020 02:06:44;U454.TI_FT01_PV.F_CV;28.250877380;100.0 +25/10/2020 02:06:45;U454.TI_FT01_PV.F_CV;28.251813889;100.0 +25/10/2020 02:06:46;U454.TI_FT01_PV.F_CV;28.252315521;100.0 +25/10/2020 02:06:47;U454.TI_FT01_PV.F_CV;28.252180099;100.0 +25/10/2020 02:06:48;U454.TI_FT01_PV.F_CV;28.252422333;100.0 +25/10/2020 02:06:49;U454.TI_FT01_PV.F_CV;28.251708984;100.0 +25/10/2020 02:06:50;U454.TI_FT01_PV.F_CV;28.251928329;100.0 +25/10/2020 02:06:51;U454.TI_FT01_PV.F_CV;28.251832962;100.0 +25/10/2020 02:06:52;U454.TI_FT01_PV.F_CV;28.251884460;100.0 +25/10/2020 02:06:53;U454.TI_FT01_PV.F_CV;28.252002716;100.0 +25/10/2020 02:06:54;U454.TI_FT01_PV.F_CV;28.251533508;100.0 +25/10/2020 02:06:55;U454.TI_FT01_PV.F_CV;28.250852585;100.0 +25/10/2020 02:06:56;U454.TI_FT01_PV.F_CV;28.251535416;100.0 +25/10/2020 02:06:57;U454.TI_FT01_PV.F_CV;28.250736237;100.0 +25/10/2020 02:06:58;U454.TI_FT01_PV.F_CV;28.251537323;100.0 +25/10/2020 02:06:59;U454.TI_FT01_PV.F_CV;28.250659943;100.0 +25/10/2020 02:06:00;U454.TI_FT02_PV.F_CV;28.250844955;100.0 +25/10/2020 02:06:01;U454.TI_FT02_PV.F_CV;28.251132965;100.0 +25/10/2020 02:06:02;U454.TI_FT02_PV.F_CV;28.251403809;100.0 +25/10/2020 02:06:03;U454.TI_FT02_PV.F_CV;28.251094818;100.0 +25/10/2020 02:06:04;U454.TI_FT02_PV.F_CV;28.275959015;100.0 +25/10/2020 02:06:05;U454.TI_FT02_PV.F_CV;28.265394211;100.0 +25/10/2020 02:06:06;U454.TI_FT02_PV.F_CV;28.251974106;100.0 +25/10/2020 02:06:07;U454.TI_FT02_PV.F_CV;28.250982285;100.0 +25/10/2020 02:06:08;U454.TI_FT02_PV.F_CV;28.251502991;100.0 +25/10/2020 02:06:09;U454.TI_FT02_PV.F_CV;28.251329422;100.0 +25/10/2020 02:06:10;U454.TI_FT02_PV.F_CV;28.252296448;100.0 +25/10/2020 02:06:11;U454.TI_FT02_PV.F_CV;28.252304077;100.0 +25/10/2020 02:06:12;U454.TI_FT02_PV.F_CV;28.251056671;100.0 +25/10/2020 02:06:13;U454.TI_FT02_PV.F_CV;28.251050949;100.0 +25/10/2020 02:06:14;U454.TI_FT02_PV.F_CV;28.250780106;100.0 +25/10/2020 02:06:15;U454.TI_FT02_PV.F_CV;28.250890732;100.0 +25/10/2020 02:06:16;U454.TI_FT02_PV.F_CV;28.250774384;100.0 +25/10/2020 02:06:17;U454.TI_FT02_PV.F_CV;28.251579285;100.0 +25/10/2020 02:06:18;U454.TI_FT02_PV.F_CV;28.251478195;100.0 +25/10/2020 02:06:19;U454.TI_FT02_PV.F_CV;28.250507355;100.0 +25/10/2020 02:06:20;U454.TI_FT02_PV.F_CV;28.250446320;100.0 +25/10/2020 02:06:21;U454.TI_FT02_PV.F_CV;28.250213623;100.0 +25/10/2020 02:06:22;U454.TI_FT02_PV.F_CV;28.250461578;100.0 +25/10/2020 02:06:23;U454.TI_FT02_PV.F_CV;28.250854492;100.0 +25/10/2020 02:06:24;U454.TI_FT02_PV.F_CV;28.250780106;100.0 +25/10/2020 02:06:25;U454.TI_FT02_PV.F_CV;28.250976563;100.0 +25/10/2020 02:06:26;U454.TI_FT02_PV.F_CV;28.250499725;100.0 +25/10/2020 02:06:27;U454.TI_FT02_PV.F_CV;28.250141144;100.0 +25/10/2020 02:06:28;U454.TI_FT02_PV.F_CV;28.250885010;100.0 +25/10/2020 02:06:29;U454.TI_FT02_PV.F_CV;28.248859406;100.0 +25/10/2020 02:06:30;U454.TI_FT02_PV.F_CV;28.247005463;100.0 +25/10/2020 02:06:31;U454.TI_FT02_PV.F_CV;28.248622894;100.0 +25/10/2020 02:06:32;U454.TI_FT02_PV.F_CV;28.250041962;100.0 +25/10/2020 02:06:33;U454.TI_FT02_PV.F_CV;28.245840073;100.0 +25/10/2020 02:06:34;U454.TI_FT02_PV.F_CV;28.245725632;100.0 +25/10/2020 02:06:35;U454.TI_FT02_PV.F_CV;28.248319626;100.0 +25/10/2020 02:06:36;U454.TI_FT02_PV.F_CV;28.250017166;100.0 +25/10/2020 02:06:37;U454.TI_FT02_PV.F_CV;28.251674652;100.0 +25/10/2020 02:06:38;U454.TI_FT02_PV.F_CV;28.271354675;100.0 +25/10/2020 02:06:39;U454.TI_FT02_PV.F_CV;28.261575699;100.0 +25/10/2020 02:06:40;U454.TI_FT02_PV.F_CV;28.249111176;100.0 +25/10/2020 02:06:41;U454.TI_FT02_PV.F_CV;28.249301910;100.0 +25/10/2020 02:06:42;U454.TI_FT02_PV.F_CV;28.250099182;100.0 +25/10/2020 02:06:43;U454.TI_FT02_PV.F_CV;28.251708984;100.0 +25/10/2020 02:06:44;U454.TI_FT02_PV.F_CV;28.252574921;100.0 +25/10/2020 02:06:45;U454.TI_FT02_PV.F_CV;28.251625061;100.0 +25/10/2020 02:06:46;U454.TI_FT02_PV.F_CV;28.250968933;100.0 +25/10/2020 02:06:47;U454.TI_FT02_PV.F_CV;28.252433777;100.0 +25/10/2020 02:06:48;U454.TI_FT02_PV.F_CV;28.276937485;100.0 +25/10/2020 02:06:49;U454.TI_FT02_PV.F_CV;28.264846802;100.0 +25/10/2020 02:06:50;U454.TI_FT02_PV.F_CV;28.251106262;100.0 +25/10/2020 02:06:51;U454.TI_FT02_PV.F_CV;28.251007080;100.0 +25/10/2020 02:06:52;U454.TI_FT02_PV.F_CV;28.251159668;100.0 +25/10/2020 02:06:53;U454.TI_FT02_PV.F_CV;28.251056671;100.0 +25/10/2020 02:06:54;U454.TI_FT02_PV.F_CV;28.250511169;100.0 +25/10/2020 02:06:55;U454.TI_FT02_PV.F_CV;28.259124756;100.0 +25/10/2020 02:06:56;U454.TI_FT02_PV.F_CV;28.248739243;100.0 +25/10/2020 02:06:57;U454.TI_FT02_PV.F_CV;28.245880127;100.0 +25/10/2020 02:06:58;U454.TI_FT02_PV.F_CV;28.238922119;100.0 +25/10/2020 02:06:59;U454.TI_FT02_PV.F_CV;28.245910645;100.0 +25/10/2020 02:06:00;U454.TI_FT03_PV.F_CV;28.991996765;100.0 +25/10/2020 02:06:01;U454.TI_FT03_PV.F_CV;28.992103577;100.0 +25/10/2020 02:06:02;U454.TI_FT03_PV.F_CV;28.991254807;100.0 +25/10/2020 02:06:03;U454.TI_FT03_PV.F_CV;28.991741180;100.0 +25/10/2020 02:06:04;U454.TI_FT03_PV.F_CV;28.992109299;100.0 +25/10/2020 02:06:05;U454.TI_FT03_PV.F_CV;28.991348267;100.0 +25/10/2020 02:06:06;U454.TI_FT03_PV.F_CV;28.991949081;100.0 +25/10/2020 02:06:07;U454.TI_FT03_PV.F_CV;28.991752625;100.0 +25/10/2020 02:06:08;U454.TI_FT03_PV.F_CV;28.991426468;100.0 +25/10/2020 02:06:09;U454.TI_FT03_PV.F_CV;28.992038727;100.0 +25/10/2020 02:06:10;U454.TI_FT03_PV.F_CV;28.991985321;100.0 +25/10/2020 02:06:11;U454.TI_FT03_PV.F_CV;28.991895676;100.0 +25/10/2020 02:06:12;U454.TI_FT03_PV.F_CV;28.992557526;100.0 +25/10/2020 02:06:13;U454.TI_FT03_PV.F_CV;28.992691040;100.0 +25/10/2020 02:06:14;U454.TI_FT03_PV.F_CV;28.991706848;100.0 +25/10/2020 02:06:15;U454.TI_FT03_PV.F_CV;28.991592407;100.0 +25/10/2020 02:06:16;U454.TI_FT03_PV.F_CV;28.992824554;100.0 +25/10/2020 02:06:17;U454.TI_FT03_PV.F_CV;28.992237091;100.0 +25/10/2020 02:06:18;U454.TI_FT03_PV.F_CV;28.991998672;100.0 +25/10/2020 02:06:19;U454.TI_FT03_PV.F_CV;28.992259979;100.0 +25/10/2020 02:06:20;U454.TI_FT03_PV.F_CV;28.992341995;100.0 +25/10/2020 02:06:21;U454.TI_FT03_PV.F_CV;28.992309570;100.0 +25/10/2020 02:06:22;U454.TI_FT03_PV.F_CV;28.992053986;100.0 +25/10/2020 02:06:23;U454.TI_FT03_PV.F_CV;28.991476059;100.0 +25/10/2020 02:06:24;U454.TI_FT03_PV.F_CV;28.991273880;100.0 +25/10/2020 02:06:25;U454.TI_FT03_PV.F_CV;28.991970062;100.0 +25/10/2020 02:06:26;U454.TI_FT03_PV.F_CV;28.992341995;100.0 +25/10/2020 02:06:27;U454.TI_FT03_PV.F_CV;28.991168976;100.0 +25/10/2020 02:06:28;U454.TI_FT03_PV.F_CV;28.991794586;100.0 +25/10/2020 02:06:29;U454.TI_FT03_PV.F_CV;28.991973877;100.0 +25/10/2020 02:06:30;U454.TI_FT03_PV.F_CV;28.991539001;100.0 +25/10/2020 02:06:31;U454.TI_FT03_PV.F_CV;28.991641998;100.0 +25/10/2020 02:06:32;U454.TI_FT03_PV.F_CV;28.991918564;100.0 +25/10/2020 02:06:33;U454.TI_FT03_PV.F_CV;28.992378235;100.0 +25/10/2020 02:06:34;U454.TI_FT03_PV.F_CV;28.992143631;100.0 +25/10/2020 02:06:35;U454.TI_FT03_PV.F_CV;28.992601395;100.0 +25/10/2020 02:06:36;U454.TI_FT03_PV.F_CV;28.992164612;100.0 +25/10/2020 02:06:37;U454.TI_FT03_PV.F_CV;28.992540359;100.0 +25/10/2020 02:06:38;U454.TI_FT03_PV.F_CV;28.992786407;100.0 +25/10/2020 02:06:39;U454.TI_FT03_PV.F_CV;28.991285324;100.0 +25/10/2020 02:06:40;U454.TI_FT03_PV.F_CV;28.991584778;100.0 +25/10/2020 02:06:41;U454.TI_FT03_PV.F_CV;28.991432190;100.0 +25/10/2020 02:06:42;U454.TI_FT03_PV.F_CV;28.991102219;100.0 +25/10/2020 02:06:43;U454.TI_FT03_PV.F_CV;28.992238998;100.0 +25/10/2020 02:06:44;U454.TI_FT03_PV.F_CV;28.992006302;100.0 +25/10/2020 02:06:45;U454.TI_FT03_PV.F_CV;28.991071701;100.0 +25/10/2020 02:06:46;U454.TI_FT03_PV.F_CV;28.990825653;100.0 +25/10/2020 02:06:47;U454.TI_FT03_PV.F_CV;28.990953445;100.0 +25/10/2020 02:06:48;U454.TI_FT03_PV.F_CV;28.991765976;100.0 +25/10/2020 02:06:49;U454.TI_FT03_PV.F_CV;28.991783142;100.0 +25/10/2020 02:06:50;U454.TI_FT03_PV.F_CV;28.991909027;100.0 +25/10/2020 02:06:51;U454.TI_FT03_PV.F_CV;28.992183685;100.0 +25/10/2020 02:06:52;U454.TI_FT03_PV.F_CV;28.992067337;100.0 +25/10/2020 02:06:53;U454.TI_FT03_PV.F_CV;28.991985321;100.0 +25/10/2020 02:06:54;U454.TI_FT03_PV.F_CV;28.992321014;100.0 +25/10/2020 02:06:55;U454.TI_FT03_PV.F_CV;28.991176605;100.0 +25/10/2020 02:06:56;U454.TI_FT03_PV.F_CV;28.991491318;100.0 +25/10/2020 02:06:57;U454.TI_FT03_PV.F_CV;28.992002487;100.0 +25/10/2020 02:06:58;U454.TI_FT03_PV.F_CV;28.991664886;100.0 +25/10/2020 02:06:59;U454.TI_FT03_PV.F_CV;28.991870880;100.0 +25/10/2020 02:06:00;U454.TI_FT06_PV.F_CV;27.774196625;100.0 +25/10/2020 02:06:01;U454.TI_FT06_PV.F_CV;27.823812485;100.0 +25/10/2020 02:06:02;U454.TI_FT06_PV.F_CV;27.807205200;100.0 +25/10/2020 02:06:03;U454.TI_FT06_PV.F_CV;27.809034348;100.0 +25/10/2020 02:06:04;U454.TI_FT06_PV.F_CV;27.742464066;100.0 +25/10/2020 02:06:05;U454.TI_FT06_PV.F_CV;27.771856308;100.0 +25/10/2020 02:06:06;U454.TI_FT06_PV.F_CV;27.818082809;100.0 +25/10/2020 02:06:07;U454.TI_FT06_PV.F_CV;27.819484711;100.0 +25/10/2020 02:06:08;U454.TI_FT06_PV.F_CV;27.783018112;100.0 +25/10/2020 02:06:09;U454.TI_FT06_PV.F_CV;27.795055389;100.0 +25/10/2020 02:06:10;U454.TI_FT06_PV.F_CV;27.835720062;100.0 +25/10/2020 02:06:11;U454.TI_FT06_PV.F_CV;27.817770004;100.0 +25/10/2020 02:06:12;U454.TI_FT06_PV.F_CV;27.798704147;100.0 +25/10/2020 02:06:13;U454.TI_FT06_PV.F_CV;27.820610046;100.0 +25/10/2020 02:06:14;U454.TI_FT06_PV.F_CV;27.810062408;100.0 +25/10/2020 02:06:15;U454.TI_FT06_PV.F_CV;27.766616821;100.0 +25/10/2020 02:06:16;U454.TI_FT06_PV.F_CV;27.817367554;100.0 +25/10/2020 02:06:17;U454.TI_FT06_PV.F_CV;27.842781067;100.0 +25/10/2020 02:06:18;U454.TI_FT06_PV.F_CV;27.732929230;100.0 +25/10/2020 02:06:19;U454.TI_FT06_PV.F_CV;27.755119324;100.0 +25/10/2020 02:06:20;U454.TI_FT06_PV.F_CV;27.829622269;100.0 +25/10/2020 02:06:21;U454.TI_FT06_PV.F_CV;27.818443298;100.0 +25/10/2020 02:06:22;U454.TI_FT06_PV.F_CV;27.820922852;100.0 +25/10/2020 02:06:23;U454.TI_FT06_PV.F_CV;27.810756683;100.0 +25/10/2020 02:06:24;U454.TI_FT06_PV.F_CV;27.773624420;100.0 +25/10/2020 02:06:25;U454.TI_FT06_PV.F_CV;27.782608032;100.0 +25/10/2020 02:06:26;U454.TI_FT06_PV.F_CV;27.790412903;100.0 +25/10/2020 02:06:27;U454.TI_FT06_PV.F_CV;27.826690674;100.0 +25/10/2020 02:06:28;U454.TI_FT06_PV.F_CV;27.838558197;100.0 +25/10/2020 02:06:29;U454.TI_FT06_PV.F_CV;27.799747467;100.0 +25/10/2020 02:06:30;U454.TI_FT06_PV.F_CV;27.799663544;100.0 +25/10/2020 02:06:31;U454.TI_FT06_PV.F_CV;27.813661575;100.0 +25/10/2020 02:06:32;U454.TI_FT06_PV.F_CV;27.734752655;100.0 +25/10/2020 02:06:33;U454.TI_FT06_PV.F_CV;27.774406433;100.0 +25/10/2020 02:06:34;U454.TI_FT06_PV.F_CV;27.823749542;100.0 +25/10/2020 02:06:35;U454.TI_FT06_PV.F_CV;27.792325974;100.0 +25/10/2020 02:06:36;U454.TI_FT06_PV.F_CV;27.679597855;100.0 +25/10/2020 02:06:37;U454.TI_FT06_PV.F_CV;27.726985931;100.0 +25/10/2020 02:06:38;U454.TI_FT06_PV.F_CV;27.706447601;100.0 +25/10/2020 02:06:39;U454.TI_FT06_PV.F_CV;27.700565338;100.0 +25/10/2020 02:06:40;U454.TI_FT06_PV.F_CV;27.706363678;100.0 +25/10/2020 02:06:41;U454.TI_FT06_PV.F_CV;27.610832214;100.0 +25/10/2020 02:06:42;U454.TI_FT06_PV.F_CV;27.565128326;100.0 +25/10/2020 02:06:43;U454.TI_FT06_PV.F_CV;27.732868195;100.0 +25/10/2020 02:06:44;U454.TI_FT06_PV.F_CV;27.742458344;100.0 +25/10/2020 02:06:45;U454.TI_FT06_PV.F_CV;27.753028870;100.0 +25/10/2020 02:06:46;U454.TI_FT06_PV.F_CV;27.750606537;100.0 +25/10/2020 02:06:47;U454.TI_FT06_PV.F_CV;27.741283417;100.0 +25/10/2020 02:06:48;U454.TI_FT06_PV.F_CV;27.730710983;100.0 +25/10/2020 02:06:49;U454.TI_FT06_PV.F_CV;27.649808884;100.0 +25/10/2020 02:06:50;U454.TI_FT06_PV.F_CV;27.711404800;100.0 +25/10/2020 02:06:51;U454.TI_FT06_PV.F_CV;27.743665695;100.0 +25/10/2020 02:06:52;U454.TI_FT06_PV.F_CV;27.750921249;100.0 +25/10/2020 02:06:53;U454.TI_FT06_PV.F_CV;27.758293152;100.0 +25/10/2020 02:06:54;U454.TI_FT06_PV.F_CV;27.681919098;100.0 +25/10/2020 02:06:55;U454.TI_FT06_PV.F_CV;27.743263245;100.0 +25/10/2020 02:06:56;U454.TI_FT06_PV.F_CV;27.764955521;100.0 +25/10/2020 02:06:57;U454.TI_FT06_PV.F_CV;27.779132843;100.0 +25/10/2020 02:06:58;U454.TI_FT06_PV.F_CV;27.727033615;100.0 +25/10/2020 02:06:59;U454.TI_FT06_PV.F_CV;27.681472778;100.0 +25/10/2020 02:06:00;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:01;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:02;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:03;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:04;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:05;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:06;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:07;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:08;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:09;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:10;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:11;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:12;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:13;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:14;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:15;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:16;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:17;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:18;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:19;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:20;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:21;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:22;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:23;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:24;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:25;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:26;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:27;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:28;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:29;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:30;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:31;U454.VANNE_CHARGE.F_CV;4.000000000;100.0 +25/10/2020 02:06:32;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:33;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:34;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:35;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:36;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:37;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:38;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:39;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:40;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:41;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:42;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:43;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:44;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:45;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:46;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:47;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:48;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:49;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:50;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:51;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:52;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:53;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:54;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:55;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:56;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:57;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:58;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:59;U454.VANNE_CHARGE.F_CV;5.000000000;100.0 +25/10/2020 02:06:00;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:01;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:02;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:03;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:04;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:05;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:06;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:07;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:08;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:09;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:10;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:11;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:12;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:13;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:14;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:15;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:16;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:17;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:18;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:19;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:20;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:21;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:22;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:23;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:24;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:25;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:26;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:27;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:28;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:29;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:30;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:31;U454.VANNE_EXTRAIT.F_CV;13.000000000;100.0 +25/10/2020 02:06:32;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:33;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:34;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:35;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:36;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:37;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:38;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:39;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:40;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:41;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:42;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:43;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:44;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:45;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:46;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:47;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:48;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:49;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:50;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:51;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:52;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:53;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:54;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:55;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:56;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:57;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:58;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:59;U454.VANNE_EXTRAIT.F_CV;14.000000000;100.0 +25/10/2020 02:06:00;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:01;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:02;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:03;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:04;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:05;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:06;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:07;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:08;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:09;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:10;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:11;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:12;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:13;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:14;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:15;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:16;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:17;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:18;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:19;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:20;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:21;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:22;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:23;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:24;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:25;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:26;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:27;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:28;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:29;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:30;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:31;U454.VANNE_RAFFINAT.F_CV;8.000000000;100.0 +25/10/2020 02:06:32;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:33;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:34;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:35;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:36;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:37;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:38;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:39;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:40;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:41;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:42;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:43;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:44;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:45;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:46;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:47;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:48;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:49;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:50;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:51;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:52;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:53;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:54;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:55;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:56;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:57;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:58;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:59;U454.VANNE_RAFFINAT.F_CV;9.000000000;100.0 +25/10/2020 02:06:00;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:01;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:02;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:03;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:04;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:05;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:06;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:07;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:08;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:09;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:10;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:11;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:12;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:13;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:14;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:15;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:16;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:17;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:18;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:19;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:20;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:21;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:22;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:23;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:24;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:25;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:26;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:27;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:28;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:29;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:30;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:31;U454.VANNE_SOLVANT.F_CV;10.000000000;100.0 +25/10/2020 02:06:32;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:33;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:34;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:35;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:36;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:37;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:38;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:39;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:40;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:41;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:42;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:43;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:44;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:45;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:46;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:47;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:48;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:49;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:50;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:51;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:52;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:53;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:54;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:55;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:56;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:57;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:58;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:59;U454.VANNE_SOLVANT.F_CV;11.000000000;100.0 +25/10/2020 02:06:22;U454.WI01_PV.F_CV;2784.866699219;100.0 +25/10/2020 02:06:57;U454.WI01_PV.F_CV;2781.256835938;100.0 +25/10/2020 02:06:26;U454.WI02_PV.F_CV;4710.617675781;100.0 +25/10/2020 02:06:40;U454.WI03_PV.F_CV;31.000000000;100.0 +25/10/2020 02:06:10;U454.WI04_PV.F_CV;30.899997711;100.0 +25/10/2020 02:06:00;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.XN400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.Z100_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.Z10_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.Z11_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.Z200_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.Z300_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.Z400_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:02;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:03;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:04;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:08;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:11;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:12;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:13;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:14;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:16;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:17;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:18;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:21;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:23;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:24;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:26;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:28;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:29;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:31;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:33;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:34;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:36;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:37;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:41;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:42;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:43;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:44;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:47;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:48;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:51;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:54;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:58;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:59;U454.Z500_Retour_Etat.F_CV;1.000000000;100.0 +25/10/2020 02:06:01;U544.DI001_L_MES.F_CV;987.781005859;100.0 +25/10/2020 02:06:01;U544.DI001_MES.F_CV;987.781005859;100.0 +25/10/2020 02:06:01;U544.DI002_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U544.FC007_OP_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U544.FC007_PV_MES.F_CV;0.050759327;100.0 +25/10/2020 02:06:02;U544.FC007_PV_MES.F_CV;0.056240574;100.0 +25/10/2020 02:06:04;U544.FC007_PV_MES.F_CV;0.048036352;100.0 +25/10/2020 02:06:06;U544.FC007_PV_MES.F_CV;0.053553183;100.0 +25/10/2020 02:06:09;U544.FC007_PV_MES.F_CV;0.045934267;100.0 +25/10/2020 02:06:10;U544.FC007_PV_MES.F_CV;0.052719448;100.0 +25/10/2020 02:06:12;U544.FC007_PV_MES.F_CV;0.048769113;100.0 +25/10/2020 02:06:14;U544.FC007_PV_MES.F_CV;0.053443883;100.0 +25/10/2020 02:06:16;U544.FC007_PV_MES.F_CV;0.046091288;100.0 +25/10/2020 02:06:18;U544.FC007_PV_MES.F_CV;0.051931005;100.0 +25/10/2020 02:06:20;U544.FC007_PV_MES.F_CV;0.047094896;100.0 +25/10/2020 02:06:22;U544.FC007_PV_MES.F_CV;0.050171614;100.0 +25/10/2020 02:06:24;U544.FC007_PV_MES.F_CV;0.046584871;100.0 +25/10/2020 02:06:26;U544.FC007_PV_MES.F_CV;0.049224027;100.0 +25/10/2020 02:06:27;U544.FC007_PV_MES.F_CV;0.045776118;100.0 +25/10/2020 02:06:29;U544.FC007_PV_MES.F_CV;0.049128655;100.0 +25/10/2020 02:06:30;U544.FC007_PV_MES.F_CV;0.053345602;100.0 +25/10/2020 02:06:31;U544.FC007_PV_MES.F_CV;0.048629317;100.0 +25/10/2020 02:06:32;U544.FC007_PV_MES.F_CV;0.046982564;100.0 +25/10/2020 02:06:34;U544.FC007_PV_MES.F_CV;0.053554356;100.0 +25/10/2020 02:06:35;U544.FC007_PV_MES.F_CV;0.051582262;100.0 +25/10/2020 02:06:37;U544.FC007_PV_MES.F_CV;0.054623146;100.0 +25/10/2020 02:06:40;U544.FC007_PV_MES.F_CV;0.045886770;100.0 +25/10/2020 02:06:41;U544.FC007_PV_MES.F_CV;0.048696678;100.0 +25/10/2020 02:06:43;U544.FC007_PV_MES.F_CV;0.045682419;100.0 +25/10/2020 02:06:46;U544.FC007_PV_MES.F_CV;0.050812159;100.0 +25/10/2020 02:06:47;U544.FC007_PV_MES.F_CV;0.044751093;100.0 +25/10/2020 02:06:49;U544.FC007_PV_MES.F_CV;0.053729691;100.0 +25/10/2020 02:06:52;U544.FC007_PV_MES.F_CV;0.046944316;100.0 +25/10/2020 02:06:53;U544.FC007_PV_MES.F_CV;0.052891318;100.0 +25/10/2020 02:06:55;U544.FC007_PV_MES.F_CV;0.046517495;100.0 +25/10/2020 02:06:57;U544.FC007_PV_MES.F_CV;0.050017372;100.0 +25/10/2020 02:06:59;U544.FC007_PV_MES.F_CV;0.046065964;100.0 +25/10/2020 02:06:04;U544.FC011_OP_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U544.FC011_PV_MES.F_CV;0.053319298;100.0 +25/10/2020 02:06:01;U544.FC020_OP_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U544.FC020_PV_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U544.FI001_MES.F_CV;49.637184143;100.0 +25/10/2020 02:06:48;U544.FI001_MES.F_CV;48.979507446;100.0 +25/10/2020 02:06:51;U544.FI001_MES.F_CV;49.791412354;100.0 +25/10/2020 02:06:58;U544.FI001_MES.F_CV;49.101100922;100.0 +25/10/2020 02:06:36;U544.FI002_MES.F_CV;0.209514797;100.0 +25/10/2020 02:06:01;U544.FI003_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U544.FI004_MES.F_CV;0.009174794;100.0 +25/10/2020 02:06:12;U544.FI005_MES.F_CV;2.157911777;100.0 +25/10/2020 02:06:43;U544.FI006_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U544.FI008_MES.F_CV;58.382518768;100.0 +25/10/2020 02:06:46;U544.FI008_MES.F_CV;60.515903473;100.0 +25/10/2020 02:06:19;U544.FI009_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U544.FI013_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U544.FI015_MES.F_CV;0.001063049;100.0 +25/10/2020 02:06:01;U544.FQ002_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U544.FQ003_MES.F_CV;6980.000000000;100.0 +25/10/2020 02:06:04;U544.FQ004_MES.F_CV;2531.000000000;100.0 +25/10/2020 02:06:01;U544.FQ005_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U544.FQ006_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U544.FQ008_MES.F_CV;408226.000000000;100.0 +25/10/2020 02:06:01;U544.FQ009_MES.F_CV;153730.000000000;100.0 +25/10/2020 02:06:01;U544.FQ013_MES.F_CV;7274.000000000;100.0 +25/10/2020 02:06:45;U544.FV001_MES.F_CV;50.000000000;100.0 +25/10/2020 02:06:01;U544.FV002_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U544.FV003_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U544.FV004_MES.F_CV;2.000000000;100.0 +25/10/2020 02:06:43;U544.FV005_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U544.FV006_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U544.LC070_OP_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U544.LC070_PV_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U544.LC071_OP_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U544.LC071_PV_MES.F_CV;5.946415901;100.0 +25/10/2020 02:06:01;U544.LC073_OP_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U544.LC073_PV_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U544.LI074_MES.F_CV;-1.025994062;100.0 +25/10/2020 02:06:43;U544.LI075_MES.F_CV;26.272136688;100.0 +25/10/2020 02:06:43;U544.LI080_MES.F_CV;10.242462158;100.0 +25/10/2020 02:06:01;U544.PC062_OP_MES.F_CV;31.760612488;100.0 +25/10/2020 02:06:02;U544.PC062_OP_MES.F_CV;31.907100677;100.0 +25/10/2020 02:06:03;U544.PC062_OP_MES.F_CV;31.760612488;100.0 +25/10/2020 02:06:05;U544.PC062_OP_MES.F_CV;31.907100677;100.0 +25/10/2020 02:06:06;U544.PC062_OP_MES.F_CV;31.760612488;100.0 +25/10/2020 02:06:07;U544.PC062_OP_MES.F_CV;32.248908997;100.0 +25/10/2020 02:06:08;U544.PC062_OP_MES.F_CV;31.785028458;100.0 +25/10/2020 02:06:10;U544.PC062_OP_MES.F_CV;31.955930710;100.0 +25/10/2020 02:06:13;U544.PC062_OP_MES.F_CV;31.492050171;100.0 +25/10/2020 02:06:14;U544.PC062_OP_MES.F_CV;31.955930710;100.0 +25/10/2020 02:06:16;U544.PC062_OP_MES.F_CV;31.833856583;100.0 +25/10/2020 02:06:17;U544.PC062_OP_MES.F_CV;31.492050171;100.0 +25/10/2020 02:06:19;U544.PC062_OP_MES.F_CV;31.418806076;100.0 +25/10/2020 02:06:20;U544.PC062_OP_MES.F_CV;31.736198425;100.0 +25/10/2020 02:06:21;U544.PC062_OP_MES.F_CV;31.565294266;100.0 +25/10/2020 02:06:24;U544.PC062_OP_MES.F_CV;32.053588867;100.0 +25/10/2020 02:06:25;U544.PC062_OP_MES.F_CV;31.418806076;100.0 +25/10/2020 02:06:26;U544.PC062_OP_MES.F_CV;31.711782455;100.0 +25/10/2020 02:06:27;U544.PC062_OP_MES.F_CV;31.858272552;100.0 +25/10/2020 02:06:29;U544.PC062_OP_MES.F_CV;31.736198425;100.0 +25/10/2020 02:06:30;U544.PC062_OP_MES.F_CV;31.589708328;100.0 +25/10/2020 02:06:31;U544.PC062_OP_MES.F_CV;31.736198425;100.0 +25/10/2020 02:06:32;U544.PC062_OP_MES.F_CV;31.565294266;100.0 +25/10/2020 02:06:34;U544.PC062_OP_MES.F_CV;31.882686615;100.0 +25/10/2020 02:06:35;U544.PC062_OP_MES.F_CV;31.736198425;100.0 +25/10/2020 02:06:36;U544.PC062_OP_MES.F_CV;31.418806076;100.0 +25/10/2020 02:06:37;U544.PC062_OP_MES.F_CV;31.882686615;100.0 +25/10/2020 02:06:41;U544.PC062_OP_MES.F_CV;32.102420807;100.0 +25/10/2020 02:06:44;U544.PC062_OP_MES.F_CV;31.614124298;100.0 +25/10/2020 02:06:46;U544.PC062_OP_MES.F_CV;31.955930710;100.0 +25/10/2020 02:06:47;U544.PC062_OP_MES.F_CV;31.809442520;100.0 +25/10/2020 02:06:49;U544.PC062_OP_MES.F_CV;31.955930710;100.0 +25/10/2020 02:06:50;U544.PC062_OP_MES.F_CV;31.809442520;100.0 +25/10/2020 02:06:52;U544.PC062_OP_MES.F_CV;31.980346680;100.0 +25/10/2020 02:06:53;U544.PC062_OP_MES.F_CV;31.492050171;100.0 +25/10/2020 02:06:54;U544.PC062_OP_MES.F_CV;31.638538361;100.0 +25/10/2020 02:06:55;U544.PC062_OP_MES.F_CV;31.955930710;100.0 +25/10/2020 02:06:57;U544.PC062_OP_MES.F_CV;31.785028458;100.0 +25/10/2020 02:06:59;U544.PC062_OP_MES.F_CV;31.955930710;100.0 +25/10/2020 02:06:52;U544.PC062_PV_MES.F_CV;0.501043200;100.0 +25/10/2020 02:06:24;U544.PI060_MES.F_CV;0.006821603;100.0 +25/10/2020 02:06:43;U544.PI064_MES.F_CV;3.709928989;100.0 +25/10/2020 02:06:54;U544.PI072_MES.F_CV;-0.082427263;100.0 +25/10/2020 02:06:02;U544.PI073_MES.F_CV;-0.137002021;100.0 +25/10/2020 02:06:51;U544.PI074_MES.F_CV;-0.314725935;100.0 +25/10/2020 02:06:43;U544.TC050_OP_MES.F_CV;5.000000000;100.0 +25/10/2020 02:06:27;U544.TC050_PV_MES.F_CV;20.783132553;100.0 +25/10/2020 02:06:43;U544.TC051_OP_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U544.TC051_PV_MES.F_CV;20.223751068;100.0 +25/10/2020 02:06:01;U544.TC052_OP_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U544.TC052_PV_MES.F_CV;20.632530212;100.0 +25/10/2020 02:06:01;U544.TC053_OP_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U544.TC053_PV_MES.F_CV;21.087827682;100.0 +25/10/2020 02:06:04;U544.TC056_OP_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U544.TC056_PV_MES.F_CV;200.000000000;100.0 +25/10/2020 02:06:00;U544.TC060_OP_MES.F_CV;26.831872940;100.0 +25/10/2020 02:06:01;U544.TC060_OP_MES.F_CV;26.929533005;100.0 +25/10/2020 02:06:07;U544.TC060_OP_MES.F_CV;26.783044815;100.0 +25/10/2020 02:06:09;U544.TC060_OP_MES.F_CV;26.929533005;100.0 +25/10/2020 02:06:10;U544.TC060_OP_MES.F_CV;26.831872940;100.0 +25/10/2020 02:06:11;U544.TC060_OP_MES.F_CV;26.929533005;100.0 +25/10/2020 02:06:14;U544.TC060_OP_MES.F_CV;26.856288910;100.0 +25/10/2020 02:06:15;U544.TC060_OP_MES.F_CV;26.929533005;100.0 +25/10/2020 02:06:18;U544.TC060_OP_MES.F_CV;26.758628845;100.0 +25/10/2020 02:06:19;U544.TC060_OP_MES.F_CV;26.880702972;100.0 +25/10/2020 02:06:26;U544.TC060_OP_MES.F_CV;26.953947067;100.0 +25/10/2020 02:06:27;U544.TC060_OP_MES.F_CV;26.856288910;100.0 +25/10/2020 02:06:32;U544.TC060_OP_MES.F_CV;26.783044815;100.0 +25/10/2020 02:06:34;U544.TC060_OP_MES.F_CV;27.124851227;100.0 +25/10/2020 02:06:36;U544.TC060_OP_MES.F_CV;26.953947067;100.0 +25/10/2020 02:06:40;U544.TC060_OP_MES.F_CV;27.076021194;100.0 +25/10/2020 02:06:43;U544.TC060_OP_MES.F_CV;26.783044815;100.0 +25/10/2020 02:06:45;U544.TC060_OP_MES.F_CV;27.100437164;100.0 +25/10/2020 02:06:46;U544.TC060_OP_MES.F_CV;27.173681259;100.0 +25/10/2020 02:06:48;U544.TC060_OP_MES.F_CV;27.002777100;100.0 +25/10/2020 02:06:49;U544.TC060_OP_MES.F_CV;26.831872940;100.0 +25/10/2020 02:06:51;U544.TC060_OP_MES.F_CV;27.002777100;100.0 +25/10/2020 02:06:52;U544.TC060_OP_MES.F_CV;26.880702972;100.0 +25/10/2020 02:06:53;U544.TC060_OP_MES.F_CV;27.027191162;100.0 +25/10/2020 02:06:58;U544.TC060_OP_MES.F_CV;26.831872940;100.0 +25/10/2020 02:06:00;U544.TC060_PV_MES.F_CV;150.082305908;100.0 +25/10/2020 02:06:01;U544.TC060_PV_MES.F_CV;149.923446655;100.0 +25/10/2020 02:06:03;U544.TC060_PV_MES.F_CV;150.088150024;100.0 +25/10/2020 02:06:06;U544.TC060_PV_MES.F_CV;149.979522705;100.0 +25/10/2020 02:06:07;U544.TC060_PV_MES.F_CV;150.194274902;100.0 +25/10/2020 02:06:08;U544.TC060_PV_MES.F_CV;149.914474487;100.0 +25/10/2020 02:06:10;U544.TC060_PV_MES.F_CV;150.061737061;100.0 +25/10/2020 02:06:17;U544.TC060_PV_MES.F_CV;149.911163330;100.0 +25/10/2020 02:06:19;U544.TC060_PV_MES.F_CV;150.050872803;100.0 +25/10/2020 02:06:20;U544.TC060_PV_MES.F_CV;149.943267822;100.0 +25/10/2020 02:06:27;U544.TC060_PV_MES.F_CV;150.127456665;100.0 +25/10/2020 02:06:28;U544.TC060_PV_MES.F_CV;149.975524902;100.0 +25/10/2020 02:06:33;U544.TC060_PV_MES.F_CV;149.817443848;100.0 +25/10/2020 02:06:34;U544.TC060_PV_MES.F_CV;149.932510376;100.0 +25/10/2020 02:06:39;U544.TC060_PV_MES.F_CV;149.795516968;100.0 +25/10/2020 02:06:42;U544.TC060_PV_MES.F_CV;150.098358154;100.0 +25/10/2020 02:06:44;U544.TC060_PV_MES.F_CV;149.982696533;100.0 +25/10/2020 02:06:49;U544.TC060_PV_MES.F_CV;150.172470093;100.0 +25/10/2020 02:06:50;U544.TC060_PV_MES.F_CV;149.866882324;100.0 +25/10/2020 02:06:55;U544.TC060_PV_MES.F_CV;150.174255371;100.0 +25/10/2020 02:06:58;U544.TC060_PV_MES.F_CV;149.943359375;100.0 +25/10/2020 02:06:04;U544.TC061_OP_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U544.TC061_PV_MES.F_CV;21.049676895;100.0 +25/10/2020 02:06:06;U544.TC061_PV_MES.F_CV;20.899791718;100.0 +25/10/2020 02:06:07;U544.TC061_PV_MES.F_CV;21.039211273;100.0 +25/10/2020 02:06:09;U544.TC061_PV_MES.F_CV;20.915000916;100.0 +25/10/2020 02:06:12;U544.TC061_PV_MES.F_CV;21.022668839;100.0 +25/10/2020 02:06:16;U544.TC061_PV_MES.F_CV;20.876857758;100.0 +25/10/2020 02:06:19;U544.TC061_PV_MES.F_CV;20.999263763;100.0 +25/10/2020 02:06:23;U544.TC061_PV_MES.F_CV;20.800294876;100.0 +25/10/2020 02:06:24;U544.TC061_PV_MES.F_CV;20.984052658;100.0 +25/10/2020 02:06:31;U544.TC061_PV_MES.F_CV;21.102092743;100.0 +25/10/2020 02:06:33;U544.TC061_PV_MES.F_CV;20.832166672;100.0 +25/10/2020 02:06:34;U544.TC061_PV_MES.F_CV;20.955768585;100.0 +25/10/2020 02:06:39;U544.TC061_PV_MES.F_CV;20.816230774;100.0 +25/10/2020 02:06:41;U544.TC061_PV_MES.F_CV;21.025411606;100.0 +25/10/2020 02:06:45;U544.TC061_PV_MES.F_CV;20.898473740;100.0 +25/10/2020 02:06:48;U544.TC061_PV_MES.F_CV;21.064888000;100.0 +25/10/2020 02:06:50;U544.TC061_PV_MES.F_CV;20.854864120;100.0 +25/10/2020 02:06:51;U544.TC061_PV_MES.F_CV;21.075099945;100.0 +25/10/2020 02:06:52;U544.TC061_PV_MES.F_CV;20.865921021;100.0 +25/10/2020 02:06:55;U544.TC061_PV_MES.F_CV;21.108972549;100.0 +25/10/2020 02:06:56;U544.TC061_PV_MES.F_CV;20.995794296;100.0 +25/10/2020 02:06:50;U544.TC062_OP_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U544.TC062_PV_MES.F_CV;21.452611923;100.0 +25/10/2020 02:06:03;U544.TC062_PV_MES.F_CV;21.318910599;100.0 +25/10/2020 02:06:05;U544.TC062_PV_MES.F_CV;21.512825012;100.0 +25/10/2020 02:06:06;U544.TC062_PV_MES.F_CV;21.269136429;100.0 +25/10/2020 02:06:07;U544.TC062_PV_MES.F_CV;21.416683197;100.0 +25/10/2020 02:06:09;U544.TC062_PV_MES.F_CV;21.269689560;100.0 +25/10/2020 02:06:11;U544.TC062_PV_MES.F_CV;21.434019089;100.0 +25/10/2020 02:06:12;U544.TC062_PV_MES.F_CV;21.311206818;100.0 +25/10/2020 02:06:13;U544.TC062_PV_MES.F_CV;21.514377594;100.0 +25/10/2020 02:06:14;U544.TC062_PV_MES.F_CV;21.331733704;100.0 +25/10/2020 02:06:15;U544.TC062_PV_MES.F_CV;21.453159332;100.0 +25/10/2020 02:06:28;U544.TC062_PV_MES.F_CV;21.309108734;100.0 +25/10/2020 02:06:29;U544.TC062_PV_MES.F_CV;21.440412521;100.0 +25/10/2020 02:06:30;U544.TC062_PV_MES.F_CV;21.268074036;100.0 +25/10/2020 02:06:31;U544.TC062_PV_MES.F_CV;21.402017593;100.0 +25/10/2020 02:06:33;U544.TC062_PV_MES.F_CV;21.179960251;100.0 +25/10/2020 02:06:34;U544.TC062_PV_MES.F_CV;21.421785355;100.0 +25/10/2020 02:06:38;U544.TC062_PV_MES.F_CV;21.528045654;100.0 +25/10/2020 02:06:40;U544.TC062_PV_MES.F_CV;21.283538818;100.0 +25/10/2020 02:06:41;U544.TC062_PV_MES.F_CV;21.484056473;100.0 +25/10/2020 02:06:43;U544.TC062_PV_MES.F_CV;21.252090454;100.0 +25/10/2020 02:06:46;U544.TC062_PV_MES.F_CV;21.505668640;100.0 +25/10/2020 02:06:47;U544.TC062_PV_MES.F_CV;21.314439774;100.0 +25/10/2020 02:06:48;U544.TC062_PV_MES.F_CV;21.483295441;100.0 +25/10/2020 02:06:50;U544.TC062_PV_MES.F_CV;21.367176056;100.0 +25/10/2020 02:06:55;U544.TC062_PV_MES.F_CV;21.525878906;100.0 +25/10/2020 02:06:56;U544.TC062_PV_MES.F_CV;21.222770691;100.0 +25/10/2020 02:06:57;U544.TC062_PV_MES.F_CV;21.423879623;100.0 +25/10/2020 02:06:58;U544.TC062_PV_MES.F_CV;21.314687729;100.0 +25/10/2020 02:06:59;U544.TC062_PV_MES.F_CV;21.489669800;100.0 +25/10/2020 02:06:22;U544.TC063_OP_MES.F_CV;99.978637695;100.0 +25/10/2020 02:06:24;U544.TC063_PV_MES.F_CV;119.495750427;100.0 +25/10/2020 02:06:26;U544.TC063_PV_MES.F_CV;119.727050781;100.0 +25/10/2020 02:06:28;U544.TC063_PV_MES.F_CV;119.538345337;100.0 +25/10/2020 02:06:32;U544.TC063_PV_MES.F_CV;119.700172424;100.0 +25/10/2020 02:06:33;U544.TC063_PV_MES.F_CV;119.473388672;100.0 +25/10/2020 02:06:38;U544.TC063_PV_MES.F_CV;119.722106934;100.0 +25/10/2020 02:06:39;U544.TC063_PV_MES.F_CV;119.507736206;100.0 +25/10/2020 02:06:41;U544.TC063_PV_MES.F_CV;119.618225098;100.0 +25/10/2020 02:06:59;U544.TC063_PV_MES.F_CV;119.451690674;100.0 +25/10/2020 02:06:10;U544.TC070_OP_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U544.TC070_PV_MES.F_CV;20.985240936;100.0 +25/10/2020 02:06:02;U544.TC070_PV_MES.F_CV;20.890998840;100.0 +25/10/2020 02:06:03;U544.TC070_PV_MES.F_CV;21.007505417;100.0 +25/10/2020 02:06:06;U544.TC070_PV_MES.F_CV;20.869958878;100.0 +25/10/2020 02:06:07;U544.TC070_PV_MES.F_CV;21.028375626;100.0 +25/10/2020 02:06:08;U544.TC070_PV_MES.F_CV;20.839216232;100.0 +25/10/2020 02:06:11;U544.TC070_PV_MES.F_CV;20.922330856;100.0 +25/10/2020 02:06:12;U544.TC070_PV_MES.F_CV;20.769567490;100.0 +25/10/2020 02:06:14;U544.TC070_PV_MES.F_CV;20.884738922;100.0 +25/10/2020 02:06:18;U544.TC070_PV_MES.F_CV;20.946722031;100.0 +25/10/2020 02:06:20;U544.TC070_PV_MES.F_CV;20.881128311;100.0 +25/10/2020 02:06:24;U544.TC070_PV_MES.F_CV;21.047245026;100.0 +25/10/2020 02:06:25;U544.TC070_PV_MES.F_CV;20.824586868;100.0 +25/10/2020 02:06:29;U544.TC070_PV_MES.F_CV;20.902757645;100.0 +25/10/2020 02:06:31;U544.TC070_PV_MES.F_CV;20.839328766;100.0 +25/10/2020 02:06:32;U544.TC070_PV_MES.F_CV;21.044576645;100.0 +25/10/2020 02:06:33;U544.TC070_PV_MES.F_CV;20.833700180;100.0 +25/10/2020 02:06:35;U544.TC070_PV_MES.F_CV;20.893756866;100.0 +25/10/2020 02:06:37;U544.TC070_PV_MES.F_CV;20.804401398;100.0 +25/10/2020 02:06:38;U544.TC070_PV_MES.F_CV;20.888814926;100.0 +25/10/2020 02:06:43;U544.TC070_PV_MES.F_CV;20.754196167;100.0 +25/10/2020 02:06:45;U544.TC070_PV_MES.F_CV;21.027784348;100.0 +25/10/2020 02:06:46;U544.TC070_PV_MES.F_CV;20.832273483;100.0 +25/10/2020 02:06:47;U544.TC070_PV_MES.F_CV;20.741565704;100.0 +25/10/2020 02:06:51;U544.TC070_PV_MES.F_CV;20.895904541;100.0 +25/10/2020 02:06:55;U544.TC070_PV_MES.F_CV;20.839328766;100.0 +25/10/2020 02:06:57;U544.TC070_PV_MES.F_CV;20.989355087;100.0 +25/10/2020 02:06:58;U544.TC070_PV_MES.F_CV;20.858070374;100.0 +25/10/2020 02:06:59;U544.TC070_PV_MES.F_CV;20.914554596;100.0 +25/10/2020 02:06:47;U544.TC124_OP_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U544.TC124_PV_MES.F_CV;22.074010849;100.0 +25/10/2020 02:06:09;U544.TC128_OP_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U544.TC128_PV_MES.F_CV;21.536144257;100.0 +25/10/2020 02:06:00;U544.TI007_MES.F_CV;21.442167282;100.0 +25/10/2020 02:06:01;U544.TI007_MES.F_CV;21.250160217;100.0 +25/10/2020 02:06:02;U544.TI007_MES.F_CV;21.466579437;100.0 +25/10/2020 02:06:04;U544.TI007_MES.F_CV;21.311012268;100.0 +25/10/2020 02:06:07;U544.TI007_MES.F_CV;21.427427292;100.0 +25/10/2020 02:06:12;U544.TI007_MES.F_CV;21.276699066;100.0 +25/10/2020 02:06:14;U544.TI007_MES.F_CV;21.395961761;100.0 +25/10/2020 02:06:16;U544.TI007_MES.F_CV;21.280771255;100.0 +25/10/2020 02:06:17;U544.TI007_MES.F_CV;21.473541260;100.0 +25/10/2020 02:06:18;U544.TI007_MES.F_CV;21.292659760;100.0 +25/10/2020 02:06:19;U544.TI007_MES.F_CV;21.558080673;100.0 +25/10/2020 02:06:20;U544.TI007_MES.F_CV;21.238161087;100.0 +25/10/2020 02:06:23;U544.TI007_MES.F_CV;21.530210495;100.0 +25/10/2020 02:06:24;U544.TI007_MES.F_CV;21.274549484;100.0 +25/10/2020 02:06:28;U544.TI007_MES.F_CV;21.433778763;100.0 +25/10/2020 02:06:33;U544.TI007_MES.F_CV;21.237640381;100.0 +25/10/2020 02:06:34;U544.TI007_MES.F_CV;21.462963104;100.0 +25/10/2020 02:06:35;U544.TI007_MES.F_CV;21.282960892;100.0 +25/10/2020 02:06:36;U544.TI007_MES.F_CV;21.500278473;100.0 +25/10/2020 02:06:37;U544.TI007_MES.F_CV;21.302515030;100.0 +25/10/2020 02:06:38;U544.TI007_MES.F_CV;21.435112000;100.0 +25/10/2020 02:06:39;U544.TI007_MES.F_CV;21.252918243;100.0 +25/10/2020 02:06:41;U544.TI007_MES.F_CV;21.567821503;100.0 +25/10/2020 02:06:43;U544.TI007_MES.F_CV;21.169212341;100.0 +25/10/2020 02:06:44;U544.TI007_MES.F_CV;21.292659760;100.0 +25/10/2020 02:06:46;U544.TI007_MES.F_CV;21.141342163;100.0 +25/10/2020 02:06:47;U544.TI007_MES.F_CV;21.348625183;100.0 +25/10/2020 02:06:49;U544.TI007_MES.F_CV;21.460313797;100.0 +25/10/2020 02:06:53;U544.TI007_MES.F_CV;21.122360229;100.0 +25/10/2020 02:06:56;U544.TI007_MES.F_CV;21.462261200;100.0 +25/10/2020 02:06:57;U544.TI007_MES.F_CV;21.322813034;100.0 +25/10/2020 02:06:04;U544.TI008_MES.F_CV;21.471599579;100.0 +25/10/2020 02:06:46;U544.TI009_MES.F_CV;20.374353409;100.0 +25/10/2020 02:06:02;U544.TI054_MES.F_CV;98.192771912;100.0 +25/10/2020 02:06:00;U544.TI066_MES.F_CV;20.481641769;100.0 +25/10/2020 02:06:05;U544.TI066_MES.F_CV;20.584112167;100.0 +25/10/2020 02:06:13;U544.TI066_MES.F_CV;20.422468185;100.0 +25/10/2020 02:06:14;U544.TI066_MES.F_CV;20.646524429;100.0 +25/10/2020 02:06:16;U544.TI066_MES.F_CV;20.494758606;100.0 +25/10/2020 02:06:17;U544.TI066_MES.F_CV;20.674982071;100.0 +25/10/2020 02:06:19;U544.TI066_MES.F_CV;20.438842773;100.0 +25/10/2020 02:06:20;U544.TI066_MES.F_CV;20.551216125;100.0 +25/10/2020 02:06:24;U544.TI066_MES.F_CV;20.450204849;100.0 +25/10/2020 02:06:25;U544.TI066_MES.F_CV;20.673242569;100.0 +25/10/2020 02:06:27;U544.TI066_MES.F_CV;20.501195908;100.0 +25/10/2020 02:06:30;U544.TI066_MES.F_CV;20.651664734;100.0 +25/10/2020 02:06:35;U544.TI066_MES.F_CV;20.394512177;100.0 +25/10/2020 02:06:41;U544.TI066_MES.F_CV;20.634113312;100.0 +25/10/2020 02:06:47;U544.TI066_MES.F_CV;20.405649185;100.0 +25/10/2020 02:06:48;U544.TI066_MES.F_CV;20.618768692;100.0 +25/10/2020 02:06:49;U544.TI066_MES.F_CV;20.339557648;100.0 +25/10/2020 02:06:50;U544.TI066_MES.F_CV;20.620771408;100.0 +25/10/2020 02:06:52;U544.TI066_MES.F_CV;20.503179550;100.0 +25/10/2020 02:06:54;U544.TI066_MES.F_CV;20.610591888;100.0 +25/10/2020 02:06:01;U544.TI067_MES.F_CV;-273.149993896;100.0 +25/10/2020 02:06:10;U544.TI100_MES.F_CV;20.245265961;100.0 +25/10/2020 02:06:25;U544.TI100_MES.F_CV;20.159206390;100.0 +25/10/2020 02:06:26;U544.TI100_MES.F_CV;20.202238083;100.0 +25/10/2020 02:06:37;U544.TI100_MES.F_CV;20.245265961;100.0 +25/10/2020 02:06:48;U544.TI100_MES.F_CV;20.202238083;100.0 +25/10/2020 02:06:20;U544.TI101_MES.F_CV;21.084337234;100.0 +25/10/2020 02:06:36;U544.TI101_MES.F_CV;21.148880005;100.0 +25/10/2020 02:06:55;U544.TI101_MES.F_CV;21.084337234;100.0 +25/10/2020 02:06:10;U544.TI102_MES.F_CV;21.600687027;100.0 +25/10/2020 02:06:20;U544.TI102_MES.F_CV;21.536142349;100.0 +25/10/2020 02:06:36;U544.TI102_MES.F_CV;21.600687027;100.0 +25/10/2020 02:06:57;U544.TI102_MES.F_CV;21.536142349;100.0 +25/10/2020 02:06:15;U544.TI105_MES.F_CV;21.451108932;100.0 +25/10/2020 02:06:09;U544.TI106_MES.F_CV;21.299482346;100.0 +25/10/2020 02:06:15;U544.TI110_MES.F_CV;20.309808731;100.0 +25/10/2020 02:06:23;U544.TI110_MES.F_CV;20.245265961;100.0 +25/10/2020 02:06:04;U544.TI111_MES.F_CV;33.345001221;100.0 +25/10/2020 02:06:06;U544.TI112_MES.F_CV;21.191909790;100.0 +25/10/2020 02:06:13;U544.TI113_MES.F_CV;20.030120850;100.0 +25/10/2020 02:06:16;U544.TI113_MES.F_CV;20.094663620;100.0 +25/10/2020 02:06:26;U544.TI113_MES.F_CV;20.030120850;100.0 +25/10/2020 02:06:36;U544.TI114_MES.F_CV;20.567985535;100.0 +25/10/2020 02:06:40;U544.TI115_MES.F_CV;19.836486816;100.0 +25/10/2020 02:06:14;U544.TI122_MES.F_CV;21.256454468;100.0 +25/10/2020 02:06:43;U544.TI123_MES.F_CV;21.643716812;100.0 +25/10/2020 02:06:49;U544.TI124_MES.F_CV;22.074010849;100.0 +25/10/2020 02:06:48;U544.TI125_MES.F_CV;22.074010849;100.0 +25/10/2020 02:06:58;U544.TI126_MES.F_CV;21.923408508;100.0 +25/10/2020 02:06:51;U544.TI127_MES.F_CV;21.944921494;100.0 +25/10/2020 02:06:50;U544.TI128_MES.F_CV;21.557659149;100.0 +25/10/2020 02:06:58;U544.TI129_MES.F_CV;21.837348938;100.0 +25/10/2020 02:06:54;U544.TI150_MES.F_CV;21.772804260;100.0 +25/10/2020 02:06:04;U544.TI151_MES.F_CV;21.772804260;100.0 +25/10/2020 02:06:09;U544.TI152_MES.F_CV;21.299482346;100.0 +25/10/2020 02:06:43;U544.TI153_MES.F_CV;21.148880005;100.0 +25/10/2020 02:06:39;U544.TI156_MES.F_CV;415.942321777;100.0 +25/10/2020 02:06:01;U544.TI160_MES.F_CV;148.210098267;100.0 +25/10/2020 02:06:11;U544.TI160_MES.F_CV;148.415069580;100.0 +25/10/2020 02:06:12;U544.TI160_MES.F_CV;148.195693970;100.0 +25/10/2020 02:06:21;U544.TI160_MES.F_CV;148.427856445;100.0 +25/10/2020 02:06:30;U544.TI160_MES.F_CV;148.261993408;100.0 +25/10/2020 02:06:32;U544.TI160_MES.F_CV;148.415740967;100.0 +25/10/2020 02:06:33;U544.TI160_MES.F_CV;148.234771729;100.0 +25/10/2020 02:06:34;U544.TI160_MES.F_CV;148.391082764;100.0 +25/10/2020 02:06:35;U544.TI160_MES.F_CV;148.196487427;100.0 +25/10/2020 02:06:43;U544.TI160_MES.F_CV;148.433914185;100.0 +25/10/2020 02:06:44;U544.TI160_MES.F_CV;148.212005615;100.0 +25/10/2020 02:06:46;U544.TI160_MES.F_CV;148.104339600;100.0 +25/10/2020 02:06:47;U544.TI160_MES.F_CV;148.372207642;100.0 +25/10/2020 02:06:50;U544.TI160_MES.F_CV;148.258758545;100.0 +25/10/2020 02:06:54;U544.TI160_MES.F_CV;148.403350830;100.0 +25/10/2020 02:06:56;U544.TI160_MES.F_CV;148.167938232;100.0 +25/10/2020 02:06:57;U544.TI160_MES.F_CV;148.354690552;100.0 +25/10/2020 02:06:04;U544.TI161_MES.F_CV;21.493638992;100.0 +25/10/2020 02:06:05;U544.TI161_MES.F_CV;21.284557343;100.0 +25/10/2020 02:06:06;U544.TI161_MES.F_CV;21.464136124;100.0 +25/10/2020 02:06:09;U544.TI161_MES.F_CV;21.344709396;100.0 +25/10/2020 02:06:13;U544.TI161_MES.F_CV;21.478956223;100.0 +25/10/2020 02:06:14;U544.TI161_MES.F_CV;21.376667023;100.0 +25/10/2020 02:06:16;U544.TI161_MES.F_CV;21.502059937;100.0 +25/10/2020 02:06:21;U544.TI161_MES.F_CV;21.355752945;100.0 +25/10/2020 02:06:32;U544.TI161_MES.F_CV;21.462104797;100.0 +25/10/2020 02:06:33;U544.TI161_MES.F_CV;21.274669647;100.0 +25/10/2020 02:06:34;U544.TI161_MES.F_CV;21.408937454;100.0 +25/10/2020 02:06:41;U544.TI161_MES.F_CV;21.251567841;100.0 +25/10/2020 02:06:42;U544.TI161_MES.F_CV;21.413137436;100.0 +25/10/2020 02:06:56;U544.TI161_MES.F_CV;21.287303925;100.0 +25/10/2020 02:06:59;U544.TI161_MES.F_CV;21.542434692;100.0 +25/10/2020 02:06:00;U544.TI162_MES.F_CV;20.624271393;100.0 +25/10/2020 02:06:02;U544.TI162_MES.F_CV;20.848974228;100.0 +25/10/2020 02:06:05;U544.TI162_MES.F_CV;20.691614151;100.0 +25/10/2020 02:06:08;U544.TI162_MES.F_CV;20.843996048;100.0 +25/10/2020 02:06:09;U544.TI162_MES.F_CV;20.684652328;100.0 +25/10/2020 02:06:12;U544.TI162_MES.F_CV;20.864135742;100.0 +25/10/2020 02:06:13;U544.TI162_MES.F_CV;20.693771362;100.0 +25/10/2020 02:06:16;U544.TI162_MES.F_CV;20.864135742;100.0 +25/10/2020 02:06:17;U544.TI162_MES.F_CV;20.647211075;100.0 +25/10/2020 02:06:18;U544.TI162_MES.F_CV;20.889190674;100.0 +25/10/2020 02:06:19;U544.TI162_MES.F_CV;20.783506393;100.0 +25/10/2020 02:06:21;U544.TI162_MES.F_CV;20.891483307;100.0 +25/10/2020 02:06:22;U544.TI162_MES.F_CV;20.791154861;100.0 +25/10/2020 02:06:24;U544.TI162_MES.F_CV;20.905300140;100.0 +25/10/2020 02:06:25;U544.TI162_MES.F_CV;20.728612900;100.0 +25/10/2020 02:06:28;U544.TI162_MES.F_CV;20.868543625;100.0 +25/10/2020 02:06:30;U544.TI162_MES.F_CV;20.697917938;100.0 +25/10/2020 02:06:32;U544.TI162_MES.F_CV;20.809267044;100.0 +25/10/2020 02:06:38;U544.TI162_MES.F_CV;20.611648560;100.0 +25/10/2020 02:06:39;U544.TI162_MES.F_CV;20.764581680;100.0 +25/10/2020 02:06:41;U544.TI162_MES.F_CV;20.645734787;100.0 +25/10/2020 02:06:46;U544.TI162_MES.F_CV;20.788883209;100.0 +25/10/2020 02:06:55;U544.TI162_MES.F_CV;20.649881363;100.0 +25/10/2020 02:06:57;U544.TI162_MES.F_CV;20.802963257;100.0 +25/10/2020 02:06:58;U544.TI162_MES.F_CV;20.652038574;100.0 +25/10/2020 02:06:59;U544.TI162_MES.F_CV;20.775045395;100.0 +25/10/2020 02:06:00;U544.TI163_MES.F_CV;142.797378540;100.0 +25/10/2020 02:06:02;U544.TI163_MES.F_CV;142.920669556;100.0 +25/10/2020 02:06:24;U544.TI163_MES.F_CV;143.022552490;100.0 +25/10/2020 02:06:26;U544.TI163_MES.F_CV;142.889694214;100.0 +25/10/2020 02:06:27;U544.TI163_MES.F_CV;143.008880615;100.0 +25/10/2020 02:06:38;U544.TI163_MES.F_CV;142.764404297;100.0 +25/10/2020 02:06:47;U544.TI163_MES.F_CV;142.928878784;100.0 +25/10/2020 02:06:56;U544.TI163_MES.F_CV;142.828857422;100.0 +25/10/2020 02:06:00;U544.TI170_MES.F_CV;20.702405930;100.0 +25/10/2020 02:06:02;U544.TI170_MES.F_CV;20.803224564;100.0 +25/10/2020 02:06:03;U544.TI170_MES.F_CV;20.668872833;100.0 +25/10/2020 02:06:05;U544.TI170_MES.F_CV;20.798440933;100.0 +25/10/2020 02:06:06;U544.TI170_MES.F_CV;20.734439850;100.0 +25/10/2020 02:06:07;U544.TI170_MES.F_CV;20.788866043;100.0 +25/10/2020 02:06:11;U544.TI170_MES.F_CV;20.609441757;100.0 +25/10/2020 02:06:12;U544.TI170_MES.F_CV;20.748363495;100.0 +25/10/2020 02:06:17;U544.TI170_MES.F_CV;20.682161331;100.0 +25/10/2020 02:06:18;U544.TI170_MES.F_CV;20.796939850;100.0 +25/10/2020 02:06:21;U544.TI170_MES.F_CV;20.711572647;100.0 +25/10/2020 02:06:27;U544.TI170_MES.F_CV;20.777553558;100.0 +25/10/2020 02:06:28;U544.TI170_MES.F_CV;20.717878342;100.0 +25/10/2020 02:06:31;U544.TI170_MES.F_CV;20.838079453;100.0 +25/10/2020 02:06:33;U544.TI170_MES.F_CV;20.607463837;100.0 +25/10/2020 02:06:35;U544.TI170_MES.F_CV;20.760787964;100.0 +25/10/2020 02:06:37;U544.TI170_MES.F_CV;20.602024078;100.0 +25/10/2020 02:06:38;U544.TI170_MES.F_CV;20.826976776;100.0 +25/10/2020 02:06:40;U544.TI170_MES.F_CV;20.761631012;100.0 +25/10/2020 02:06:41;U544.TI170_MES.F_CV;20.652122498;100.0 +25/10/2020 02:06:42;U544.TI170_MES.F_CV;20.769706726;100.0 +25/10/2020 02:06:43;U544.TI170_MES.F_CV;20.698514938;100.0 +25/10/2020 02:06:45;U544.TI170_MES.F_CV;20.811731339;100.0 +25/10/2020 02:06:46;U544.TI170_MES.F_CV;20.615972519;100.0 +25/10/2020 02:06:47;U544.TI170_MES.F_CV;20.878372192;100.0 +25/10/2020 02:06:51;U544.TI170_MES.F_CV;20.656036377;100.0 +25/10/2020 02:06:52;U544.TI170_MES.F_CV;20.712213516;100.0 +25/10/2020 02:06:53;U544.TI170_MES.F_CV;20.874229431;100.0 +25/10/2020 02:06:54;U544.TI170_MES.F_CV;20.675647736;100.0 +25/10/2020 02:06:56;U544.TI170_MES.F_CV;20.831321716;100.0 +25/10/2020 02:06:58;U544.TI170_MES.F_CV;20.631216049;100.0 +25/10/2020 02:06:59;U544.TI170_MES.F_CV;20.693714142;100.0 +25/10/2020 02:06:43;U544.TI250_MES.F_CV;21.450084686;100.0 +25/10/2020 02:06:18;U544.TI251_MES.F_CV;20.417383194;100.0 +25/10/2020 02:06:43;U544.TI252_MES.F_CV;21.686746597;100.0 +25/10/2020 02:06:43;U544.TI253_MES.F_CV;20.137691498;100.0 +25/10/2020 02:06:01;U544.TI261_MES.F_CV;21.475492477;100.0 +25/10/2020 02:06:05;U544.TI261_MES.F_CV;21.234863281;100.0 +25/10/2020 02:06:08;U544.TI261_MES.F_CV;21.469827652;100.0 +25/10/2020 02:06:10;U544.TI261_MES.F_CV;21.347215652;100.0 +25/10/2020 02:06:18;U544.TI261_MES.F_CV;21.455221176;100.0 +25/10/2020 02:06:21;U544.TI261_MES.F_CV;21.344188690;100.0 +25/10/2020 02:06:31;U544.TI261_MES.F_CV;21.447826385;100.0 +25/10/2020 02:06:32;U544.TI261_MES.F_CV;21.331314087;100.0 +25/10/2020 02:06:34;U544.TI261_MES.F_CV;21.456953049;100.0 +25/10/2020 02:06:37;U544.TI261_MES.F_CV;21.242261887;100.0 +25/10/2020 02:06:48;U544.TI261_MES.F_CV;21.496397018;100.0 +25/10/2020 02:06:50;U544.TI261_MES.F_CV;21.209817886;100.0 +25/10/2020 02:06:54;U544.TI261_MES.F_CV;21.439977646;100.0 +25/10/2020 02:06:59;U544.TI261_MES.F_CV;21.283006668;100.0 +25/10/2020 02:06:02;U553.AI01_1_PV.F_CV;8.980757713;100.0 +25/10/2020 02:06:05;U553.AI02_2_PV.F_CV;7.342303276;100.0 +25/10/2020 02:06:46;U553.FC01_OP.F_CV;95.000000000;100.0 +25/10/2020 02:06:55;U553.FC01_PV.F_CV;-1.218642592;100.0 +25/10/2020 02:06:46;U553.FC01_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U553.FC02_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U553.FC02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U553.FC02_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U553.PDI01_PV.F_CV;0.090624988;100.0 +25/10/2020 02:06:03;U553.PDI02_PV.F_CV;0.091062009;100.0 +25/10/2020 02:06:05;U553.PDI02_PV.F_CV;0.047666013;100.0 +25/10/2020 02:06:07;U553.PDI02_PV.F_CV;0.091062009;100.0 +25/10/2020 02:06:08;U553.PDI02_PV.F_CV;0.047666013;100.0 +25/10/2020 02:06:10;U553.PDI02_PV.F_CV;0.091062009;100.0 +25/10/2020 02:06:12;U553.PDI02_PV.F_CV;0.047666013;100.0 +25/10/2020 02:06:16;U553.PDI02_PV.F_CV;0.091062009;100.0 +25/10/2020 02:06:18;U553.PDI02_PV.F_CV;0.047666013;100.0 +25/10/2020 02:06:29;U553.PDI02_PV.F_CV;0.091062009;100.0 +25/10/2020 02:06:31;U553.PDI02_PV.F_CV;0.047666013;100.0 +25/10/2020 02:06:42;U553.PDI02_PV.F_CV;0.091062009;100.0 +25/10/2020 02:06:48;U553.PDI02_PV.F_CV;0.047666013;100.0 +25/10/2020 02:06:53;U553.PDI02_PV.F_CV;0.091062009;100.0 +25/10/2020 02:06:55;U553.PDI02_PV.F_CV;0.047666013;100.0 +25/10/2020 02:06:59;U553.PDI02_PV.F_CV;0.091062009;100.0 +25/10/2020 02:06:46;U553.TC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U553.TC01_PV.F_CV;18.100000381;100.0 +25/10/2020 02:06:46;U553.TC01_SP.F_CV;280.000000000;100.0 +25/10/2020 02:06:46;U553.TC02_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U553.TC02_PV.F_CV;18.299999237;100.0 +25/10/2020 02:06:46;U553.TC02_SP.F_CV;280.000000000;100.0 +25/10/2020 02:06:48;U553.TI1002_PV.F_CV;18.000000000;100.0 +25/10/2020 02:06:46;U553.TI101_PV.F_CV;18.299999237;100.0 +25/10/2020 02:06:46;U553.TI102_PV.F_CV;18.299999237;100.0 +25/10/2020 02:06:39;U553.TI11_PV.F_CV;18.200000763;100.0 +25/10/2020 02:06:33;U553.TI12_PV.F_CV;18.039381027;100.0 +25/10/2020 02:06:39;U553.TI13_PV.F_CV;17.983301163;100.0 +25/10/2020 02:06:46;U553.TI14_PV.F_CV;17.899999619;100.0 +25/10/2020 02:06:39;U553.TI15_PV.F_CV;17.762868881;100.0 +25/10/2020 02:06:46;U553.TI16_PV.F_CV;17.746929169;100.0 +25/10/2020 02:06:46;U553.TI17_PV.F_CV;17.862180710;100.0 +25/10/2020 02:06:21;U553.TI18_PV.F_CV;17.669059753;100.0 +25/10/2020 02:06:40;U553.TI19_PV.F_CV;17.927358627;100.0 +25/10/2020 02:06:33;U553.TI20_PV.F_CV;17.899999619;100.0 +25/10/2020 02:06:39;U553.TI21_PV.F_CV;17.549098969;100.0 +25/10/2020 02:06:46;U553.TI22_PV.F_CV;18.468490601;100.0 +25/10/2020 02:06:46;U553.TI23_PV.F_CV;17.786941528;100.0 +25/10/2020 02:06:33;U553.TI24_PV.F_CV;17.829782486;100.0 +25/10/2020 02:06:42;U553.TI25_PV.F_CV;18.068239212;100.0 +25/10/2020 02:06:33;U553.TI26_PV.F_CV;18.463991165;100.0 +25/10/2020 02:06:04;U553.TI27_PV.F_CV;17.881240845;100.0 +25/10/2020 02:06:33;U553.TI28_PV.F_CV;17.964199066;100.0 +25/10/2020 02:06:16;U553.TI29_PV.F_CV;18.836460114;100.0 +25/10/2020 02:06:46;U553.TI31_PV.F_CV;17.299999237;100.0 +25/10/2020 02:06:45;U553.TI32_PV.F_CV;17.795629501;100.0 +25/10/2020 02:06:46;U553.TI33_PV.F_CV;18.251138687;100.0 +25/10/2020 02:06:46;U553.TI34_PV.F_CV;17.964200974;100.0 +25/10/2020 02:06:46;U553.TI35_PV.F_CV;18.011301041;100.0 +25/10/2020 02:06:46;U553.TI41_PV.F_CV;17.299999237;100.0 +25/10/2020 02:06:33;U553.TI42_PV.F_CV;17.832201004;100.0 +25/10/2020 02:06:42;U553.TI43_PV.F_CV;17.935800552;100.0 +25/10/2020 02:06:44;U553.TI44_PV.F_CV;17.579160690;100.0 +25/10/2020 02:06:46;U553.TI45_PV.F_CV;17.680768967;100.0 +25/10/2020 02:06:46;U553.TI50_PV.F_CV;17.470668793;100.0 +25/10/2020 02:06:46;U553.TI51_PV.F_CV;17.299999237;100.0 +25/10/2020 02:06:46;U553.TI52_PV.F_CV;17.610900879;100.0 +25/10/2020 02:06:46;U553.TI53_PV.F_CV;17.552907944;100.0 +25/10/2020 02:06:46;U553.TI54_PV.F_CV;17.637699127;100.0 +25/10/2020 02:06:44;U553.TI55_PV.F_CV;17.894729614;100.0 +25/10/2020 02:06:34;U553.TI60_PV.F_CV;18.391599655;100.0 +25/10/2020 02:06:46;U553.TI61_PV.F_CV;17.600000381;100.0 +25/10/2020 02:06:46;U553.TI62_PV.F_CV;17.982999802;100.0 +25/10/2020 02:06:46;U553.TI63_PV.F_CV;18.040559769;100.0 +25/10/2020 02:06:46;U553.TI64_PV.F_CV;18.030149460;100.0 +25/10/2020 02:06:46;U553.TI65_PV.F_CV;18.143968582;100.0 +25/10/2020 02:06:46;U553.TI71_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U553.TI72_PV.F_CV;18.004999161;100.0 +25/10/2020 02:06:46;U553.TI73_PV.F_CV;18.104299545;100.0 +25/10/2020 02:06:46;U553.TI74_PV.F_CV;18.110000610;100.0 +25/10/2020 02:06:46;U553.TI75_PV.F_CV;18.260158539;100.0 +25/10/2020 02:06:46;U553.TI81_PV.F_CV;18.000000000;100.0 +25/10/2020 02:06:46;U553.TI82_PV.F_CV;18.335910797;100.0 +25/10/2020 02:06:46;U553.TI83_PV.F_CV;18.434419632;100.0 +25/10/2020 02:06:46;U553.TI84_PV.F_CV;18.355579376;100.0 +25/10/2020 02:06:46;U553.TI85_PV.F_CV;18.511159897;100.0 +25/10/2020 02:06:46;U554.AI10A.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.AI10B.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.AI10C.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.AI11.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.AI20A.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.AI20B.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.AI20C.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.AI21.F_CV;46.249996185;100.0 +25/10/2020 02:06:46;U554.AI30.F_CV;13916.000000000;100.0 +25/10/2020 02:06:46;U554.AI30C.F_CV;7100.000000000;100.0 +25/10/2020 02:06:46;U554.AI31.F_CV;0.012055216;100.0 +25/10/2020 02:06:46;U554.AI31C.F_CV;1420.000000000;100.0 +25/10/2020 02:06:46;U554.ALRM_P.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC1003_OP.F_CV;10.000000000;100.0 +25/10/2020 02:06:46;U554.FC1003_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC1500_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FC1501_PV.F_CV;0.001252053;100.0 +25/10/2020 02:06:46;U554.FC1501_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC1502_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC1502_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC1503_PV.F_CV;0.000117271;100.0 +25/10/2020 02:06:46;U554.FC1503_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U554.FC1504_PV.F_CV;0.123091295;100.0 +25/10/2020 02:06:01;U554.FC1504_PV.F_CV;0.120953478;100.0 +25/10/2020 02:06:03;U554.FC1504_PV.F_CV;0.127506465;100.0 +25/10/2020 02:06:04;U554.FC1504_PV.F_CV;0.121361449;100.0 +25/10/2020 02:06:05;U554.FC1504_PV.F_CV;0.124124698;100.0 +25/10/2020 02:06:07;U554.FC1504_PV.F_CV;0.122558191;100.0 +25/10/2020 02:06:08;U554.FC1504_PV.F_CV;0.122936942;100.0 +25/10/2020 02:06:10;U554.FC1504_PV.F_CV;0.119369127;100.0 +25/10/2020 02:06:11;U554.FC1504_PV.F_CV;0.124938682;100.0 +25/10/2020 02:06:12;U554.FC1504_PV.F_CV;0.128534600;100.0 +25/10/2020 02:06:13;U554.FC1504_PV.F_CV;0.124078929;100.0 +25/10/2020 02:06:15;U554.FC1504_PV.F_CV;0.121440880;100.0 +25/10/2020 02:06:16;U554.FC1504_PV.F_CV;0.124008745;100.0 +25/10/2020 02:06:17;U554.FC1504_PV.F_CV;0.118347414;100.0 +25/10/2020 02:06:18;U554.FC1504_PV.F_CV;0.121900924;100.0 +25/10/2020 02:06:19;U554.FC1504_PV.F_CV;0.122724697;100.0 +25/10/2020 02:06:21;U554.FC1504_PV.F_CV;0.122404985;100.0 +25/10/2020 02:06:23;U554.FC1504_PV.F_CV;0.120541297;100.0 +25/10/2020 02:06:24;U554.FC1504_PV.F_CV;0.124975421;100.0 +25/10/2020 02:06:25;U554.FC1504_PV.F_CV;0.122222960;100.0 +25/10/2020 02:06:26;U554.FC1504_PV.F_CV;0.123026684;100.0 +25/10/2020 02:06:27;U554.FC1504_PV.F_CV;0.122193761;100.0 +25/10/2020 02:06:28;U554.FC1504_PV.F_CV;0.119802475;100.0 +25/10/2020 02:06:29;U554.FC1504_PV.F_CV;0.122545101;100.0 +25/10/2020 02:06:30;U554.FC1504_PV.F_CV;0.123918489;100.0 +25/10/2020 02:06:31;U554.FC1504_PV.F_CV;0.122088075;100.0 +25/10/2020 02:06:32;U554.FC1504_PV.F_CV;0.121378519;100.0 +25/10/2020 02:06:33;U554.FC1504_PV.F_CV;0.126347125;100.0 +25/10/2020 02:06:34;U554.FC1504_PV.F_CV;0.125524402;100.0 +25/10/2020 02:06:35;U554.FC1504_PV.F_CV;0.121455424;100.0 +25/10/2020 02:06:36;U554.FC1504_PV.F_CV;0.123009525;100.0 +25/10/2020 02:06:37;U554.FC1504_PV.F_CV;0.125276610;100.0 +25/10/2020 02:06:39;U554.FC1504_PV.F_CV;0.123017743;100.0 +25/10/2020 02:06:40;U554.FC1504_PV.F_CV;0.120064393;100.0 +25/10/2020 02:06:41;U554.FC1504_PV.F_CV;0.116432041;100.0 +25/10/2020 02:06:42;U554.FC1504_PV.F_CV;0.124028206;100.0 +25/10/2020 02:06:43;U554.FC1504_PV.F_CV;0.127430290;100.0 +25/10/2020 02:06:44;U554.FC1504_PV.F_CV;0.121493086;100.0 +25/10/2020 02:06:45;U554.FC1504_PV.F_CV;0.120857291;100.0 +25/10/2020 02:06:46;U554.FC1504_PV.F_CV;0.123583242;100.0 +25/10/2020 02:06:47;U554.FC1504_PV.F_CV;0.123884417;100.0 +25/10/2020 02:06:48;U554.FC1504_PV.F_CV;0.121440187;100.0 +25/10/2020 02:06:50;U554.FC1504_PV.F_CV;0.122478925;100.0 +25/10/2020 02:06:51;U554.FC1504_PV.F_CV;0.125042796;100.0 +25/10/2020 02:06:52;U554.FC1504_PV.F_CV;0.120065302;100.0 +25/10/2020 02:06:53;U554.FC1504_PV.F_CV;0.124611229;100.0 +25/10/2020 02:06:54;U554.FC1504_PV.F_CV;0.123162009;100.0 +25/10/2020 02:06:55;U554.FC1504_PV.F_CV;0.123781554;100.0 +25/10/2020 02:06:56;U554.FC1504_PV.F_CV;0.121511459;100.0 +25/10/2020 02:06:57;U554.FC1504_PV.F_CV;0.117686599;100.0 +25/10/2020 02:06:58;U554.FC1504_PV.F_CV;0.121984325;100.0 +25/10/2020 02:06:59;U554.FC1504_PV.F_CV;0.116588473;100.0 +25/10/2020 02:06:46;U554.FC1504_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC1505_PV.F_CV;0.002101344;100.0 +25/10/2020 02:06:46;U554.FC1505_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC1506_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC1507_PV.F_CV;0.010092892;100.0 +25/10/2020 02:06:13;U554.FC1531_PV.F_CV;0.001298705;100.0 +25/10/2020 02:06:18;U554.FC1531_PV.F_CV;0.001610216;100.0 +25/10/2020 02:06:22;U554.FC1531_PV.F_CV;0.001352241;100.0 +25/10/2020 02:06:38;U554.FC1531_PV.F_CV;0.001635274;100.0 +25/10/2020 02:06:41;U554.FC1531_PV.F_CV;0.001356432;100.0 +25/10/2020 02:06:46;U554.FC1531_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U554.FC1532_PV.F_CV;0.062910527;100.0 +25/10/2020 02:06:01;U554.FC1532_PV.F_CV;0.061516955;100.0 +25/10/2020 02:06:03;U554.FC1532_PV.F_CV;0.064418487;100.0 +25/10/2020 02:06:04;U554.FC1532_PV.F_CV;0.062783226;100.0 +25/10/2020 02:06:07;U554.FC1532_PV.F_CV;0.061124694;100.0 +25/10/2020 02:06:10;U554.FC1532_PV.F_CV;0.061951317;100.0 +25/10/2020 02:06:11;U554.FC1532_PV.F_CV;0.065873884;100.0 +25/10/2020 02:06:12;U554.FC1532_PV.F_CV;0.062891856;100.0 +25/10/2020 02:06:13;U554.FC1532_PV.F_CV;0.061382566;100.0 +25/10/2020 02:06:14;U554.FC1532_PV.F_CV;0.063288949;100.0 +25/10/2020 02:06:15;U554.FC1532_PV.F_CV;0.063714534;100.0 +25/10/2020 02:06:16;U554.FC1532_PV.F_CV;0.066693835;100.0 +25/10/2020 02:06:17;U554.FC1532_PV.F_CV;0.064465053;100.0 +25/10/2020 02:06:20;U554.FC1532_PV.F_CV;0.059912693;100.0 +25/10/2020 02:06:21;U554.FC1532_PV.F_CV;0.063412435;100.0 +25/10/2020 02:06:22;U554.FC1532_PV.F_CV;0.060482215;100.0 +25/10/2020 02:06:23;U554.FC1532_PV.F_CV;0.063729845;100.0 +25/10/2020 02:06:24;U554.FC1532_PV.F_CV;0.063451074;100.0 +25/10/2020 02:06:26;U554.FC1532_PV.F_CV;0.065182872;100.0 +25/10/2020 02:06:28;U554.FC1532_PV.F_CV;0.066404201;100.0 +25/10/2020 02:06:29;U554.FC1532_PV.F_CV;0.064859301;100.0 +25/10/2020 02:06:30;U554.FC1532_PV.F_CV;0.064090125;100.0 +25/10/2020 02:06:31;U554.FC1532_PV.F_CV;0.066570930;100.0 +25/10/2020 02:06:32;U554.FC1532_PV.F_CV;0.063659571;100.0 +25/10/2020 02:06:33;U554.FC1532_PV.F_CV;0.061719380;100.0 +25/10/2020 02:06:34;U554.FC1532_PV.F_CV;0.062114783;100.0 +25/10/2020 02:06:35;U554.FC1532_PV.F_CV;0.066321753;100.0 +25/10/2020 02:06:36;U554.FC1532_PV.F_CV;0.063997738;100.0 +25/10/2020 02:06:37;U554.FC1532_PV.F_CV;0.064460337;100.0 +25/10/2020 02:06:38;U554.FC1532_PV.F_CV;0.062825494;100.0 +25/10/2020 02:06:39;U554.FC1532_PV.F_CV;0.064965360;100.0 +25/10/2020 02:06:40;U554.FC1532_PV.F_CV;0.064018771;100.0 +25/10/2020 02:06:42;U554.FC1532_PV.F_CV;0.062961712;100.0 +25/10/2020 02:06:43;U554.FC1532_PV.F_CV;0.061988831;100.0 +25/10/2020 02:06:44;U554.FC1532_PV.F_CV;0.063409664;100.0 +25/10/2020 02:06:46;U554.FC1532_PV.F_CV;0.064885721;100.0 +25/10/2020 02:06:48;U554.FC1532_PV.F_CV;0.060598545;100.0 +25/10/2020 02:06:49;U554.FC1532_PV.F_CV;0.064556234;100.0 +25/10/2020 02:06:50;U554.FC1532_PV.F_CV;0.065594234;100.0 +25/10/2020 02:06:51;U554.FC1532_PV.F_CV;0.063584030;100.0 +25/10/2020 02:06:54;U554.FC1532_PV.F_CV;0.064739972;100.0 +25/10/2020 02:06:55;U554.FC1532_PV.F_CV;0.064251028;100.0 +25/10/2020 02:06:57;U554.FC1532_PV.F_CV;0.061978947;100.0 +25/10/2020 02:06:58;U554.FC1532_PV.F_CV;0.060438320;100.0 +25/10/2020 02:06:59;U554.FC1532_PV.F_CV;0.066565841;100.0 +25/10/2020 02:06:46;U554.FC1532_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC1533_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC1533_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC1534_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC1534_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC1535_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC1535_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC1536_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC1536_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC1537_PV.F_CV;0.000117634;100.0 +25/10/2020 02:06:46;U554.FC1537_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U554.FC1538_PV.F_CV;0.012829215;100.0 +25/10/2020 02:06:09;U554.FC1539_PV.F_CV;-24.210857391;100.0 +25/10/2020 02:06:10;U554.FC1539_PV.F_CV;-24.208463669;100.0 +25/10/2020 02:06:11;U554.FC1539_PV.F_CV;-24.210882187;100.0 +25/10/2020 02:06:22;U554.FC1539_PV.F_CV;-24.210092545;100.0 +25/10/2020 02:06:23;U554.FC1539_PV.F_CV;-24.210886002;100.0 +25/10/2020 02:06:44;U554.FC1539_PV.F_CV;-24.210212708;100.0 +25/10/2020 02:06:45;U554.FC1539_PV.F_CV;-24.210876465;100.0 +25/10/2020 02:06:46;U554.FC1539_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC2501_PV.F_CV;0.000000029;100.0 +25/10/2020 02:06:46;U554.FC2501_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC2502_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC2502_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC2503_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC2503_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U554.FC2504_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC2504_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC2505_PV.F_CV;0.001353467;100.0 +25/10/2020 02:06:46;U554.FC2505_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC3501_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC3501_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC3502_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC3502_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC3503_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC3503_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC3504_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FC3505_PV.F_CV;0.000000433;100.0 +25/10/2020 02:06:46;U554.FI1001.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U554.FI1511.F_CV;0.042785153;100.0 +25/10/2020 02:06:46;U554.FI1512.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI1513.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI1515.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI1520.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI1521.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI1522.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI1523.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI1524.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI1525.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI1526.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI2002.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FI2511.F_CV;1.619303107;100.0 +25/10/2020 02:06:46;U554.FI2512.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI2513.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI2515.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI2520.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI2521.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI2522.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI2523.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI2524.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI2525.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI2526.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI3002.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FI3511.F_CV;0.294873118;100.0 +25/10/2020 02:06:46;U554.FI3512.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI3513.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI3515.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI3520.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI3521.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI3522.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI3523.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI3524.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI3525.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FI3526.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ1001.F_CV;39904.000000000;100.0 +25/10/2020 02:06:46;U554.FQ1003.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.FQ1501.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ1502.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ1503.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ1504.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ1505.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ1511.F_CV;455.000000000;100.0 +25/10/2020 02:06:46;U554.FQ1512.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ1513.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ1515.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ1520.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ1521.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ1522.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ1523.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ1524.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ1525.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ1526.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ1531.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ1532.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ1533.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ1534.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ1535.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ1536.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ1537.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ1539.F_CV;2.000000000;100.0 +25/10/2020 02:06:46;U554.FQ2002.F_CV;1.000000000;100.0 +25/10/2020 02:06:46;U554.FQ2501.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ2502.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ2503.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ2504.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ2505.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ2511.F_CV;1960.000000000;100.0 +25/10/2020 02:06:46;U554.FQ2512.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ2513.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ2515.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ2520.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ2521.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ2522.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ2523.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ2524.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ2525.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ2526.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ3002.F_CV;3.000000000;100.0 +25/10/2020 02:06:46;U554.FQ3501.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ3502.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ3503.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ3504.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ3505.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ3511.F_CV;463.000000000;100.0 +25/10/2020 02:06:46;U554.FQ3512.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ3513.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ3515.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ3520.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ3521.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ3522.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ3523.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ3524.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ3525.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.FQ3526.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.LC1001_PV.F_CV;0.129812956;100.0 +25/10/2020 02:06:46;U554.LC1002.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.LI1001.F_CV;0.064906478;100.0 +25/10/2020 02:06:46;U554.LI2001.F_CV;-0.006154180;100.0 +25/10/2020 02:06:46;U554.LI3001.F_CV;-0.054144859;100.0 +25/10/2020 02:06:46;U554.LXH1002.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.LXL1002.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.LY1001.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.LY2001.F_CV;-0.012308359;100.0 +25/10/2020 02:06:46;U554.LY3001.F_CV;-0.108289719;100.0 +25/10/2020 02:06:36;U554.PC1002_PV.F_CV;994.738586426;100.0 +25/10/2020 02:06:46;U554.PC1022_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.PC1022_PV.F_CV;994.927185059;100.0 +25/10/2020 02:06:46;U554.PC2002_PV.F_CV;995.105957031;100.0 +25/10/2020 02:06:46;U554.PC3002_PV.F_CV;995.937133789;100.0 +25/10/2020 02:06:46;U554.PDC1007_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.PDC1007_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.PDC1007_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.PDC2007_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.PDC2007_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.PDC2007_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.PDC3007_OP.F_CV;2.000000000;100.0 +25/10/2020 02:06:46;U554.PDC3007_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.PDC3007_SP.F_CV;15.000000000;100.0 +25/10/2020 02:06:56;U554.PDI1001.F_CV;-0.512216985;100.0 +25/10/2020 02:06:46;U554.PDI1003.F_CV;-0.450080633;100.0 +25/10/2020 02:06:00;U554.PDI1004.F_CV;-0.265683234;100.0 +25/10/2020 02:06:46;U554.PDI1006.F_CV;0.385803223;100.0 +25/10/2020 02:06:17;U554.PDI1007.F_CV;0.047796965;100.0 +25/10/2020 02:06:42;U554.PDI1008.F_CV;0.402295589;100.0 +25/10/2020 02:06:05;U554.PDI1009.F_CV;0.187468529;100.0 +25/10/2020 02:06:31;U554.PDI1014.F_CV;0.938140869;100.0 +25/10/2020 02:06:48;U554.PDI1017.F_CV;0.139349699;100.0 +25/10/2020 02:06:46;U554.PDI1026.F_CV;-2.906918526;100.0 +25/10/2020 02:06:01;U554.PDI2001.F_CV;0.095218420;100.0 +25/10/2020 02:06:46;U554.PDI2003.F_CV;-0.371405482;100.0 +25/10/2020 02:06:46;U554.PDI2006.F_CV;0.200820923;100.0 +25/10/2020 02:06:46;U554.PDI2007.F_CV;-0.047691166;100.0 +25/10/2020 02:06:14;U554.PDI2008.F_CV;-0.185731053;100.0 +25/10/2020 02:06:43;U554.PDI2009.F_CV;-0.006094575;100.0 +25/10/2020 02:06:46;U554.PDI3001.F_CV;0.165393949;100.0 +25/10/2020 02:06:46;U554.PDI3003.F_CV;0.061929226;100.0 +25/10/2020 02:06:46;U554.PDI3006.F_CV;0.234062195;100.0 +25/10/2020 02:06:13;U554.PDI3008.F_CV;-0.078043342;100.0 +25/10/2020 02:06:23;U554.PDI3009.F_CV;-0.054141134;100.0 +25/10/2020 02:06:42;U554.PDI3026.F_CV;1.474916935;100.0 +25/10/2020 02:06:46;U554.PI1002.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.PI1005.F_CV;988.971130371;100.0 +25/10/2020 02:06:46;U554.PI1010.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;U554.PI1012.F_CV;993.977539063;100.0 +25/10/2020 02:06:01;U554.PI1012.F_CV;993.901733398;100.0 +25/10/2020 02:06:02;U554.PI1012.F_CV;993.993774414;100.0 +25/10/2020 02:06:03;U554.PI1012.F_CV;993.961242676;100.0 +25/10/2020 02:06:04;U554.PI1012.F_CV;993.945007324;100.0 +25/10/2020 02:06:06;U554.PI1012.F_CV;993.966674805;100.0 +25/10/2020 02:06:07;U554.PI1012.F_CV;993.945007324;100.0 +25/10/2020 02:06:08;U554.PI1012.F_CV;993.950378418;100.0 +25/10/2020 02:06:09;U554.PI1012.F_CV;993.972045898;100.0 +25/10/2020 02:06:10;U554.PI1012.F_CV;993.966674805;100.0 +25/10/2020 02:06:12;U554.PI1012.F_CV;993.982910156;100.0 +25/10/2020 02:06:14;U554.PI1012.F_CV;994.004577637;100.0 +25/10/2020 02:06:15;U554.PI1012.F_CV;993.950378418;100.0 +25/10/2020 02:06:16;U554.PI1012.F_CV;993.966674805;100.0 +25/10/2020 02:06:17;U554.PI1012.F_CV;993.950378418;100.0 +25/10/2020 02:06:18;U554.PI1012.F_CV;993.945007324;100.0 +25/10/2020 02:06:19;U554.PI1012.F_CV;993.955871582;100.0 +25/10/2020 02:06:22;U554.PI1012.F_CV;993.950378418;100.0 +25/10/2020 02:06:23;U554.PI1012.F_CV;993.934143066;100.0 +25/10/2020 02:06:24;U554.PI1012.F_CV;993.955871582;100.0 +25/10/2020 02:06:25;U554.PI1012.F_CV;993.945007324;100.0 +25/10/2020 02:06:27;U554.PI1012.F_CV;993.982910156;100.0 +25/10/2020 02:06:28;U554.PI1012.F_CV;993.939636230;100.0 +25/10/2020 02:06:29;U554.PI1012.F_CV;993.880004883;100.0 +25/10/2020 02:06:30;U554.PI1012.F_CV;993.945007324;100.0 +25/10/2020 02:06:31;U554.PI1012.F_CV;993.961242676;100.0 +25/10/2020 02:06:33;U554.PI1012.F_CV;993.917968750;100.0 +25/10/2020 02:06:34;U554.PI1012.F_CV;993.988403320;100.0 +25/10/2020 02:06:35;U554.PI1012.F_CV;993.955871582;100.0 +25/10/2020 02:06:36;U554.PI1012.F_CV;993.972045898;100.0 +25/10/2020 02:06:37;U554.PI1012.F_CV;993.945007324;100.0 +25/10/2020 02:06:38;U554.PI1012.F_CV;993.939636230;100.0 +25/10/2020 02:06:39;U554.PI1012.F_CV;993.961242676;100.0 +25/10/2020 02:06:41;U554.PI1012.F_CV;993.945007324;100.0 +25/10/2020 02:06:43;U554.PI1012.F_CV;993.988403320;100.0 +25/10/2020 02:06:44;U554.PI1012.F_CV;993.982910156;100.0 +25/10/2020 02:06:45;U554.PI1012.F_CV;993.945007324;100.0 +25/10/2020 02:06:46;U554.PI1012.F_CV;993.934143066;100.0 +25/10/2020 02:06:48;U554.PI1012.F_CV;993.988403320;100.0 +25/10/2020 02:06:49;U554.PI1012.F_CV;993.912475586;100.0 +25/10/2020 02:06:50;U554.PI1012.F_CV;993.928771973;100.0 +25/10/2020 02:06:52;U554.PI1012.F_CV;993.988403320;100.0 +25/10/2020 02:06:54;U554.PI1012.F_CV;993.977539063;100.0 +25/10/2020 02:06:55;U554.PI1012.F_CV;993.961242676;100.0 +25/10/2020 02:06:57;U554.PI1012.F_CV;993.977539063;100.0 +25/10/2020 02:06:58;U554.PI1012.F_CV;993.982910156;100.0 +25/10/2020 02:06:59;U554.PI1012.F_CV;993.928771973;100.0 +25/10/2020 02:06:46;U554.PI2002.F_CV;0.000000000;0.0 +25/10/2020 02:06:01;U554.PI2010.F_CV;996.582519531;100.0 +25/10/2020 02:06:02;U554.PI2010.F_CV;996.432128906;100.0 +25/10/2020 02:06:03;U554.PI2010.F_CV;996.460571289;100.0 +25/10/2020 02:06:04;U554.PI2010.F_CV;996.440307617;100.0 +25/10/2020 02:06:05;U554.PI2010.F_CV;996.452453613;100.0 +25/10/2020 02:06:06;U554.PI2010.F_CV;996.468750000;100.0 +25/10/2020 02:06:07;U554.PI2010.F_CV;996.606933594;100.0 +25/10/2020 02:06:08;U554.PI2010.F_CV;996.489013672;100.0 +25/10/2020 02:06:09;U554.PI2010.F_CV;996.440307617;100.0 +25/10/2020 02:06:10;U554.PI2010.F_CV;996.513427734;100.0 +25/10/2020 02:06:11;U554.PI2010.F_CV;996.387390137;100.0 +25/10/2020 02:06:12;U554.PI2010.F_CV;996.517517090;100.0 +25/10/2020 02:06:13;U554.PI2010.F_CV;996.472717285;100.0 +25/10/2020 02:06:14;U554.PI2010.F_CV;996.521545410;100.0 +25/10/2020 02:06:15;U554.PI2010.F_CV;996.460571289;100.0 +25/10/2020 02:06:16;U554.PI2010.F_CV;996.517517090;100.0 +25/10/2020 02:06:17;U554.PI2010.F_CV;996.444335938;100.0 +25/10/2020 02:06:18;U554.PI2010.F_CV;996.517517090;100.0 +25/10/2020 02:06:19;U554.PI2010.F_CV;996.460571289;100.0 +25/10/2020 02:06:21;U554.PI2010.F_CV;996.509399414;100.0 +25/10/2020 02:06:22;U554.PI2010.F_CV;996.472717285;100.0 +25/10/2020 02:06:23;U554.PI2010.F_CV;996.444335938;100.0 +25/10/2020 02:06:24;U554.PI2010.F_CV;996.509399414;100.0 +25/10/2020 02:06:25;U554.PI2010.F_CV;996.456481934;100.0 +25/10/2020 02:06:26;U554.PI2010.F_CV;996.505310059;100.0 +25/10/2020 02:06:27;U554.PI2010.F_CV;996.513427734;100.0 +25/10/2020 02:06:28;U554.PI2010.F_CV;996.424011230;100.0 +25/10/2020 02:06:29;U554.PI2010.F_CV;996.436157227;100.0 +25/10/2020 02:06:30;U554.PI2010.F_CV;996.509399414;100.0 +25/10/2020 02:06:31;U554.PI2010.F_CV;996.501281738;100.0 +25/10/2020 02:06:32;U554.PI2010.F_CV;996.509399414;100.0 +25/10/2020 02:06:33;U554.PI2010.F_CV;996.395507813;100.0 +25/10/2020 02:06:34;U554.PI2010.F_CV;996.432128906;100.0 +25/10/2020 02:06:35;U554.PI2010.F_CV;996.505310059;100.0 +25/10/2020 02:06:36;U554.PI2010.F_CV;996.338623047;100.0 +25/10/2020 02:06:37;U554.PI2010.F_CV;996.484985352;100.0 +25/10/2020 02:06:38;U554.PI2010.F_CV;996.493103027;100.0 +25/10/2020 02:06:39;U554.PI2010.F_CV;996.424011230;100.0 +25/10/2020 02:06:41;U554.PI2010.F_CV;996.541870117;100.0 +25/10/2020 02:06:42;U554.PI2010.F_CV;996.407775879;100.0 +25/10/2020 02:06:43;U554.PI2010.F_CV;996.432128906;100.0 +25/10/2020 02:06:44;U554.PI2010.F_CV;996.549987793;100.0 +25/10/2020 02:06:45;U554.PI2010.F_CV;996.598815918;100.0 +25/10/2020 02:06:46;U554.PI2010.F_CV;996.541870117;100.0 +25/10/2020 02:06:47;U554.PI2010.F_CV;996.521545410;100.0 +25/10/2020 02:06:48;U554.PI2010.F_CV;996.415893555;100.0 +25/10/2020 02:06:49;U554.PI2010.F_CV;996.448364258;100.0 +25/10/2020 02:06:50;U554.PI2010.F_CV;996.444335938;100.0 +25/10/2020 02:06:51;U554.PI2010.F_CV;996.606933594;100.0 +25/10/2020 02:06:52;U554.PI2010.F_CV;996.371154785;100.0 +25/10/2020 02:06:53;U554.PI2010.F_CV;996.419921875;100.0 +25/10/2020 02:06:54;U554.PI2010.F_CV;996.493103027;100.0 +25/10/2020 02:06:55;U554.PI2010.F_CV;996.440307617;100.0 +25/10/2020 02:06:56;U554.PI2010.F_CV;996.533691406;100.0 +25/10/2020 02:06:57;U554.PI2010.F_CV;996.586669922;100.0 +25/10/2020 02:06:58;U554.PI2010.F_CV;996.399597168;100.0 +25/10/2020 02:06:59;U554.PI2010.F_CV;996.452453613;100.0 +25/10/2020 02:06:46;U554.PI3002.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;U554.PI3010.F_CV;995.070068359;100.0 +25/10/2020 02:06:01;U554.PI3010.F_CV;995.066040039;100.0 +25/10/2020 02:06:02;U554.PI3010.F_CV;995.021423340;100.0 +25/10/2020 02:06:03;U554.PI3010.F_CV;995.049743652;100.0 +25/10/2020 02:06:05;U554.PI3010.F_CV;995.082214355;100.0 +25/10/2020 02:06:06;U554.PI3010.F_CV;995.021423340;100.0 +25/10/2020 02:06:07;U554.PI3010.F_CV;995.053833008;100.0 +25/10/2020 02:06:08;U554.PI3010.F_CV;995.066040039;100.0 +25/10/2020 02:06:09;U554.PI3010.F_CV;995.029541016;100.0 +25/10/2020 02:06:11;U554.PI3010.F_CV;995.025451660;100.0 +25/10/2020 02:06:12;U554.PI3010.F_CV;995.021423340;100.0 +25/10/2020 02:06:13;U554.PI3010.F_CV;995.049743652;100.0 +25/10/2020 02:06:14;U554.PI3010.F_CV;995.082214355;100.0 +25/10/2020 02:06:15;U554.PI3010.F_CV;995.090332031;100.0 +25/10/2020 02:06:16;U554.PI3010.F_CV;995.094360352;100.0 +25/10/2020 02:06:17;U554.PI3010.F_CV;995.029541016;100.0 +25/10/2020 02:06:18;U554.PI3010.F_CV;995.045715332;100.0 +25/10/2020 02:06:19;U554.PI3010.F_CV;995.049743652;100.0 +25/10/2020 02:06:20;U554.PI3010.F_CV;995.021423340;100.0 +25/10/2020 02:06:21;U554.PI3010.F_CV;994.984924316;100.0 +25/10/2020 02:06:22;U554.PI3010.F_CV;995.025451660;100.0 +25/10/2020 02:06:23;U554.PI3010.F_CV;995.041687012;100.0 +25/10/2020 02:06:24;U554.PI3010.F_CV;995.017395020;100.0 +25/10/2020 02:06:25;U554.PI3010.F_CV;995.053833008;100.0 +25/10/2020 02:06:26;U554.PI3010.F_CV;995.001098633;100.0 +25/10/2020 02:06:27;U554.PI3010.F_CV;995.037597656;100.0 +25/10/2020 02:06:28;U554.PI3010.F_CV;995.045715332;100.0 +25/10/2020 02:06:29;U554.PI3010.F_CV;994.972778320;100.0 +25/10/2020 02:06:30;U554.PI3010.F_CV;995.045715332;100.0 +25/10/2020 02:06:31;U554.PI3010.F_CV;995.062011719;100.0 +25/10/2020 02:06:32;U554.PI3010.F_CV;995.070068359;100.0 +25/10/2020 02:06:33;U554.PI3010.F_CV;995.013244629;100.0 +25/10/2020 02:06:34;U554.PI3010.F_CV;995.049743652;100.0 +25/10/2020 02:06:35;U554.PI3010.F_CV;995.041687012;100.0 +25/10/2020 02:06:36;U554.PI3010.F_CV;995.049743652;100.0 +25/10/2020 02:06:38;U554.PI3010.F_CV;995.013244629;100.0 +25/10/2020 02:06:39;U554.PI3010.F_CV;995.009216309;100.0 +25/10/2020 02:06:40;U554.PI3010.F_CV;995.070068359;100.0 +25/10/2020 02:06:41;U554.PI3010.F_CV;994.992980957;100.0 +25/10/2020 02:06:45;U554.PI3010.F_CV;995.049743652;100.0 +25/10/2020 02:06:46;U554.PI3010.F_CV;995.021423340;100.0 +25/10/2020 02:06:47;U554.PI3010.F_CV;995.086303711;100.0 +25/10/2020 02:06:48;U554.PI3010.F_CV;994.980834961;100.0 +25/10/2020 02:06:49;U554.PI3010.F_CV;995.033569336;100.0 +25/10/2020 02:06:50;U554.PI3010.F_CV;995.082214355;100.0 +25/10/2020 02:06:51;U554.PI3010.F_CV;994.976806641;100.0 +25/10/2020 02:06:52;U554.PI3010.F_CV;995.070068359;100.0 +25/10/2020 02:06:53;U554.PI3010.F_CV;995.021423340;100.0 +25/10/2020 02:06:54;U554.PI3010.F_CV;994.992980957;100.0 +25/10/2020 02:06:55;U554.PI3010.F_CV;995.005249023;100.0 +25/10/2020 02:06:57;U554.PI3010.F_CV;995.062011719;100.0 +25/10/2020 02:06:58;U554.PI3010.F_CV;995.021423340;100.0 +25/10/2020 02:06:59;U554.PI3010.F_CV;995.025451660;100.0 +25/10/2020 02:06:46;U554.PV1013.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.SI1003.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC1001_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC1001_PV.F_CV;18.595338821;100.0 +25/10/2020 02:06:46;U554.TC1001_SP.F_CV;200.000000000;100.0 +25/10/2020 02:06:46;U554.TC1005_OP.F_CV;2.000000000;100.0 +25/10/2020 02:06:46;U554.TC1005_PV.F_CV;18.707803726;100.0 +25/10/2020 02:06:46;U554.TC1005_SP.F_CV;600.000000000;100.0 +25/10/2020 02:06:46;U554.TC1007_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC1007_PV.F_CV;18.644922256;100.0 +25/10/2020 02:06:46;U554.TC1007_SP.F_CV;450.000000000;100.0 +25/10/2020 02:06:46;U554.TC1008_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC1008_PV.F_CV;18.995342255;100.0 +25/10/2020 02:06:46;U554.TC1008_SP.F_CV;150.000000000;100.0 +25/10/2020 02:06:46;U554.TC1009_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC1009_PV.F_CV;19.190391541;100.0 +25/10/2020 02:06:46;U554.TC1009_SP.F_CV;200.000000000;100.0 +25/10/2020 02:06:46;U554.TC1010_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U554.TC1010_PV.F_CV;18.907438278;100.0 +25/10/2020 02:06:46;U554.TC1010_SP.F_CV;25.890987396;100.0 +25/10/2020 02:06:46;U554.TC1012_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC1012_PV.F_CV;18.725381851;100.0 +25/10/2020 02:06:46;U554.TC1012_SP.F_CV;26.978734970;100.0 +25/10/2020 02:06:40;U554.TC1015_PV.F_CV;20.010375977;100.0 +25/10/2020 02:06:38;U554.TC1016_PV.F_CV;19.181365967;100.0 +25/10/2020 02:06:46;U554.TC1020_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC1020_PV.F_CV;19.743465424;100.0 +25/10/2020 02:06:46;U554.TC1020_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC1021_PV.F_CV;18.954872131;100.0 +25/10/2020 02:06:46;U554.TC1022_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC1022_PV.F_CV;19.798416138;100.0 +25/10/2020 02:06:46;U554.TC1022_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC1501_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U554.TC1501_PV.F_CV;19.247873306;100.0 +25/10/2020 02:06:17;U554.TC1501_PV.F_CV;19.145660400;100.0 +25/10/2020 02:06:23;U554.TC1501_PV.F_CV;19.258939743;100.0 +25/10/2020 02:06:33;U554.TC1501_PV.F_CV;19.153223038;100.0 +25/10/2020 02:06:46;U554.TC1501_SP.F_CV;59.840473175;100.0 +25/10/2020 02:06:46;U554.TC2001_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U554.TC2001_PV.F_CV;18.877376556;100.0 +25/10/2020 02:06:46;U554.TC2001_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC2005_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC2005_PV.F_CV;19.114755630;100.0 +25/10/2020 02:06:46;U554.TC2005_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC2007_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC2007_PV.F_CV;19.204980850;100.0 +25/10/2020 02:06:46;U554.TC2007_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC2008_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC2008_PV.F_CV;18.843416214;100.0 +25/10/2020 02:06:46;U554.TC2008_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC2009_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC2009_PV.F_CV;19.157876968;100.0 +25/10/2020 02:06:46;U554.TC2009_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC2010_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC2010_PV.F_CV;18.921264648;100.0 +25/10/2020 02:06:46;U554.TC2010_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC2012_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC2012_PV.F_CV;18.218036652;100.0 +25/10/2020 02:06:46;U554.TC2012_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC3001_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC3001_PV.F_CV;19.187700272;100.0 +25/10/2020 02:06:46;U554.TC3001_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC3005_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC3005_PV.F_CV;19.360347748;100.0 +25/10/2020 02:06:46;U554.TC3005_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC3007_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC3007_PV.F_CV;19.267614365;100.0 +25/10/2020 02:06:46;U554.TC3007_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC3008_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TC3008_PV.F_CV;19.120674133;100.0 +25/10/2020 02:06:46;U554.TC3008_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U554.TI1002.F_CV;19.260040283;100.0 +25/10/2020 02:06:46;U554.TI1003.F_CV;19.217378616;100.0 +25/10/2020 02:06:46;U554.TI1004.F_CV;19.138841629;100.0 +25/10/2020 02:06:46;U554.TI1005.F_CV;18.707803726;100.0 +25/10/2020 02:06:46;U554.TI1006.F_CV;19.133222580;100.0 +25/10/2020 02:06:46;U554.TI1009.F_CV;0.000000000;0.0 +25/10/2020 02:06:11;U554.TI1011.F_CV;18.306798935;100.0 +25/10/2020 02:06:46;U554.TI1019.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.TI1023.F_CV;18.866102219;100.0 +25/10/2020 02:06:46;U554.TI1101.F_CV;18.745723724;100.0 +25/10/2020 02:06:46;U554.TI1105.F_CV;18.845109940;100.0 +25/10/2020 02:06:46;U554.TI1107.F_CV;18.795726776;100.0 +25/10/2020 02:06:46;U554.TI1108.F_CV;19.531703949;100.0 +25/10/2020 02:06:46;U554.TI1109.F_CV;19.605575562;100.0 +25/10/2020 02:06:09;U554.TI1110.F_CV;19.589372635;100.0 +25/10/2020 02:06:46;U554.TI1112.F_CV;18.920383453;100.0 +25/10/2020 02:06:46;U554.TI1120.F_CV;19.559444427;100.0 +25/10/2020 02:06:46;U554.TI1202.F_CV;19.263475418;100.0 +25/10/2020 02:06:46;U554.TI1205.F_CV;18.414461136;100.0 +25/10/2020 02:06:48;U554.TI1531.F_CV;19.029531479;100.0 +25/10/2020 02:06:48;U554.TI1601.F_CV;19.658344269;100.0 +25/10/2020 02:06:46;U554.TI2002.F_CV;19.206558228;100.0 +25/10/2020 02:06:46;U554.TI2003.F_CV;19.260814667;100.0 +25/10/2020 02:06:46;U554.TI2004.F_CV;19.430206299;100.0 +25/10/2020 02:06:46;U554.TI2005.F_CV;19.114755630;100.0 +25/10/2020 02:06:46;U554.TI2006.F_CV;19.542881012;100.0 +25/10/2020 02:06:46;U554.TI2009.F_CV;19.146448135;100.0 +25/10/2020 02:06:38;U554.TI2011.F_CV;18.420768738;100.0 +25/10/2020 02:06:39;U554.TI2011.F_CV;18.571510315;100.0 +25/10/2020 02:06:45;U554.TI2011.F_CV;18.460710526;100.0 +25/10/2020 02:06:53;U554.TI2011.F_CV;18.602876663;100.0 +25/10/2020 02:06:56;U554.TI2011.F_CV;18.499137878;100.0 +25/10/2020 02:06:35;U554.TI2015.F_CV;18.101451874;100.0 +25/10/2020 02:06:37;U554.TI2015.F_CV;17.965049744;100.0 +25/10/2020 02:06:44;U554.TI2015.F_CV;18.078308105;100.0 +25/10/2020 02:06:49;U554.TI2015.F_CV;17.953159332;100.0 +25/10/2020 02:06:51;U554.TI2015.F_CV;18.060754776;100.0 +25/10/2020 02:06:46;U554.TI2019.F_CV;19.343954086;100.0 +25/10/2020 02:06:46;U554.TI2101.F_CV;19.075553894;100.0 +25/10/2020 02:06:46;U554.TI2105.F_CV;19.195312500;100.0 +25/10/2020 02:06:46;U554.TI2107.F_CV;19.474227905;100.0 +25/10/2020 02:06:46;U554.TI2108.F_CV;19.358839035;100.0 +25/10/2020 02:06:46;U554.TI2109.F_CV;19.537969589;100.0 +25/10/2020 02:06:46;U554.TI2110.F_CV;19.508720398;100.0 +25/10/2020 02:06:46;U554.TI2112.F_CV;18.602329254;100.0 +25/10/2020 02:06:46;U554.TI2202.F_CV;19.332698822;100.0 +25/10/2020 02:06:46;U554.TI2205.F_CV;18.930973053;100.0 +25/10/2020 02:06:46;U554.TI3002.F_CV;19.446649551;100.0 +25/10/2020 02:06:46;U554.TI3003.F_CV;19.374511719;100.0 +25/10/2020 02:06:46;U554.TI3004.F_CV;19.770776749;100.0 +25/10/2020 02:06:46;U554.TI3005.F_CV;19.360347748;100.0 +25/10/2020 02:06:46;U554.TI3006.F_CV;20.060266495;100.0 +25/10/2020 02:06:46;U554.TI3008.F_CV;19.120674133;100.0 +25/10/2020 02:06:46;U554.TI3018.F_CV;19.148099899;100.0 +25/10/2020 02:06:46;U554.TI3101.F_CV;19.575441360;100.0 +25/10/2020 02:06:46;U554.TI3105.F_CV;19.446676254;100.0 +25/10/2020 02:06:46;U554.TI3107.F_CV;19.665233612;100.0 +25/10/2020 02:06:46;U554.TI3108.F_CV;19.389385223;100.0 +25/10/2020 02:06:46;U554.TI3202.F_CV;19.678092957;100.0 +25/10/2020 02:06:46;U554.TI3205.F_CV;19.189361572;100.0 +25/10/2020 02:06:46;U554.TI4001.F_CV;1372.000000000;100.0 +25/10/2020 02:06:46;U554.TR01MOY.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.TR02MOY.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U554.TR03MOY.F_CV;0.000000000;0.0 +25/10/2020 02:06:11;U578.AI01_1_PV.F_CV;16854.728515625;100.0 +25/10/2020 02:06:12;U578.AI01_1_PV.F_CV;16890.896484375;100.0 +25/10/2020 02:06:13;U578.AI01_1_PV.F_CV;16854.728515625;100.0 +25/10/2020 02:06:16;U578.AI01_1_PV.F_CV;16890.896484375;100.0 +25/10/2020 02:06:17;U578.AI01_1_PV.F_CV;16854.728515625;100.0 +25/10/2020 02:06:35;U578.AI01_1_PV.F_CV;16854.728515625;100.0 +25/10/2020 02:06:36;U578.AI01_1_PV.F_CV;16890.896484375;100.0 +25/10/2020 02:06:37;U578.AI01_1_PV.F_CV;16854.728515625;100.0 +25/10/2020 02:06:41;U578.AI01_1_PV.F_CV;16890.896484375;100.0 +25/10/2020 02:06:42;U578.AI01_1_PV.F_CV;16854.728515625;100.0 +25/10/2020 02:06:44;U578.AI01_1_PV.F_CV;16890.896484375;100.0 +25/10/2020 02:06:45;U578.AI01_1_PV.F_CV;16854.728515625;100.0 +25/10/2020 02:06:49;U578.AI01_1_PV.F_CV;16890.896484375;100.0 +25/10/2020 02:06:50;U578.AI01_1_PV.F_CV;16854.728515625;100.0 +25/10/2020 02:06:53;U578.AI01_1_PV.F_CV;16890.896484375;100.0 +25/10/2020 02:06:54;U578.AI01_1_PV.F_CV;16854.728515625;100.0 +25/10/2020 02:06:35;U578.AI01_2_PV.F_CV;18.916378021;100.0 +25/10/2020 02:06:07;U578.Defaut_Automate_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.Emb_Th_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.F01_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.F02_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.F03_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.FC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.FC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.FC01_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.FC03_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.FC03_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.FC03_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.FT01_Def_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.FT02_RPT_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.FT02_SH_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.FT02_SL_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.FT03_Def_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.FT_Gaz_Instab_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.FT_Vap_Instab_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.HEV01_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.HEV02_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.HEV03_Out.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U578.HEV04_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.HEV05_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.HEV06_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.KAG1_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.KRE_Out.F_CV;1.000000000;100.0 +25/10/2020 02:06:07;U578.PDI02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.Porte_Ouv_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.Refroid_TTL_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.T_Gaz_SL_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.TC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.TC01_PV.F_CV;18.500000000;100.0 +25/10/2020 02:06:07;U578.TC01_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.TC02_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:12;U578.TC02_PV.F_CV;17.799999237;100.0 +25/10/2020 02:06:07;U578.TC02_SP.F_CV;180.000000000;100.0 +25/10/2020 02:06:07;U578.TC03_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U578.TC03_PV.F_CV;18.299999237;100.0 +25/10/2020 02:06:07;U578.TC03_SP.F_CV;100.000000000;100.0 +25/10/2020 02:06:07;U578.TC10_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.TC10_PV.F_CV;18.500000000;100.0 +25/10/2020 02:06:07;U578.TC10_SP.F_CV;27.350000381;100.0 +25/10/2020 02:06:07;U578.TE_Gaz_Instab_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.TI101_PV.F_CV;18.100000381;100.0 +25/10/2020 02:06:00;U578.TI102_PV.F_CV;17.399999619;100.0 +25/10/2020 02:06:56;U578.TI103_PV.F_CV;17.500000000;100.0 +25/10/2020 02:06:41;U578.TI11_PV.F_CV;17.799999237;100.0 +25/10/2020 02:06:56;U578.TI12_PV.F_CV;17.700000763;100.0 +25/10/2020 02:06:40;U578.TI13_PV.F_CV;17.600000381;100.0 +25/10/2020 02:06:07;U578.WI01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.WT01_Anorm_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.WT01_Def_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.WT01_Instab_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.WT01_Mq_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.XNP230_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.XNP380_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U578.Z02_TTL_Out.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U716.AI01_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:15;U716.AI02_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:15;U716.AI03_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:15;U716.AI04_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:15;U716.AI05_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:50;U716.AI06_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:50;U716.AI07_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:41;U716.FC01_PV.F_CV;1.156241655;100.0 +25/10/2020 02:06:38;U716.FC02_PV.F_CV;2.084514618;100.0 +25/10/2020 02:06:32;U716.FC03_PV.F_CV;-0.243518710;100.0 +25/10/2020 02:06:00;U716.FC04_PV.F_CV;0.284104139;100.0 +25/10/2020 02:06:01;U716.FC04_PV.F_CV;0.139601842;100.0 +25/10/2020 02:06:02;U716.FC04_PV.F_CV;0.197402775;100.0 +25/10/2020 02:06:06;U716.FC04_PV.F_CV;-0.033800922;100.0 +25/10/2020 02:06:07;U716.FC04_PV.F_CV;0.313004613;100.0 +25/10/2020 02:06:08;U716.FC04_PV.F_CV;0.052900463;100.0 +25/10/2020 02:06:10;U716.FC04_PV.F_CV;0.255203694;100.0 +25/10/2020 02:06:12;U716.FC04_PV.F_CV;0.110701382;100.0 +25/10/2020 02:06:16;U716.FC04_PV.F_CV;0.024000000;100.0 +25/10/2020 02:06:18;U716.FC04_PV.F_CV;0.226303250;100.0 +25/10/2020 02:06:22;U716.FC04_PV.F_CV;0.168502316;100.0 +25/10/2020 02:06:24;U716.FC04_PV.F_CV;-0.120502308;100.0 +25/10/2020 02:06:29;U716.FC04_PV.F_CV;0.255203694;100.0 +25/10/2020 02:06:31;U716.FC04_PV.F_CV;0.139601842;100.0 +25/10/2020 02:06:32;U716.FC04_PV.F_CV;0.197402775;100.0 +25/10/2020 02:06:34;U716.FC04_PV.F_CV;0.024000000;100.0 +25/10/2020 02:06:35;U716.FC04_PV.F_CV;0.168502316;100.0 +25/10/2020 02:06:37;U716.FC04_PV.F_CV;-0.091601849;100.0 +25/10/2020 02:06:39;U716.FC04_PV.F_CV;0.313004613;100.0 +25/10/2020 02:06:43;U716.FC04_PV.F_CV;0.110701382;100.0 +25/10/2020 02:06:49;U716.FC04_PV.F_CV;0.226303250;100.0 +25/10/2020 02:06:51;U716.FC04_PV.F_CV;0.081800923;100.0 +25/10/2020 02:06:55;U716.FC04_PV.F_CV;0.226303250;100.0 +25/10/2020 02:06:58;U716.FC04_PV.F_CV;0.110701382;100.0 +25/10/2020 02:06:03;U716.FC06_PV.F_CV;0.389200002;100.0 +25/10/2020 02:06:22;U716.FC07_PV.F_CV;1.187997222;100.0 +25/10/2020 02:06:17;U716.FQ05_PV.F_CV;3.453202009;100.0 +25/10/2020 02:06:00;U716.HEV01A.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U716.HEV01B.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U716.NUM_CYCLE.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U716.PI02_PV.F_CV;0.000289352;100.0 +25/10/2020 02:06:09;U716.PI15_PV.F_CV;0.997106493;100.0 +25/10/2020 02:06:06;U716.TC02_PV.F_CV;18.600000381;100.0 +25/10/2020 02:06:29;U716.TC02_PV.F_CV;18.700000763;100.0 +25/10/2020 02:06:57;U716.TC05_PV.F_CV;17.500000000;100.0 +25/10/2020 02:06:30;U716.TC08_PV.F_CV;17.500000000;100.0 +25/10/2020 02:06:20;U716.TI03_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:12;U716.TI04_PV.F_CV;18.600000381;100.0 +25/10/2020 02:06:13;U716.TI04_PV.F_CV;18.700000763;100.0 +25/10/2020 02:06:51;U716.TPS_INERTAGE1.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U716.TPS_INERTAGE2.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U716.TPS_OXYDATION.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U716.TPS_REDUCTION.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U737.FC01_57_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:39;U737.FC01_57_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:39;U737.FC01_57_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U737.FC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U737.FC01_PV.F_CV;0.194364563;100.0 +25/10/2020 02:06:02;U737.FC01_PV.F_CV;0.142041951;100.0 +25/10/2020 02:06:03;U737.FC01_PV.F_CV;0.183124393;100.0 +25/10/2020 02:06:04;U737.FC01_PV.F_CV;0.205293998;100.0 +25/10/2020 02:06:06;U737.FC01_PV.F_CV;0.155124456;100.0 +25/10/2020 02:06:07;U737.FC01_PV.F_CV;0.185891405;100.0 +25/10/2020 02:06:10;U737.FC01_PV.F_CV;0.144590512;100.0 +25/10/2020 02:06:11;U737.FC01_PV.F_CV;0.187175989;100.0 +25/10/2020 02:06:12;U737.FC01_PV.F_CV;0.210757270;100.0 +25/10/2020 02:06:13;U737.FC01_PV.F_CV;0.197255015;100.0 +25/10/2020 02:06:14;U737.FC01_PV.F_CV;0.166822493;100.0 +25/10/2020 02:06:15;U737.FC01_PV.F_CV;0.178558797;100.0 +25/10/2020 02:06:16;U737.FC01_PV.F_CV;0.206879631;100.0 +25/10/2020 02:06:17;U737.FC01_PV.F_CV;0.161572188;100.0 +25/10/2020 02:06:18;U737.FC01_PV.F_CV;0.143180341;100.0 +25/10/2020 02:06:20;U737.FC01_PV.F_CV;0.213650510;100.0 +25/10/2020 02:06:21;U737.FC01_PV.F_CV;0.166695327;100.0 +25/10/2020 02:06:23;U737.FC01_PV.F_CV;0.157077715;100.0 +25/10/2020 02:06:24;U737.FC01_PV.F_CV;0.199649930;100.0 +25/10/2020 02:06:25;U737.FC01_PV.F_CV;0.162265137;100.0 +25/10/2020 02:06:26;U737.FC01_PV.F_CV;0.145282552;100.0 +25/10/2020 02:06:28;U737.FC01_PV.F_CV;0.213832751;100.0 +25/10/2020 02:06:29;U737.FC01_PV.F_CV;0.167059660;100.0 +25/10/2020 02:06:30;U737.FC01_PV.F_CV;0.146630168;100.0 +25/10/2020 02:06:31;U737.FC01_PV.F_CV;0.185382575;100.0 +25/10/2020 02:06:34;U737.FC01_PV.F_CV;0.121021666;100.0 +25/10/2020 02:06:37;U737.FC01_PV.F_CV;0.189179480;100.0 +25/10/2020 02:06:38;U737.FC01_PV.F_CV;0.146061763;100.0 +25/10/2020 02:06:41;U737.FC01_PV.F_CV;0.183105290;100.0 +25/10/2020 02:06:42;U737.FC01_PV.F_CV;0.117121398;100.0 +25/10/2020 02:06:44;U737.FC01_PV.F_CV;0.153476819;100.0 +25/10/2020 02:06:46;U737.FC01_PV.F_CV;0.173192590;100.0 +25/10/2020 02:06:47;U737.FC01_PV.F_CV;0.133772939;100.0 +25/10/2020 02:06:49;U737.FC01_PV.F_CV;0.181064263;100.0 +25/10/2020 02:06:52;U737.FC01_PV.F_CV;0.124985844;100.0 +25/10/2020 02:06:53;U737.FC01_PV.F_CV;0.169206083;100.0 +25/10/2020 02:06:54;U737.FC01_PV.F_CV;0.130165949;100.0 +25/10/2020 02:06:57;U737.FC01_PV.F_CV;0.178064272;100.0 +25/10/2020 02:06:58;U737.FC01_PV.F_CV;0.139856398;100.0 +25/10/2020 02:06:39;U737.FC01_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U737.FC04_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U737.FC04_PV.F_CV;1.527612567;100.0 +25/10/2020 02:06:02;U737.FC04_PV.F_CV;0.067885756;100.0 +25/10/2020 02:06:03;U737.FC04_PV.F_CV;1.116973400;100.0 +25/10/2020 02:06:04;U737.FC04_PV.F_CV;1.681916833;100.0 +25/10/2020 02:06:06;U737.FC04_PV.F_CV;0.391184688;100.0 +25/10/2020 02:06:07;U737.FC04_PV.F_CV;1.196215391;100.0 +25/10/2020 02:06:10;U737.FC04_PV.F_CV;0.186350703;100.0 +25/10/2020 02:06:11;U737.FC04_PV.F_CV;1.258892536;100.0 +25/10/2020 02:06:12;U737.FC04_PV.F_CV;1.864558339;100.0 +25/10/2020 02:06:13;U737.FC04_PV.F_CV;1.577105284;100.0 +25/10/2020 02:06:14;U737.FC04_PV.F_CV;0.770420372;100.0 +25/10/2020 02:06:15;U737.FC04_PV.F_CV;0.979877353;100.0 +25/10/2020 02:06:16;U737.FC04_PV.F_CV;1.771550655;100.0 +25/10/2020 02:06:17;U737.FC04_PV.F_CV;0.639355242;100.0 +25/10/2020 02:06:18;U737.FC04_PV.F_CV;0.216330454;100.0 +25/10/2020 02:06:20;U737.FC04_PV.F_CV;2.017192364;100.0 +25/10/2020 02:06:21;U737.FC04_PV.F_CV;0.800925195;100.0 +25/10/2020 02:06:23;U737.FC04_PV.F_CV;0.467877418;100.0 +25/10/2020 02:06:24;U737.FC04_PV.F_CV;1.596839666;100.0 +25/10/2020 02:06:25;U737.FC04_PV.F_CV;0.693552017;100.0 +25/10/2020 02:06:27;U737.FC04_PV.F_CV;-0.395318747;100.0 +25/10/2020 02:06:28;U737.FC04_PV.F_CV;1.793143988;100.0 +25/10/2020 02:06:29;U737.FC04_PV.F_CV;0.758512318;100.0 +25/10/2020 02:06:30;U737.FC04_PV.F_CV;0.294647813;100.0 +25/10/2020 02:06:31;U737.FC04_PV.F_CV;1.218875170;100.0 +25/10/2020 02:06:34;U737.FC04_PV.F_CV;-0.360105693;100.0 +25/10/2020 02:06:35;U737.FC04_PV.F_CV;0.096421272;100.0 +25/10/2020 02:06:36;U737.FC04_PV.F_CV;0.958326757;100.0 +25/10/2020 02:06:37;U737.FC04_PV.F_CV;1.418040633;100.0 +25/10/2020 02:06:38;U737.FC04_PV.F_CV;0.284753263;100.0 +25/10/2020 02:06:41;U737.FC04_PV.F_CV;1.167003870;100.0 +25/10/2020 02:06:42;U737.FC04_PV.F_CV;-0.497539252;100.0 +25/10/2020 02:06:44;U737.FC04_PV.F_CV;0.438816965;100.0 +25/10/2020 02:06:46;U737.FC04_PV.F_CV;0.996396542;100.0 +25/10/2020 02:06:47;U737.FC04_PV.F_CV;-0.064261734;100.0 +25/10/2020 02:06:48;U737.FC04_PV.F_CV;0.294798791;100.0 +25/10/2020 02:06:49;U737.FC04_PV.F_CV;1.095999599;100.0 +25/10/2020 02:06:50;U737.FC04_PV.F_CV;0.808671117;100.0 +25/10/2020 02:06:51;U737.FC04_PV.F_CV;0.026748359;100.0 +25/10/2020 02:06:52;U737.FC04_PV.F_CV;-0.412780017;100.0 +25/10/2020 02:06:53;U737.FC04_PV.F_CV;0.700405717;100.0 +25/10/2020 02:06:54;U737.FC04_PV.F_CV;-0.190468013;100.0 +25/10/2020 02:06:55;U737.FC04_PV.F_CV;-0.002621800;100.0 +25/10/2020 02:06:57;U737.FC04_PV.F_CV;1.773533106;100.0 +25/10/2020 02:06:58;U737.FC04_PV.F_CV;0.333965242;100.0 +25/10/2020 02:06:39;U737.FC04_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U737.FI02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U737.FI03_57_PV.F_CV;-0.008724213;100.0 +25/10/2020 02:06:21;U737.FQ02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U737.MIL_Res1_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:39;U737.MIL_Res2_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:39;U737.MIL_Res3_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:39;U737.MIL_Res4_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:14;U737.PC602_PV.F_CV;101.381782532;100.0 +25/10/2020 02:06:38;U737.PI01_57_PV.F_CV;0.205618203;100.0 +25/10/2020 02:06:20;U737.PI01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U737.PI02_PV.F_CV;0.380524695;100.0 +25/10/2020 02:06:48;U737.PI09_PV.F_CV;0.090397619;100.0 +25/10/2020 02:06:14;U737.PI601_PV.F_CV;101.399353027;100.0 +25/10/2020 02:06:07;U737.PI602_PV.F_CV;101.378639221;100.0 +25/10/2020 02:06:43;U737.PI610_PV.F_CV;87.492431641;100.0 +25/10/2020 02:06:01;U737.PI611_PV.F_CV;55.856445313;100.0 +25/10/2020 02:06:44;U737.PI612_PV.F_CV;61.864013672;100.0 +25/10/2020 02:06:17;U737.PI613_PV.F_CV;15.685579300;100.0 +25/10/2020 02:06:13;U737.TC03_57_OP.F_CV;69.436073303;100.0 +25/10/2020 02:06:16;U737.TC03_57_OP.F_CV;68.529991150;100.0 +25/10/2020 02:06:35;U737.TC03_57_OP.F_CV;64.044868469;100.0 +25/10/2020 02:06:37;U737.TC03_57_OP.F_CV;63.551158905;100.0 +25/10/2020 02:06:40;U737.TC03_57_OP.F_CV;62.861938477;100.0 +25/10/2020 02:06:41;U737.TC03_57_OP.F_CV;62.454013824;100.0 +25/10/2020 02:06:42;U737.TC03_57_OP.F_CV;62.189197540;100.0 +25/10/2020 02:06:44;U737.TC03_57_OP.F_CV;61.868415833;100.0 +25/10/2020 02:06:49;U737.TC03_57_PV.F_CV;130.299926758;100.0 +25/10/2020 02:06:39;U737.TC03_57_SP.F_CV;129.000000000;100.0 +25/10/2020 02:06:39;U737.TC05_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U737.TC05_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:39;U737.TC05_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U737.TC09_57_OP.F_CV;83.049644470;100.0 +25/10/2020 02:06:08;U737.TC09_57_OP.F_CV;84.618423462;100.0 +25/10/2020 02:06:10;U737.TC09_57_OP.F_CV;85.418228149;100.0 +25/10/2020 02:06:12;U737.TC09_57_OP.F_CV;86.619941711;100.0 +25/10/2020 02:06:13;U737.TC09_57_OP.F_CV;86.919578552;100.0 +25/10/2020 02:06:15;U737.TC09_57_OP.F_CV;88.018653870;100.0 +25/10/2020 02:06:16;U737.TC09_57_OP.F_CV;88.487380981;100.0 +25/10/2020 02:06:17;U737.TC09_57_OP.F_CV;88.830993652;100.0 +25/10/2020 02:06:23;U737.TC09_57_OP.F_CV;91.645195007;100.0 +25/10/2020 02:06:39;U737.TC09_57_OP.F_CV;98.860992432;100.0 +25/10/2020 02:06:40;U737.TC09_57_OP.F_CV;99.474151611;100.0 +25/10/2020 02:06:41;U737.TC09_57_OP.F_CV;99.824951172;100.0 +25/10/2020 02:06:42;U737.TC09_57_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:22;U737.TC09_57_PV.F_CV;126.700195313;100.0 +25/10/2020 02:06:39;U737.TC09_57_SP.F_CV;129.000000000;100.0 +25/10/2020 02:06:27;U737.TC10_57_PV.F_CV;50.000015259;100.0 +25/10/2020 02:06:16;U737.TC16_57_PV.F_CV;50.000289917;100.0 +25/10/2020 02:06:14;U737.TC18_57_PV.F_CV;50.000015259;100.0 +25/10/2020 02:06:18;U737.TI01_57_PV.F_CV;130.125045776;100.0 +25/10/2020 02:06:39;U737.TI01_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:20;U737.TI02_57_PV.F_CV;134.277847290;100.0 +25/10/2020 02:06:39;U737.TI02_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:36;U737.TI03_57_PV.F_CV;130.234329224;100.0 +25/10/2020 02:06:39;U737.TI03_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:23;U737.TI04_57_PV.F_CV;61.706470490;100.0 +25/10/2020 02:06:39;U737.TI04_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:16;U737.TI05_57_PV.F_CV;104.199943542;100.0 +25/10/2020 02:06:39;U737.TI05_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:10;U737.TI06_57_PV.F_CV;13.009332657;100.0 +25/10/2020 02:06:49;U737.TI06_57_PV.F_CV;13.097091675;100.0 +25/10/2020 02:06:39;U737.TI06_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:45;U737.TI07_57_PV.F_CV;130.900054932;100.0 +25/10/2020 02:06:21;U737.TI07_PV.F_CV;10.394195557;100.0 +25/10/2020 02:06:26;U737.TI07_PV.F_CV;10.289738655;100.0 +25/10/2020 02:06:33;U737.TI07_PV.F_CV;10.459477425;100.0 +25/10/2020 02:06:41;U737.TI07_PV.F_CV;10.322545052;100.0 +25/10/2020 02:06:47;U737.TI07_PV.F_CV;10.435203552;100.0 +25/10/2020 02:06:50;U737.TI07_PV.F_CV;10.313138008;100.0 +25/10/2020 02:06:24;U737.TI08_57_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:39;U737.TI08_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:22;U737.TI09_57_PV.F_CV;126.700157166;100.0 +25/10/2020 02:06:38;U737.TI09_PV.F_CV;12.601666451;100.0 +25/10/2020 02:06:48;U737.TI09_PV.F_CV;12.719614029;100.0 +25/10/2020 02:06:52;U737.TI09_PV.F_CV;12.628114700;100.0 +25/10/2020 02:06:18;U737.TI10_PV.F_CV;10.441797256;100.0 +25/10/2020 02:06:47;U737.TI10_PV.F_CV;10.526098251;100.0 +25/10/2020 02:06:04;U737.TI11_57_PV.F_CV;13.720675468;100.0 +25/10/2020 02:06:19;U737.TI11_57_PV.F_CV;13.421828270;100.0 +25/10/2020 02:06:15;U737.TI11_PV.F_CV;11.130728722;100.0 +25/10/2020 02:06:20;U737.TI11_PV.F_CV;11.005194664;100.0 +25/10/2020 02:06:56;U737.TI11_PV.F_CV;11.099588394;100.0 +25/10/2020 02:06:58;U737.TI11_PV.F_CV;11.189481735;100.0 +25/10/2020 02:06:10;U737.TI12_57_PV.F_CV;13.344341278;100.0 +25/10/2020 02:06:10;U737.TI12_PV.F_CV;11.488618851;100.0 +25/10/2020 02:06:39;U737.TI13_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:39;U737.TI14_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:08;U737.TI15_PV.F_CV;11.285448074;100.0 +25/10/2020 02:06:21;U737.TI16_PV.F_CV;11.800992012;100.0 +25/10/2020 02:06:56;U737.TI16_PV.F_CV;12.084830284;100.0 +25/10/2020 02:06:28;U737.TI17_PV.F_CV;10.393468857;100.0 +25/10/2020 02:06:39;U737.TI18_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:39;U737.TI19_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:39;U737.TI20_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:39;U737.TI21_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:39;U737.TI22_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:17;U737.TI23_57_PV.F_CV;61.568614960;100.0 +25/10/2020 02:06:37;U737.TI23_57_PV.F_CV;61.457756042;100.0 +25/10/2020 02:06:47;U737.TI23_57_PV.F_CV;61.549766541;100.0 +25/10/2020 02:06:39;U737.TI23_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:21;U737.TI24_57_PV.F_CV;13.614895821;100.0 +25/10/2020 02:06:51;U737.TI24_57_PV.F_CV;13.699918747;100.0 +25/10/2020 02:06:39;U737.TI24_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:21;U737.TI600_PV.F_CV;104.309860229;100.0 +25/10/2020 02:06:46;U737.TI600_PV.F_CV;104.589797974;100.0 +25/10/2020 02:06:24;U737.TI601_PV.F_CV;13.700004578;100.0 +25/10/2020 02:06:39;U737.TI603_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:50;U737.TI604_PV.F_CV;13.900003433;100.0 +25/10/2020 02:06:16;U737.TI605_PV.F_CV;22.199993134;100.0 +25/10/2020 02:06:08;U737.TI607_PV.F_CV;20.399990082;100.0 +25/10/2020 02:06:23;U737.TI608_PV.F_CV;1.700000525;100.0 +25/10/2020 02:06:30;U737.TI609_PV.F_CV;20.988080978;100.0 +25/10/2020 02:06:25;U737.TI610_PV.F_CV;49.100563049;100.0 +25/10/2020 02:06:00;U737.TI611_PV.F_CV;109.442749023;100.0 +25/10/2020 02:06:25;U737.TI612_PV.F_CV;14.027097702;100.0 +25/10/2020 02:06:34;U737.TI613_PV.F_CV;15.474578857;100.0 +25/10/2020 02:06:48;U737.TI613_PV.F_CV;15.581469536;100.0 +25/10/2020 02:06:43;U737.TI614_PV.F_CV;13.874580383;100.0 +25/10/2020 02:06:00;U737.TI615_PV.F_CV;14.682493210;100.0 +25/10/2020 02:06:08;U737.TI615_PV.F_CV;14.553351402;100.0 +25/10/2020 02:06:51;U737.TI615_PV.F_CV;14.847137451;100.0 +25/10/2020 02:06:28;U737.TI616_PV.F_CV;82.546165466;100.0 +25/10/2020 02:06:04;U737.TI617_PV.F_CV;107.280715942;100.0 +25/10/2020 02:06:24;U737.TI618_PV.F_CV;51.079692841;100.0 +25/10/2020 02:06:33;U737.TI618_PV.F_CV;51.179008484;100.0 +25/10/2020 02:06:12;U737.TI619_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:02;U737.TI620_PV.F_CV;13.239442825;100.0 +25/10/2020 02:06:20;U737.TI620_PV.F_CV;13.153146744;100.0 +25/10/2020 02:06:40;U737.TI620_PV.F_CV;12.825227737;100.0 +25/10/2020 02:06:26;U737.TI621_PV.F_CV;31.321945190;100.0 +25/10/2020 02:06:27;U737.TI71_PV.F_CV;31.386640549;100.0 +25/10/2020 02:06:39;U737.Z01_TC51_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:39;U737.Z01_TC51_SP.F_CV;10.000000000;100.0 +25/10/2020 02:06:39;U737.Z03_PDT110_PV.F_CV;0.016318671;100.0 +25/10/2020 02:06:39;U737.Z03_PT111_PV.F_CV;0.071043171;100.0 +25/10/2020 02:06:39;U737.Z03_PT112_PV.F_CV;0.055102758;100.0 +25/10/2020 02:06:46;U737.Z03_TI101_PV.F_CV;14.896245003;100.0 +25/10/2020 02:06:34;U737.Z03_ZT110_PV.F_CV;898.966796875;100.0 +25/10/2020 02:06:13;U737.Z04_TC40_PV.F_CV;157.675247192;100.0 +25/10/2020 02:06:23;U737.Z04_TC40_SP.F_CV;160.000000000;100.0 +25/10/2020 02:06:23;U737.ZI01_PV.F_CV;-2.971969366;100.0 +25/10/2020 02:06:39;U737.ZI02_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:39;U737.ZI03_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:13;U737.ZI04_PV.F_CV;1.674098969;100.0 +25/10/2020 02:06:39;U737.ZI05_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:59;U737.ZI06_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:42;U737.ZI10_PV.F_CV;7.594936371;100.0 +25/10/2020 02:06:55;U737.ZI11_PV.F_CV;6.589119911;100.0 +25/10/2020 02:06:48;U737.ZI12_PV.F_CV;6.799111843;100.0 +25/10/2020 02:06:42;U737.ZI13_PV.F_CV;6.191990852;100.0 +25/10/2020 02:06:42;U740.AI03_PV.F_CV;0.932814717;100.0 +25/10/2020 02:06:38;U740.AI04_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:58;U740.AI07_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:23;U740.AI08A_PV.F_CV;1097.105590820;100.0 +25/10/2020 02:06:01;U740.AI08B_PV.F_CV;700.098754883;100.0 +25/10/2020 02:06:03;U740.AI09A_PV.F_CV;980.868347168;100.0 +25/10/2020 02:06:01;U740.AI09B_PV.F_CV;699.919738770;100.0 +25/10/2020 02:06:24;U740.AI12A_PV.F_CV;973.594665527;100.0 +25/10/2020 02:06:24;U740.AI12B_PV.F_CV;960.435974121;100.0 +25/10/2020 02:06:05;U740.AI13A_PV.F_CV;988.308471680;100.0 +25/10/2020 02:06:07;U740.AI13A_PV.F_CV;987.996093750;100.0 +25/10/2020 02:06:20;U740.AI13B_PV.F_CV;928.638488770;100.0 +25/10/2020 02:06:21;U740.AI13B_PV.F_CV;929.043457031;100.0 +25/10/2020 02:06:07;U740.AI16_PV.F_CV;0.824691772;100.0 +25/10/2020 02:06:10;U740.AI16_PV.F_CV;0.824973226;100.0 +25/10/2020 02:06:18;U740.AI16_PV.F_CV;0.824696779;100.0 +25/10/2020 02:06:23;U740.AI16_PV.F_CV;0.824970901;100.0 +25/10/2020 02:06:51;U740.AI16_PV.F_CV;0.824717939;100.0 +25/10/2020 02:06:29;U740.DI01_PV.F_CV;1099.947143555;100.0 +25/10/2020 02:06:17;U740.DI02_PV.F_CV;1099.284545898;100.0 +25/10/2020 02:06:18;U740.DI02_PV.F_CV;1100.269653320;100.0 +25/10/2020 02:06:28;U740.DI02_PV.F_CV;1099.665161133;100.0 +25/10/2020 02:06:31;U740.DI02_PV.F_CV;1100.251464844;100.0 +25/10/2020 02:06:33;U740.DI02_PV.F_CV;1099.303222656;100.0 +25/10/2020 02:06:34;U740.DI02_PV.F_CV;1100.220581055;100.0 +25/10/2020 02:06:38;U740.DI02_PV.F_CV;1098.804687500;100.0 +25/10/2020 02:06:39;U740.DI02_PV.F_CV;1100.012939453;100.0 +25/10/2020 02:06:57;U740.DI02_PV.F_CV;1098.596069336;100.0 +25/10/2020 02:06:58;U740.DI02_PV.F_CV;1100.303466797;100.0 +25/10/2020 02:06:03;U740.DI221_PV.F_CV;699.835266113;100.0 +25/10/2020 02:06:27;U740.DI222_PV.F_CV;699.999877930;100.0 +25/10/2020 02:06:59;U740.FC03_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:04;U740.FC03_PV.F_CV;46.697654724;100.0 +25/10/2020 02:06:24;U740.FC12_OP.F_CV;20.000000000;100.0 +25/10/2020 02:06:15;U740.FC12_PV.F_CV;0.151012763;100.0 +25/10/2020 02:06:21;U740.FC12_PV.F_CV;0.134971723;100.0 +25/10/2020 02:06:30;U740.FC12_PV.F_CV;0.146301463;100.0 +25/10/2020 02:06:38;U740.FC12_SP.F_CV;14.800000191;100.0 +25/10/2020 02:06:38;U740.FC13_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U740.FC13_PV.F_CV;-0.003855661;100.0 +25/10/2020 02:06:45;U740.FC13_SP.F_CV;15.899999619;100.0 +25/10/2020 02:06:03;U740.FI03_PV.F_CV;0.973031878;100.0 +25/10/2020 02:06:58;U740.FI07_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:59;U740.FI08A_PV.F_CV;-0.161880851;100.0 +25/10/2020 02:06:39;U740.FI08B_PV.F_CV;0.010565563;100.0 +25/10/2020 02:06:01;U740.FI09A_PV.F_CV;-0.260398924;100.0 +25/10/2020 02:06:03;U740.FI09B_PV.F_CV;-0.011834717;100.0 +25/10/2020 02:06:21;U740.FI12A_PV.F_CV;2.208210468;100.0 +25/10/2020 02:06:27;U740.FI12A_PV.F_CV;2.045179367;100.0 +25/10/2020 02:06:29;U740.FI12A_PV.F_CV;2.360349655;100.0 +25/10/2020 02:06:54;U740.FI12B_PV.F_CV;0.023529580;100.0 +25/10/2020 02:06:38;U740.FI13A_PV.F_CV;-0.058333136;100.0 +25/10/2020 02:06:00;U740.FI13B_PV.F_CV;0.374472469;100.0 +25/10/2020 02:06:02;U740.FI13B_PV.F_CV;0.397805393;100.0 +25/10/2020 02:06:04;U740.FI13B_PV.F_CV;0.260528862;100.0 +25/10/2020 02:06:05;U740.FI13B_PV.F_CV;0.131361559;100.0 +25/10/2020 02:06:07;U740.FI13B_PV.F_CV;0.352960914;100.0 +25/10/2020 02:06:08;U740.FI13B_PV.F_CV;0.388985574;100.0 +25/10/2020 02:06:09;U740.FI13B_PV.F_CV;0.199987456;100.0 +25/10/2020 02:06:10;U740.FI13B_PV.F_CV;0.082352370;100.0 +25/10/2020 02:06:11;U740.FI13B_PV.F_CV;0.238468558;100.0 +25/10/2020 02:06:13;U740.FI13B_PV.F_CV;0.051568765;100.0 +25/10/2020 02:06:14;U740.FI13B_PV.F_CV;0.014989689;100.0 +25/10/2020 02:06:16;U740.FI13B_PV.F_CV;0.137583703;100.0 +25/10/2020 02:06:17;U740.FI13B_PV.F_CV;0.046019547;100.0 +25/10/2020 02:06:18;U740.FI13B_PV.F_CV;0.013002848;100.0 +25/10/2020 02:06:22;U740.FI13B_PV.F_CV;0.199131161;100.0 +25/10/2020 02:06:23;U740.FI13B_PV.F_CV;0.329857856;100.0 +25/10/2020 02:06:24;U740.FI13B_PV.F_CV;0.183549687;100.0 +25/10/2020 02:06:26;U740.FI13B_PV.F_CV;0.154745862;100.0 +25/10/2020 02:06:27;U740.FI13B_PV.F_CV;0.289443135;100.0 +25/10/2020 02:06:28;U740.FI13B_PV.F_CV;0.137197495;100.0 +25/10/2020 02:06:31;U740.FI13B_PV.F_CV;0.012277199;100.0 +25/10/2020 02:06:33;U740.FI13B_PV.F_CV;0.203953981;100.0 +25/10/2020 02:06:35;U740.FI13B_PV.F_CV;0.042459674;100.0 +25/10/2020 02:06:36;U740.FI13B_PV.F_CV;0.015290422;100.0 +25/10/2020 02:06:39;U740.FI13B_PV.F_CV;0.187669575;100.0 +25/10/2020 02:06:41;U740.FI13B_PV.F_CV;0.057694476;100.0 +25/10/2020 02:06:42;U740.FI13B_PV.F_CV;0.027310472;100.0 +25/10/2020 02:06:43;U740.FI13B_PV.F_CV;0.116563007;100.0 +25/10/2020 02:06:44;U740.FI13B_PV.F_CV;0.291016996;100.0 +25/10/2020 02:06:45;U740.FI13B_PV.F_CV;0.126352742;100.0 +25/10/2020 02:06:46;U740.FI13B_PV.F_CV;0.039418403;100.0 +25/10/2020 02:06:47;U740.FI13B_PV.F_CV;0.113621339;100.0 +25/10/2020 02:06:48;U740.FI13B_PV.F_CV;0.035204642;100.0 +25/10/2020 02:06:50;U740.FI13B_PV.F_CV;0.246000394;100.0 +25/10/2020 02:06:51;U740.FI13B_PV.F_CV;0.111722231;100.0 +25/10/2020 02:06:52;U740.FI13B_PV.F_CV;0.039989326;100.0 +25/10/2020 02:06:53;U740.FI13B_PV.F_CV;0.192740589;100.0 +25/10/2020 02:06:55;U740.FI13B_PV.F_CV;0.160344198;100.0 +25/10/2020 02:06:58;U740.FI13B_PV.F_CV;0.376220554;100.0 +25/10/2020 02:06:59;U740.FI13B_PV.F_CV;0.165741757;100.0 +25/10/2020 02:06:07;U740.FI16_PV.F_CV;93.484878540;100.0 +25/10/2020 02:06:10;U740.FI16_PV.F_CV;93.689292908;100.0 +25/10/2020 02:06:18;U740.FI16_PV.F_CV;93.481361389;100.0 +25/10/2020 02:06:26;U740.FI16_PV.F_CV;93.817298889;100.0 +25/10/2020 02:06:51;U740.FI16_PV.F_CV;93.499717712;100.0 +25/10/2020 02:06:10;U740.FI221_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U740.FI222_PV.F_CV;-3.052015781;100.0 +25/10/2020 02:06:15;U740.FSPLIT_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:58;U740.FY07_V_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:00;U740.FY08A_V_PV.F_CV;-0.008769189;100.0 +25/10/2020 02:06:40;U740.FY08B_V_PV.F_CV;0.000895154;100.0 +25/10/2020 02:06:00;U740.FY09A_V_PV.F_CV;-0.015902188;100.0 +25/10/2020 02:06:04;U740.FY09B_V_PV.F_CV;-0.001008955;100.0 +25/10/2020 02:06:21;U740.FY12A_V_PV.F_CV;0.135557607;100.0 +25/10/2020 02:06:27;U740.FY12A_V_PV.F_CV;0.125813901;100.0 +25/10/2020 02:06:29;U740.FY12A_V_PV.F_CV;0.144543573;100.0 +25/10/2020 02:06:52;U740.FY12B_V_PV.F_CV;0.001479617;100.0 +25/10/2020 02:06:38;U740.FY13A_V_PV.F_CV;-0.003632686;100.0 +25/10/2020 02:06:00;U740.FY13B_V_PV.F_CV;0.022562958;100.0 +25/10/2020 02:06:05;U740.FY13B_V_PV.F_CV;0.010710685;100.0 +25/10/2020 02:06:07;U740.FY13B_V_PV.F_CV;0.019873468;100.0 +25/10/2020 02:06:10;U740.FY13B_V_PV.F_CV;0.008200933;100.0 +25/10/2020 02:06:12;U740.FY13B_V_PV.F_CV;0.019047895;100.0 +25/10/2020 02:06:13;U740.FY13B_V_PV.F_CV;0.006689617;100.0 +25/10/2020 02:06:23;U740.FY13B_V_PV.F_CV;0.020154223;100.0 +25/10/2020 02:06:32;U740.FY13B_V_PV.F_CV;0.000213680;100.0 +25/10/2020 02:06:33;U740.FY13B_V_PV.F_CV;0.010632413;100.0 +25/10/2020 02:06:36;U740.FY13B_V_PV.F_CV;0.001281889;100.0 +25/10/2020 02:06:40;U740.FY13B_V_PV.F_CV;0.014738611;100.0 +25/10/2020 02:06:41;U740.FY13B_V_PV.F_CV;0.004704379;100.0 +25/10/2020 02:06:44;U740.FY13B_V_PV.F_CV;0.017032713;100.0 +25/10/2020 02:06:46;U740.FY13B_V_PV.F_CV;0.003234708;100.0 +25/10/2020 02:06:50;U740.FY13B_V_PV.F_CV;0.013612910;100.0 +25/10/2020 02:06:52;U740.FY13B_V_PV.F_CV;0.002843827;100.0 +25/10/2020 02:06:58;U740.FY13B_V_PV.F_CV;0.023689855;100.0 +25/10/2020 02:06:23;U740.LC08_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U740.LC08_PV.F_CV;-0.019166479;100.0 +25/10/2020 02:06:38;U740.LC08_SP.F_CV;60.000000000;100.0 +25/10/2020 02:06:38;U740.LC09_OP.F_CV;50.000000000;100.0 +25/10/2020 02:06:10;U740.LC09_PV.F_CV;100.020210266;100.0 +25/10/2020 02:06:58;U740.LC09_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:00;U740.LI03_PV.F_CV;-1.709927917;100.0 +25/10/2020 02:06:01;U740.LI03_PV.F_CV;-1.523284674;100.0 +25/10/2020 02:06:03;U740.LI03_PV.F_CV;-1.635310650;100.0 +25/10/2020 02:06:04;U740.LI03_PV.F_CV;-1.544082522;100.0 +25/10/2020 02:06:05;U740.LI03_PV.F_CV;-1.632558465;100.0 +25/10/2020 02:06:07;U740.LI03_PV.F_CV;-1.576010346;100.0 +25/10/2020 02:06:08;U740.LI03_PV.F_CV;-1.716705084;100.0 +25/10/2020 02:06:09;U740.LI03_PV.F_CV;-1.507924199;100.0 +25/10/2020 02:06:13;U740.LI03_PV.F_CV;-1.681357503;100.0 +25/10/2020 02:06:15;U740.LI03_PV.F_CV;-1.520742297;100.0 +25/10/2020 02:06:16;U740.LI03_PV.F_CV;-1.648193598;100.0 +25/10/2020 02:06:17;U740.LI03_PV.F_CV;-1.453378916;100.0 +25/10/2020 02:06:18;U740.LI03_PV.F_CV;-1.612059355;100.0 +25/10/2020 02:06:20;U740.LI03_PV.F_CV;-1.549238086;100.0 +25/10/2020 02:06:21;U740.LI03_PV.F_CV;-1.663448572;100.0 +25/10/2020 02:06:23;U740.LI03_PV.F_CV;-1.465010405;100.0 +25/10/2020 02:06:24;U740.LI03_PV.F_CV;-1.635210752;100.0 +25/10/2020 02:06:25;U740.LI03_PV.F_CV;-1.470932007;100.0 +25/10/2020 02:06:26;U740.LI03_PV.F_CV;-1.613965631;100.0 +25/10/2020 02:06:28;U740.LI03_PV.F_CV;-1.557129979;100.0 +25/10/2020 02:06:29;U740.LI03_PV.F_CV;-1.664678812;100.0 +25/10/2020 02:06:31;U740.LI03_PV.F_CV;-1.461284876;100.0 +25/10/2020 02:06:32;U740.LI03_PV.F_CV;-1.680073857;100.0 +25/10/2020 02:06:33;U740.LI03_PV.F_CV;-1.457948804;100.0 +25/10/2020 02:06:34;U740.LI03_PV.F_CV;-1.595018506;100.0 +25/10/2020 02:06:37;U740.LI03_PV.F_CV;-1.683777571;100.0 +25/10/2020 02:06:39;U740.LI03_PV.F_CV;-1.461232305;100.0 +25/10/2020 02:06:40;U740.LI03_PV.F_CV;-1.638515472;100.0 +25/10/2020 02:06:41;U740.LI03_PV.F_CV;-1.443708777;100.0 +25/10/2020 02:06:42;U740.LI03_PV.F_CV;-1.587296486;100.0 +25/10/2020 02:06:45;U740.LI03_PV.F_CV;-1.655336618;100.0 +25/10/2020 02:06:47;U740.LI03_PV.F_CV;-1.493672729;100.0 +25/10/2020 02:06:48;U740.LI03_PV.F_CV;-1.633657694;100.0 +25/10/2020 02:06:49;U740.LI03_PV.F_CV;-1.500232100;100.0 +25/10/2020 02:06:50;U740.LI03_PV.F_CV;-1.617033362;100.0 +25/10/2020 02:06:51;U740.LI03_PV.F_CV;-1.529003263;100.0 +25/10/2020 02:06:53;U740.LI03_PV.F_CV;-1.659122229;100.0 +25/10/2020 02:06:54;U740.LI03_PV.F_CV;-1.506374598;100.0 +25/10/2020 02:06:56;U740.LI03_PV.F_CV;-1.615417719;100.0 +25/10/2020 02:06:57;U740.LI03_PV.F_CV;-1.524392128;100.0 +25/10/2020 02:06:58;U740.LI03_PV.F_CV;-1.637042999;100.0 +25/10/2020 02:06:59;U740.LI03_PV.F_CV;-1.503444791;100.0 +25/10/2020 02:06:01;U740.LI04_PV.F_CV;-1.327116609;100.0 +25/10/2020 02:06:02;U740.LI04_PV.F_CV;-1.430825591;100.0 +25/10/2020 02:06:04;U740.LI04_PV.F_CV;-1.320926428;100.0 +25/10/2020 02:06:05;U740.LI04_PV.F_CV;-1.456446409;100.0 +25/10/2020 02:06:06;U740.LI04_PV.F_CV;-1.338885427;100.0 +25/10/2020 02:06:08;U740.LI04_PV.F_CV;-1.407528162;100.0 +25/10/2020 02:06:09;U740.LI04_PV.F_CV;-1.336380482;100.0 +25/10/2020 02:06:10;U740.LI04_PV.F_CV;-1.474318504;100.0 +25/10/2020 02:06:11;U740.LI04_PV.F_CV;-1.355023980;100.0 +25/10/2020 02:06:13;U740.LI04_PV.F_CV;-1.467087507;100.0 +25/10/2020 02:06:14;U740.LI04_PV.F_CV;-1.321638346;100.0 +25/10/2020 02:06:15;U740.LI04_PV.F_CV;-1.400752425;100.0 +25/10/2020 02:06:16;U740.LI04_PV.F_CV;-1.323863864;100.0 +25/10/2020 02:06:18;U740.LI04_PV.F_CV;-1.437238574;100.0 +25/10/2020 02:06:19;U740.LI04_PV.F_CV;-1.317588568;100.0 +25/10/2020 02:06:21;U740.LI04_PV.F_CV;-1.431202054;100.0 +25/10/2020 02:06:22;U740.LI04_PV.F_CV;-1.296305656;100.0 +25/10/2020 02:06:23;U740.LI04_PV.F_CV;-1.410163999;100.0 +25/10/2020 02:06:24;U740.LI04_PV.F_CV;-1.358852148;100.0 +25/10/2020 02:06:26;U740.LI04_PV.F_CV;-1.447149396;100.0 +25/10/2020 02:06:27;U740.LI04_PV.F_CV;-1.335648179;100.0 +25/10/2020 02:06:29;U740.LI04_PV.F_CV;-1.430415869;100.0 +25/10/2020 02:06:30;U740.LI04_PV.F_CV;-1.307646751;100.0 +25/10/2020 02:06:31;U740.LI04_PV.F_CV;-1.395070314;100.0 +25/10/2020 02:06:33;U740.LI04_PV.F_CV;-1.331271052;100.0 +25/10/2020 02:06:34;U740.LI04_PV.F_CV;-1.459165692;100.0 +25/10/2020 02:06:35;U740.LI04_PV.F_CV;-1.340046644;100.0 +25/10/2020 02:06:37;U740.LI04_PV.F_CV;-1.433233261;100.0 +25/10/2020 02:06:38;U740.LI04_PV.F_CV;-1.297453880;100.0 +25/10/2020 02:06:39;U740.LI04_PV.F_CV;-1.400607109;100.0 +25/10/2020 02:06:43;U740.LI04_PV.F_CV;-1.333109498;100.0 +25/10/2020 02:06:45;U740.LI04_PV.F_CV;-1.414666414;100.0 +25/10/2020 02:06:46;U740.LI04_PV.F_CV;-1.301125288;100.0 +25/10/2020 02:06:47;U740.LI04_PV.F_CV;-1.455511093;100.0 +25/10/2020 02:06:51;U740.LI04_PV.F_CV;-1.301620245;100.0 +25/10/2020 02:06:52;U740.LI04_PV.F_CV;-1.396104097;100.0 +25/10/2020 02:06:54;U740.LI04_PV.F_CV;-1.311396837;100.0 +25/10/2020 02:06:55;U740.LI04_PV.F_CV;-1.477283716;100.0 +25/10/2020 02:06:56;U740.LI04_PV.F_CV;-1.333284259;100.0 +25/10/2020 02:06:08;U740.LI09_PV.F_CV;100.019760132;100.0 +25/10/2020 02:06:00;U740.LI10_PV.F_CV;0.003566312;100.0 +25/10/2020 02:06:58;U740.LIfutur_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:57;U740.PC222_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U740.PC223_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U740.PC27_PV.F_CV;0.081142820;100.0 +25/10/2020 02:06:38;U740.PDC02_PV.F_CV;0.012200267;100.0 +25/10/2020 02:06:00;U740.PDR_PV.F_CV;0.644427836;100.0 +25/10/2020 02:06:01;U740.PDR_PV.F_CV;0.640060544;100.0 +25/10/2020 02:06:02;U740.PDR_PV.F_CV;0.589397728;100.0 +25/10/2020 02:06:03;U740.PDR_PV.F_CV;0.544345260;100.0 +25/10/2020 02:06:04;U740.PDR_PV.F_CV;0.521732748;100.0 +25/10/2020 02:06:05;U740.PDR_PV.F_CV;0.562464893;100.0 +25/10/2020 02:06:06;U740.PDR_PV.F_CV;0.555135012;100.0 +25/10/2020 02:06:07;U740.PDR_PV.F_CV;0.620083570;100.0 +25/10/2020 02:06:08;U740.PDR_PV.F_CV;0.602543890;100.0 +25/10/2020 02:06:09;U740.PDR_PV.F_CV;0.727134466;100.0 +25/10/2020 02:06:10;U740.PDR_PV.F_CV;0.787438035;100.0 +25/10/2020 02:06:11;U740.PDR_PV.F_CV;0.857467592;100.0 +25/10/2020 02:06:12;U740.PDR_PV.F_CV;0.815621376;100.0 +25/10/2020 02:06:13;U740.PDR_PV.F_CV;0.690275252;100.0 +25/10/2020 02:06:14;U740.PDR_PV.F_CV;0.687187254;100.0 +25/10/2020 02:06:15;U740.PDR_PV.F_CV;0.698829710;100.0 +25/10/2020 02:06:16;U740.PDR_PV.F_CV;0.806889653;100.0 +25/10/2020 02:06:17;U740.PDR_PV.F_CV;0.733006716;100.0 +25/10/2020 02:06:18;U740.PDR_PV.F_CV;0.632241726;100.0 +25/10/2020 02:06:19;U740.PDR_PV.F_CV;0.607604444;100.0 +25/10/2020 02:06:20;U740.PDR_PV.F_CV;0.657303870;100.0 +25/10/2020 02:06:21;U740.PDR_PV.F_CV;0.703764141;100.0 +25/10/2020 02:06:22;U740.PDR_PV.F_CV;0.729562342;100.0 +25/10/2020 02:06:24;U740.PDR_PV.F_CV;0.758961260;100.0 +25/10/2020 02:06:25;U740.PDR_PV.F_CV;0.675974190;100.0 +25/10/2020 02:06:26;U740.PDR_PV.F_CV;0.679499090;100.0 +25/10/2020 02:06:27;U740.PDR_PV.F_CV;0.663573623;100.0 +25/10/2020 02:06:28;U740.PDR_PV.F_CV;0.772196114;100.0 +25/10/2020 02:06:29;U740.PDR_PV.F_CV;0.769359887;100.0 +25/10/2020 02:06:30;U740.PDR_PV.F_CV;0.777122200;100.0 +25/10/2020 02:06:31;U740.PDR_PV.F_CV;0.759485960;100.0 +25/10/2020 02:06:32;U740.PDR_PV.F_CV;0.655486822;100.0 +25/10/2020 02:06:33;U740.PDR_PV.F_CV;0.579786479;100.0 +25/10/2020 02:06:34;U740.PDR_PV.F_CV;0.600387633;100.0 +25/10/2020 02:06:35;U740.PDR_PV.F_CV;0.665468395;100.0 +25/10/2020 02:06:36;U740.PDR_PV.F_CV;0.686335921;100.0 +25/10/2020 02:06:37;U740.PDR_PV.F_CV;0.739232779;100.0 +25/10/2020 02:06:38;U740.PDR_PV.F_CV;0.764970541;100.0 +25/10/2020 02:06:39;U740.PDR_PV.F_CV;0.717057705;100.0 +25/10/2020 02:06:40;U740.PDR_PV.F_CV;0.796685636;100.0 +25/10/2020 02:06:41;U740.PDR_PV.F_CV;0.769681811;100.0 +25/10/2020 02:06:42;U740.PDR_PV.F_CV;0.683791220;100.0 +25/10/2020 02:06:43;U740.PDR_PV.F_CV;0.608461857;100.0 +25/10/2020 02:06:44;U740.PDR_PV.F_CV;0.646519423;100.0 +25/10/2020 02:06:45;U740.PDR_PV.F_CV;0.657156229;100.0 +25/10/2020 02:06:46;U740.PDR_PV.F_CV;0.592288733;100.0 +25/10/2020 02:06:47;U740.PDR_PV.F_CV;0.548429847;100.0 +25/10/2020 02:06:48;U740.PDR_PV.F_CV;0.582152486;100.0 +25/10/2020 02:06:49;U740.PDR_PV.F_CV;0.614776850;100.0 +25/10/2020 02:06:50;U740.PDR_PV.F_CV;0.570516467;100.0 +25/10/2020 02:06:51;U740.PDR_PV.F_CV;0.537909269;100.0 +25/10/2020 02:06:52;U740.PDR_PV.F_CV;0.568339348;100.0 +25/10/2020 02:06:53;U740.PDR_PV.F_CV;0.657140017;100.0 +25/10/2020 02:06:54;U740.PDR_PV.F_CV;0.624461174;100.0 +25/10/2020 02:06:55;U740.PDR_PV.F_CV;0.627217650;100.0 +25/10/2020 02:06:56;U740.PDR_PV.F_CV;0.648523033;100.0 +25/10/2020 02:06:57;U740.PDR_PV.F_CV;0.692117035;100.0 +25/10/2020 02:06:59;U740.PDR_PV.F_CV;0.676786542;100.0 +25/10/2020 02:06:12;U740.PDT01_PV.F_CV;1.465845585;100.0 +25/10/2020 02:06:13;U740.PDT01_PV.F_CV;1.502556086;100.0 +25/10/2020 02:06:19;U740.PDT01_PV.F_CV;1.469342470;100.0 +25/10/2020 02:06:21;U740.PDT01_PV.F_CV;1.522128105;100.0 +25/10/2020 02:06:29;U740.PDT01_PV.F_CV;1.480298996;100.0 +25/10/2020 02:06:30;U740.PDT01_PV.F_CV;1.511655688;100.0 +25/10/2020 02:06:52;U740.PDT01_PV.F_CV;1.420248866;100.0 +25/10/2020 02:06:23;U740.PDT223_PV.F_CV;0.099046260;100.0 +25/10/2020 02:06:53;U740.PDT322_PV.F_CV;0.148092136;100.0 +25/10/2020 02:06:58;U740.PDT322_PV.F_CV;0.106321692;100.0 +25/10/2020 02:06:51;U740.PI09_PV.F_CV;-0.009449577;100.0 +25/10/2020 02:06:54;U740.PI21_PV.F_CV;0.949585617;100.0 +25/10/2020 02:06:38;U740.PI221_PV.F_CV;-0.122838467;100.0 +25/10/2020 02:06:38;U740.PI222_PV.F_CV;-0.254036248;100.0 +25/10/2020 02:06:38;U740.PI223_PV.F_CV;-0.210824862;100.0 +25/10/2020 02:06:23;U740.PI26_PV.F_CV;1.065020919;100.0 +25/10/2020 02:06:59;U740.PI32_PV.F_CV;0.069131337;100.0 +25/10/2020 02:06:52;U740.PI42_PV.F_CV;0.257896811;100.0 +25/10/2020 02:06:59;U740.PI54_PV.F_CV;-0.478339344;100.0 +25/10/2020 02:06:23;U740.PI70_PV.F_CV;0.078812554;100.0 +25/10/2020 02:06:51;U740.PI71_PV.F_CV;0.099327847;100.0 +25/10/2020 02:06:51;U740.PI78_PV.F_CV;0.076479517;100.0 +25/10/2020 02:06:51;U740.PI79_PV.F_CV;0.068041936;100.0 +25/10/2020 02:06:03;U740.TC03_PV.F_CV;10.766170502;100.0 +25/10/2020 02:06:59;U740.TC14_PV.F_CV;12.139024734;100.0 +25/10/2020 02:06:29;U740.TC16_PV.F_CV;10.489662170;100.0 +25/10/2020 02:06:56;U740.TC17_PV.F_CV;13.593029022;100.0 +25/10/2020 02:06:48;U740.TI06_PV.F_CV;11.202649117;100.0 +25/10/2020 02:06:35;U740.TI08_PV.F_CV;10.602403641;100.0 +25/10/2020 02:06:22;U740.TI09_PV.F_CV;11.629597664;100.0 +25/10/2020 02:06:46;U740.TI14B_PV.F_CV;12.032687187;100.0 +25/10/2020 02:06:54;U740.TI188_PV.F_CV;11.183460236;100.0 +25/10/2020 02:06:02;U740.TI220_PV.F_CV;11.823999405;100.0 +25/10/2020 02:06:03;U740.TI220_PV.F_CV;11.912000656;100.0 +25/10/2020 02:06:05;U740.TI220_PV.F_CV;11.823999405;100.0 +25/10/2020 02:06:11;U740.TI220_PV.F_CV;11.882666588;100.0 +25/10/2020 02:06:16;U740.TI220_PV.F_CV;11.823999405;100.0 +25/10/2020 02:06:18;U740.TI220_PV.F_CV;11.882666588;100.0 +25/10/2020 02:06:20;U740.TI220_PV.F_CV;11.823999405;100.0 +25/10/2020 02:06:22;U740.TI220_PV.F_CV;11.882666588;100.0 +25/10/2020 02:06:24;U740.TI220_PV.F_CV;11.823999405;100.0 +25/10/2020 02:06:26;U740.TI220_PV.F_CV;11.912000656;100.0 +25/10/2020 02:06:28;U740.TI220_PV.F_CV;11.823999405;100.0 +25/10/2020 02:06:31;U740.TI220_PV.F_CV;11.890000343;100.0 +25/10/2020 02:06:33;U740.TI220_PV.F_CV;11.823999405;100.0 +25/10/2020 02:06:36;U740.TI220_PV.F_CV;11.890000343;100.0 +25/10/2020 02:06:38;U740.TI220_PV.F_CV;12.087999344;100.0 +25/10/2020 02:06:39;U740.TI220_PV.F_CV;11.823999405;100.0 +25/10/2020 02:06:42;U740.TI220_PV.F_CV;11.876800537;100.0 +25/10/2020 02:06:45;U740.TI220_PV.F_CV;11.823999405;100.0 +25/10/2020 02:06:47;U740.TI220_PV.F_CV;11.912000656;100.0 +25/10/2020 02:06:48;U740.TI220_PV.F_CV;11.823999405;100.0 +25/10/2020 02:06:49;U740.TI220_PV.F_CV;11.912000656;100.0 +25/10/2020 02:06:50;U740.TI220_PV.F_CV;11.823999405;100.0 +25/10/2020 02:06:52;U740.TI220_PV.F_CV;11.882666588;100.0 +25/10/2020 02:06:54;U740.TI220_PV.F_CV;11.823999405;100.0 +25/10/2020 02:06:57;U740.TI220_PV.F_CV;11.890000343;100.0 +25/10/2020 02:06:59;U740.TI220_PV.F_CV;11.823999405;100.0 +25/10/2020 02:06:00;U740.TI223_PV.F_CV;15.687200546;100.0 +25/10/2020 02:06:05;U740.TI223_PV.F_CV;15.739999771;100.0 +25/10/2020 02:06:06;U740.TI223_PV.F_CV;15.652000427;100.0 +25/10/2020 02:06:07;U740.TI223_PV.F_CV;15.739999771;100.0 +25/10/2020 02:06:10;U740.TI223_PV.F_CV;15.673999786;100.0 +25/10/2020 02:06:12;U740.TI223_PV.F_CV;15.739999771;100.0 +25/10/2020 02:06:14;U740.TI223_PV.F_CV;15.652000427;100.0 +25/10/2020 02:06:15;U740.TI223_PV.F_CV;15.739999771;100.0 +25/10/2020 02:06:17;U740.TI223_PV.F_CV;15.681333542;100.0 +25/10/2020 02:06:19;U740.TI223_PV.F_CV;15.739999771;100.0 +25/10/2020 02:06:23;U740.TI223_PV.F_CV;15.681333542;100.0 +25/10/2020 02:06:26;U740.TI223_PV.F_CV;15.739999771;100.0 +25/10/2020 02:06:28;U740.TI223_PV.F_CV;15.681333542;100.0 +25/10/2020 02:06:36;U740.TI223_PV.F_CV;15.871999741;100.0 +25/10/2020 02:06:40;U740.TI223_PV.F_CV;15.652000427;100.0 +25/10/2020 02:06:41;U740.TI223_PV.F_CV;15.739999771;100.0 +25/10/2020 02:06:47;U740.TI223_PV.F_CV;15.681333542;100.0 +25/10/2020 02:06:51;U740.TI223_PV.F_CV;15.739999771;100.0 +25/10/2020 02:06:52;U740.TI223_PV.F_CV;15.652000427;100.0 +25/10/2020 02:06:53;U740.TI223_PV.F_CV;15.739999771;100.0 +25/10/2020 02:06:55;U740.TI223_PV.F_CV;15.652000427;100.0 +25/10/2020 02:06:56;U740.TI223_PV.F_CV;15.739999771;100.0 +25/10/2020 02:06:16;U740.TI224_PV.F_CV;15.827999115;100.0 +25/10/2020 02:06:01;U740.TI25_PV.F_CV;10.806446075;100.0 +25/10/2020 02:06:10;U740.TI25_PV.F_CV;10.750724792;100.0 +25/10/2020 02:06:59;U740.TI28_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:48;U740.TI29_PV.F_CV;10.543721199;100.0 +25/10/2020 02:06:57;U740.TI32_PV.F_CV;13.526521683;100.0 +25/10/2020 02:06:21;U740.TI33_PV.F_CV;13.212607384;100.0 +25/10/2020 02:06:38;U740.TI37_PV.F_CV;11.322668076;100.0 +25/10/2020 02:06:43;U740.TI38_PV.F_CV;11.696174622;100.0 +25/10/2020 02:06:30;U740.TI46_PV.F_CV;11.244349480;100.0 +25/10/2020 02:06:29;U740.UI12_PV.F_CV;-1.119342089;100.0 +25/10/2020 02:06:03;U767.AI01A_PV.F_CV;1201.744873047;100.0 +25/10/2020 02:06:19;U767.AI01A_PV.F_CV;1201.067504883;100.0 +25/10/2020 02:06:20;U767.AI01A_PV.F_CV;1201.775146484;100.0 +25/10/2020 02:06:12;U767.AI01B_PV.F_CV;1199.123046875;100.0 +25/10/2020 02:06:56;U767.AI01B_PV.F_CV;1198.567504883;100.0 +25/10/2020 02:06:27;U767.DI01A_PV.F_CV;0.864696920;100.0 +25/10/2020 02:06:04;U767.DI01B_PV.F_CV;0.846080422;100.0 +25/10/2020 02:06:05;U767.DI01B_PV.F_CV;0.845278144;100.0 +25/10/2020 02:06:08;U767.DI01B_PV.F_CV;0.846207023;100.0 +25/10/2020 02:06:10;U767.DI01B_PV.F_CV;0.844731212;100.0 +25/10/2020 02:06:15;U767.DI01B_PV.F_CV;0.847131789;100.0 +25/10/2020 02:06:29;U767.DI01B_PV.F_CV;0.845941842;100.0 +25/10/2020 02:06:43;U767.DI01B_PV.F_CV;0.847368836;100.0 +25/10/2020 02:06:51;U767.DI01B_PV.F_CV;0.846550524;100.0 +25/10/2020 02:06:52;U767.DI01B_PV.F_CV;0.845181584;100.0 +25/10/2020 02:06:58;U767.DI01B_PV.F_CV;0.846919358;100.0 +25/10/2020 02:06:47;U767.DI159_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.DI172_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.DI173_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U767.dT1_CoefH_1;-64.927818298;100.0 +25/10/2020 02:06:01;U767.dT1_CoefH_1;-64.487091064;100.0 +25/10/2020 02:06:02;U767.dT1_CoefH_1;-62.061664581;100.0 +25/10/2020 02:06:03;U767.dT1_CoefH_1;-65.368545532;100.0 +25/10/2020 02:06:04;U767.dT1_CoefH_1;-62.171607971;100.0 +25/10/2020 02:06:05;U767.dT1_CoefH_1;-65.148658752;100.0 +25/10/2020 02:06:06;U767.dT1_CoefH_1;-64.487091064;100.0 +25/10/2020 02:06:07;U767.dT1_CoefH_1;-65.369026184;100.0 +25/10/2020 02:06:08;U767.dT1_CoefH_1;-66.141014099;100.0 +25/10/2020 02:06:09;U767.dT1_CoefH_1;-65.148185730;100.0 +25/10/2020 02:06:10;U767.dT1_CoefH_1;-64.928298950;100.0 +25/10/2020 02:06:11;U767.dT1_CoefH_1;-66.030593872;100.0 +25/10/2020 02:06:12;U767.dT1_CoefH_1;-63.825527191;100.0 +25/10/2020 02:06:13;U767.dT1_CoefH_1;-64.487091064;100.0 +25/10/2020 02:06:14;U767.dT1_CoefH_1;-63.494743347;100.0 +25/10/2020 02:06:15;U767.dT1_CoefH_1;-66.802581787;100.0 +25/10/2020 02:06:16;U767.dT1_CoefH_1;-64.597511292;100.0 +25/10/2020 02:06:17;U767.dT1_CoefH_1;-65.479446411;100.0 +25/10/2020 02:06:18;U767.dT1_CoefH_1;-64.817878723;100.0 +25/10/2020 02:06:19;U767.dT1_CoefH_1;-65.148658752;100.0 +25/10/2020 02:06:20;U767.dT1_CoefH_1;-65.369026184;100.0 +25/10/2020 02:06:21;U767.dT1_CoefH_1;-65.699806213;100.0 +25/10/2020 02:06:22;U767.dT1_CoefH_1;-64.817878723;100.0 +25/10/2020 02:06:23;U767.dT1_CoefH_1;-64.045890808;100.0 +25/10/2020 02:06:24;U767.dT1_CoefH_1;-65.038238525;100.0 +25/10/2020 02:06:25;U767.dT1_CoefH_1;-63.384323120;100.0 +25/10/2020 02:06:26;U767.dT1_CoefH_1;-64.817878723;100.0 +25/10/2020 02:06:27;U767.dT1_CoefH_1;-63.164436340;100.0 +25/10/2020 02:06:28;U767.dT1_CoefH_1;-66.141014099;100.0 +25/10/2020 02:06:29;U767.dT1_CoefH_1;-65.258605957;100.0 +25/10/2020 02:06:30;U767.dT1_CoefH_1;-64.045890808;100.0 +25/10/2020 02:06:31;U767.dT1_CoefH_1;-64.045890808;100.0 +25/10/2020 02:06:32;U767.dT1_CoefH_1;-63.273899078;100.0 +25/10/2020 02:06:33;U767.dT1_CoefH_1;-64.156311035;100.0 +25/10/2020 02:06:34;U767.dT1_CoefH_1;-62.833175659;100.0 +25/10/2020 02:06:35;U767.dT1_CoefH_1;-63.384799957;100.0 +25/10/2020 02:06:36;U767.dT1_CoefH_1;-64.597038269;100.0 +25/10/2020 02:06:37;U767.dT1_CoefH_1;-62.612812042;100.0 +25/10/2020 02:06:38;U767.dT1_CoefH_1;-64.927818298;100.0 +25/10/2020 02:06:39;U767.dT1_CoefH_1;-63.826004028;100.0 +25/10/2020 02:06:40;U767.dT1_CoefH_1;-64.266250610;100.0 +25/10/2020 02:06:41;U767.dT1_CoefH_1;-62.943595886;100.0 +25/10/2020 02:06:42;U767.dT1_CoefH_1;-65.699806213;100.0 +25/10/2020 02:06:43;U767.dT1_CoefH_1;-63.274379730;100.0 +25/10/2020 02:06:44;U767.dT1_CoefH_1;-62.943115234;100.0 +25/10/2020 02:06:45;U767.dT1_CoefH_1;-63.053535461;100.0 +25/10/2020 02:06:46;U767.dT1_CoefH_1;-65.038238525;100.0 +25/10/2020 02:06:47;U767.dT1_CoefH_1;-63.935466766;100.0 +25/10/2020 02:06:48;U767.dT1_CoefH_1;-67.132888794;100.0 +25/10/2020 02:06:49;U767.dT1_CoefH_1;-63.604682922;100.0 +25/10/2020 02:06:50;U767.dT1_CoefH_1;-64.597038269;100.0 +25/10/2020 02:06:51;U767.dT1_CoefH_1;-65.920173645;100.0 +25/10/2020 02:06:52;U767.dT1_CoefH_1;-64.597038269;100.0 +25/10/2020 02:06:53;U767.dT1_CoefH_1;-65.148185730;100.0 +25/10/2020 02:06:54;U767.dT1_CoefH_1;-63.715106964;100.0 +25/10/2020 02:06:55;U767.dT1_CoefH_1;-62.282028198;100.0 +25/10/2020 02:06:56;U767.dT1_CoefH_1;-62.282028198;100.0 +25/10/2020 02:06:57;U767.dT1_CoefH_1;-63.384799957;100.0 +25/10/2020 02:06:58;U767.dT1_CoefH_1;-63.163959503;100.0 +25/10/2020 02:06:59;U767.dT1_CoefH_1;-63.164436340;100.0 +25/10/2020 02:06:00;U767.dT1_CoefH_2;-57.371414185;100.0 +25/10/2020 02:06:01;U767.dT1_CoefH_2;-57.931938171;100.0 +25/10/2020 02:06:02;U767.dT1_CoefH_2;-58.941661835;100.0 +25/10/2020 02:06:03;U767.dT1_CoefH_2;-60.960136414;100.0 +25/10/2020 02:06:04;U767.dT1_CoefH_2;-58.156539917;100.0 +25/10/2020 02:06:05;U767.dT1_CoefH_2;-57.820613861;100.0 +25/10/2020 02:06:06;U767.dT1_CoefH_2;-56.362663269;100.0 +25/10/2020 02:06:07;U767.dT1_CoefH_2;-57.708312988;100.0 +25/10/2020 02:06:08;U767.dT1_CoefH_2;-58.942150116;100.0 +25/10/2020 02:06:09;U767.dT1_CoefH_2;-56.923187256;100.0 +25/10/2020 02:06:10;U767.dT1_CoefH_2;-55.689838409;100.0 +25/10/2020 02:06:11;U767.dT1_CoefH_2;-56.250850677;100.0 +25/10/2020 02:06:12;U767.dT1_CoefH_2;-58.493438721;100.0 +25/10/2020 02:06:13;U767.dT1_CoefH_2;-58.829364777;100.0 +25/10/2020 02:06:14;U767.dT1_CoefH_2;-59.951385498;100.0 +25/10/2020 02:06:15;U767.dT1_CoefH_2;-57.260086060;100.0 +25/10/2020 02:06:16;U767.dT1_CoefH_2;-57.372386932;100.0 +25/10/2020 02:06:17;U767.dT1_CoefH_2;-58.493438721;100.0 +25/10/2020 02:06:18;U767.dT1_CoefH_2;-58.829849243;100.0 +25/10/2020 02:06:19;U767.dT1_CoefH_2;-58.829849243;100.0 +25/10/2020 02:06:20;U767.dT1_CoefH_2;-60.175498962;100.0 +25/10/2020 02:06:21;U767.dT1_CoefH_2;-56.587261200;100.0 +25/10/2020 02:06:22;U767.dT1_CoefH_2;-58.493438721;100.0 +25/10/2020 02:06:23;U767.dT1_CoefH_2;-58.381137848;100.0 +25/10/2020 02:06:24;U767.dT1_CoefH_2;-57.820613861;100.0 +25/10/2020 02:06:25;U767.dT1_CoefH_2;-59.053962708;100.0 +25/10/2020 02:06:26;U767.dT1_CoefH_2;-58.045211792;100.0 +25/10/2020 02:06:27;U767.dT1_CoefH_2;-58.381137848;100.0 +25/10/2020 02:06:28;U767.dT1_CoefH_2;-58.493438721;100.0 +25/10/2020 02:06:29;U767.dT1_CoefH_2;-59.614486694;100.0 +25/10/2020 02:06:30;U767.dT1_CoefH_2;-57.596012115;100.0 +25/10/2020 02:06:31;U767.dT1_CoefH_2;-60.287311554;100.0 +25/10/2020 02:06:32;U767.dT1_CoefH_2;-59.726787567;100.0 +25/10/2020 02:06:33;U767.dT1_CoefH_2;-60.960136414;100.0 +25/10/2020 02:06:34;U767.dT1_CoefH_2;-58.268836975;100.0 +25/10/2020 02:06:35;U767.dT1_CoefH_2;-58.493438721;100.0 +25/10/2020 02:06:36;U767.dT1_CoefH_2;-58.717063904;100.0 +25/10/2020 02:06:37;U767.dT1_CoefH_2;-59.502185822;100.0 +25/10/2020 02:06:38;U767.dT1_CoefH_2;-57.035003662;100.0 +25/10/2020 02:06:39;U767.dT1_CoefH_2;-57.259601593;100.0 +25/10/2020 02:06:40;U767.dT1_CoefH_2;-57.707828522;100.0 +25/10/2020 02:06:41;U767.dT1_CoefH_2;-58.268352509;100.0 +25/10/2020 02:06:42;U767.dT1_CoefH_2;-57.147300720;100.0 +25/10/2020 02:06:43;U767.dT1_CoefH_2;-59.389888763;100.0 +25/10/2020 02:06:44;U767.dT1_CoefH_2;-57.708312988;100.0 +25/10/2020 02:06:45;U767.dT1_CoefH_2;-58.268836975;100.0 +25/10/2020 02:06:46;U767.dT1_CoefH_2;-58.605251312;100.0 +25/10/2020 02:06:47;U767.dT1_CoefH_2;-58.044723511;100.0 +25/10/2020 02:06:48;U767.dT1_CoefH_2;-55.689838409;100.0 +25/10/2020 02:06:49;U767.dT1_CoefH_2;-60.175498962;100.0 +25/10/2020 02:06:50;U767.dT1_CoefH_2;-57.932910919;100.0 +25/10/2020 02:06:51;U767.dT1_CoefH_2;-61.408847809;100.0 +25/10/2020 02:06:52;U767.dT1_CoefH_2;-57.932910919;100.0 +25/10/2020 02:06:53;U767.dT1_CoefH_2;-60.063198090;100.0 +25/10/2020 02:06:54;U767.dT1_CoefH_2;-58.044723511;100.0 +25/10/2020 02:06:55;U767.dT1_CoefH_2;-59.614486694;100.0 +25/10/2020 02:06:56;U767.dT1_CoefH_2;-58.717063904;100.0 +25/10/2020 02:06:57;U767.dT1_CoefH_2;-58.380649567;100.0 +25/10/2020 02:06:58;U767.dT1_CoefH_2;-58.829364777;100.0 +25/10/2020 02:06:59;U767.dT1_CoefH_2;-57.035003662;100.0 +25/10/2020 02:06:00;U767.dT2_CoefH_1;-56.190025330;100.0 +25/10/2020 02:06:01;U767.dT2_CoefH_1;-55.777797699;100.0 +25/10/2020 02:06:02;U767.dT2_CoefH_1;-55.076869965;100.0 +25/10/2020 02:06:03;U767.dT2_CoefH_1;-56.189846039;100.0 +25/10/2020 02:06:04;U767.dT2_CoefH_1;-55.076690674;100.0 +25/10/2020 02:06:05;U767.dT2_CoefH_1;-55.777618408;100.0 +25/10/2020 02:06:06;U767.dT2_CoefH_1;-56.396316528;100.0 +25/10/2020 02:06:07;U767.dT2_CoefH_1;-55.571685791;100.0 +25/10/2020 02:06:08;U767.dT2_CoefH_1;-56.355201721;100.0 +25/10/2020 02:06:09;U767.dT2_CoefH_1;-56.437431335;100.0 +25/10/2020 02:06:10;U767.dT2_CoefH_1;-56.726314545;100.0 +25/10/2020 02:06:11;U767.dT2_CoefH_1;-56.148910522;100.0 +25/10/2020 02:06:12;U767.dT2_CoefH_1;-54.622989655;100.0 +25/10/2020 02:06:13;U767.dT2_CoefH_1;-55.282981873;100.0 +25/10/2020 02:06:14;U767.dT2_CoefH_1;-55.901679993;100.0 +25/10/2020 02:06:15;U767.dT2_CoefH_1;-56.478904724;100.0 +25/10/2020 02:06:16;U767.dT2_CoefH_1;-55.942794800;100.0 +25/10/2020 02:06:17;U767.dT2_CoefH_1;-56.148910522;100.0 +25/10/2020 02:06:18;U767.dT2_CoefH_1;-56.149089813;100.0 +25/10/2020 02:06:19;U767.dT2_CoefH_1;-56.685020447;100.0 +25/10/2020 02:06:20;U767.dT2_CoefH_1;-56.643726349;100.0 +25/10/2020 02:06:21;U767.dT2_CoefH_1;-56.437431335;100.0 +25/10/2020 02:06:22;U767.dT2_CoefH_1;-55.942794800;100.0 +25/10/2020 02:06:23;U767.dT2_CoefH_1;-56.313907623;100.0 +25/10/2020 02:06:24;U767.dT2_CoefH_1;-56.849838257;100.0 +25/10/2020 02:06:25;U767.dT2_CoefH_1;-55.942794800;100.0 +25/10/2020 02:06:26;U767.dT2_CoefH_1;-56.313907623;100.0 +25/10/2020 02:06:27;U767.dT2_CoefH_1;-55.489273071;100.0 +25/10/2020 02:06:28;U767.dT2_CoefH_1;-55.695209503;100.0 +25/10/2020 02:06:29;U767.dT2_CoefH_1;-55.777618408;100.0 +25/10/2020 02:06:30;U767.dT2_CoefH_1;-55.282802582;100.0 +25/10/2020 02:06:31;U767.dT2_CoefH_1;-56.025203705;100.0 +25/10/2020 02:06:32;U767.dT2_CoefH_1;-55.447799683;100.0 +25/10/2020 02:06:33;U767.dT2_CoefH_1;-56.025203705;100.0 +25/10/2020 02:06:34;U767.dT2_CoefH_1;-55.530387878;100.0 +25/10/2020 02:06:35;U767.dT2_CoefH_1;-54.870574951;100.0 +25/10/2020 02:06:36;U767.dT2_CoefH_1;-55.695209503;100.0 +25/10/2020 02:06:37;U767.dT2_CoefH_1;-54.705757141;100.0 +25/10/2020 02:06:38;U767.dT2_CoefH_1;-55.777618408;100.0 +25/10/2020 02:06:39;U767.dT2_CoefH_1;-55.159278870;100.0 +25/10/2020 02:06:40;U767.dT2_CoefH_1;-55.777439117;100.0 +25/10/2020 02:06:41;U767.dT2_CoefH_1;-55.365390778;100.0 +25/10/2020 02:06:42;U767.dT2_CoefH_1;-55.736324310;100.0 +25/10/2020 02:06:43;U767.dT2_CoefH_1;-55.736503601;100.0 +25/10/2020 02:06:44;U767.dT2_CoefH_1;-55.571506500;100.0 +25/10/2020 02:06:45;U767.dT2_CoefH_1;-55.241508484;100.0 +25/10/2020 02:06:46;U767.dT2_CoefH_1;-55.983734131;100.0 +25/10/2020 02:06:47;U767.dT2_CoefH_1;-55.860027313;100.0 +25/10/2020 02:06:48;U767.dT2_CoefH_1;-56.890953064;100.0 +25/10/2020 02:06:49;U767.dT2_CoefH_1;-55.901321411;100.0 +25/10/2020 02:06:50;U767.dT2_CoefH_1;-55.818733215;100.0 +25/10/2020 02:06:51;U767.dT2_CoefH_1;-56.066143036;100.0 +25/10/2020 02:06:52;U767.dT2_CoefH_1;-55.818733215;100.0 +25/10/2020 02:06:53;U767.dT2_CoefH_1;-56.189846039;100.0 +25/10/2020 02:06:54;U767.dT2_CoefH_1;-55.323917389;100.0 +25/10/2020 02:06:55;U767.dT2_CoefH_1;-54.870574951;100.0 +25/10/2020 02:06:56;U767.dT2_CoefH_1;-55.076869965;100.0 +25/10/2020 02:06:57;U767.dT2_CoefH_1;-55.530387878;100.0 +25/10/2020 02:06:58;U767.dT2_CoefH_1;-55.695388794;100.0 +25/10/2020 02:06:59;U767.dT2_CoefH_1;-54.870754242;100.0 +25/10/2020 02:06:00;U767.dT2_CoefH_2;-59.599205017;100.0 +25/10/2020 02:06:01;U767.dT2_CoefH_2;-60.141796112;100.0 +25/10/2020 02:06:02;U767.dT2_CoefH_2;-59.516006470;100.0 +25/10/2020 02:06:03;U767.dT2_CoefH_2;-60.600650787;100.0 +25/10/2020 02:06:04;U767.dT2_CoefH_2;-60.058418274;100.0 +25/10/2020 02:06:05;U767.dT2_CoefH_2;-59.724906921;100.0 +25/10/2020 02:06:06;U767.dT2_CoefH_2;-59.557968140;100.0 +25/10/2020 02:06:07;U767.dT2_CoefH_2;-59.766685486;100.0 +25/10/2020 02:06:08;U767.dT2_CoefH_2;-60.768131256;100.0 +25/10/2020 02:06:09;U767.dT2_CoefH_2;-59.432807922;100.0 +25/10/2020 02:06:10;U767.dT2_CoefH_2;-59.432991028;100.0 +25/10/2020 02:06:11;U767.dT2_CoefH_2;-59.224452972;100.0 +25/10/2020 02:06:12;U767.dT2_CoefH_2;-60.309097290;100.0 +25/10/2020 02:06:13;U767.dT2_CoefH_2;-60.934886932;100.0 +25/10/2020 02:06:14;U767.dT2_CoefH_2;-59.808284760;100.0 +25/10/2020 02:06:15;U767.dT2_CoefH_2;-59.766864777;100.0 +25/10/2020 02:06:16;U767.dT2_CoefH_2;-59.683307648;100.0 +25/10/2020 02:06:17;U767.dT2_CoefH_2;-60.309097290;100.0 +25/10/2020 02:06:18;U767.dT2_CoefH_2;-59.850063324;100.0 +25/10/2020 02:06:19;U767.dT2_CoefH_2;-59.933441162;100.0 +25/10/2020 02:06:20;U767.dT2_CoefH_2;-60.225536346;100.0 +25/10/2020 02:06:21;U767.dT2_CoefH_2;-58.723457336;100.0 +25/10/2020 02:06:22;U767.dT2_CoefH_2;-59.432807922;100.0 +25/10/2020 02:06:23;U767.dT2_CoefH_2;-60.017002106;100.0 +25/10/2020 02:06:24;U767.dT2_CoefH_2;-59.098934174;100.0 +25/10/2020 02:06:25;U767.dT2_CoefH_2;-61.018447876;100.0 +25/10/2020 02:06:26;U767.dT2_CoefH_2;-59.641708374;100.0 +25/10/2020 02:06:27;U767.dT2_CoefH_2;-59.850063324;100.0 +25/10/2020 02:06:28;U767.dT2_CoefH_2;-58.806835175;100.0 +25/10/2020 02:06:29;U767.dT2_CoefH_2;-59.933078766;100.0 +25/10/2020 02:06:30;U767.dT2_CoefH_2;-60.559413910;100.0 +25/10/2020 02:06:31;U767.dT2_CoefH_2;-61.268585205;100.0 +25/10/2020 02:06:32;U767.dT2_CoefH_2;-59.808101654;100.0 +25/10/2020 02:06:33;U767.dT2_CoefH_2;-60.225177765;100.0 +25/10/2020 02:06:34;U767.dT2_CoefH_2;-59.140350342;100.0 +25/10/2020 02:06:35;U767.dT2_CoefH_2;-59.808101654;100.0 +25/10/2020 02:06:36;U767.dT2_CoefH_2;-59.766143799;100.0 +25/10/2020 02:06:37;U767.dT2_CoefH_2;-59.891300201;100.0 +25/10/2020 02:06:38;U767.dT2_CoefH_2;-59.265510559;100.0 +25/10/2020 02:06:39;U767.dT2_CoefH_2;-58.639537811;100.0 +25/10/2020 02:06:40;U767.dT2_CoefH_2;-58.973232269;100.0 +25/10/2020 02:06:41;U767.dT2_CoefH_2;-59.849338531;100.0 +25/10/2020 02:06:42;U767.dT2_CoefH_2;-59.682762146;100.0 +25/10/2020 02:06:43;U767.dT2_CoefH_2;-61.101284027;100.0 +25/10/2020 02:06:44;U767.dT2_CoefH_2;-59.682945251;100.0 +25/10/2020 02:06:45;U767.dT2_CoefH_2;-60.141796112;100.0 +25/10/2020 02:06:46;U767.dT2_CoefH_2;-60.225357056;100.0 +25/10/2020 02:06:47;U767.dT2_CoefH_2;-60.267135620;100.0 +25/10/2020 02:06:48;U767.dT2_CoefH_2;-58.848796844;100.0 +25/10/2020 02:06:49;U767.dT2_CoefH_2;-60.601013184;100.0 +25/10/2020 02:06:50;U767.dT2_CoefH_2;-61.060226440;100.0 +25/10/2020 02:06:51;U767.dT2_CoefH_2;-61.393741608;100.0 +25/10/2020 02:06:52;U767.dT2_CoefH_2;-59.391029358;100.0 +25/10/2020 02:06:53;U767.dT2_CoefH_2;-60.642612457;100.0 +25/10/2020 02:06:54;U767.dT2_CoefH_2;-59.766502380;100.0 +25/10/2020 02:06:55;U767.dT2_CoefH_2;-60.100017548;100.0 +25/10/2020 02:06:56;U767.dT2_CoefH_2;-59.974861145;100.0 +25/10/2020 02:06:57;U767.dT2_CoefH_2;-59.807922363;100.0 +25/10/2020 02:06:58;U767.dT2_CoefH_2;-59.933078766;100.0 +25/10/2020 02:06:59;U767.dT2_CoefH_2;-59.640983582;100.0 +25/10/2020 02:06:02;U767.FC01_OP.F_CV;57.123725891;100.0 +25/10/2020 02:06:03;U767.FC01_OP.F_CV;57.181579590;100.0 +25/10/2020 02:06:05;U767.FC01_OP.F_CV;57.038921356;100.0 +25/10/2020 02:06:07;U767.FC01_OP.F_CV;57.148353577;100.0 +25/10/2020 02:06:10;U767.FC01_OP.F_CV;57.046859741;100.0 +25/10/2020 02:06:27;U767.FC01_OP.F_CV;57.132282257;100.0 +25/10/2020 02:06:29;U767.FC01_OP.F_CV;57.069572449;100.0 +25/10/2020 02:06:32;U767.FC01_OP.F_CV;57.122703552;100.0 +25/10/2020 02:06:37;U767.FC01_OP.F_CV;57.048313141;100.0 +25/10/2020 02:06:49;U767.FC01_OP.F_CV;57.150154114;100.0 +25/10/2020 02:06:50;U767.FC01_OP.F_CV;57.227092743;100.0 +25/10/2020 02:06:53;U767.FC01_OP.F_CV;57.020832062;100.0 +25/10/2020 02:06:00;U767.FC01_PV.F_CV;15.004052162;100.0 +25/10/2020 02:06:01;U767.FC01_PV.F_CV;14.998259544;100.0 +25/10/2020 02:06:03;U767.FC01_PV.F_CV;14.953942299;100.0 +25/10/2020 02:06:04;U767.FC01_PV.F_CV;14.960409164;100.0 +25/10/2020 02:06:05;U767.FC01_PV.F_CV;14.990749359;100.0 +25/10/2020 02:06:06;U767.FC01_PV.F_CV;15.000378609;100.0 +25/10/2020 02:06:07;U767.FC01_PV.F_CV;14.974552155;100.0 +25/10/2020 02:06:08;U767.FC01_PV.F_CV;14.953440666;100.0 +25/10/2020 02:06:09;U767.FC01_PV.F_CV;14.964373589;100.0 +25/10/2020 02:06:10;U767.FC01_PV.F_CV;14.996674538;100.0 +25/10/2020 02:06:11;U767.FC01_PV.F_CV;15.022519112;100.0 +25/10/2020 02:06:12;U767.FC01_PV.F_CV;15.035842896;100.0 +25/10/2020 02:06:13;U767.FC01_PV.F_CV;15.041728973;100.0 +25/10/2020 02:06:14;U767.FC01_PV.F_CV;15.038825989;100.0 +25/10/2020 02:06:17;U767.FC01_PV.F_CV;15.014663696;100.0 +25/10/2020 02:06:19;U767.FC01_PV.F_CV;15.008008957;100.0 +25/10/2020 02:06:22;U767.FC01_PV.F_CV;15.003704071;100.0 +25/10/2020 02:06:24;U767.FC01_PV.F_CV;15.005333900;100.0 +25/10/2020 02:06:26;U767.FC01_PV.F_CV;14.993000984;100.0 +25/10/2020 02:06:27;U767.FC01_PV.F_CV;14.972874641;100.0 +25/10/2020 02:06:28;U767.FC01_PV.F_CV;14.960144997;100.0 +25/10/2020 02:06:29;U767.FC01_PV.F_CV;14.971748352;100.0 +25/10/2020 02:06:30;U767.FC01_PV.F_CV;14.987516403;100.0 +25/10/2020 02:06:32;U767.FC01_PV.F_CV;14.980044365;100.0 +25/10/2020 02:06:33;U767.FC01_PV.F_CV;14.972951889;100.0 +25/10/2020 02:06:34;U767.FC01_PV.F_CV;14.969201088;100.0 +25/10/2020 02:06:36;U767.FC01_PV.F_CV;14.988182068;100.0 +25/10/2020 02:06:39;U767.FC01_PV.F_CV;15.024456024;100.0 +25/10/2020 02:06:40;U767.FC01_PV.F_CV;15.031924248;100.0 +25/10/2020 02:06:41;U767.FC01_PV.F_CV;15.034135818;100.0 +25/10/2020 02:06:43;U767.FC01_PV.F_CV;15.028349876;100.0 +25/10/2020 02:06:46;U767.FC01_PV.F_CV;15.010139465;100.0 +25/10/2020 02:06:48;U767.FC01_PV.F_CV;15.005225182;100.0 +25/10/2020 02:06:49;U767.FC01_PV.F_CV;14.986550331;100.0 +25/10/2020 02:06:50;U767.FC01_PV.F_CV;14.951160431;100.0 +25/10/2020 02:06:51;U767.FC01_PV.F_CV;14.937418938;100.0 +25/10/2020 02:06:52;U767.FC01_PV.F_CV;14.950824738;100.0 +25/10/2020 02:06:53;U767.FC01_PV.F_CV;14.983099937;100.0 +25/10/2020 02:06:54;U767.FC01_PV.F_CV;15.007656097;100.0 +25/10/2020 02:06:55;U767.FC01_PV.F_CV;15.022126198;100.0 +25/10/2020 02:06:56;U767.FC01_PV.F_CV;15.031159401;100.0 +25/10/2020 02:06:59;U767.FC01_PV.F_CV;15.027495384;100.0 +25/10/2020 02:06:48;U767.FC01_SP.F_CV;15.000000000;100.0 +25/10/2020 02:06:47;U767.FC02_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U767.FC02_PV.F_CV;0.053661428;100.0 +25/10/2020 02:06:47;U767.FC02_SP.F_CV;5.000000000;100.0 +25/10/2020 02:06:00;U767.FC26_PV.F_CV;3.022155046;100.0 +25/10/2020 02:06:04;U767.FC26_PV.F_CV;3.002184629;100.0 +25/10/2020 02:06:08;U767.FC26_PV.F_CV;3.096065998;100.0 +25/10/2020 02:06:09;U767.FC26_PV.F_CV;3.102867365;100.0 +25/10/2020 02:06:13;U767.FC26_PV.F_CV;3.084448099;100.0 +25/10/2020 02:06:15;U767.FC26_PV.F_CV;3.034217358;100.0 +25/10/2020 02:06:17;U767.FC26_PV.F_CV;3.013557434;100.0 +25/10/2020 02:06:19;U767.FC26_PV.F_CV;3.021527529;100.0 +25/10/2020 02:06:23;U767.FC26_PV.F_CV;3.096821308;100.0 +25/10/2020 02:06:25;U767.FC26_PV.F_CV;3.104570389;100.0 +25/10/2020 02:06:28;U767.FC26_PV.F_CV;3.072535038;100.0 +25/10/2020 02:06:29;U767.FC26_PV.F_CV;3.041685581;100.0 +25/10/2020 02:06:31;U767.FC26_PV.F_CV;3.015690327;100.0 +25/10/2020 02:06:34;U767.FC26_PV.F_CV;3.032804489;100.0 +25/10/2020 02:06:35;U767.FC26_PV.F_CV;3.061902761;100.0 +25/10/2020 02:06:37;U767.FC26_PV.F_CV;3.084372997;100.0 +25/10/2020 02:06:39;U767.FC26_PV.F_CV;3.096150398;100.0 +25/10/2020 02:06:41;U767.FC26_PV.F_CV;3.084174871;100.0 +25/10/2020 02:06:45;U767.FC26_PV.F_CV;3.020704269;100.0 +25/10/2020 02:06:48;U767.FC26_PV.F_CV;3.038639784;100.0 +25/10/2020 02:06:50;U767.FC26_PV.F_CV;3.126216412;100.0 +25/10/2020 02:06:51;U767.FC26_PV.F_CV;3.134042025;100.0 +25/10/2020 02:06:55;U767.FC26_PV.F_CV;3.110362530;100.0 +25/10/2020 02:06:57;U767.FC26_PV.F_CV;3.044508457;100.0 +25/10/2020 02:06:58;U767.FC26_PV.F_CV;3.034112215;100.0 +25/10/2020 02:06:47;U767.FF164_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.FF166_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.FF168_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.FF170_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U767.FI01A_PV.F_CV;-0.001828015;100.0 +25/10/2020 02:06:58;U767.FI01a_V_PV.F_CV;-0.002221279;100.0 +25/10/2020 02:06:00;U767.FI01B_PV.F_CV;12.705499649;100.0 +25/10/2020 02:06:01;U767.FI01B_PV.F_CV;12.644051552;100.0 +25/10/2020 02:06:02;U767.FI01B_PV.F_CV;12.655991554;100.0 +25/10/2020 02:06:03;U767.FI01B_PV.F_CV;12.701269150;100.0 +25/10/2020 02:06:04;U767.FI01B_PV.F_CV;12.715689659;100.0 +25/10/2020 02:06:06;U767.FI01B_PV.F_CV;12.611829758;100.0 +25/10/2020 02:06:07;U767.FI01B_PV.F_CV;12.637234688;100.0 +25/10/2020 02:06:08;U767.FI01B_PV.F_CV;12.700876236;100.0 +25/10/2020 02:06:09;U767.FI01B_PV.F_CV;12.720590591;100.0 +25/10/2020 02:06:10;U767.FI01B_PV.F_CV;12.707582474;100.0 +25/10/2020 02:06:13;U767.FI01B_PV.F_CV;12.721367836;100.0 +25/10/2020 02:06:24;U767.FI01B_PV.F_CV;12.721367836;100.0 +25/10/2020 02:06:25;U767.FI01B_PV.F_CV;12.675419807;100.0 +25/10/2020 02:06:26;U767.FI01B_PV.F_CV;12.661278725;100.0 +25/10/2020 02:06:27;U767.FI01B_PV.F_CV;12.671844482;100.0 +25/10/2020 02:06:28;U767.FI01B_PV.F_CV;12.704455376;100.0 +25/10/2020 02:06:30;U767.FI01B_PV.F_CV;12.661201477;100.0 +25/10/2020 02:06:36;U767.FI01B_PV.F_CV;12.701162338;100.0 +25/10/2020 02:06:38;U767.FI01B_PV.F_CV;12.725730896;100.0 +25/10/2020 02:06:47;U767.FI01B_PV.F_CV;12.711877823;100.0 +25/10/2020 02:06:48;U767.FI01B_PV.F_CV;12.653590202;100.0 +25/10/2020 02:06:49;U767.FI01B_PV.F_CV;12.637716293;100.0 +25/10/2020 02:06:50;U767.FI01B_PV.F_CV;12.649813652;100.0 +25/10/2020 02:06:51;U767.FI01B_PV.F_CV;12.707710266;100.0 +25/10/2020 02:06:56;U767.FI01B_PV.F_CV;12.718242645;100.0 +25/10/2020 02:06:08;U767.FI01b_V_PV.F_CV;15.024682999;100.0 +25/10/2020 02:06:25;U767.FI01b_V_PV.F_CV;14.996496201;100.0 +25/10/2020 02:06:38;U767.FI01b_V_PV.F_CV;15.017094612;100.0 +25/10/2020 02:06:40;U767.FI01b_V_PV.F_CV;15.035248756;100.0 +25/10/2020 02:06:47;U767.FI01b_V_PV.F_CV;14.977168083;100.0 +25/10/2020 02:06:50;U767.FI01b_V_PV.F_CV;14.930569649;100.0 +25/10/2020 02:06:55;U767.FI01b_V_PV.F_CV;15.035350800;100.0 +25/10/2020 02:06:59;U767.FI01b_V_PV.F_CV;15.000961304;100.0 +25/10/2020 02:06:16;U767.FI02A_PV.F_CV;0.053980760;100.0 +25/10/2020 02:06:00;U767.FI02B_PV.F_CV;0.019983660;100.0 +25/10/2020 02:06:02;U767.FI02B_PV.F_CV;0.027263526;100.0 +25/10/2020 02:06:03;U767.FI02B_PV.F_CV;0.036469467;100.0 +25/10/2020 02:06:04;U767.FI02B_PV.F_CV;0.022248739;100.0 +25/10/2020 02:06:05;U767.FI02B_PV.F_CV;0.027869387;100.0 +25/10/2020 02:06:06;U767.FI02B_PV.F_CV;0.022443961;100.0 +25/10/2020 02:06:07;U767.FI02B_PV.F_CV;0.030481637;100.0 +25/10/2020 02:06:08;U767.FI02B_PV.F_CV;0.050312553;100.0 +25/10/2020 02:06:09;U767.FI02B_PV.F_CV;0.040212475;100.0 +25/10/2020 02:06:10;U767.FI02B_PV.F_CV;0.020724041;100.0 +25/10/2020 02:06:12;U767.FI02B_PV.F_CV;0.004903365;100.0 +25/10/2020 02:06:13;U767.FI02B_PV.F_CV;0.013965693;100.0 +25/10/2020 02:06:14;U767.FI02B_PV.F_CV;0.006873125;100.0 +25/10/2020 02:06:17;U767.FI02B_PV.F_CV;0.030163134;100.0 +25/10/2020 02:06:21;U767.FI02B_PV.F_CV;0.020362582;100.0 +25/10/2020 02:06:22;U767.FI02B_PV.F_CV;0.034140818;100.0 +25/10/2020 02:06:23;U767.FI02B_PV.F_CV;0.015820935;100.0 +25/10/2020 02:06:25;U767.FI02B_PV.F_CV;0.020149447;100.0 +25/10/2020 02:06:26;U767.FI02B_PV.F_CV;0.010768433;100.0 +25/10/2020 02:06:27;U767.FI02B_PV.F_CV;0.017046569;100.0 +25/10/2020 02:06:29;U767.FI02B_PV.F_CV;0.005593123;100.0 +25/10/2020 02:06:30;U767.FI02B_PV.F_CV;0.019492636;100.0 +25/10/2020 02:06:31;U767.FI02B_PV.F_CV;0.010663296;100.0 +25/10/2020 02:06:34;U767.FI02B_PV.F_CV;0.006237002;100.0 +25/10/2020 02:06:36;U767.FI02B_PV.F_CV;0.010470819;100.0 +25/10/2020 02:06:38;U767.FI02B_PV.F_CV;0.027203936;100.0 +25/10/2020 02:06:39;U767.FI02B_PV.F_CV;0.042797230;100.0 +25/10/2020 02:06:41;U767.FI02B_PV.F_CV;0.016235713;100.0 +25/10/2020 02:06:42;U767.FI02B_PV.F_CV;0.009407975;100.0 +25/10/2020 02:06:45;U767.FI02B_PV.F_CV;0.019161515;100.0 +25/10/2020 02:06:47;U767.FI02B_PV.F_CV;0.006466295;100.0 +25/10/2020 02:06:48;U767.FI02B_PV.F_CV;0.002769121;100.0 +25/10/2020 02:06:52;U767.FI02B_PV.F_CV;0.018558456;100.0 +25/10/2020 02:06:53;U767.FI02B_PV.F_CV;0.030411731;100.0 +25/10/2020 02:06:54;U767.FI02B_PV.F_CV;0.048922151;100.0 +25/10/2020 02:06:55;U767.FI02B_PV.F_CV;0.035443492;100.0 +25/10/2020 02:06:56;U767.FI02B_PV.F_CV;0.043387949;100.0 +25/10/2020 02:06:57;U767.FI02B_PV.F_CV;0.035863481;100.0 +25/10/2020 02:06:58;U767.FI02B_PV.F_CV;0.013340846;100.0 +25/10/2020 02:06:59;U767.FI02B_PV.F_CV;0.003839523;100.0 +25/10/2020 02:06:47;U767.FI159_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.FI172_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.FI173_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.FI200_PV.F_CV;-0.046096586;100.0 +25/10/2020 02:06:09;U767.FI220_PV.F_CV;3.323883057;100.0 +25/10/2020 02:06:19;U767.FI220_PV.F_CV;3.311458588;100.0 +25/10/2020 02:06:21;U767.FI220_PV.F_CV;3.319042206;100.0 +25/10/2020 02:06:49;U767.FI220_PV.F_CV;3.298793793;100.0 +25/10/2020 02:06:01;U767.FI221_PV.F_CV;2.200157166;100.0 +25/10/2020 02:06:03;U767.FI221_PV.F_CV;2.189952850;100.0 +25/10/2020 02:06:14;U767.FI221_PV.F_CV;2.199649811;100.0 +25/10/2020 02:06:15;U767.FI221_PV.F_CV;2.190109253;100.0 +25/10/2020 02:06:27;U767.FI221_PV.F_CV;2.180423737;100.0 +25/10/2020 02:06:35;U767.FI221_PV.F_CV;2.189735413;100.0 +25/10/2020 02:06:53;U767.FI221_PV.F_CV;2.181133270;100.0 +25/10/2020 02:06:58;U767.FI221_PV.F_CV;2.201744080;100.0 +25/10/2020 02:06:24;U767.FI222_PV.F_CV;2.210388184;100.0 +25/10/2020 02:06:29;U767.FI222_PV.F_CV;2.228725433;100.0 +25/10/2020 02:06:32;U767.FI222_PV.F_CV;2.219360352;100.0 +25/10/2020 02:06:06;U767.FI223_PV.F_CV;1.211830139;100.0 +25/10/2020 02:06:55;U767.FI223_PV.F_CV;1.195404053;100.0 +25/10/2020 02:06:57;U767.FI223_PV.F_CV;1.207557678;100.0 +25/10/2020 02:06:00;U767.FI224_PV.F_CV;4.044931412;100.0 +25/10/2020 02:06:06;U767.FI224_PV.F_CV;4.052747726;100.0 +25/10/2020 02:06:12;U767.FI224_PV.F_CV;4.046747208;100.0 +25/10/2020 02:06:22;U767.FI224_PV.F_CV;4.043605804;100.0 +25/10/2020 02:06:26;U767.FI224_PV.F_CV;4.048519135;100.0 +25/10/2020 02:06:32;U767.FI224_PV.F_CV;4.045623779;100.0 +25/10/2020 02:06:41;U767.FI224_PV.F_CV;4.051275253;100.0 +25/10/2020 02:06:45;U767.FI224_PV.F_CV;4.043703079;100.0 +25/10/2020 02:06:58;U767.FI224_PV.F_CV;4.050462723;100.0 +25/10/2020 02:06:07;U767.FI225_PV.F_CV;1.657859802;100.0 +25/10/2020 02:06:29;U767.FI225_PV.F_CV;1.640514374;100.0 +25/10/2020 02:06:35;U767.FI225_PV.F_CV;1.664527893;100.0 +25/10/2020 02:06:43;U767.FI225_PV.F_CV;1.655559540;100.0 +25/10/2020 02:06:45;U767.FI225_PV.F_CV;1.638420105;100.0 +25/10/2020 02:06:57;U767.FI225_PV.F_CV;1.666625977;100.0 +25/10/2020 02:06:47;U767.FQ159_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.FQ172_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.FQ173_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U767.H_CoefH_1;447.392028809;100.0 +25/10/2020 02:06:01;U767.H_CoefH_1;449.223754883;100.0 +25/10/2020 02:06:02;U767.H_CoefH_1;449.399658203;100.0 +25/10/2020 02:06:03;U767.H_CoefH_1;448.131378174;100.0 +25/10/2020 02:06:04;U767.H_CoefH_1;448.293518066;100.0 +25/10/2020 02:06:05;U767.H_CoefH_1;453.505157471;100.0 +25/10/2020 02:06:06;U767.H_CoefH_1;452.972015381;100.0 +25/10/2020 02:06:07;U767.H_CoefH_1;453.106872559;100.0 +25/10/2020 02:06:08;U767.H_CoefH_1;449.438201904;100.0 +25/10/2020 02:06:09;U767.H_CoefH_1;449.053741455;100.0 +25/10/2020 02:06:10;U767.H_CoefH_1;444.830749512;100.0 +25/10/2020 02:06:11;U767.H_CoefH_1;448.094879150;100.0 +25/10/2020 02:06:12;U767.H_CoefH_1;448.166259766;100.0 +25/10/2020 02:06:13;U767.H_CoefH_1;450.723693848;100.0 +25/10/2020 02:06:14;U767.H_CoefH_1;453.118896484;100.0 +25/10/2020 02:06:15;U767.H_CoefH_1;454.590911865;100.0 +25/10/2020 02:06:16;U767.H_CoefH_1;455.964874268;100.0 +25/10/2020 02:06:17;U767.H_CoefH_1;457.531311035;100.0 +25/10/2020 02:06:18;U767.H_CoefH_1;456.607543945;100.0 +25/10/2020 02:06:19;U767.H_CoefH_1;455.495941162;100.0 +25/10/2020 02:06:20;U767.H_CoefH_1;452.817382813;100.0 +25/10/2020 02:06:21;U767.H_CoefH_1;452.945526123;100.0 +25/10/2020 02:06:22;U767.H_CoefH_1;454.394592285;100.0 +25/10/2020 02:06:23;U767.H_CoefH_1;451.338592529;100.0 +25/10/2020 02:06:24;U767.H_CoefH_1;452.807312012;100.0 +25/10/2020 02:06:25;U767.H_CoefH_1;449.583923340;100.0 +25/10/2020 02:06:26;U767.H_CoefH_1;449.596282959;100.0 +25/10/2020 02:06:27;U767.H_CoefH_1;448.228973389;100.0 +25/10/2020 02:06:28;U767.H_CoefH_1;449.311645508;100.0 +25/10/2020 02:06:29;U767.H_CoefH_1;449.005462646;100.0 +25/10/2020 02:06:30;U767.H_CoefH_1;450.049468994;100.0 +25/10/2020 02:06:31;U767.H_CoefH_1;446.554779053;100.0 +25/10/2020 02:06:32;U767.H_CoefH_1;446.639038086;100.0 +25/10/2020 02:06:33;U767.H_CoefH_1;445.591400146;100.0 +25/10/2020 02:06:34;U767.H_CoefH_1;446.997711182;100.0 +25/10/2020 02:06:35;U767.H_CoefH_1;443.213897705;100.0 +25/10/2020 02:06:36;U767.H_CoefH_1;447.003387451;100.0 +25/10/2020 02:06:37;U767.H_CoefH_1;448.068176270;100.0 +25/10/2020 02:06:38;U767.H_CoefH_1;448.622070313;100.0 +25/10/2020 02:06:39;U767.H_CoefH_1;450.072875977;100.0 +25/10/2020 02:06:40;U767.H_CoefH_1;450.208007813;100.0 +25/10/2020 02:06:41;U767.H_CoefH_1;449.758087158;100.0 +25/10/2020 02:06:42;U767.H_CoefH_1;451.575256348;100.0 +25/10/2020 02:06:43;U767.H_CoefH_1;448.716369629;100.0 +25/10/2020 02:06:44;U767.H_CoefH_1;452.879852295;100.0 +25/10/2020 02:06:45;U767.H_CoefH_1;451.715454102;100.0 +25/10/2020 02:06:46;U767.H_CoefH_1;453.347045898;100.0 +25/10/2020 02:06:47;U767.H_CoefH_1;452.326965332;100.0 +25/10/2020 02:06:48;U767.H_CoefH_1;452.801605225;100.0 +25/10/2020 02:06:49;U767.H_CoefH_1;452.091461182;100.0 +25/10/2020 02:06:50;U767.H_CoefH_1;449.553833008;100.0 +25/10/2020 02:06:51;U767.H_CoefH_1;447.132263184;100.0 +25/10/2020 02:06:52;U767.H_CoefH_1;445.949859619;100.0 +25/10/2020 02:06:53;U767.H_CoefH_1;442.730987549;100.0 +25/10/2020 02:06:54;U767.H_CoefH_1;444.497161865;100.0 +25/10/2020 02:06:55;U767.H_CoefH_1;443.044189453;100.0 +25/10/2020 02:06:56;U767.H_CoefH_1;445.834411621;100.0 +25/10/2020 02:06:57;U767.H_CoefH_1;446.809112549;100.0 +25/10/2020 02:06:58;U767.H_CoefH_1;448.439453125;100.0 +25/10/2020 02:06:59;U767.H_CoefH_1;448.113220215;100.0 +25/10/2020 02:06:00;U767.H_CoefH_2;493.314453125;100.0 +25/10/2020 02:06:01;U767.H_CoefH_2;493.968933105;100.0 +25/10/2020 02:06:02;U767.H_CoefH_2;491.291870117;100.0 +25/10/2020 02:06:03;U767.H_CoefH_2;493.179290771;100.0 +25/10/2020 02:06:04;U767.H_CoefH_2;491.923767090;100.0 +25/10/2020 02:06:05;U767.H_CoefH_2;493.278137207;100.0 +25/10/2020 02:06:06;U767.H_CoefH_2;494.272888184;100.0 +25/10/2020 02:06:07;U767.H_CoefH_2;491.405303955;100.0 +25/10/2020 02:06:08;U767.H_CoefH_2;494.474578857;100.0 +25/10/2020 02:06:09;U767.H_CoefH_2;494.086059570;100.0 +25/10/2020 02:06:10;U767.H_CoefH_2;496.666381836;100.0 +25/10/2020 02:06:11;U767.H_CoefH_2;496.946624756;100.0 +25/10/2020 02:06:12;U767.H_CoefH_2;494.393829346;100.0 +25/10/2020 02:06:13;U767.H_CoefH_2;495.452423096;100.0 +25/10/2020 02:06:14;U767.H_CoefH_2;493.851470947;100.0 +25/10/2020 02:06:15;U767.H_CoefH_2;494.760681152;100.0 +25/10/2020 02:06:16;U767.H_CoefH_2;493.785827637;100.0 +25/10/2020 02:06:17;U767.H_CoefH_2;492.302551270;100.0 +25/10/2020 02:06:18;U767.H_CoefH_2;489.329986572;100.0 +25/10/2020 02:06:19;U767.H_CoefH_2;493.077758789;100.0 +25/10/2020 02:06:20;U767.H_CoefH_2;491.551971436;100.0 +25/10/2020 02:06:21;U767.H_CoefH_2;493.371093750;100.0 +25/10/2020 02:06:22;U767.H_CoefH_2;493.765136719;100.0 +25/10/2020 02:06:23;U767.H_CoefH_2;494.807800293;100.0 +25/10/2020 02:06:24;U767.H_CoefH_2;494.319610596;100.0 +25/10/2020 02:06:25;U767.H_CoefH_2;493.879760742;100.0 +25/10/2020 02:06:26;U767.H_CoefH_2;494.435546875;100.0 +25/10/2020 02:06:27;U767.H_CoefH_2;495.478942871;100.0 +25/10/2020 02:06:28;U767.H_CoefH_2;496.580993652;100.0 +25/10/2020 02:06:29;U767.H_CoefH_2;497.428741455;100.0 +25/10/2020 02:06:30;U767.H_CoefH_2;498.789306641;100.0 +25/10/2020 02:06:31;U767.H_CoefH_2;493.645904541;100.0 +25/10/2020 02:06:32;U767.H_CoefH_2;493.328002930;100.0 +25/10/2020 02:06:33;U767.H_CoefH_2;492.656768799;100.0 +25/10/2020 02:06:34;U767.H_CoefH_2;490.529602051;100.0 +25/10/2020 02:06:35;U767.H_CoefH_2;489.531463623;100.0 +25/10/2020 02:06:36;U767.H_CoefH_2;489.147644043;100.0 +25/10/2020 02:06:37;U767.H_CoefH_2;490.832550049;100.0 +25/10/2020 02:06:38;U767.H_CoefH_2;490.116699219;100.0 +25/10/2020 02:06:39;U767.H_CoefH_2;492.049743652;100.0 +25/10/2020 02:06:40;U767.H_CoefH_2;494.274322510;100.0 +25/10/2020 02:06:41;U767.H_CoefH_2;495.824676514;100.0 +25/10/2020 02:06:42;U767.H_CoefH_2;494.990203857;100.0 +25/10/2020 02:06:43;U767.H_CoefH_2;494.424041748;100.0 +25/10/2020 02:06:44;U767.H_CoefH_2;493.533142090;100.0 +25/10/2020 02:06:45;U767.H_CoefH_2;493.522857666;100.0 +25/10/2020 02:06:46;U767.H_CoefH_2;495.132202148;100.0 +25/10/2020 02:06:47;U767.H_CoefH_2;496.782104492;100.0 +25/10/2020 02:06:48;U767.H_CoefH_2;497.806243896;100.0 +25/10/2020 02:06:49;U767.H_CoefH_2;498.010528564;100.0 +25/10/2020 02:06:50;U767.H_CoefH_2;496.977783203;100.0 +25/10/2020 02:06:51;U767.H_CoefH_2;498.999938965;100.0 +25/10/2020 02:06:52;U767.H_CoefH_2;494.072692871;100.0 +25/10/2020 02:06:53;U767.H_CoefH_2;495.897430420;100.0 +25/10/2020 02:06:54;U767.H_CoefH_2;491.569915771;100.0 +25/10/2020 02:06:55;U767.H_CoefH_2;494.916107178;100.0 +25/10/2020 02:06:56;U767.H_CoefH_2;496.480529785;100.0 +25/10/2020 02:06:57;U767.H_CoefH_2;497.678497314;100.0 +25/10/2020 02:06:58;U767.H_CoefH_2;496.148773193;100.0 +25/10/2020 02:06:59;U767.H_CoefH_2;496.863464355;100.0 +25/10/2020 02:06:01;U767.II01_PV.F_CV;21.416049957;100.0 +25/10/2020 02:06:03;U767.II01_PV.F_CV;21.314380646;100.0 +25/10/2020 02:06:05;U767.II01_PV.F_CV;21.418674469;100.0 +25/10/2020 02:06:06;U767.II01_PV.F_CV;21.331315994;100.0 +25/10/2020 02:06:09;U767.II01_PV.F_CV;21.391132355;100.0 +25/10/2020 02:06:10;U767.II01_PV.F_CV;21.316312790;100.0 +25/10/2020 02:06:13;U767.II01_PV.F_CV;21.390350342;100.0 +25/10/2020 02:06:15;U767.II01_PV.F_CV;21.313226700;100.0 +25/10/2020 02:06:17;U767.II01_PV.F_CV;21.384693146;100.0 +25/10/2020 02:06:19;U767.II01_PV.F_CV;21.257061005;100.0 +25/10/2020 02:06:20;U767.II01_PV.F_CV;21.357051849;100.0 +25/10/2020 02:06:22;U767.II01_PV.F_CV;21.287206650;100.0 +25/10/2020 02:06:24;U767.II01_PV.F_CV;21.354940414;100.0 +25/10/2020 02:06:27;U767.II01_PV.F_CV;21.299322128;100.0 +25/10/2020 02:06:28;U767.II01_PV.F_CV;21.371063232;100.0 +25/10/2020 02:06:30;U767.II01_PV.F_CV;21.313112259;100.0 +25/10/2020 02:06:31;U767.II01_PV.F_CV;21.373233795;100.0 +25/10/2020 02:06:33;U767.II01_PV.F_CV;21.305137634;100.0 +25/10/2020 02:06:36;U767.II01_PV.F_CV;21.386035919;100.0 +25/10/2020 02:06:37;U767.II01_PV.F_CV;21.333883286;100.0 +25/10/2020 02:06:40;U767.II01_PV.F_CV;21.403377533;100.0 +25/10/2020 02:06:41;U767.II01_PV.F_CV;21.293510437;100.0 +25/10/2020 02:06:44;U767.II01_PV.F_CV;21.419338226;100.0 +25/10/2020 02:06:45;U767.II01_PV.F_CV;21.322647095;100.0 +25/10/2020 02:06:55;U767.II01_PV.F_CV;21.431203842;100.0 +25/10/2020 02:06:57;U767.II01_PV.F_CV;21.275123596;100.0 +25/10/2020 02:06:59;U767.II01_PV.F_CV;21.401906967;100.0 +25/10/2020 02:06:47;U767.LI02_PV.F_CV;99.967239380;100.0 +25/10/2020 02:06:47;U767.LI04_PV.F_CV;3.776181936;100.0 +25/10/2020 02:06:50;U767.MI311_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:47;U767.PC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U767.PC01_PV.F_CV;2.835749149;100.0 +25/10/2020 02:06:47;U767.PC01_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U767.PC05_PV.F_CV;0.144837499;100.0 +25/10/2020 02:06:47;U767.PC09_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:06;U767.PC09_PV.F_CV;0.156929865;100.0 +25/10/2020 02:06:47;U767.PC09_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U767.PC31_PV.F_CV;0.143411651;100.0 +25/10/2020 02:06:47;U767.PC31B_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:55;U767.PC31B_PV.F_CV;2.389976978;100.0 +25/10/2020 02:06:47;U767.PC31B_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U767.PC36_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:23;U767.PC36_PV.F_CV;5.065747261;100.0 +25/10/2020 02:06:47;U767.PC36_SP.F_CV;28.000000000;100.0 +25/10/2020 02:06:47;U767.PC38_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.PC38_PV.F_CV;0.165489227;100.0 +25/10/2020 02:06:47;U767.PC38_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:15;U767.PC49_PV.F_CV;5.122490406;100.0 +25/10/2020 02:06:47;U767.PC50_PV.F_CV;0.129884988;100.0 +25/10/2020 02:06:47;U767.PDC162_OP.F_CV;0.000003815;100.0 +25/10/2020 02:06:47;U767.PDC162_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:47;U767.PDC162_SP.F_CV;-2.000000000;100.0 +25/10/2020 02:06:02;U767.PDT02_PV.F_CV;2.046038389;100.0 +25/10/2020 02:06:11;U767.PDT02_PV.F_CV;2.059149265;100.0 +25/10/2020 02:06:27;U767.PDT02_PV.F_CV;2.048190594;100.0 +25/10/2020 02:06:38;U767.PDT02_PV.F_CV;2.061662436;100.0 +25/10/2020 02:06:49;U767.PDT02_PV.F_CV;2.045510769;100.0 +25/10/2020 02:06:54;U767.PDT02_PV.F_CV;2.056301832;100.0 +25/10/2020 02:06:01;U767.PDT04_PV.F_CV;1.430833220;100.0 +25/10/2020 02:06:04;U767.PDT04_PV.F_CV;1.436894059;100.0 +25/10/2020 02:06:06;U767.PDT04_PV.F_CV;1.428503990;100.0 +25/10/2020 02:06:13;U767.PDT04_PV.F_CV;1.440743446;100.0 +25/10/2020 02:06:26;U767.PDT04_PV.F_CV;1.431191564;100.0 +25/10/2020 02:06:37;U767.PDT04_PV.F_CV;1.437247038;100.0 +25/10/2020 02:06:49;U767.PDT04_PV.F_CV;1.425815344;100.0 +25/10/2020 02:06:56;U767.PDT04_PV.F_CV;1.440800548;100.0 +25/10/2020 02:06:00;U767.PDT05_PV.F_CV;100.530227661;100.0 +25/10/2020 02:06:01;U767.PDT05_PV.F_CV;98.952499390;100.0 +25/10/2020 02:06:02;U767.PDT05_PV.F_CV;100.441085815;100.0 +25/10/2020 02:06:03;U767.PDT05_PV.F_CV;100.839599609;100.0 +25/10/2020 02:06:04;U767.PDT05_PV.F_CV;99.760055542;100.0 +25/10/2020 02:06:05;U767.PDT05_PV.F_CV;99.113929749;100.0 +25/10/2020 02:06:06;U767.PDT05_PV.F_CV;98.953201294;100.0 +25/10/2020 02:06:07;U767.PDT05_PV.F_CV;100.357223511;100.0 +25/10/2020 02:06:08;U767.PDT05_PV.F_CV;100.594253540;100.0 +25/10/2020 02:06:09;U767.PDT05_PV.F_CV;100.482627869;100.0 +25/10/2020 02:06:10;U767.PDT05_PV.F_CV;100.369873047;100.0 +25/10/2020 02:06:11;U767.PDT05_PV.F_CV;100.866737366;100.0 +25/10/2020 02:06:12;U767.PDT05_PV.F_CV;100.956420898;100.0 +25/10/2020 02:06:13;U767.PDT05_PV.F_CV;101.315299988;100.0 +25/10/2020 02:06:14;U767.PDT05_PV.F_CV;100.910224915;100.0 +25/10/2020 02:06:15;U767.PDT05_PV.F_CV;100.560768127;100.0 +25/10/2020 02:06:16;U767.PDT05_PV.F_CV;100.899742126;100.0 +25/10/2020 02:06:17;U767.PDT05_PV.F_CV;100.535881042;100.0 +25/10/2020 02:06:18;U767.PDT05_PV.F_CV;101.168853760;100.0 +25/10/2020 02:06:19;U767.PDT05_PV.F_CV;100.943069458;100.0 +25/10/2020 02:06:20;U767.PDT05_PV.F_CV;100.454299927;100.0 +25/10/2020 02:06:21;U767.PDT05_PV.F_CV;100.703079224;100.0 +25/10/2020 02:06:22;U767.PDT05_PV.F_CV;100.772048950;100.0 +25/10/2020 02:06:23;U767.PDT05_PV.F_CV;100.859420776;100.0 +25/10/2020 02:06:24;U767.PDT05_PV.F_CV;101.042129517;100.0 +25/10/2020 02:06:25;U767.PDT05_PV.F_CV;99.965499878;100.0 +25/10/2020 02:06:26;U767.PDT05_PV.F_CV;99.371047974;100.0 +25/10/2020 02:06:27;U767.PDT05_PV.F_CV;99.814376831;100.0 +25/10/2020 02:06:28;U767.PDT05_PV.F_CV;99.529296875;100.0 +25/10/2020 02:06:29;U767.PDT05_PV.F_CV;99.447738647;100.0 +25/10/2020 02:06:30;U767.PDT05_PV.F_CV;99.357154846;100.0 +25/10/2020 02:06:31;U767.PDT05_PV.F_CV;100.024856567;100.0 +25/10/2020 02:06:32;U767.PDT05_PV.F_CV;100.024559021;100.0 +25/10/2020 02:06:33;U767.PDT05_PV.F_CV;99.689170837;100.0 +25/10/2020 02:06:34;U767.PDT05_PV.F_CV;99.463935852;100.0 +25/10/2020 02:06:35;U767.PDT05_PV.F_CV;100.015121460;100.0 +25/10/2020 02:06:36;U767.PDT05_PV.F_CV;100.658042908;100.0 +25/10/2020 02:06:37;U767.PDT05_PV.F_CV;100.777069092;100.0 +25/10/2020 02:06:38;U767.PDT05_PV.F_CV;101.098876953;100.0 +25/10/2020 02:06:39;U767.PDT05_PV.F_CV;100.509483337;100.0 +25/10/2020 02:06:40;U767.PDT05_PV.F_CV;100.969070435;100.0 +25/10/2020 02:06:41;U767.PDT05_PV.F_CV;100.745086670;100.0 +25/10/2020 02:06:42;U767.PDT05_PV.F_CV;101.263343811;100.0 +25/10/2020 02:06:43;U767.PDT05_PV.F_CV;101.029220581;100.0 +25/10/2020 02:06:44;U767.PDT05_PV.F_CV;100.571861267;100.0 +25/10/2020 02:06:45;U767.PDT05_PV.F_CV;100.690544128;100.0 +25/10/2020 02:06:46;U767.PDT05_PV.F_CV;100.426895142;100.0 +25/10/2020 02:06:47;U767.PDT05_PV.F_CV;100.830413818;100.0 +25/10/2020 02:06:48;U767.PDT05_PV.F_CV;99.637741089;100.0 +25/10/2020 02:06:49;U767.PDT05_PV.F_CV;100.193054199;100.0 +25/10/2020 02:06:50;U767.PDT05_PV.F_CV;99.425598145;100.0 +25/10/2020 02:06:51;U767.PDT05_PV.F_CV;99.615875244;100.0 +25/10/2020 02:06:52;U767.PDT05_PV.F_CV;99.550315857;100.0 +25/10/2020 02:06:53;U767.PDT05_PV.F_CV;100.143173218;100.0 +25/10/2020 02:06:54;U767.PDT05_PV.F_CV;100.395011902;100.0 +25/10/2020 02:06:55;U767.PDT05_PV.F_CV;100.327384949;100.0 +25/10/2020 02:06:56;U767.PDT05_PV.F_CV;100.989974976;100.0 +25/10/2020 02:06:57;U767.PDT05_PV.F_CV;100.904151917;100.0 +25/10/2020 02:06:58;U767.PDT05_PV.F_CV;101.305641174;100.0 +25/10/2020 02:06:59;U767.PDT05_PV.F_CV;100.060569763;100.0 +25/10/2020 02:06:01;U767.PDT06_PV.F_CV;0.669553399;100.0 +25/10/2020 02:06:02;U767.PDT06_PV.F_CV;0.662782907;100.0 +25/10/2020 02:06:04;U767.PDT06_PV.F_CV;0.669848919;100.0 +25/10/2020 02:06:07;U767.PDT06_PV.F_CV;0.658018053;100.0 +25/10/2020 02:06:11;U767.PDT06_PV.F_CV;0.673933506;100.0 +25/10/2020 02:06:26;U767.PDT06_PV.F_CV;0.667406082;100.0 +25/10/2020 02:06:38;U767.PDT06_PV.F_CV;0.673890412;100.0 +25/10/2020 02:06:49;U767.PDT06_PV.F_CV;0.661423266;100.0 +25/10/2020 02:06:55;U767.PDT06_PV.F_CV;0.672311068;100.0 +25/10/2020 02:06:47;U767.PDT07A_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:47;U767.PDT07B_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:00;U767.PDT08_PV.F_CV;344.843444824;100.0 +25/10/2020 02:06:01;U767.PDT08_PV.F_CV;344.549285889;100.0 +25/10/2020 02:06:02;U767.PDT08_PV.F_CV;340.907379150;100.0 +25/10/2020 02:06:03;U767.PDT08_PV.F_CV;341.242950439;100.0 +25/10/2020 02:06:04;U767.PDT08_PV.F_CV;343.929077148;100.0 +25/10/2020 02:06:05;U767.PDT08_PV.F_CV;345.047790527;100.0 +25/10/2020 02:06:06;U767.PDT08_PV.F_CV;343.409545898;100.0 +25/10/2020 02:06:07;U767.PDT08_PV.F_CV;340.145935059;100.0 +25/10/2020 02:06:08;U767.PDT08_PV.F_CV;340.703674316;100.0 +25/10/2020 02:06:09;U767.PDT08_PV.F_CV;342.793548584;100.0 +25/10/2020 02:06:10;U767.PDT08_PV.F_CV;344.254852295;100.0 +25/10/2020 02:06:11;U767.PDT08_PV.F_CV;344.628997803;100.0 +25/10/2020 02:06:12;U767.PDT08_PV.F_CV;344.694488525;100.0 +25/10/2020 02:06:13;U767.PDT08_PV.F_CV;343.993957520;100.0 +25/10/2020 02:06:14;U767.PDT08_PV.F_CV;344.451873779;100.0 +25/10/2020 02:06:15;U767.PDT08_PV.F_CV;345.093170166;100.0 +25/10/2020 02:06:16;U767.PDT08_PV.F_CV;344.692443848;100.0 +25/10/2020 02:06:17;U767.PDT08_PV.F_CV;344.733154297;100.0 +25/10/2020 02:06:18;U767.PDT08_PV.F_CV;344.270538330;100.0 +25/10/2020 02:06:19;U767.PDT08_PV.F_CV;344.330627441;100.0 +25/10/2020 02:06:20;U767.PDT08_PV.F_CV;345.306732178;100.0 +25/10/2020 02:06:21;U767.PDT08_PV.F_CV;345.433258057;100.0 +25/10/2020 02:06:22;U767.PDT08_PV.F_CV;344.855255127;100.0 +25/10/2020 02:06:23;U767.PDT08_PV.F_CV;345.081481934;100.0 +25/10/2020 02:06:24;U767.PDT08_PV.F_CV;344.915039063;100.0 +25/10/2020 02:06:25;U767.PDT08_PV.F_CV;344.794006348;100.0 +25/10/2020 02:06:26;U767.PDT08_PV.F_CV;343.093505859;100.0 +25/10/2020 02:06:27;U767.PDT08_PV.F_CV;341.636566162;100.0 +25/10/2020 02:06:28;U767.PDT08_PV.F_CV;342.181213379;100.0 +25/10/2020 02:06:29;U767.PDT08_PV.F_CV;343.647735596;100.0 +25/10/2020 02:06:30;U767.PDT08_PV.F_CV;344.045532227;100.0 +25/10/2020 02:06:31;U767.PDT08_PV.F_CV;342.990661621;100.0 +25/10/2020 02:06:32;U767.PDT08_PV.F_CV;342.480682373;100.0 +25/10/2020 02:06:33;U767.PDT08_PV.F_CV;342.688568115;100.0 +25/10/2020 02:06:34;U767.PDT08_PV.F_CV;342.630065918;100.0 +25/10/2020 02:06:35;U767.PDT08_PV.F_CV;343.060302734;100.0 +25/10/2020 02:06:36;U767.PDT08_PV.F_CV;342.795227051;100.0 +25/10/2020 02:06:37;U767.PDT08_PV.F_CV;343.495300293;100.0 +25/10/2020 02:06:38;U767.PDT08_PV.F_CV;343.858581543;100.0 +25/10/2020 02:06:39;U767.PDT08_PV.F_CV;344.664001465;100.0 +25/10/2020 02:06:40;U767.PDT08_PV.F_CV;344.846984863;100.0 +25/10/2020 02:06:41;U767.PDT08_PV.F_CV;345.349639893;100.0 +25/10/2020 02:06:42;U767.PDT08_PV.F_CV;345.026611328;100.0 +25/10/2020 02:06:43;U767.PDT08_PV.F_CV;344.549530029;100.0 +25/10/2020 02:06:44;U767.PDT08_PV.F_CV;344.386291504;100.0 +25/10/2020 02:06:45;U767.PDT08_PV.F_CV;344.533874512;100.0 +25/10/2020 02:06:46;U767.PDT08_PV.F_CV;344.418304443;100.0 +25/10/2020 02:06:47;U767.PDT08_PV.F_CV;344.632110596;100.0 +25/10/2020 02:06:48;U767.PDT08_PV.F_CV;344.034240723;100.0 +25/10/2020 02:06:49;U767.PDT08_PV.F_CV;341.582092285;100.0 +25/10/2020 02:06:50;U767.PDT08_PV.F_CV;340.183288574;100.0 +25/10/2020 02:06:51;U767.PDT08_PV.F_CV;341.191009521;100.0 +25/10/2020 02:06:52;U767.PDT08_PV.F_CV;342.601745605;100.0 +25/10/2020 02:06:54;U767.PDT08_PV.F_CV;343.690429688;100.0 +25/10/2020 02:06:55;U767.PDT08_PV.F_CV;343.765838623;100.0 +25/10/2020 02:06:56;U767.PDT08_PV.F_CV;344.757965088;100.0 +25/10/2020 02:06:57;U767.PDT08_PV.F_CV;345.256988525;100.0 +25/10/2020 02:06:58;U767.PDT08_PV.F_CV;345.081359863;100.0 +25/10/2020 02:06:59;U767.PDT08_PV.F_CV;344.747619629;100.0 +25/10/2020 02:06:02;U767.PDT1_39_PV.F_CV;2.589573860;100.0 +25/10/2020 02:06:47;U767.PDT84_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:47;U767.PDT85_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:19;U767.PDT9_45_PV.F_CV;0.008609249;100.0 +25/10/2020 02:06:47;U767.PF164_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.PF166_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.PF168_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.PF170_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U767.PI105_PV.F_CV;1.558338523;100.0 +25/10/2020 02:06:18;U767.PI105_PV.F_CV;1.561465621;100.0 +25/10/2020 02:06:32;U767.PI105_PV.F_CV;1.558727145;100.0 +25/10/2020 02:06:36;U767.PI105_PV.F_CV;1.561428070;100.0 +25/10/2020 02:06:54;U767.PI105_PV.F_CV;1.558404088;100.0 +25/10/2020 02:06:46;U767.PI114_PV.F_CV;2.198465347;100.0 +25/10/2020 02:06:54;U767.PI116_PV.F_CV;1.816122651;100.0 +25/10/2020 02:06:01;U767.PI124_PV.F_CV;0.699983299;100.0 +25/10/2020 02:06:03;U767.PI126_PV.F_CV;1.078738689;100.0 +25/10/2020 02:06:47;U767.PI150_PV.F_CV;0.251907229;100.0 +25/10/2020 02:06:47;U767.PI151_PV.F_CV;0.181985602;100.0 +25/10/2020 02:06:47;U767.PI152_PV.F_CV;0.273367256;100.0 +25/10/2020 02:06:47;U767.PI153_PV.F_CV;0.278093040;100.0 +25/10/2020 02:06:47;U767.PI154_PV.F_CV;0.069292560;100.0 +25/10/2020 02:06:47;U767.PI155_PV.F_CV;0.269798607;100.0 +25/10/2020 02:06:47;U767.PI156_PV.F_CV;0.228595868;100.0 +25/10/2020 02:06:47;U767.PI157_PV.F_CV;0.274783432;100.0 +25/10/2020 02:06:47;U767.PI158_PV.F_CV;0.050604623;100.0 +25/10/2020 02:06:47;U767.PI165_PV.F_CV;0.001540096;100.0 +25/10/2020 02:06:47;U767.PI31A_PV.F_CV;0.093663678;100.0 +25/10/2020 02:06:57;U767.PI37_PV.F_CV;4.857200146;100.0 +25/10/2020 02:06:23;U767.PI39_PV.F_CV;0.235438481;100.0 +25/10/2020 02:06:00;U767.PI45_PV.F_CV;0.146925002;100.0 +25/10/2020 02:06:01;U767.PI54_PV.F_CV;0.557489872;100.0 +25/10/2020 02:06:10;U767.PI65_PV.F_CV;0.155339360;100.0 +25/10/2020 02:06:20;U767.PI66_PV.F_CV;1.252175570;100.0 +25/10/2020 02:06:00;U767.Q_CoefH_1;2811.213623047;100.0 +25/10/2020 02:06:01;U767.Q_CoefH_1;2809.041748047;100.0 +25/10/2020 02:06:02;U767.Q_CoefH_1;2816.469970703;100.0 +25/10/2020 02:06:03;U767.Q_CoefH_1;2808.242187500;100.0 +25/10/2020 02:06:04;U767.Q_CoefH_1;2810.591064453;100.0 +25/10/2020 02:06:05;U767.Q_CoefH_1;2822.013427734;100.0 +25/10/2020 02:06:06;U767.Q_CoefH_1;2832.691406250;100.0 +25/10/2020 02:06:07;U767.Q_CoefH_1;2834.917236328;100.0 +25/10/2020 02:06:08;U767.Q_CoefH_1;2827.188232422;100.0 +25/10/2020 02:06:09;U767.Q_CoefH_1;2814.196777344;100.0 +25/10/2020 02:06:10;U767.Q_CoefH_1;2800.478271484;100.0 +25/10/2020 02:06:11;U767.Q_CoefH_1;2800.810302734;100.0 +25/10/2020 02:06:12;U767.Q_CoefH_1;2804.095703125;100.0 +25/10/2020 02:06:13;U767.Q_CoefH_1;2817.504394531;100.0 +25/10/2020 02:06:14;U767.Q_CoefH_1;2828.230468750;100.0 +25/10/2020 02:06:15;U767.Q_CoefH_1;2843.034912109;100.0 +25/10/2020 02:06:16;U767.Q_CoefH_1;2849.962158203;100.0 +25/10/2020 02:06:17;U767.Q_CoefH_1;2852.994873047;100.0 +25/10/2020 02:06:18;U767.Q_CoefH_1;2848.481689453;100.0 +25/10/2020 02:06:19;U767.Q_CoefH_1;2847.118408203;100.0 +25/10/2020 02:06:20;U767.Q_CoefH_1;2848.563476563;100.0 +25/10/2020 02:06:21;U767.Q_CoefH_1;2840.962890625;100.0 +25/10/2020 02:06:22;U767.Q_CoefH_1;2839.875244141;100.0 +25/10/2020 02:06:23;U767.Q_CoefH_1;2833.652099609;100.0 +25/10/2020 02:06:24;U767.Q_CoefH_1;2827.250000000;100.0 +25/10/2020 02:06:25;U767.Q_CoefH_1;2820.286132813;100.0 +25/10/2020 02:06:26;U767.Q_CoefH_1;2814.001708984;100.0 +25/10/2020 02:06:27;U767.Q_CoefH_1;2811.278320313;100.0 +25/10/2020 02:06:28;U767.Q_CoefH_1;2812.415771484;100.0 +25/10/2020 02:06:29;U767.Q_CoefH_1;2817.248535156;100.0 +25/10/2020 02:06:30;U767.Q_CoefH_1;2817.736816406;100.0 +25/10/2020 02:06:31;U767.Q_CoefH_1;2808.091308594;100.0 +25/10/2020 02:06:32;U767.Q_CoefH_1;2807.918212891;100.0 +25/10/2020 02:06:33;U767.Q_CoefH_1;2795.180908203;100.0 +25/10/2020 02:06:34;U767.Q_CoefH_1;2791.866943359;100.0 +25/10/2020 02:06:35;U767.Q_CoefH_1;2785.331787109;100.0 +25/10/2020 02:06:36;U767.Q_CoefH_1;2801.733886719;100.0 +25/10/2020 02:06:37;U767.Q_CoefH_1;2800.135986328;100.0 +25/10/2020 02:06:38;U767.Q_CoefH_1;2808.229492188;100.0 +25/10/2020 02:06:39;U767.Q_CoefH_1;2811.156250000;100.0 +25/10/2020 02:06:40;U767.Q_CoefH_1;2817.791503906;100.0 +25/10/2020 02:06:41;U767.Q_CoefH_1;2808.943359375;100.0 +25/10/2020 02:06:42;U767.Q_CoefH_1;2813.010742188;100.0 +25/10/2020 02:06:43;U767.Q_CoefH_1;2815.887451172;100.0 +25/10/2020 02:06:44;U767.Q_CoefH_1;2826.797851563;100.0 +25/10/2020 02:06:45;U767.Q_CoefH_1;2829.455810547;100.0 +25/10/2020 02:06:46;U767.Q_CoefH_1;2830.693603516;100.0 +25/10/2020 02:06:47;U767.Q_CoefH_1;2831.617675781;100.0 +25/10/2020 02:06:48;U767.Q_CoefH_1;2829.012695313;100.0 +25/10/2020 02:06:49;U767.Q_CoefH_1;2829.619628906;100.0 +25/10/2020 02:06:50;U767.Q_CoefH_1;2819.559814453;100.0 +25/10/2020 02:06:51;U767.Q_CoefH_1;2805.909912109;100.0 +25/10/2020 02:06:52;U767.Q_CoefH_1;2790.817871094;100.0 +25/10/2020 02:06:53;U767.Q_CoefH_1;2783.470458984;100.0 +25/10/2020 02:06:54;U767.Q_CoefH_1;2779.305419922;100.0 +25/10/2020 02:06:55;U767.Q_CoefH_1;2777.356689453;100.0 +25/10/2020 02:06:56;U767.Q_CoefH_1;2786.099121094;100.0 +25/10/2020 02:06:57;U767.Q_CoefH_1;2798.669189453;100.0 +25/10/2020 02:06:58;U767.Q_CoefH_1;2803.874755859;100.0 +25/10/2020 02:06:59;U767.Q_CoefH_1;2796.441650391;100.0 +25/10/2020 02:06:00;U767.Q_CoefH_2;3100.023681641;100.0 +25/10/2020 02:06:01;U767.Q_CoefH_2;3095.192138672;100.0 +25/10/2020 02:06:02;U767.Q_CoefH_2;3095.159179688;100.0 +25/10/2020 02:06:03;U767.Q_CoefH_2;3092.701171875;100.0 +25/10/2020 02:06:04;U767.Q_CoefH_2;3098.374267578;100.0 +25/10/2020 02:06:05;U767.Q_CoefH_2;3100.701904297;100.0 +25/10/2020 02:06:06;U767.Q_CoefH_2;3102.972412109;100.0 +25/10/2020 02:06:07;U767.Q_CoefH_2;3096.411132813;100.0 +25/10/2020 02:06:08;U767.Q_CoefH_2;3101.493164063;100.0 +25/10/2020 02:06:09;U767.Q_CoefH_2;3112.197265625;100.0 +25/10/2020 02:06:10;U767.Q_CoefH_2;3115.031250000;100.0 +25/10/2020 02:06:11;U767.Q_CoefH_2;3117.330322266;100.0 +25/10/2020 02:06:12;U767.Q_CoefH_2;3119.008789063;100.0 +25/10/2020 02:06:13;U767.Q_CoefH_2;3116.072265625;100.0 +25/10/2020 02:06:14;U767.Q_CoefH_2;3109.323486328;100.0 +25/10/2020 02:06:15;U767.Q_CoefH_2;3107.040039063;100.0 +25/10/2020 02:06:16;U767.Q_CoefH_2;3108.699951172;100.0 +25/10/2020 02:06:17;U767.Q_CoefH_2;3099.712158203;100.0 +25/10/2020 02:06:18;U767.Q_CoefH_2;3089.753662109;100.0 +25/10/2020 02:06:19;U767.Q_CoefH_2;3089.010986328;100.0 +25/10/2020 02:06:20;U767.Q_CoefH_2;3083.253662109;100.0 +25/10/2020 02:06:21;U767.Q_CoefH_2;3093.947021484;100.0 +25/10/2020 02:06:22;U767.Q_CoefH_2;3098.399658203;100.0 +25/10/2020 02:06:23;U767.Q_CoefH_2;3109.385253906;100.0 +25/10/2020 02:06:24;U767.Q_CoefH_2;3101.582275391;100.0 +25/10/2020 02:06:25;U767.Q_CoefH_2;3105.504394531;100.0 +25/10/2020 02:06:26;U767.Q_CoefH_2;3106.264648438;100.0 +25/10/2020 02:06:27;U767.Q_CoefH_2;3119.354248047;100.0 +25/10/2020 02:06:28;U767.Q_CoefH_2;3119.885986328;100.0 +25/10/2020 02:06:29;U767.Q_CoefH_2;3128.050048828;100.0 +25/10/2020 02:06:30;U767.Q_CoefH_2;3115.947509766;100.0 +25/10/2020 02:06:31;U767.Q_CoefH_2;3108.639892578;100.0 +25/10/2020 02:06:32;U767.Q_CoefH_2;3100.244873047;100.0 +25/10/2020 02:06:33;U767.Q_CoefH_2;3097.082275391;100.0 +25/10/2020 02:06:34;U767.Q_CoefH_2;3090.691406250;100.0 +25/10/2020 02:06:35;U767.Q_CoefH_2;3086.000976563;100.0 +25/10/2020 02:06:36;U767.Q_CoefH_2;3083.457275391;100.0 +25/10/2020 02:06:37;U767.Q_CoefH_2;3085.000244141;100.0 +25/10/2020 02:06:38;U767.Q_CoefH_2;3080.050781250;100.0 +25/10/2020 02:06:39;U767.Q_CoefH_2;3095.878906250;100.0 +25/10/2020 02:06:40;U767.Q_CoefH_2;3096.243652344;100.0 +25/10/2020 02:06:41;U767.Q_CoefH_2;3102.865478516;100.0 +25/10/2020 02:06:42;U767.Q_CoefH_2;3107.763671875;100.0 +25/10/2020 02:06:43;U767.Q_CoefH_2;3113.764160156;100.0 +25/10/2020 02:06:44;U767.Q_CoefH_2;3100.040283203;100.0 +25/10/2020 02:06:45;U767.Q_CoefH_2;3106.478515625;100.0 +25/10/2020 02:06:46;U767.Q_CoefH_2;3115.318115234;100.0 +25/10/2020 02:06:47;U767.Q_CoefH_2;3127.648193359;100.0 +25/10/2020 02:06:48;U767.Q_CoefH_2;3129.131103516;100.0 +25/10/2020 02:06:49;U767.Q_CoefH_2;3140.843994141;100.0 +25/10/2020 02:06:50;U767.Q_CoefH_2;3135.222412109;100.0 +25/10/2020 02:06:51;U767.Q_CoefH_2;3128.999023438;100.0 +25/10/2020 02:06:52;U767.Q_CoefH_2;3119.212158203;100.0 +25/10/2020 02:06:53;U767.Q_CoefH_2;3116.822265625;100.0 +25/10/2020 02:06:54;U767.Q_CoefH_2;3110.773437500;100.0 +25/10/2020 02:06:55;U767.Q_CoefH_2;3111.652343750;100.0 +25/10/2020 02:06:56;U767.Q_CoefH_2;3120.850341797;100.0 +25/10/2020 02:06:57;U767.Q_CoefH_2;3124.529541016;100.0 +25/10/2020 02:06:58;U767.Q_CoefH_2;3127.067626953;100.0 +25/10/2020 02:06:59;U767.Q_CoefH_2;3123.400390625;100.0 +25/10/2020 02:06:47;U767.REF_C2H6_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.REF_C3H8_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.REF_C6PLUS_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.REF_CH4_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.REF_CO2_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.REF_I_C4H10_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.REF_I_C5H12_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.REF_N2_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.REF_N_C4H10_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.REF_N_C5H12_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.REF_NEO_C5H2_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.RPF_F164_F166_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:47;U767.RPF_F168_F170_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:03;U767.SC01_OP.F_CV;131.923690796;100.0 +25/10/2020 02:06:30;U767.SC01_PV.F_CV;130.053833008;100.0 +25/10/2020 02:06:33;U767.SC01_PV.F_CV;129.961746216;100.0 +25/10/2020 02:06:36;U767.SC01_SP.F_CV;130.000000000;100.0 +25/10/2020 02:06:47;U767.T17_C2H6_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.T17_C3H8_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.T17_C6PLUS_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.T17_CH4_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.T17_CO2_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.T17_I_C4H10_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.T17_I_C5H12_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.T17_N2_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.T17_N_C4H10_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.T17_N_C5H12_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.T17_NEO_C5H2_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U767.TC05_PV.F_CV;9.484251976;100.0 +25/10/2020 02:06:32;U767.TC05_PV.F_CV;9.431653023;100.0 +25/10/2020 02:06:31;U767.TC101_OP.F_CV;14.866882324;100.0 +25/10/2020 02:06:44;U767.TC101_OP.F_CV;14.816041946;100.0 +25/10/2020 02:06:47;U767.TC101_PV.F_CV;31.492773056;100.0 +25/10/2020 02:06:48;U767.TC101_SP.F_CV;31.500000000;100.0 +25/10/2020 02:06:13;U767.TC110_OP.F_CV;8.896582603;100.0 +25/10/2020 02:06:46;U767.TC110_PV.F_CV;22.493558884;100.0 +25/10/2020 02:06:23;U767.TC110_SP.F_CV;22.500000000;100.0 +25/10/2020 02:06:56;U767.TC11_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:13;U767.TC130_PV.F_CV;33.393291473;100.0 +25/10/2020 02:06:16;U767.TC130_PV.F_CV;33.461418152;100.0 +25/10/2020 02:06:46;U767.TC130_PV.F_CV;33.404991150;100.0 +25/10/2020 02:06:49;U767.TC130_PV.F_CV;33.480834961;100.0 +25/10/2020 02:06:04;U767.TC225_PV.F_CV;31.674751282;100.0 +25/10/2020 02:06:26;U767.TC37_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:20;U767.TC60_PV.F_CV;9.283660889;100.0 +25/10/2020 02:06:42;U767.TC61_PV.F_CV;10.019302368;100.0 +25/10/2020 02:06:27;U767.TC62_PV.F_CV;9.306158066;100.0 +25/10/2020 02:06:31;U767.TC62_PV.F_CV;9.208689690;100.0 +25/10/2020 02:06:09;U767.TDC04_PV.F_CV;-20.316463470;100.0 +25/10/2020 02:06:00;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:01;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:02;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:03;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:04;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:05;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:06;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:07;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:08;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:09;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:10;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:11;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:12;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:13;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:14;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:15;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:16;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:17;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:18;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:19;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:20;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:21;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:22;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:23;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:24;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:25;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:26;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:27;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:28;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:29;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:30;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:31;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:32;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:33;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:34;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:35;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:36;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:37;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:38;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:39;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:40;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:41;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:42;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:43;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:44;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:45;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:46;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:47;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:48;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:49;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:50;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:51;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:52;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:53;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:54;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:55;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:56;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:57;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:58;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:59;U767.Tf_P1_coherence_CoefH_1;0.000000000;100.0 +25/10/2020 02:06:00;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:01;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:02;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:03;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:04;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:05;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:06;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:07;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:08;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:09;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:10;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:11;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:12;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:13;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:14;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:15;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:16;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:17;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:18;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:19;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:20;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:21;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:22;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:23;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:24;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:25;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:26;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:27;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:28;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:29;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:30;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:31;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:32;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:33;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:34;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:35;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:36;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:37;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:38;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:39;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:40;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:41;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:42;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:43;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:44;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:45;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:46;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:47;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:48;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:49;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:50;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:51;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:52;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:53;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:54;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:55;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:56;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:57;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:58;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:59;U767.Tf_P1_coherence_CoefH_2;0.000000000;100.0 +25/10/2020 02:06:47;U767.TI01_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:03;U767.TI02_PV.F_CV;8.929834366;100.0 +25/10/2020 02:06:30;U767.TI02_PV.F_CV;9.024030685;100.0 +25/10/2020 02:06:34;U767.TI02_PV.F_CV;8.935326576;100.0 +25/10/2020 02:06:11;U767.TI04A_PV.F_CV;11.454027176;100.0 +25/10/2020 02:06:27;U767.TI04A_PV.F_CV;11.426064491;100.0 +25/10/2020 02:06:34;U767.TI04A_PV.F_CV;11.455469131;100.0 +25/10/2020 02:06:56;U767.TI04A_PV.F_CV;11.427184105;100.0 +25/10/2020 02:06:18;U767.TI04B_PV.F_CV;31.885990143;100.0 +25/10/2020 02:06:47;U767.TI09_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:15;U767.TI100_PV.F_CV;9.934576035;100.0 +25/10/2020 02:06:24;U767.TI101_PV.F_CV;32.006305695;100.0 +25/10/2020 02:06:26;U767.TI101_PV.F_CV;31.936214447;100.0 +25/10/2020 02:06:38;U767.TI101_PV.F_CV;31.872364044;100.0 +25/10/2020 02:06:44;U767.TI101_PV.F_CV;31.965904236;100.0 +25/10/2020 02:06:50;U767.TI101_PV.F_CV;31.873100281;100.0 +25/10/2020 02:06:52;U767.TI101_PV.F_CV;31.961494446;100.0 +25/10/2020 02:06:53;U767.TI101_PV.F_CV;31.894096375;100.0 +25/10/2020 02:06:54;U767.TI101_PV.F_CV;31.964679718;100.0 +25/10/2020 02:06:02;U767.TI107_PV.F_CV;-10.484364510;100.0 +25/10/2020 02:06:48;U767.TI107_PV.F_CV;-10.568788528;100.0 +25/10/2020 02:06:11;U767.TI10_PV.F_CV;14.325819016;100.0 +25/10/2020 02:06:54;U767.TI10_PV.F_CV;14.033170700;100.0 +25/10/2020 02:06:35;U767.TI110_PV.F_CV;22.326662064;100.0 +25/10/2020 02:06:45;U767.TI114_PV.F_CV;22.493669510;100.0 +25/10/2020 02:06:08;U767.TI115_PV.F_CV;23.104406357;100.0 +25/10/2020 02:06:16;U767.TI121_PV.F_CV;10.364144325;100.0 +25/10/2020 02:06:46;U767.TI121_PV.F_CV;10.471419334;100.0 +25/10/2020 02:06:11;U767.TI14_PV.F_CV;31.339750290;100.0 +25/10/2020 02:06:19;U767.TI150_PV.F_CV;11.883886337;100.0 +25/10/2020 02:06:47;U767.TI151_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:44;U767.TI152_PV.F_CV;14.454015732;100.0 +25/10/2020 02:06:42;U767.TI153_PV.F_CV;14.833124161;100.0 +25/10/2020 02:06:13;U767.TI154_PV.F_CV;14.236122131;100.0 +25/10/2020 02:06:40;U767.TI155_PV.F_CV;14.583350182;100.0 +25/10/2020 02:06:35;U767.TI156_PV.F_CV;14.721386909;100.0 +25/10/2020 02:06:07;U767.TI157_PV.F_CV;14.596807480;100.0 +25/10/2020 02:06:28;U767.TI157_PV.F_CV;14.650693893;100.0 +25/10/2020 02:06:05;U767.TI158_PV.F_CV;12.019468307;100.0 +25/10/2020 02:06:41;U767.TI158_PV.F_CV;11.965148926;100.0 +25/10/2020 02:06:43;U767.TI158_PV.F_CV;12.020921707;100.0 +25/10/2020 02:06:56;U767.TI158_PV.F_CV;11.952859879;100.0 +25/10/2020 02:06:59;U767.TI158_PV.F_CV;12.005274773;100.0 +25/10/2020 02:06:36;U767.TI159_PV.F_CV;9.846357346;100.0 +25/10/2020 02:06:47;U767.TI159B_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U767.TI15_PV.F_CV;30.984527588;100.0 +25/10/2020 02:06:45;U767.TI16_PV.F_CV;30.203321457;100.0 +25/10/2020 02:06:47;U767.TI172_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.TI173_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U767.TI175_PV.F_CV;13.068854332;100.0 +25/10/2020 02:06:28;U767.TI175_PV.F_CV;13.027199745;100.0 +25/10/2020 02:06:32;U767.TI175_PV.F_CV;13.082597733;100.0 +25/10/2020 02:06:42;U767.TI175_PV.F_CV;13.024796486;100.0 +25/10/2020 02:06:09;U767.TI176_PV.F_CV;13.381007195;100.0 +25/10/2020 02:06:33;U767.TI176_PV.F_CV;13.428672791;100.0 +25/10/2020 02:06:35;U767.TI176_PV.F_CV;13.372697830;100.0 +25/10/2020 02:06:54;U767.TI176_PV.F_CV;13.415365219;100.0 +25/10/2020 02:06:30;U767.TI177_PV.F_CV;13.229036331;100.0 +25/10/2020 02:06:35;U767.TI177_PV.F_CV;13.280164719;100.0 +25/10/2020 02:06:49;U767.TI177_PV.F_CV;13.235563278;100.0 +25/10/2020 02:06:47;U767.TI178_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:58;U767.TI17_PV.F_CV;31.095567703;100.0 +25/10/2020 02:06:47;U767.TI181_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:47;U767.TI182_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:47;U767.TI200_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:09;U767.TI201_PV.F_CV;12.303097725;100.0 +25/10/2020 02:06:12;U767.TI201_PV.F_CV;12.262771606;100.0 +25/10/2020 02:06:04;U767.TI20_PV.F_CV;26.214250565;100.0 +25/10/2020 02:06:08;U767.TI20_PV.F_CV;26.111713409;100.0 +25/10/2020 02:06:23;U767.TI20_PV.F_CV;26.162530899;100.0 +25/10/2020 02:06:24;U767.TI20_PV.F_CV;26.281068802;100.0 +25/10/2020 02:06:28;U767.TI20_PV.F_CV;26.101016998;100.0 +25/10/2020 02:06:54;U767.TI20_PV.F_CV;26.283555984;100.0 +25/10/2020 02:06:56;U767.TI20_PV.F_CV;26.106178284;100.0 +25/10/2020 02:06:00;U767.TI210_PV.F_CV;11.866685867;100.0 +25/10/2020 02:06:18;U767.TI210_PV.F_CV;11.825803757;100.0 +25/10/2020 02:06:21;U767.TI210_PV.F_CV;11.867682457;100.0 +25/10/2020 02:06:35;U767.TI210_PV.F_CV;11.824247360;100.0 +25/10/2020 02:06:55;U767.TI210_PV.F_CV;11.866968155;100.0 +25/10/2020 02:06:47;U767.TI211_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:06;U767.TI21_PV.F_CV;12.018739700;100.0 +25/10/2020 02:06:13;U767.TI21_PV.F_CV;11.968536377;100.0 +25/10/2020 02:06:08;U767.TI220_PV.F_CV;31.758440018;100.0 +25/10/2020 02:06:44;U767.TI221_PV.F_CV;31.809787750;100.0 +25/10/2020 02:06:34;U767.TI222_PV.F_CV;31.885789871;100.0 +25/10/2020 02:06:02;U767.TI223_PV.F_CV;31.488782883;100.0 +25/10/2020 02:06:54;U767.TI224_PV.F_CV;31.243288040;100.0 +25/10/2020 02:06:29;U767.TI226_PV.F_CV;24.454229355;100.0 +25/10/2020 02:06:38;U767.TI226_PV.F_CV;24.657230377;100.0 +25/10/2020 02:06:43;U767.TI226_PV.F_CV;24.533433914;100.0 +25/10/2020 02:06:50;U767.TI226_PV.F_CV;24.481180191;100.0 +25/10/2020 02:06:56;U767.TI226_PV.F_CV;24.537992477;100.0 +25/10/2020 02:06:17;U767.TI230_PV.F_CV;32.085163116;100.0 +25/10/2020 02:06:39;U767.TI231_PV.F_CV;31.625392914;100.0 +25/10/2020 02:06:08;U767.TI232_PV.F_CV;31.351526260;100.0 +25/10/2020 02:06:09;U767.TI232_PV.F_CV;31.242923737;100.0 +25/10/2020 02:06:11;U767.TI232_PV.F_CV;31.191806793;100.0 +25/10/2020 02:06:17;U767.TI232_PV.F_CV;31.312223434;100.0 +25/10/2020 02:06:22;U767.TI232_PV.F_CV;31.223361969;100.0 +25/10/2020 02:06:29;U767.TI232_PV.F_CV;31.319362640;100.0 +25/10/2020 02:06:33;U767.TI232_PV.F_CV;31.222316742;100.0 +25/10/2020 02:06:48;U767.TI232_PV.F_CV;31.308637619;100.0 +25/10/2020 02:06:49;U767.TI232_PV.F_CV;31.369640350;100.0 +25/10/2020 02:06:53;U767.TI232_PV.F_CV;31.252140045;100.0 +25/10/2020 02:06:10;U767.TI233_PV.F_CV;31.049251556;100.0 +25/10/2020 02:06:03;U767.TI234_PV.F_CV;31.399030685;100.0 +25/10/2020 02:06:00;U767.TI235_PV.F_CV;31.278203964;100.0 +25/10/2020 02:06:01;U767.TI236_PV.F_CV;31.262943268;100.0 +25/10/2020 02:06:05;U767.TI236_PV.F_CV;31.117538452;100.0 +25/10/2020 02:06:09;U767.TI236_PV.F_CV;31.267772675;100.0 +25/10/2020 02:06:35;U767.TI236_PV.F_CV;31.159200668;100.0 +25/10/2020 02:06:39;U767.TI236_PV.F_CV;31.239295959;100.0 +25/10/2020 02:06:47;U767.TI236_PV.F_CV;31.147357941;100.0 +25/10/2020 02:06:51;U767.TI236_PV.F_CV;31.230533600;100.0 +25/10/2020 02:06:53;U767.TI237_PV.F_CV;30.501001358;100.0 +25/10/2020 02:06:19;U767.TI240_PV.F_CV;31.367216110;100.0 +25/10/2020 02:06:49;U767.TI240_PV.F_CV;31.427656174;100.0 +25/10/2020 02:06:55;U767.TI240_PV.F_CV;31.359552383;100.0 +25/10/2020 02:06:10;U767.TI241_PV.F_CV;31.463436127;100.0 +25/10/2020 02:06:58;U767.TI242_PV.F_CV;31.948379517;100.0 +25/10/2020 02:06:21;U767.TI243_PV.F_CV;31.505056381;100.0 +25/10/2020 02:06:16;U767.TI244_PV.F_CV;31.133579254;100.0 +25/10/2020 02:06:07;U767.TI25_PV.F_CV;12.350481033;100.0 +25/10/2020 02:06:56;U767.TI26_PV.F_CV;31.589500427;100.0 +25/10/2020 02:06:13;U767.TI27_PV.F_CV;12.385946274;100.0 +25/10/2020 02:06:16;U767.TI28_PV.F_CV;12.301875114;100.0 +25/10/2020 02:06:04;U767.TI29_PV.F_CV;12.069463730;100.0 +25/10/2020 02:06:59;U767.TI29_PV.F_CV;12.120905876;100.0 +25/10/2020 02:06:13;U767.TI302_PV.F_CV;31.996189117;100.0 +25/10/2020 02:06:17;U767.TI302_PV.F_CV;32.026466370;100.0 +25/10/2020 02:06:50;U767.TI302_PV.F_CV;31.993494034;100.0 +25/10/2020 02:06:57;U767.TI302_PV.F_CV;32.023727417;100.0 +25/10/2020 02:06:03;U767.TI304_PV.F_CV;38.478565216;100.0 +25/10/2020 02:06:36;U767.TI304_PV.F_CV;38.511054993;100.0 +25/10/2020 02:06:41;U767.TI304_PV.F_CV;38.467784882;100.0 +25/10/2020 02:06:53;U767.TI304_PV.F_CV;38.511375427;100.0 +25/10/2020 02:06:56;U767.TI304_PV.F_CV;38.476142883;100.0 +25/10/2020 02:06:34;U767.TI310_PV.F_CV;5.663586617;100.0 +25/10/2020 02:06:13;U767.TI38_PV.F_CV;8.984260559;100.0 +25/10/2020 02:06:18;U767.TI38_PV.F_CV;9.041536331;100.0 +25/10/2020 02:06:00;U767.TI401;31.481285539;100.0 +25/10/2020 02:06:01;U767.TI401;31.481285539;100.0 +25/10/2020 02:06:02;U767.TI401;31.481751856;100.0 +25/10/2020 02:06:03;U767.TI401;31.481751856;100.0 +25/10/2020 02:06:04;U767.TI401;31.482062733;100.0 +25/10/2020 02:06:05;U767.TI401;31.482062733;100.0 +25/10/2020 02:06:06;U767.TI401;31.482995366;100.0 +25/10/2020 02:06:07;U767.TI401;31.482995366;100.0 +25/10/2020 02:06:08;U767.TI401;31.483306244;100.0 +25/10/2020 02:06:09;U767.TI401;31.483306244;100.0 +25/10/2020 02:06:10;U767.TI401;31.483150805;100.0 +25/10/2020 02:06:11;U767.TI401;31.483150805;100.0 +25/10/2020 02:06:12;U767.TI401;31.485171510;100.0 +25/10/2020 02:06:13;U767.TI401;31.485171510;100.0 +25/10/2020 02:06:14;U767.TI401;31.483461683;100.0 +25/10/2020 02:06:15;U767.TI401;31.483461683;100.0 +25/10/2020 02:06:16;U767.TI401;31.484238877;100.0 +25/10/2020 02:06:17;U767.TI401;31.484238877;100.0 +25/10/2020 02:06:18;U767.TI401;31.484394316;100.0 +25/10/2020 02:06:19;U767.TI401;31.484394316;100.0 +25/10/2020 02:06:20;U767.TI401;31.485326949;100.0 +25/10/2020 02:06:21;U767.TI401;31.485326949;100.0 +25/10/2020 02:06:22;U767.TI401;31.485793265;100.0 +25/10/2020 02:06:23;U767.TI401;31.485793265;100.0 +25/10/2020 02:06:24;U767.TI401;31.485171510;100.0 +25/10/2020 02:06:25;U767.TI401;31.485171510;100.0 +25/10/2020 02:06:26;U767.TI401;31.486881337;100.0 +25/10/2020 02:06:27;U767.TI401;31.486881337;100.0 +25/10/2020 02:06:28;U767.TI401;31.485793265;100.0 +25/10/2020 02:06:29;U767.TI401;31.485793265;100.0 +25/10/2020 02:06:30;U767.TI401;31.487036776;100.0 +25/10/2020 02:06:31;U767.TI401;31.487036776;100.0 +25/10/2020 02:06:32;U767.TI401;31.488435725;100.0 +25/10/2020 02:06:33;U767.TI401;31.488435725;100.0 +25/10/2020 02:06:34;U767.TI401;31.488746603;100.0 +25/10/2020 02:06:35;U767.TI401;31.488746603;100.0 +25/10/2020 02:06:36;U767.TI401;31.487813970;100.0 +25/10/2020 02:06:37;U767.TI401;31.487813970;100.0 +25/10/2020 02:06:38;U767.TI401;31.486725898;100.0 +25/10/2020 02:06:39;U767.TI401;31.486725898;100.0 +25/10/2020 02:06:40;U767.TI401;31.488435725;100.0 +25/10/2020 02:06:41;U767.TI401;31.488435725;100.0 +25/10/2020 02:06:42;U767.TI401;31.489368358;100.0 +25/10/2020 02:06:43;U767.TI401;31.489368358;100.0 +25/10/2020 02:06:44;U767.TI401;31.488902042;100.0 +25/10/2020 02:06:45;U767.TI401;31.488902042;100.0 +25/10/2020 02:06:46;U767.TI401;31.489834674;100.0 +25/10/2020 02:06:47;U767.TI401;31.489834674;100.0 +25/10/2020 02:06:48;U767.TI401;31.490145552;100.0 +25/10/2020 02:06:49;U767.TI401;31.490145552;100.0 +25/10/2020 02:06:50;U767.TI401;31.491233624;100.0 +25/10/2020 02:06:51;U767.TI401;31.491233624;100.0 +25/10/2020 02:06:52;U767.TI401;31.491078185;100.0 +25/10/2020 02:06:53;U767.TI401;31.491078185;100.0 +25/10/2020 02:06:54;U767.TI401;31.489679236;100.0 +25/10/2020 02:06:55;U767.TI401;31.489679236;100.0 +25/10/2020 02:06:56;U767.TI401;31.490922746;100.0 +25/10/2020 02:06:57;U767.TI401;31.490922746;100.0 +25/10/2020 02:06:58;U767.TI401;31.490922746;100.0 +25/10/2020 02:06:59;U767.TI401;31.490922746;100.0 +25/10/2020 02:06:00;U767.TI402;31.102312088;100.0 +25/10/2020 02:06:01;U767.TI402;31.102312088;100.0 +25/10/2020 02:06:02;U767.TI402;31.103084564;100.0 +25/10/2020 02:06:03;U767.TI402;31.103084564;100.0 +25/10/2020 02:06:04;U767.TI402;31.104013443;100.0 +25/10/2020 02:06:05;U767.TI402;31.104013443;100.0 +25/10/2020 02:06:06;U767.TI402;31.103548050;100.0 +25/10/2020 02:06:07;U767.TI402;31.103548050;100.0 +25/10/2020 02:06:08;U767.TI402;31.102466583;100.0 +25/10/2020 02:06:09;U767.TI402;31.102466583;100.0 +25/10/2020 02:06:10;U767.TI402;31.103704453;100.0 +25/10/2020 02:06:11;U767.TI402;31.103704453;100.0 +25/10/2020 02:06:12;U767.TI402;31.103548050;100.0 +25/10/2020 02:06:13;U767.TI402;31.103548050;100.0 +25/10/2020 02:06:14;U767.TI402;31.103548050;100.0 +25/10/2020 02:06:15;U767.TI402;31.103548050;100.0 +25/10/2020 02:06:16;U767.TI402;31.105094910;100.0 +25/10/2020 02:06:17;U767.TI402;31.105094910;100.0 +25/10/2020 02:06:18;U767.TI402;31.104940414;100.0 +25/10/2020 02:06:19;U767.TI402;31.104940414;100.0 +25/10/2020 02:06:20;U767.TI402;31.106796265;100.0 +25/10/2020 02:06:21;U767.TI402;31.106796265;100.0 +25/10/2020 02:06:22;U767.TI402;31.107723236;100.0 +25/10/2020 02:06:23;U767.TI402;31.107723236;100.0 +25/10/2020 02:06:24;U767.TI402;31.104940414;100.0 +25/10/2020 02:06:25;U767.TI402;31.104940414;100.0 +25/10/2020 02:06:26;U767.TI402;31.106332779;100.0 +25/10/2020 02:06:27;U767.TI402;31.106332779;100.0 +25/10/2020 02:06:28;U767.TI402;31.106332779;100.0 +25/10/2020 02:06:29;U767.TI402;31.106332779;100.0 +25/10/2020 02:06:30;U767.TI402;31.106023788;100.0 +25/10/2020 02:06:31;U767.TI402;31.106023788;100.0 +25/10/2020 02:06:32;U767.TI402;31.107414246;100.0 +25/10/2020 02:06:33;U767.TI402;31.107414246;100.0 +25/10/2020 02:06:34;U767.TI402;31.108652115;100.0 +25/10/2020 02:06:35;U767.TI402;31.108652115;100.0 +25/10/2020 02:06:36;U767.TI402;31.108497620;100.0 +25/10/2020 02:06:37;U767.TI402;31.108497620;100.0 +25/10/2020 02:06:38;U767.TI402;31.108343124;100.0 +25/10/2020 02:06:39;U767.TI402;31.108343124;100.0 +25/10/2020 02:06:40;U767.TI402;31.109424591;100.0 +25/10/2020 02:06:41;U767.TI402;31.109424591;100.0 +25/10/2020 02:06:42;U767.TI402;31.110042572;100.0 +25/10/2020 02:06:43;U767.TI402;31.110042572;100.0 +25/10/2020 02:06:44;U767.TI402;31.110197067;100.0 +25/10/2020 02:06:45;U767.TI402;31.110197067;100.0 +25/10/2020 02:06:46;U767.TI402;31.110197067;100.0 +25/10/2020 02:06:47;U767.TI402;31.110197067;100.0 +25/10/2020 02:06:48;U767.TI402;31.110351563;100.0 +25/10/2020 02:06:49;U767.TI402;31.110351563;100.0 +25/10/2020 02:06:50;U767.TI402;31.110816956;100.0 +25/10/2020 02:06:51;U767.TI402;31.110816956;100.0 +25/10/2020 02:06:52;U767.TI402;31.110662460;100.0 +25/10/2020 02:06:53;U767.TI402;31.110662460;100.0 +25/10/2020 02:06:54;U767.TI402;31.110197067;100.0 +25/10/2020 02:06:55;U767.TI402;31.110197067;100.0 +25/10/2020 02:06:56;U767.TI402;31.110351563;100.0 +25/10/2020 02:06:57;U767.TI402;31.110351563;100.0 +25/10/2020 02:06:58;U767.TI402;31.112052917;100.0 +25/10/2020 02:06:59;U767.TI402;31.112052917;100.0 +25/10/2020 02:06:00;U767.TI411;22.603168488;100.0 +25/10/2020 02:06:01;U767.TI411;22.603168488;100.0 +25/10/2020 02:06:02;U767.TI411;22.603322983;100.0 +25/10/2020 02:06:03;U767.TI411;22.603322983;100.0 +25/10/2020 02:06:04;U767.TI411;22.603937149;100.0 +25/10/2020 02:06:05;U767.TI411;22.603937149;100.0 +25/10/2020 02:06:06;U767.TI411;22.602552414;100.0 +25/10/2020 02:06:07;U767.TI411;22.602552414;100.0 +25/10/2020 02:06:08;U767.TI411;22.603937149;100.0 +25/10/2020 02:06:09;U767.TI411;22.603937149;100.0 +25/10/2020 02:06:10;U767.TI411;22.603937149;100.0 +25/10/2020 02:06:11;U767.TI411;22.603937149;100.0 +25/10/2020 02:06:12;U767.TI411;22.605014801;100.0 +25/10/2020 02:06:13;U767.TI411;22.605014801;100.0 +25/10/2020 02:06:14;U767.TI411;22.606399536;100.0 +25/10/2020 02:06:15;U767.TI411;22.606399536;100.0 +25/10/2020 02:06:16;U767.TI411;22.605783463;100.0 +25/10/2020 02:06:17;U767.TI411;22.605783463;100.0 +25/10/2020 02:06:18;U767.TI411;22.606554031;100.0 +25/10/2020 02:06:19;U767.TI411;22.606554031;100.0 +25/10/2020 02:06:20;U767.TI411;22.606399536;100.0 +25/10/2020 02:06:21;U767.TI411;22.606399536;100.0 +25/10/2020 02:06:22;U767.TI411;22.606246948;100.0 +25/10/2020 02:06:23;U767.TI411;22.606246948;100.0 +25/10/2020 02:06:24;U767.TI411;22.607322693;100.0 +25/10/2020 02:06:25;U767.TI411;22.607322693;100.0 +25/10/2020 02:06:26;U767.TI411;22.606399536;100.0 +25/10/2020 02:06:27;U767.TI411;22.606399536;100.0 +25/10/2020 02:06:28;U767.TI411;22.606246948;100.0 +25/10/2020 02:06:29;U767.TI411;22.606246948;100.0 +25/10/2020 02:06:30;U767.TI411;22.606092453;100.0 +25/10/2020 02:06:31;U767.TI411;22.606092453;100.0 +25/10/2020 02:06:32;U767.TI411;22.605476379;100.0 +25/10/2020 02:06:33;U767.TI411;22.605476379;100.0 +25/10/2020 02:06:34;U767.TI411;22.607784271;100.0 +25/10/2020 02:06:35;U767.TI411;22.607784271;100.0 +25/10/2020 02:06:36;U767.TI411;22.608400345;100.0 +25/10/2020 02:06:37;U767.TI411;22.608400345;100.0 +25/10/2020 02:06:38;U767.TI411;22.608093262;100.0 +25/10/2020 02:06:39;U767.TI411;22.608093262;100.0 +25/10/2020 02:06:40;U767.TI411;22.609477997;100.0 +25/10/2020 02:06:41;U767.TI411;22.609477997;100.0 +25/10/2020 02:06:42;U767.TI411;22.611478806;100.0 +25/10/2020 02:06:43;U767.TI411;22.611478806;100.0 +25/10/2020 02:06:44;U767.TI411;22.610862732;100.0 +25/10/2020 02:06:45;U767.TI411;22.610862732;100.0 +25/10/2020 02:06:46;U767.TI411;22.612863541;100.0 +25/10/2020 02:06:47;U767.TI411;22.612863541;100.0 +25/10/2020 02:06:48;U767.TI411;22.613325119;100.0 +25/10/2020 02:06:49;U767.TI411;22.613325119;100.0 +25/10/2020 02:06:50;U767.TI411;22.614093781;100.0 +25/10/2020 02:06:51;U767.TI411;22.614093781;100.0 +25/10/2020 02:06:52;U767.TI411;22.614093781;100.0 +25/10/2020 02:06:53;U767.TI411;22.614093781;100.0 +25/10/2020 02:06:54;U767.TI411;22.614555359;100.0 +25/10/2020 02:06:55;U767.TI411;22.614555359;100.0 +25/10/2020 02:06:56;U767.TI411;22.613632202;100.0 +25/10/2020 02:06:57;U767.TI411;22.613632202;100.0 +25/10/2020 02:06:58;U767.TI411;22.614555359;100.0 +25/10/2020 02:06:59;U767.TI411;22.614555359;100.0 +25/10/2020 02:06:00;U767.TI412;22.726001740;100.0 +25/10/2020 02:06:01;U767.TI412;22.726001740;100.0 +25/10/2020 02:06:02;U767.TI412;22.725074768;100.0 +25/10/2020 02:06:03;U767.TI412;22.725074768;100.0 +25/10/2020 02:06:04;U767.TI412;22.726310730;100.0 +25/10/2020 02:06:05;U767.TI412;22.726310730;100.0 +25/10/2020 02:06:06;U767.TI412;22.725847244;100.0 +25/10/2020 02:06:07;U767.TI412;22.725847244;100.0 +25/10/2020 02:06:08;U767.TI412;22.726926804;100.0 +25/10/2020 02:06:09;U767.TI412;22.726926804;100.0 +25/10/2020 02:06:10;U767.TI412;22.726001740;100.0 +25/10/2020 02:06:11;U767.TI412;22.726001740;100.0 +25/10/2020 02:06:12;U767.TI412;22.725383759;100.0 +25/10/2020 02:06:13;U767.TI412;22.725383759;100.0 +25/10/2020 02:06:14;U767.TI412;22.726310730;100.0 +25/10/2020 02:06:15;U767.TI412;22.726310730;100.0 +25/10/2020 02:06:16;U767.TI412;22.728471756;100.0 +25/10/2020 02:06:17;U767.TI412;22.728471756;100.0 +25/10/2020 02:06:18;U767.TI412;22.728162766;100.0 +25/10/2020 02:06:19;U767.TI412;22.728162766;100.0 +25/10/2020 02:06:20;U767.TI412;22.729396820;100.0 +25/10/2020 02:06:21;U767.TI412;22.729396820;100.0 +25/10/2020 02:06:22;U767.TI412;22.729242325;100.0 +25/10/2020 02:06:23;U767.TI412;22.729242325;100.0 +25/10/2020 02:06:24;U767.TI412;22.728778839;100.0 +25/10/2020 02:06:25;U767.TI412;22.728778839;100.0 +25/10/2020 02:06:26;U767.TI412;22.729087830;100.0 +25/10/2020 02:06:27;U767.TI412;22.729087830;100.0 +25/10/2020 02:06:28;U767.TI412;22.729705811;100.0 +25/10/2020 02:06:29;U767.TI412;22.729705811;100.0 +25/10/2020 02:06:30;U767.TI412;22.729705811;100.0 +25/10/2020 02:06:31;U767.TI412;22.729705811;100.0 +25/10/2020 02:06:32;U767.TI412;22.729242325;100.0 +25/10/2020 02:06:33;U767.TI412;22.729242325;100.0 +25/10/2020 02:06:34;U767.TI412;22.730323792;100.0 +25/10/2020 02:06:35;U767.TI412;22.730323792;100.0 +25/10/2020 02:06:36;U767.TI412;22.729242325;100.0 +25/10/2020 02:06:37;U767.TI412;22.729242325;100.0 +25/10/2020 02:06:38;U767.TI412;22.729551315;100.0 +25/10/2020 02:06:39;U767.TI412;22.729551315;100.0 +25/10/2020 02:06:40;U767.TI412;22.730012894;100.0 +25/10/2020 02:06:41;U767.TI412;22.730012894;100.0 +25/10/2020 02:06:42;U767.TI412;22.730785370;100.0 +25/10/2020 02:06:43;U767.TI412;22.730785370;100.0 +25/10/2020 02:06:44;U767.TI412;22.731403351;100.0 +25/10/2020 02:06:45;U767.TI412;22.731403351;100.0 +25/10/2020 02:06:46;U767.TI412;22.732946396;100.0 +25/10/2020 02:06:47;U767.TI412;22.732946396;100.0 +25/10/2020 02:06:48;U767.TI412;22.733873367;100.0 +25/10/2020 02:06:49;U767.TI412;22.733873367;100.0 +25/10/2020 02:06:50;U767.TI412;22.734952927;100.0 +25/10/2020 02:06:51;U767.TI412;22.734952927;100.0 +25/10/2020 02:06:52;U767.TI412;22.734798431;100.0 +25/10/2020 02:06:53;U767.TI412;22.734798431;100.0 +25/10/2020 02:06:54;U767.TI412;22.735877991;100.0 +25/10/2020 02:06:55;U767.TI412;22.735877991;100.0 +25/10/2020 02:06:56;U767.TI412;22.736186981;100.0 +25/10/2020 02:06:57;U767.TI412;22.736186981;100.0 +25/10/2020 02:06:58;U767.TI412;22.735416412;100.0 +25/10/2020 02:06:59;U767.TI412;22.735416412;100.0 +25/10/2020 02:06:00;U767.TI413;22.843111038;100.0 +25/10/2020 02:06:01;U767.TI413;22.843111038;100.0 +25/10/2020 02:06:02;U767.TI413;22.843727112;100.0 +25/10/2020 02:06:03;U767.TI413;22.843727112;100.0 +25/10/2020 02:06:04;U767.TI413;22.844034195;100.0 +25/10/2020 02:06:05;U767.TI413;22.844034195;100.0 +25/10/2020 02:06:06;U767.TI413;22.844034195;100.0 +25/10/2020 02:06:07;U767.TI413;22.844034195;100.0 +25/10/2020 02:06:08;U767.TI413;22.844495773;100.0 +25/10/2020 02:06:09;U767.TI413;22.844495773;100.0 +25/10/2020 02:06:10;U767.TI413;22.844034195;100.0 +25/10/2020 02:06:11;U767.TI413;22.844034195;100.0 +25/10/2020 02:06:12;U767.TI413;22.842803955;100.0 +25/10/2020 02:06:13;U767.TI413;22.842803955;100.0 +25/10/2020 02:06:14;U767.TI413;22.844341278;100.0 +25/10/2020 02:06:15;U767.TI413;22.844341278;100.0 +25/10/2020 02:06:16;U767.TI413;22.844188690;100.0 +25/10/2020 02:06:17;U767.TI413;22.844188690;100.0 +25/10/2020 02:06:18;U767.TI413;22.846954346;100.0 +25/10/2020 02:06:19;U767.TI413;22.846954346;100.0 +25/10/2020 02:06:20;U767.TI413;22.847570419;100.0 +25/10/2020 02:06:21;U767.TI413;22.847570419;100.0 +25/10/2020 02:06:22;U767.TI413;22.846185684;100.0 +25/10/2020 02:06:23;U767.TI413;22.846185684;100.0 +25/10/2020 02:06:24;U767.TI413;22.846033096;100.0 +25/10/2020 02:06:25;U767.TI413;22.846033096;100.0 +25/10/2020 02:06:26;U767.TI413;22.847263336;100.0 +25/10/2020 02:06:27;U767.TI413;22.847263336;100.0 +25/10/2020 02:06:28;U767.TI413;22.846954346;100.0 +25/10/2020 02:06:29;U767.TI413;22.846954346;100.0 +25/10/2020 02:06:30;U767.TI413;22.846801758;100.0 +25/10/2020 02:06:31;U767.TI413;22.846801758;100.0 +25/10/2020 02:06:32;U767.TI413;22.846801758;100.0 +25/10/2020 02:06:33;U767.TI413;22.846801758;100.0 +25/10/2020 02:06:34;U767.TI413;22.846954346;100.0 +25/10/2020 02:06:35;U767.TI413;22.846954346;100.0 +25/10/2020 02:06:36;U767.TI413;22.847724915;100.0 +25/10/2020 02:06:37;U767.TI413;22.847724915;100.0 +25/10/2020 02:06:38;U767.TI413;22.846801758;100.0 +25/10/2020 02:06:39;U767.TI413;22.846801758;100.0 +25/10/2020 02:06:40;U767.TI413;22.847263336;100.0 +25/10/2020 02:06:41;U767.TI413;22.847263336;100.0 +25/10/2020 02:06:42;U767.TI413;22.847108841;100.0 +25/10/2020 02:06:43;U767.TI413;22.847108841;100.0 +25/10/2020 02:06:44;U767.TI413;22.848493576;100.0 +25/10/2020 02:06:45;U767.TI413;22.848493576;100.0 +25/10/2020 02:06:46;U767.TI413;22.850185394;100.0 +25/10/2020 02:06:47;U767.TI413;22.850185394;100.0 +25/10/2020 02:06:48;U767.TI413;22.851415634;100.0 +25/10/2020 02:06:49;U767.TI413;22.851415634;100.0 +25/10/2020 02:06:50;U767.TI413;22.851570129;100.0 +25/10/2020 02:06:51;U767.TI413;22.851570129;100.0 +25/10/2020 02:06:52;U767.TI413;22.852029800;100.0 +25/10/2020 02:06:53;U767.TI413;22.852029800;100.0 +25/10/2020 02:06:54;U767.TI413;22.852029800;100.0 +25/10/2020 02:06:55;U767.TI413;22.852029800;100.0 +25/10/2020 02:06:56;U767.TI413;22.852952957;100.0 +25/10/2020 02:06:57;U767.TI413;22.852952957;100.0 +25/10/2020 02:06:58;U767.TI413;22.853723526;100.0 +25/10/2020 02:06:59;U767.TI413;22.853723526;100.0 +25/10/2020 02:06:00;U767.TI414;23.252265930;100.0 +25/10/2020 02:06:01;U767.TI414;23.252265930;100.0 +25/10/2020 02:06:02;U767.TI414;23.253803253;100.0 +25/10/2020 02:06:03;U767.TI414;23.253803253;100.0 +25/10/2020 02:06:04;U767.TI414;23.254724503;100.0 +25/10/2020 02:06:05;U767.TI414;23.254724503;100.0 +25/10/2020 02:06:06;U767.TI414;23.250268936;100.0 +25/10/2020 02:06:07;U767.TI414;23.250268936;100.0 +25/10/2020 02:06:08;U767.TI414;23.250423431;100.0 +25/10/2020 02:06:09;U767.TI414;23.250423431;100.0 +25/10/2020 02:06:10;U767.TI414;23.250883102;100.0 +25/10/2020 02:06:11;U767.TI414;23.250883102;100.0 +25/10/2020 02:06:12;U767.TI414;23.251804352;100.0 +25/10/2020 02:06:13;U767.TI414;23.251804352;100.0 +25/10/2020 02:06:14;U767.TI414;23.253341675;100.0 +25/10/2020 02:06:15;U767.TI414;23.253341675;100.0 +25/10/2020 02:06:16;U767.TI414;23.252420425;100.0 +25/10/2020 02:06:17;U767.TI414;23.252420425;100.0 +25/10/2020 02:06:18;U767.TI414;23.252880096;100.0 +25/10/2020 02:06:19;U767.TI414;23.252880096;100.0 +25/10/2020 02:06:20;U767.TI414;23.254262924;100.0 +25/10/2020 02:06:21;U767.TI414;23.254262924;100.0 +25/10/2020 02:06:22;U767.TI414;23.253494263;100.0 +25/10/2020 02:06:23;U767.TI414;23.253494263;100.0 +25/10/2020 02:06:24;U767.TI414;23.253803253;100.0 +25/10/2020 02:06:25;U767.TI414;23.253803253;100.0 +25/10/2020 02:06:26;U767.TI414;23.253803253;100.0 +25/10/2020 02:06:27;U767.TI414;23.253803253;100.0 +25/10/2020 02:06:28;U767.TI414;23.253648758;100.0 +25/10/2020 02:06:29;U767.TI414;23.253648758;100.0 +25/10/2020 02:06:30;U767.TI414;23.252573013;100.0 +25/10/2020 02:06:31;U767.TI414;23.252573013;100.0 +25/10/2020 02:06:32;U767.TI414;23.251958847;100.0 +25/10/2020 02:06:33;U767.TI414;23.251958847;100.0 +25/10/2020 02:06:34;U767.TI414;23.253803253;100.0 +25/10/2020 02:06:35;U767.TI414;23.253803253;100.0 +25/10/2020 02:06:36;U767.TI414;23.254570007;100.0 +25/10/2020 02:06:37;U767.TI414;23.254570007;100.0 +25/10/2020 02:06:38;U767.TI414;23.255338669;100.0 +25/10/2020 02:06:39;U767.TI414;23.255338669;100.0 +25/10/2020 02:06:40;U767.TI414;23.256261826;100.0 +25/10/2020 02:06:41;U767.TI414;23.256261826;100.0 +25/10/2020 02:06:42;U767.TI414;23.255800247;100.0 +25/10/2020 02:06:43;U767.TI414;23.255800247;100.0 +25/10/2020 02:06:44;U767.TI414;23.255645752;100.0 +25/10/2020 02:06:45;U767.TI414;23.255645752;100.0 +25/10/2020 02:06:46;U767.TI414;23.253955841;100.0 +25/10/2020 02:06:47;U767.TI414;23.253955841;100.0 +25/10/2020 02:06:48;U767.TI414;23.255338669;100.0 +25/10/2020 02:06:49;U767.TI414;23.255338669;100.0 +25/10/2020 02:06:50;U767.TI414;23.254877090;100.0 +25/10/2020 02:06:51;U767.TI414;23.254877090;100.0 +25/10/2020 02:06:52;U767.TI414;23.253648758;100.0 +25/10/2020 02:06:53;U767.TI414;23.253648758;100.0 +25/10/2020 02:06:54;U767.TI414;23.254724503;100.0 +25/10/2020 02:06:55;U767.TI414;23.254724503;100.0 +25/10/2020 02:06:56;U767.TI414;23.256261826;100.0 +25/10/2020 02:06:57;U767.TI414;23.256261826;100.0 +25/10/2020 02:06:58;U767.TI414;23.256568909;100.0 +25/10/2020 02:06:59;U767.TI414;23.256568909;100.0 +25/10/2020 02:06:00;U767.TI421;24.663536072;100.0 +25/10/2020 02:06:01;U767.TI421;24.666046143;100.0 +25/10/2020 02:06:02;U767.TI421;24.662260056;100.0 +25/10/2020 02:06:03;U767.TI421;24.657621384;100.0 +25/10/2020 02:06:04;U767.TI421;24.664472580;100.0 +25/10/2020 02:06:05;U767.TI421;24.660457611;100.0 +25/10/2020 02:06:06;U767.TI421;24.664323807;100.0 +25/10/2020 02:06:07;U767.TI421;24.663848877;100.0 +25/10/2020 02:06:08;U767.TI421;24.657730103;100.0 +25/10/2020 02:06:09;U767.TI421;24.662778854;100.0 +25/10/2020 02:06:10;U767.TI421;24.663835526;100.0 +25/10/2020 02:06:11;U767.TI421;24.663742065;100.0 +25/10/2020 02:06:12;U767.TI421;24.662574768;100.0 +25/10/2020 02:06:13;U767.TI421;24.658138275;100.0 +25/10/2020 02:06:14;U767.TI421;24.660173416;100.0 +25/10/2020 02:06:15;U767.TI421;24.656618118;100.0 +25/10/2020 02:06:16;U767.TI421;24.662101746;100.0 +25/10/2020 02:06:17;U767.TI421;24.659074783;100.0 +25/10/2020 02:06:18;U767.TI421;24.661571503;100.0 +25/10/2020 02:06:19;U767.TI421;24.661966324;100.0 +25/10/2020 02:06:20;U767.TI421;24.664611816;100.0 +25/10/2020 02:06:21;U767.TI421;24.664829254;100.0 +25/10/2020 02:06:22;U767.TI421;24.663852692;100.0 +25/10/2020 02:06:23;U767.TI421;24.662210464;100.0 +25/10/2020 02:06:24;U767.TI421;24.662563324;100.0 +25/10/2020 02:06:25;U767.TI421;24.664367676;100.0 +25/10/2020 02:06:26;U767.TI421;24.659009933;100.0 +25/10/2020 02:06:27;U767.TI421;24.660583496;100.0 +25/10/2020 02:06:28;U767.TI421;24.657503128;100.0 +25/10/2020 02:06:29;U767.TI421;24.662157059;100.0 +25/10/2020 02:06:30;U767.TI421;24.662347794;100.0 +25/10/2020 02:06:31;U767.TI421;24.660556793;100.0 +25/10/2020 02:06:32;U767.TI421;24.660543442;100.0 +25/10/2020 02:06:33;U767.TI421;24.660652161;100.0 +25/10/2020 02:06:34;U767.TI421;24.663217545;100.0 +25/10/2020 02:06:35;U767.TI421;24.660882950;100.0 +25/10/2020 02:06:36;U767.TI421;24.657789230;100.0 +25/10/2020 02:06:37;U767.TI421;24.662565231;100.0 +25/10/2020 02:06:38;U767.TI421;24.657464981;100.0 +25/10/2020 02:06:39;U767.TI421;24.661806107;100.0 +25/10/2020 02:06:40;U767.TI421;24.657817841;100.0 +25/10/2020 02:06:41;U767.TI421;24.665618896;100.0 +25/10/2020 02:06:42;U767.TI421;24.660463333;100.0 +25/10/2020 02:06:43;U767.TI421;24.664981842;100.0 +25/10/2020 02:06:44;U767.TI421;24.662675858;100.0 +25/10/2020 02:06:45;U767.TI421;24.663774490;100.0 +25/10/2020 02:06:46;U767.TI421;24.661441803;100.0 +25/10/2020 02:06:47;U767.TI421;24.664793015;100.0 +25/10/2020 02:06:48;U767.TI421;24.664806366;100.0 +25/10/2020 02:06:49;U767.TI421;24.669813156;100.0 +25/10/2020 02:06:50;U767.TI421;24.664670944;100.0 +25/10/2020 02:06:51;U767.TI421;24.664222717;100.0 +25/10/2020 02:06:52;U767.TI421;24.667371750;100.0 +25/10/2020 02:06:53;U767.TI421;24.666448593;100.0 +25/10/2020 02:06:54;U767.TI421;24.669624329;100.0 +25/10/2020 02:06:55;U767.TI421;24.663314819;100.0 +25/10/2020 02:06:56;U767.TI421;24.659624100;100.0 +25/10/2020 02:06:57;U767.TI421;24.657712936;100.0 +25/10/2020 02:06:58;U767.TI421;24.658594131;100.0 +25/10/2020 02:06:59;U767.TI421;24.657236099;100.0 +25/10/2020 02:06:00;U767.TI422;24.528629303;100.0 +25/10/2020 02:06:01;U767.TI422;24.530216217;100.0 +25/10/2020 02:06:02;U767.TI422;24.527353287;100.0 +25/10/2020 02:06:03;U767.TI422;24.527788162;100.0 +25/10/2020 02:06:04;U767.TI422;24.527721405;100.0 +25/10/2020 02:06:05;U767.TI422;24.530393600;100.0 +25/10/2020 02:06:06;U767.TI422;24.528032303;100.0 +25/10/2020 02:06:07;U767.TI422;24.528942108;100.0 +25/10/2020 02:06:08;U767.TI422;24.520978928;100.0 +25/10/2020 02:06:09;U767.TI422;24.524410248;100.0 +25/10/2020 02:06:10;U767.TI422;24.527545929;100.0 +25/10/2020 02:06:11;U767.TI422;24.527912140;100.0 +25/10/2020 02:06:12;U767.TI422;24.524438858;100.0 +25/10/2020 02:06:13;U767.TI422;24.524614334;100.0 +25/10/2020 02:06:14;U767.TI422;24.525266647;100.0 +25/10/2020 02:06:15;U767.TI422;24.523788452;100.0 +25/10/2020 02:06:16;U767.TI422;24.522350311;100.0 +25/10/2020 02:06:17;U767.TI422;24.523937225;100.0 +25/10/2020 02:06:18;U767.TI422;24.524589539;100.0 +25/10/2020 02:06:19;U767.TI422;24.526367188;100.0 +25/10/2020 02:06:20;U767.TI422;24.528320313;100.0 +25/10/2020 02:06:21;U767.TI422;24.528076172;100.0 +25/10/2020 02:06:22;U767.TI422;24.526407242;100.0 +25/10/2020 02:06:23;U767.TI422;24.526611328;100.0 +25/10/2020 02:06:24;U767.TI422;24.528579712;100.0 +25/10/2020 02:06:25;U767.TI422;24.528308868;100.0 +25/10/2020 02:06:26;U767.TI422;24.526409149;100.0 +25/10/2020 02:06:27;U767.TI422;24.524984360;100.0 +25/10/2020 02:06:28;U767.TI422;24.525363922;100.0 +25/10/2020 02:06:29;U767.TI422;24.523790359;100.0 +25/10/2020 02:06:30;U767.TI422;24.525825500;100.0 +25/10/2020 02:06:31;U767.TI422;24.526573181;100.0 +25/10/2020 02:06:32;U767.TI422;24.526559830;100.0 +25/10/2020 02:06:33;U767.TI422;24.528282166;100.0 +25/10/2020 02:06:34;U767.TI422;24.529001236;100.0 +25/10/2020 02:06:35;U767.TI422;24.529436111;100.0 +25/10/2020 02:06:36;U767.TI422;24.525188446;100.0 +25/10/2020 02:06:37;U767.TI422;24.527429581;100.0 +25/10/2020 02:06:38;U767.TI422;24.526479721;100.0 +25/10/2020 02:06:39;U767.TI422;24.525976181;100.0 +25/10/2020 02:06:40;U767.TI422;24.524293900;100.0 +25/10/2020 02:06:41;U767.TI422;24.531173706;100.0 +25/10/2020 02:06:42;U767.TI422;24.528785706;100.0 +25/10/2020 02:06:43;U767.TI422;24.527538300;100.0 +25/10/2020 02:06:44;U767.TI422;24.530305862;100.0 +25/10/2020 02:06:45;U767.TI422;24.532098770;100.0 +25/10/2020 02:06:46;U767.TI422;24.529533386;100.0 +25/10/2020 02:06:47;U767.TI422;24.528732300;100.0 +25/10/2020 02:06:48;U767.TI422;24.531053543;100.0 +25/10/2020 02:06:49;U767.TI422;24.529371262;100.0 +25/10/2020 02:06:50;U767.TI422;24.531610489;100.0 +25/10/2020 02:06:51;U767.TI422;24.529085159;100.0 +25/10/2020 02:06:52;U767.TI422;24.529466629;100.0 +25/10/2020 02:06:53;U767.TI422;24.531312943;100.0 +25/10/2020 02:06:54;U767.TI422;24.533334732;100.0 +25/10/2020 02:06:55;U767.TI422;24.530023575;100.0 +25/10/2020 02:06:56;U767.TI422;24.529331207;100.0 +25/10/2020 02:06:57;U767.TI422;24.527418137;100.0 +25/10/2020 02:06:58;U767.TI422;24.525993347;100.0 +25/10/2020 02:06:59;U767.TI422;24.525098801;100.0 +25/10/2020 02:06:00;U767.TI423;24.354284286;100.0 +25/10/2020 02:06:01;U767.TI423;24.351718903;100.0 +25/10/2020 02:06:02;U767.TI423;24.350240707;100.0 +25/10/2020 02:06:03;U767.TI423;24.349521637;100.0 +25/10/2020 02:06:04;U767.TI423;24.350145340;100.0 +25/10/2020 02:06:05;U767.TI423;24.352357864;100.0 +25/10/2020 02:06:06;U767.TI423;24.352304459;100.0 +25/10/2020 02:06:07;U767.TI423;24.348367691;100.0 +25/10/2020 02:06:08;U767.TI423;24.346862793;100.0 +25/10/2020 02:06:09;U767.TI423;24.347526550;100.0 +25/10/2020 02:06:10;U767.TI423;24.348125458;100.0 +25/10/2020 02:06:11;U767.TI423;24.346414566;100.0 +25/10/2020 02:06:12;U767.TI423;24.348478317;100.0 +25/10/2020 02:06:13;U767.TI423;24.352577209;100.0 +25/10/2020 02:06:14;U767.TI423;24.350921631;100.0 +25/10/2020 02:06:15;U767.TI423;24.343904495;100.0 +25/10/2020 02:06:16;U767.TI423;24.346157074;100.0 +25/10/2020 02:06:17;U767.TI423;24.346130371;100.0 +25/10/2020 02:06:18;U767.TI423;24.347475052;100.0 +25/10/2020 02:06:19;U767.TI423;24.347867966;100.0 +25/10/2020 02:06:20;U767.TI423;24.347515106;100.0 +25/10/2020 02:06:21;U767.TI423;24.347963333;100.0 +25/10/2020 02:06:22;U767.TI423;24.348140717;100.0 +25/10/2020 02:06:23;U767.TI423;24.349266052;100.0 +25/10/2020 02:06:24;U767.TI423;24.347543716;100.0 +25/10/2020 02:06:25;U767.TI423;24.346349716;100.0 +25/10/2020 02:06:26;U767.TI423;24.346065521;100.0 +25/10/2020 02:06:27;U767.TI423;24.345563889;100.0 +25/10/2020 02:06:28;U767.TI423;24.347097397;100.0 +25/10/2020 02:06:29;U767.TI423;24.350597382;100.0 +25/10/2020 02:06:30;U767.TI423;24.350326538;100.0 +25/10/2020 02:06:31;U767.TI423;24.351305008;100.0 +25/10/2020 02:06:32;U767.TI423;24.347137451;100.0 +25/10/2020 02:06:33;U767.TI423;24.350477219;100.0 +25/10/2020 02:06:34;U767.TI423;24.349811554;100.0 +25/10/2020 02:06:35;U767.TI423;24.350246429;100.0 +25/10/2020 02:06:36;U767.TI423;24.350843430;100.0 +25/10/2020 02:06:37;U767.TI423;24.351007462;100.0 +25/10/2020 02:06:38;U767.TI423;24.351440430;100.0 +25/10/2020 02:06:39;U767.TI423;24.349786758;100.0 +25/10/2020 02:06:40;U767.TI423;24.349256516;100.0 +25/10/2020 02:06:41;U767.TI423;24.353599548;100.0 +25/10/2020 02:06:42;U767.TI423;24.350749969;100.0 +25/10/2020 02:06:43;U767.TI423;24.353193283;100.0 +25/10/2020 02:06:44;U767.TI423;24.350885391;100.0 +25/10/2020 02:06:45;U767.TI423;24.352907181;100.0 +25/10/2020 02:06:46;U767.TI423;24.352420807;100.0 +25/10/2020 02:06:47;U767.TI423;24.351619720;100.0 +25/10/2020 02:06:48;U767.TI423;24.352325439;100.0 +25/10/2020 02:06:49;U767.TI423;24.351564407;100.0 +25/10/2020 02:06:50;U767.TI423;24.351959229;100.0 +25/10/2020 02:06:51;U767.TI423;24.351972580;100.0 +25/10/2020 02:06:52;U767.TI423;24.353736877;100.0 +25/10/2020 02:06:53;U767.TI423;24.354198456;100.0 +25/10/2020 02:06:54;U767.TI423;24.355297089;100.0 +25/10/2020 02:06:55;U767.TI423;24.353832245;100.0 +25/10/2020 02:06:56;U767.TI423;24.352678299;100.0 +25/10/2020 02:06:57;U767.TI423;24.349611282;100.0 +25/10/2020 02:06:58;U767.TI423;24.347957611;100.0 +25/10/2020 02:06:59;U767.TI423;24.345676422;100.0 +25/10/2020 02:06:00;U767.TI424;30.959251404;100.0 +25/10/2020 02:06:01;U767.TI424;30.928264618;100.0 +25/10/2020 02:06:02;U767.TI424;30.942161560;100.0 +25/10/2020 02:06:03;U767.TI424;30.940986633;100.0 +25/10/2020 02:06:04;U767.TI424;30.944818497;100.0 +25/10/2020 02:06:05;U767.TI424;30.899314880;100.0 +25/10/2020 02:06:06;U767.TI424;30.929992676;100.0 +25/10/2020 02:06:07;U767.TI424;30.932043076;100.0 +25/10/2020 02:06:08;U767.TI424;30.964946747;100.0 +25/10/2020 02:06:09;U767.TI424;30.940380096;100.0 +25/10/2020 02:06:10;U767.TI424;30.967119217;100.0 +25/10/2020 02:06:11;U767.TI424;30.921846390;100.0 +25/10/2020 02:06:12;U767.TI424;30.930089951;100.0 +25/10/2020 02:06:13;U767.TI424;30.925907135;100.0 +25/10/2020 02:06:14;U767.TI424;30.915088654;100.0 +25/10/2020 02:06:15;U767.TI424;30.927837372;100.0 +25/10/2020 02:06:16;U767.TI424;30.924800873;100.0 +25/10/2020 02:06:17;U767.TI424;30.911014557;100.0 +25/10/2020 02:06:18;U767.TI424;30.914184570;100.0 +25/10/2020 02:06:19;U767.TI424;30.926502228;100.0 +25/10/2020 02:06:20;U767.TI424;30.966972351;100.0 +25/10/2020 02:06:21;U767.TI424;30.948154449;100.0 +25/10/2020 02:06:22;U767.TI424;30.926084518;100.0 +25/10/2020 02:06:23;U767.TI424;30.953807831;100.0 +25/10/2020 02:06:24;U767.TI424;30.917922974;100.0 +25/10/2020 02:06:25;U767.TI424;30.945861816;100.0 +25/10/2020 02:06:26;U767.TI424;30.930442810;100.0 +25/10/2020 02:06:27;U767.TI424;30.943244934;100.0 +25/10/2020 02:06:28;U767.TI424;30.932155609;100.0 +25/10/2020 02:06:29;U767.TI424;30.948478699;100.0 +25/10/2020 02:06:30;U767.TI424;30.936054230;100.0 +25/10/2020 02:06:31;U767.TI424;30.961793900;100.0 +25/10/2020 02:06:32;U767.TI424;30.960405350;100.0 +25/10/2020 02:06:33;U767.TI424;30.945835114;100.0 +25/10/2020 02:06:34;U767.TI424;30.918342590;100.0 +25/10/2020 02:06:35;U767.TI424;30.956615448;100.0 +25/10/2020 02:06:36;U767.TI424;30.941154480;100.0 +25/10/2020 02:06:37;U767.TI424;30.923200607;100.0 +25/10/2020 02:06:38;U767.TI424;30.933723450;100.0 +25/10/2020 02:06:39;U767.TI424;30.919921875;100.0 +25/10/2020 02:06:40;U767.TI424;30.934761047;100.0 +25/10/2020 02:06:41;U767.TI424;30.920961380;100.0 +25/10/2020 02:06:42;U767.TI424;30.905744553;100.0 +25/10/2020 02:06:43;U767.TI424;30.951747894;100.0 +25/10/2020 02:06:44;U767.TI424;30.919410706;100.0 +25/10/2020 02:06:45;U767.TI424;30.942060471;100.0 +25/10/2020 02:06:46;U767.TI424;30.922311783;100.0 +25/10/2020 02:06:47;U767.TI424;30.938716888;100.0 +25/10/2020 02:06:48;U767.TI424;30.926116943;100.0 +25/10/2020 02:06:49;U767.TI424;30.937286377;100.0 +25/10/2020 02:06:50;U767.TI424;30.949602127;100.0 +25/10/2020 02:06:51;U767.TI424;30.952596664;100.0 +25/10/2020 02:06:52;U767.TI424;30.934629440;100.0 +25/10/2020 02:06:53;U767.TI424;30.963294983;100.0 +25/10/2020 02:06:54;U767.TI424;30.928153992;100.0 +25/10/2020 02:06:55;U767.TI424;30.943208694;100.0 +25/10/2020 02:06:56;U767.TI424;30.922338486;100.0 +25/10/2020 02:06:57;U767.TI424;30.936031342;100.0 +25/10/2020 02:06:58;U767.TI424;30.923608780;100.0 +25/10/2020 02:06:59;U767.TI424;30.911020279;100.0 +25/10/2020 02:06:00;U767.TI431;24.639484406;100.0 +25/10/2020 02:06:01;U767.TI431;24.638248444;100.0 +25/10/2020 02:06:02;U767.TI431;24.638385773;100.0 +25/10/2020 02:06:03;U767.TI431;24.636486053;100.0 +25/10/2020 02:06:04;U767.TI431;24.642429352;100.0 +25/10/2020 02:06:05;U767.TI431;24.636865616;100.0 +25/10/2020 02:06:06;U767.TI431;24.632646561;100.0 +25/10/2020 02:06:07;U767.TI431;24.632593155;100.0 +25/10/2020 02:06:08;U767.TI431;24.630924225;100.0 +25/10/2020 02:06:09;U767.TI431;24.634561539;100.0 +25/10/2020 02:06:10;U767.TI431;24.631250381;100.0 +25/10/2020 02:06:11;U767.TI431;24.629350662;100.0 +25/10/2020 02:06:12;U767.TI431;24.627193451;100.0 +25/10/2020 02:06:13;U767.TI431;24.631549835;100.0 +25/10/2020 02:06:14;U767.TI431;24.634914398;100.0 +25/10/2020 02:06:15;U767.TI431;24.633911133;100.0 +25/10/2020 02:06:16;U767.TI431;24.631347656;100.0 +25/10/2020 02:06:17;U767.TI431;24.631509781;100.0 +25/10/2020 02:06:18;U767.TI431;24.632377625;100.0 +25/10/2020 02:06:19;U767.TI431;24.633001328;100.0 +25/10/2020 02:06:20;U767.TI431;24.632255554;100.0 +25/10/2020 02:06:21;U767.TI431;24.634277344;100.0 +25/10/2020 02:06:22;U767.TI431;24.629827499;100.0 +25/10/2020 02:06:23;U767.TI431;24.630994797;100.0 +25/10/2020 02:06:24;U767.TI431;24.632284164;100.0 +25/10/2020 02:06:25;U767.TI431;24.630683899;100.0 +25/10/2020 02:06:26;U767.TI431;24.634468079;100.0 +25/10/2020 02:06:27;U767.TI431;24.630277634;100.0 +25/10/2020 02:06:28;U767.TI431;24.634809494;100.0 +25/10/2020 02:06:29;U767.TI431;24.632896423;100.0 +25/10/2020 02:06:30;U767.TI431;24.638160706;100.0 +25/10/2020 02:06:31;U767.TI431;24.635799408;100.0 +25/10/2020 02:06:32;U767.TI431;24.638690948;100.0 +25/10/2020 02:06:33;U767.TI431;24.637088776;100.0 +25/10/2020 02:06:34;U767.TI431;24.640766144;100.0 +25/10/2020 02:06:35;U767.TI431;24.635841370;100.0 +25/10/2020 02:06:36;U767.TI431;24.637809753;100.0 +25/10/2020 02:06:37;U767.TI431;24.638486862;100.0 +25/10/2020 02:06:38;U767.TI431;24.639152527;100.0 +25/10/2020 02:06:39;U767.TI431;24.636302948;100.0 +25/10/2020 02:06:40;U767.TI431;24.636941910;100.0 +25/10/2020 02:06:41;U767.TI431;24.641038895;100.0 +25/10/2020 02:06:42;U767.TI431;24.642652512;100.0 +25/10/2020 02:06:43;U767.TI431;24.637266159;100.0 +25/10/2020 02:06:44;U767.TI431;24.642097473;100.0 +25/10/2020 02:06:45;U767.TI431;24.634607315;100.0 +25/10/2020 02:06:46;U767.TI431;24.637403488;100.0 +25/10/2020 02:06:47;U767.TI431;24.637294769;100.0 +25/10/2020 02:06:48;U767.TI431;24.635883331;100.0 +25/10/2020 02:06:49;U767.TI431;24.630308151;100.0 +25/10/2020 02:06:50;U767.TI431;24.636928558;100.0 +25/10/2020 02:06:51;U767.TI431;24.635288239;100.0 +25/10/2020 02:06:52;U767.TI431;24.638408661;100.0 +25/10/2020 02:06:53;U767.TI431;24.634704590;100.0 +25/10/2020 02:06:54;U767.TI431;24.639331818;100.0 +25/10/2020 02:06:55;U767.TI431;24.636468887;100.0 +25/10/2020 02:06:56;U767.TI431;24.639480591;100.0 +25/10/2020 02:06:57;U767.TI431;24.637771606;100.0 +25/10/2020 02:06:58;U767.TI431;24.638652802;100.0 +25/10/2020 02:06:59;U767.TI431;24.638883591;100.0 +25/10/2020 02:06:00;U767.TI432;24.520086288;100.0 +25/10/2020 02:06:01;U767.TI432;24.520235062;100.0 +25/10/2020 02:06:02;U767.TI432;24.519218445;100.0 +25/10/2020 02:06:03;U767.TI432;24.515243530;100.0 +25/10/2020 02:06:04;U767.TI432;24.517034531;100.0 +25/10/2020 02:06:05;U767.TI432;24.517238617;100.0 +25/10/2020 02:06:06;U767.TI432;24.513710022;100.0 +25/10/2020 02:06:07;U767.TI432;24.516654968;100.0 +25/10/2020 02:06:08;U767.TI432;24.512218475;100.0 +25/10/2020 02:06:09;U767.TI432;24.513317108;100.0 +25/10/2020 02:06:10;U767.TI432;24.514158249;100.0 +25/10/2020 02:06:11;U767.TI432;24.514797211;100.0 +25/10/2020 02:06:12;U767.TI432;24.511486053;100.0 +25/10/2020 02:06:13;U767.TI432;24.511228561;100.0 +25/10/2020 02:06:14;U767.TI432;24.513902664;100.0 +25/10/2020 02:06:15;U767.TI432;24.510591507;100.0 +25/10/2020 02:06:16;U767.TI432;24.513563156;100.0 +25/10/2020 02:06:17;U767.TI432;24.513494492;100.0 +25/10/2020 02:06:18;U767.TI432;24.512056351;100.0 +25/10/2020 02:06:19;U767.TI432;24.511989594;100.0 +25/10/2020 02:06:20;U767.TI432;24.511243820;100.0 +25/10/2020 02:06:21;U767.TI432;24.510496140;100.0 +25/10/2020 02:06:22;U767.TI432;24.513427734;100.0 +25/10/2020 02:06:23;U767.TI432;24.510673523;100.0 +25/10/2020 02:06:24;U767.TI432;24.512193680;100.0 +25/10/2020 02:06:25;U767.TI432;24.511745453;100.0 +25/10/2020 02:06:26;U767.TI432;24.512994766;100.0 +25/10/2020 02:06:27;U767.TI432;24.510877609;100.0 +25/10/2020 02:06:28;U767.TI432;24.514719009;100.0 +25/10/2020 02:06:29;U767.TI432;24.512575150;100.0 +25/10/2020 02:06:30;U767.TI432;24.515533447;100.0 +25/10/2020 02:06:31;U767.TI432;24.517324448;100.0 +25/10/2020 02:06:32;U767.TI432;24.514678955;100.0 +25/10/2020 02:06:33;U767.TI432;24.514230728;100.0 +25/10/2020 02:06:34;U767.TI432;24.515371323;100.0 +25/10/2020 02:06:35;U767.TI432;24.515981674;100.0 +25/10/2020 02:06:36;U767.TI432;24.517488480;100.0 +25/10/2020 02:06:37;U767.TI432;24.517705917;100.0 +25/10/2020 02:06:38;U767.TI432;24.516756058;100.0 +25/10/2020 02:06:39;U767.TI432;24.518981934;100.0 +25/10/2020 02:06:40;U767.TI432;24.519157410;100.0 +25/10/2020 02:06:41;U767.TI432;24.522333145;100.0 +25/10/2020 02:06:42;U767.TI432;24.522794724;100.0 +25/10/2020 02:06:43;U767.TI432;24.519714355;100.0 +25/10/2020 02:06:44;U767.TI432;24.519931793;100.0 +25/10/2020 02:06:45;U767.TI432;24.515901566;100.0 +25/10/2020 02:06:46;U767.TI432;24.517543793;100.0 +25/10/2020 02:06:47;U767.TI432;24.516744614;100.0 +25/10/2020 02:06:48;U767.TI432;24.516485214;100.0 +25/10/2020 02:06:49;U767.TI432;24.515754700;100.0 +25/10/2020 02:06:50;U767.TI432;24.513147354;100.0 +25/10/2020 02:06:51;U767.TI432;24.516120911;100.0 +25/10/2020 02:06:52;U767.TI432;24.512090683;100.0 +25/10/2020 02:06:53;U767.TI432;24.515537262;100.0 +25/10/2020 02:06:54;U767.TI432;24.515781403;100.0 +25/10/2020 02:06:55;U767.TI432;24.517070770;100.0 +25/10/2020 02:06:56;U767.TI432;24.516853333;100.0 +25/10/2020 02:06:57;U767.TI432;24.516990662;100.0 +25/10/2020 02:06:58;U767.TI432;24.518564224;100.0 +25/10/2020 02:06:59;U767.TI432;24.517871857;100.0 +25/10/2020 02:06:00;U767.TI433;24.309267044;100.0 +25/10/2020 02:06:01;U767.TI433;24.308725357;100.0 +25/10/2020 02:06:02;U767.TI433;24.305860519;100.0 +25/10/2020 02:06:03;U767.TI433;24.307422638;100.0 +25/10/2020 02:06:04;U767.TI433;24.307367325;100.0 +25/10/2020 02:06:05;U767.TI433;24.304803848;100.0 +25/10/2020 02:06:06;U767.TI433;24.302427292;100.0 +25/10/2020 02:06:07;U767.TI433;24.303297043;100.0 +25/10/2020 02:06:08;U767.TI433;24.300474167;100.0 +25/10/2020 02:06:09;U767.TI433;24.298574448;100.0 +25/10/2020 02:06:10;U767.TI433;24.302646637;100.0 +25/10/2020 02:06:11;U767.TI433;24.300746918;100.0 +25/10/2020 02:06:12;U767.TI433;24.299741745;100.0 +25/10/2020 02:06:13;U767.TI433;24.298099518;100.0 +25/10/2020 02:06:14;U767.TI433;24.298004150;100.0 +25/10/2020 02:06:15;U767.TI433;24.303230286;100.0 +25/10/2020 02:06:16;U767.TI433;24.300895691;100.0 +25/10/2020 02:06:17;U767.TI433;24.301521301;100.0 +25/10/2020 02:06:18;U767.TI433;24.298929214;100.0 +25/10/2020 02:06:19;U767.TI433;24.302091599;100.0 +25/10/2020 02:06:20;U767.TI433;24.300884247;100.0 +25/10/2020 02:06:21;U767.TI433;24.301290512;100.0 +25/10/2020 02:06:22;U767.TI433;24.305145264;100.0 +25/10/2020 02:06:23;U767.TI433;24.302391052;100.0 +25/10/2020 02:06:24;U767.TI433;24.300449371;100.0 +25/10/2020 02:06:25;U767.TI433;24.303924561;100.0 +25/10/2020 02:06:26;U767.TI433;24.297098160;100.0 +25/10/2020 02:06:27;U767.TI433;24.300518036;100.0 +25/10/2020 02:06:28;U767.TI433;24.303897858;100.0 +25/10/2020 02:06:29;U767.TI433;24.307752609;100.0 +25/10/2020 02:06:30;U767.TI433;24.306789398;100.0 +25/10/2020 02:06:31;U767.TI433;24.300966263;100.0 +25/10/2020 02:06:32;U767.TI433;24.299936295;100.0 +25/10/2020 02:06:33;U767.TI433;24.306409836;100.0 +25/10/2020 02:06:34;U767.TI433;24.307781219;100.0 +25/10/2020 02:06:35;U767.TI433;24.308853149;100.0 +25/10/2020 02:06:36;U767.TI433;24.307130814;100.0 +25/10/2020 02:06:37;U767.TI433;24.308040619;100.0 +25/10/2020 02:06:38;U767.TI433;24.308013916;100.0 +25/10/2020 02:06:39;U767.TI433;24.308624268;100.0 +25/10/2020 02:06:40;U767.TI433;24.312723160;100.0 +25/10/2020 02:06:41;U767.TI433;24.314975739;100.0 +25/10/2020 02:06:42;U767.TI433;24.311746597;100.0 +25/10/2020 02:06:43;U767.TI433;24.307281494;100.0 +25/10/2020 02:06:44;U767.TI433;24.304267883;100.0 +25/10/2020 02:06:45;U767.TI433;24.304620743;100.0 +25/10/2020 02:06:46;U767.TI433;24.304878235;100.0 +25/10/2020 02:06:47;U767.TI433;24.304309845;100.0 +25/10/2020 02:06:48;U767.TI433;24.302667618;100.0 +25/10/2020 02:06:49;U767.TI433;24.304933548;100.0 +25/10/2020 02:06:50;U767.TI433;24.301866531;100.0 +25/10/2020 02:06:51;U767.TI433;24.297685623;100.0 +25/10/2020 02:06:52;U767.TI433;24.298961639;100.0 +25/10/2020 02:06:53;U767.TI433;24.306331635;100.0 +25/10/2020 02:06:54;U767.TI433;24.304037094;100.0 +25/10/2020 02:06:55;U767.TI433;24.306020737;100.0 +25/10/2020 02:06:56;U767.TI433;24.307188034;100.0 +25/10/2020 02:06:57;U767.TI433;24.306169510;100.0 +25/10/2020 02:06:58;U767.TI433;24.307975769;100.0 +25/10/2020 02:06:59;U767.TI433;24.307514191;100.0 +25/10/2020 02:06:00;U767.TI434;30.948089600;100.0 +25/10/2020 02:06:01;U767.TI434;30.928285599;100.0 +25/10/2020 02:06:02;U767.TI434;30.961902618;100.0 +25/10/2020 02:06:03;U767.TI434;30.932495117;100.0 +25/10/2020 02:06:04;U767.TI434;30.959272385;100.0 +25/10/2020 02:06:05;U767.TI434;30.945257187;100.0 +25/10/2020 02:06:06;U767.TI434;30.936704636;100.0 +25/10/2020 02:06:07;U767.TI434;30.958208084;100.0 +25/10/2020 02:06:08;U767.TI434;30.927883148;100.0 +25/10/2020 02:06:09;U767.TI434;30.955806732;100.0 +25/10/2020 02:06:10;U767.TI434;30.929124832;100.0 +25/10/2020 02:06:11;U767.TI434;30.929988861;100.0 +25/10/2020 02:06:12;U767.TI434;30.964994431;100.0 +25/10/2020 02:06:13;U767.TI434;30.944786072;100.0 +25/10/2020 02:06:14;U767.TI434;30.952718735;100.0 +25/10/2020 02:06:15;U767.TI434;30.936586380;100.0 +25/10/2020 02:06:16;U767.TI434;30.952611923;100.0 +25/10/2020 02:06:17;U767.TI434;30.951856613;100.0 +25/10/2020 02:06:18;U767.TI434;30.969459534;100.0 +25/10/2020 02:06:19;U767.TI434;30.919628143;100.0 +25/10/2020 02:06:20;U767.TI434;30.926914215;100.0 +25/10/2020 02:06:21;U767.TI434;30.927549362;100.0 +25/10/2020 02:06:22;U767.TI434;30.932067871;100.0 +25/10/2020 02:06:23;U767.TI434;30.941024780;100.0 +25/10/2020 02:06:24;U767.TI434;30.931987762;100.0 +25/10/2020 02:06:25;U767.TI434;30.943695068;100.0 +25/10/2020 02:06:26;U767.TI434;30.938058853;100.0 +25/10/2020 02:06:27;U767.TI434;30.953611374;100.0 +25/10/2020 02:06:28;U767.TI434;30.943670273;100.0 +25/10/2020 02:06:29;U767.TI434;30.951400757;100.0 +25/10/2020 02:06:30;U767.TI434;30.907787323;100.0 +25/10/2020 02:06:31;U767.TI434;30.955663681;100.0 +25/10/2020 02:06:32;U767.TI434;30.943401337;100.0 +25/10/2020 02:06:33;U767.TI434;30.946855545;100.0 +25/10/2020 02:06:34;U767.TI434;30.961977005;100.0 +25/10/2020 02:06:35;U767.TI434;30.964876175;100.0 +25/10/2020 02:06:36;U767.TI434;30.964540482;100.0 +25/10/2020 02:06:37;U767.TI434;30.946180344;100.0 +25/10/2020 02:06:38;U767.TI434;30.945236206;100.0 +25/10/2020 02:06:39;U767.TI434;30.955476761;100.0 +25/10/2020 02:06:40;U767.TI434;30.930425644;100.0 +25/10/2020 02:06:41;U767.TI434;30.924867630;100.0 +25/10/2020 02:06:42;U767.TI434;30.943901062;100.0 +25/10/2020 02:06:43;U767.TI434;30.961250305;100.0 +25/10/2020 02:06:44;U767.TI434;30.942661285;100.0 +25/10/2020 02:06:45;U767.TI434;30.955396652;100.0 +25/10/2020 02:06:46;U767.TI434;30.952899933;100.0 +25/10/2020 02:06:47;U767.TI434;30.956920624;100.0 +25/10/2020 02:06:48;U767.TI434;30.947721481;100.0 +25/10/2020 02:06:49;U767.TI434;30.968778610;100.0 +25/10/2020 02:06:50;U767.TI434;30.968252182;100.0 +25/10/2020 02:06:51;U767.TI434;30.928781509;100.0 +25/10/2020 02:06:52;U767.TI434;30.973163605;100.0 +25/10/2020 02:06:53;U767.TI434;30.945631027;100.0 +25/10/2020 02:06:54;U767.TI434;30.989215851;100.0 +25/10/2020 02:06:55;U767.TI434;30.949218750;100.0 +25/10/2020 02:06:56;U767.TI434;30.948774338;100.0 +25/10/2020 02:06:57;U767.TI434;30.942258835;100.0 +25/10/2020 02:06:58;U767.TI434;30.967443466;100.0 +25/10/2020 02:06:59;U767.TI434;30.951850891;100.0 +25/10/2020 02:06:27;U767.TI61A_PV.F_CV;10.022938728;100.0 +25/10/2020 02:06:10;U767.TI61B_PV.F_CV;10.181305885;100.0 +25/10/2020 02:06:14;U767.TI61B_PV.F_CV;10.363403320;100.0 +25/10/2020 02:06:38;U767.TI61B_PV.F_CV;10.149508476;100.0 +25/10/2020 02:06:42;U767.TI61B_PV.F_CV;10.344057083;100.0 +25/10/2020 02:06:57;U767.TI61B_PV.F_CV;10.174612999;100.0 +25/10/2020 02:06:56;U767.TI61C_PV.F_CV;10.164737701;100.0 +25/10/2020 02:06:00;U767.TI63_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:41;U767.TI64_PV.F_CV;14.986003876;100.0 +25/10/2020 02:06:50;U767.TI64_PV.F_CV;14.848567009;100.0 +25/10/2020 02:06:51;U767.TI65_PV.F_CV;23.615545273;100.0 +25/10/2020 02:06:47;U767.TI66_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:13;U767.TI67_PV.F_CV;30.787656784;100.0 +25/10/2020 02:06:29;U767.TI68_PV.F_CV;31.454149246;100.0 +25/10/2020 02:06:00;U767.Tp_CoefH_1;24.675693512;100.0 +25/10/2020 02:06:01;U767.Tp_CoefH_1;24.675163269;100.0 +25/10/2020 02:06:02;U767.Tp_CoefH_1;24.674978256;100.0 +25/10/2020 02:06:03;U767.Tp_CoefH_1;24.674427032;100.0 +25/10/2020 02:06:04;U767.Tp_CoefH_1;24.675285339;100.0 +25/10/2020 02:06:05;U767.Tp_CoefH_1;24.676643372;100.0 +25/10/2020 02:06:06;U767.Tp_CoefH_1;24.676424026;100.0 +25/10/2020 02:06:07;U767.Tp_CoefH_1;24.675424576;100.0 +25/10/2020 02:06:08;U767.Tp_CoefH_1;24.674453735;100.0 +25/10/2020 02:06:09;U767.Tp_CoefH_1;24.673433304;100.0 +25/10/2020 02:06:10;U767.Tp_CoefH_1;24.671514511;100.0 +25/10/2020 02:06:11;U767.Tp_CoefH_1;24.671361923;100.0 +25/10/2020 02:06:12;U767.Tp_CoefH_1;24.673269272;100.0 +25/10/2020 02:06:13;U767.Tp_CoefH_1;24.674839020;100.0 +25/10/2020 02:06:14;U767.Tp_CoefH_1;24.673391342;100.0 +25/10/2020 02:06:15;U767.Tp_CoefH_1;24.673786163;100.0 +25/10/2020 02:06:16;U767.Tp_CoefH_1;24.674402237;100.0 +25/10/2020 02:06:17;U767.Tp_CoefH_1;24.675386429;100.0 +25/10/2020 02:06:18;U767.Tp_CoefH_1;24.675825119;100.0 +25/10/2020 02:06:19;U767.Tp_CoefH_1;24.675912857;100.0 +25/10/2020 02:06:20;U767.Tp_CoefH_1;24.676218033;100.0 +25/10/2020 02:06:21;U767.Tp_CoefH_1;24.675958633;100.0 +25/10/2020 02:06:22;U767.Tp_CoefH_1;24.676284790;100.0 +25/10/2020 02:06:23;U767.Tp_CoefH_1;24.675477982;100.0 +25/10/2020 02:06:24;U767.Tp_CoefH_1;24.674097061;100.0 +25/10/2020 02:06:25;U767.Tp_CoefH_1;24.672758102;100.0 +25/10/2020 02:06:26;U767.Tp_CoefH_1;24.671489716;100.0 +25/10/2020 02:06:27;U767.Tp_CoefH_1;24.671276093;100.0 +25/10/2020 02:06:28;U767.Tp_CoefH_1;24.672767639;100.0 +25/10/2020 02:06:29;U767.Tp_CoefH_1;24.674058914;100.0 +25/10/2020 02:06:30;U767.Tp_CoefH_1;24.675106049;100.0 +25/10/2020 02:06:31;U767.Tp_CoefH_1;24.673446655;100.0 +25/10/2020 02:06:32;U767.Tp_CoefH_1;24.673631668;100.0 +25/10/2020 02:06:33;U767.Tp_CoefH_1;24.672866821;100.0 +25/10/2020 02:06:34;U767.Tp_CoefH_1;24.672523499;100.0 +25/10/2020 02:06:35;U767.Tp_CoefH_1;24.672218323;100.0 +25/10/2020 02:06:36;U767.Tp_CoefH_1;24.673341751;100.0 +25/10/2020 02:06:37;U767.Tp_CoefH_1;24.673847198;100.0 +25/10/2020 02:06:38;U767.Tp_CoefH_1;24.674045563;100.0 +25/10/2020 02:06:39;U767.Tp_CoefH_1;24.673919678;100.0 +25/10/2020 02:06:40;U767.Tp_CoefH_1;24.675895691;100.0 +25/10/2020 02:06:41;U767.Tp_CoefH_1;24.675506592;100.0 +25/10/2020 02:06:42;U767.Tp_CoefH_1;24.676414490;100.0 +25/10/2020 02:06:43;U767.Tp_CoefH_1;24.676319122;100.0 +25/10/2020 02:06:44;U767.Tp_CoefH_1;24.677581787;100.0 +25/10/2020 02:06:45;U767.Tp_CoefH_1;24.678258896;100.0 +25/10/2020 02:06:46;U767.Tp_CoefH_1;24.678321838;100.0 +25/10/2020 02:06:47;U767.Tp_CoefH_1;24.678604126;100.0 +25/10/2020 02:06:48;U767.Tp_CoefH_1;24.678318024;100.0 +25/10/2020 02:06:49;U767.Tp_CoefH_1;24.678331375;100.0 +25/10/2020 02:06:50;U767.Tp_CoefH_1;24.677696228;100.0 +25/10/2020 02:06:51;U767.Tp_CoefH_1;24.677249908;100.0 +25/10/2020 02:06:52;U767.Tp_CoefH_1;24.676485062;100.0 +25/10/2020 02:06:53;U767.Tp_CoefH_1;24.676248550;100.0 +25/10/2020 02:06:54;U767.Tp_CoefH_1;24.675458908;100.0 +25/10/2020 02:06:55;U767.Tp_CoefH_1;24.674406052;100.0 +25/10/2020 02:06:56;U767.Tp_CoefH_1;24.673158646;100.0 +25/10/2020 02:06:57;U767.Tp_CoefH_1;24.672351837;100.0 +25/10/2020 02:06:58;U767.Tp_CoefH_1;24.671092987;100.0 +25/10/2020 02:06:59;U767.Tp_CoefH_1;24.670539856;100.0 +25/10/2020 02:06:00;U767.Tp_CoefH_2;24.664016724;100.0 +25/10/2020 02:06:01;U767.Tp_CoefH_2;24.662321091;100.0 +25/10/2020 02:06:02;U767.Tp_CoefH_2;24.661861420;100.0 +25/10/2020 02:06:03;U767.Tp_CoefH_2;24.661548615;100.0 +25/10/2020 02:06:04;U767.Tp_CoefH_2;24.660787582;100.0 +25/10/2020 02:06:05;U767.Tp_CoefH_2;24.659347534;100.0 +25/10/2020 02:06:06;U767.Tp_CoefH_2;24.658851624;100.0 +25/10/2020 02:06:07;U767.Tp_CoefH_2;24.657073975;100.0 +25/10/2020 02:06:08;U767.Tp_CoefH_2;24.655582428;100.0 +25/10/2020 02:06:09;U767.Tp_CoefH_2;24.656909943;100.0 +25/10/2020 02:06:10;U767.Tp_CoefH_2;24.657245636;100.0 +25/10/2020 02:06:11;U767.Tp_CoefH_2;24.657020569;100.0 +25/10/2020 02:06:12;U767.Tp_CoefH_2;24.656240463;100.0 +25/10/2020 02:06:13;U767.Tp_CoefH_2;24.655439377;100.0 +25/10/2020 02:06:14;U767.Tp_CoefH_2;24.656648636;100.0 +25/10/2020 02:06:15;U767.Tp_CoefH_2;24.656702042;100.0 +25/10/2020 02:06:16;U767.Tp_CoefH_2;24.656967163;100.0 +25/10/2020 02:06:17;U767.Tp_CoefH_2;24.655500412;100.0 +25/10/2020 02:06:18;U767.Tp_CoefH_2;24.655206680;100.0 +25/10/2020 02:06:19;U767.Tp_CoefH_2;24.654874802;100.0 +25/10/2020 02:06:20;U767.Tp_CoefH_2;24.654426575;100.0 +25/10/2020 02:06:21;U767.Tp_CoefH_2;24.656515121;100.0 +25/10/2020 02:06:22;U767.Tp_CoefH_2;24.657020569;100.0 +25/10/2020 02:06:23;U767.Tp_CoefH_2;24.656997681;100.0 +25/10/2020 02:06:24;U767.Tp_CoefH_2;24.657539368;100.0 +25/10/2020 02:06:25;U767.Tp_CoefH_2;24.655719757;100.0 +25/10/2020 02:06:26;U767.Tp_CoefH_2;24.655612946;100.0 +25/10/2020 02:06:27;U767.Tp_CoefH_2;24.657978058;100.0 +25/10/2020 02:06:28;U767.Tp_CoefH_2;24.660936356;100.0 +25/10/2020 02:06:29;U767.Tp_CoefH_2;24.662961960;100.0 +25/10/2020 02:06:30;U767.Tp_CoefH_2;24.660764694;100.0 +25/10/2020 02:06:31;U767.Tp_CoefH_2;24.658355713;100.0 +25/10/2020 02:06:32;U767.Tp_CoefH_2;24.659051895;100.0 +25/10/2020 02:06:33;U767.Tp_CoefH_2;24.660364151;100.0 +25/10/2020 02:06:34;U767.Tp_CoefH_2;24.661252975;100.0 +25/10/2020 02:06:35;U767.Tp_CoefH_2;24.660888672;100.0 +25/10/2020 02:06:36;U767.Tp_CoefH_2;24.660804749;100.0 +25/10/2020 02:06:37;U767.Tp_CoefH_2;24.660942078;100.0 +25/10/2020 02:06:38;U767.Tp_CoefH_2;24.660915375;100.0 +25/10/2020 02:06:39;U767.Tp_CoefH_2;24.663675308;100.0 +25/10/2020 02:06:40;U767.Tp_CoefH_2;24.666204453;100.0 +25/10/2020 02:06:41;U767.Tp_CoefH_2;24.666877747;100.0 +25/10/2020 02:06:42;U767.Tp_CoefH_2;24.665468216;100.0 +25/10/2020 02:06:43;U767.Tp_CoefH_2;24.663490295;100.0 +25/10/2020 02:06:44;U767.Tp_CoefH_2;24.661338806;100.0 +25/10/2020 02:06:45;U767.Tp_CoefH_2;24.660898209;100.0 +25/10/2020 02:06:46;U767.Tp_CoefH_2;24.661008835;100.0 +25/10/2020 02:06:47;U767.Tp_CoefH_2;24.661104202;100.0 +25/10/2020 02:06:48;U767.Tp_CoefH_2;24.661880493;100.0 +25/10/2020 02:06:49;U767.Tp_CoefH_2;24.661994934;100.0 +25/10/2020 02:06:50;U767.Tp_CoefH_2;24.659675598;100.0 +25/10/2020 02:06:51;U767.Tp_CoefH_2;24.658241272;100.0 +25/10/2020 02:06:52;U767.Tp_CoefH_2;24.659896851;100.0 +25/10/2020 02:06:53;U767.Tp_CoefH_2;24.660415649;100.0 +25/10/2020 02:06:54;U767.Tp_CoefH_2;24.660972595;100.0 +25/10/2020 02:06:55;U767.Tp_CoefH_2;24.661987305;100.0 +25/10/2020 02:06:56;U767.Tp_CoefH_2;24.662826538;100.0 +25/10/2020 02:06:57;U767.Tp_CoefH_2;24.664051056;100.0 +25/10/2020 02:06:58;U767.Tp_CoefH_2;24.664762497;100.0 +25/10/2020 02:06:59;U767.Tp_CoefH_2;24.665615082;100.0 +25/10/2020 02:06:47;U767.V01_C2H6_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.V01_C3H8_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.V01_C6PLUS_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.V01_CH4_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.V01_CO2_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.V01_I_C4H10_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.V01_I_C5H12_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.V01_N2_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.V01_N_C4H10_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.V01_N_C5H12_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.V01_NEO_C5H2_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U767.WDS_CycleIndex;0.000000000;100.0 +25/10/2020 02:06:05;U767.WDS_CycleIndex;0.000000000;100.0 +25/10/2020 02:06:10;U767.WDS_CycleIndex;0.000000000;100.0 +25/10/2020 02:06:15;U767.WDS_CycleIndex;0.000000000;100.0 +25/10/2020 02:06:20;U767.WDS_CycleIndex;0.000000000;100.0 +25/10/2020 02:06:25;U767.WDS_CycleIndex;0.000000000;100.0 +25/10/2020 02:06:30;U767.WDS_CycleIndex;0.000000000;100.0 +25/10/2020 02:06:35;U767.WDS_CycleIndex;0.000000000;100.0 +25/10/2020 02:06:40;U767.WDS_CycleIndex;0.000000000;100.0 +25/10/2020 02:06:45;U767.WDS_CycleIndex;0.000000000;100.0 +25/10/2020 02:06:50;U767.WDS_CycleIndex;0.000000000;100.0 +25/10/2020 02:06:55;U767.WDS_CycleIndex;0.000000000;100.0 +25/10/2020 02:06:00;U767.WDS_CycleTotal;0.000000000;100.0 +25/10/2020 02:06:05;U767.WDS_CycleTotal;0.000000000;100.0 +25/10/2020 02:06:10;U767.WDS_CycleTotal;0.000000000;100.0 +25/10/2020 02:06:15;U767.WDS_CycleTotal;0.000000000;100.0 +25/10/2020 02:06:20;U767.WDS_CycleTotal;0.000000000;100.0 +25/10/2020 02:06:25;U767.WDS_CycleTotal;0.000000000;100.0 +25/10/2020 02:06:30;U767.WDS_CycleTotal;0.000000000;100.0 +25/10/2020 02:06:35;U767.WDS_CycleTotal;0.000000000;100.0 +25/10/2020 02:06:40;U767.WDS_CycleTotal;0.000000000;100.0 +25/10/2020 02:06:45;U767.WDS_CycleTotal;0.000000000;100.0 +25/10/2020 02:06:50;U767.WDS_CycleTotal;0.000000000;100.0 +25/10/2020 02:06:55;U767.WDS_CycleTotal;0.000000000;100.0 +25/10/2020 02:06:00;U767.WDS_JI520_PV.F_CV;0.000016431;100.0 +25/10/2020 02:06:05;U767.WDS_JI520_PV.F_CV;0.000021461;100.0 +25/10/2020 02:06:10;U767.WDS_JI520_PV.F_CV;0.000016431;100.0 +25/10/2020 02:06:15;U767.WDS_JI520_PV.F_CV;0.000016431;100.0 +25/10/2020 02:06:20;U767.WDS_JI520_PV.F_CV;0.000021461;100.0 +25/10/2020 02:06:25;U767.WDS_JI520_PV.F_CV;0.000016431;100.0 +25/10/2020 02:06:30;U767.WDS_JI520_PV.F_CV;0.000016431;100.0 +25/10/2020 02:06:35;U767.WDS_JI520_PV.F_CV;0.000016431;100.0 +25/10/2020 02:06:40;U767.WDS_JI520_PV.F_CV;0.000016431;100.0 +25/10/2020 02:06:45;U767.WDS_JI520_PV.F_CV;0.000012072;100.0 +25/10/2020 02:06:50;U767.WDS_JI520_PV.F_CV;0.000016431;100.0 +25/10/2020 02:06:55;U767.WDS_JI520_PV.F_CV;0.000008383;100.0 +25/10/2020 02:06:00;U767.WDS_JI520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U767.WDS_JI520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U767.WDS_JI520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U767.WDS_JI520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U767.WDS_JI520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U767.WDS_JI520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U767.WDS_JI520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U767.WDS_JI520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U767.WDS_JI520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U767.WDS_JI520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U767.WDS_JI520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U767.WDS_JI520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U767.WDS_JI530_PV.F_CV;0.000021244;100.0 +25/10/2020 02:06:05;U767.WDS_JI530_PV.F_CV;0.000026887;100.0 +25/10/2020 02:06:10;U767.WDS_JI530_PV.F_CV;0.000033194;100.0 +25/10/2020 02:06:15;U767.WDS_JI530_PV.F_CV;0.000026887;100.0 +25/10/2020 02:06:20;U767.WDS_JI530_PV.F_CV;0.000026887;100.0 +25/10/2020 02:06:25;U767.WDS_JI530_PV.F_CV;0.000026887;100.0 +25/10/2020 02:06:30;U767.WDS_JI530_PV.F_CV;0.000021244;100.0 +25/10/2020 02:06:35;U767.WDS_JI530_PV.F_CV;0.000021244;100.0 +25/10/2020 02:06:40;U767.WDS_JI530_PV.F_CV;0.000021244;100.0 +25/10/2020 02:06:45;U767.WDS_JI530_PV.F_CV;0.000021244;100.0 +25/10/2020 02:06:50;U767.WDS_JI530_PV.F_CV;0.000021244;100.0 +25/10/2020 02:06:55;U767.WDS_JI530_PV.F_CV;0.000026887;100.0 +25/10/2020 02:06:00;U767.WDS_JI530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U767.WDS_JI530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U767.WDS_JI530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U767.WDS_JI530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U767.WDS_JI530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U767.WDS_JI530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U767.WDS_JI530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U767.WDS_JI530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U767.WDS_JI530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U767.WDS_JI530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U767.WDS_JI530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U767.WDS_JI530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U767.WDS_TI521;22.630000000;100.0 +25/10/2020 02:06:05;U767.WDS_TI521;22.610000000;100.0 +25/10/2020 02:06:10;U767.WDS_TI521;22.620000000;100.0 +25/10/2020 02:06:15;U767.WDS_TI521;22.610000000;100.0 +25/10/2020 02:06:20;U767.WDS_TI521;22.630000000;100.0 +25/10/2020 02:06:25;U767.WDS_TI521;22.620000000;100.0 +25/10/2020 02:06:30;U767.WDS_TI521;22.630000000;100.0 +25/10/2020 02:06:35;U767.WDS_TI521;22.610000000;100.0 +25/10/2020 02:06:40;U767.WDS_TI521;22.620000000;100.0 +25/10/2020 02:06:45;U767.WDS_TI521;22.630000000;100.0 +25/10/2020 02:06:50;U767.WDS_TI521;22.630000000;100.0 +25/10/2020 02:06:55;U767.WDS_TI521;22.640000000;100.0 +25/10/2020 02:06:00;U767.WDS_TI522;22.950000000;100.0 +25/10/2020 02:06:05;U767.WDS_TI522;22.980000000;100.0 +25/10/2020 02:06:10;U767.WDS_TI522;22.950000000;100.0 +25/10/2020 02:06:15;U767.WDS_TI522;22.960000000;100.0 +25/10/2020 02:06:20;U767.WDS_TI522;22.960000000;100.0 +25/10/2020 02:06:25;U767.WDS_TI522;22.970000000;100.0 +25/10/2020 02:06:30;U767.WDS_TI522;22.970000000;100.0 +25/10/2020 02:06:35;U767.WDS_TI522;22.970000000;100.0 +25/10/2020 02:06:40;U767.WDS_TI522;22.960000000;100.0 +25/10/2020 02:06:45;U767.WDS_TI522;22.960000000;100.0 +25/10/2020 02:06:50;U767.WDS_TI522;22.960000000;100.0 +25/10/2020 02:06:55;U767.WDS_TI522;22.960000000;100.0 +25/10/2020 02:06:00;U767.WDS_TI523;23.350000000;100.0 +25/10/2020 02:06:05;U767.WDS_TI523;23.360000000;100.0 +25/10/2020 02:06:10;U767.WDS_TI523;23.370000000;100.0 +25/10/2020 02:06:15;U767.WDS_TI523;23.350000000;100.0 +25/10/2020 02:06:20;U767.WDS_TI523;23.360000000;100.0 +25/10/2020 02:06:25;U767.WDS_TI523;23.360000000;100.0 +25/10/2020 02:06:30;U767.WDS_TI523;23.360000000;100.0 +25/10/2020 02:06:35;U767.WDS_TI523;23.360000000;100.0 +25/10/2020 02:06:40;U767.WDS_TI523;23.370000000;100.0 +25/10/2020 02:06:45;U767.WDS_TI523;23.370000000;100.0 +25/10/2020 02:06:50;U767.WDS_TI523;23.370000000;100.0 +25/10/2020 02:06:55;U767.WDS_TI523;23.360000000;100.0 +25/10/2020 02:06:00;U767.WDS_TI524;22.840000000;100.0 +25/10/2020 02:06:05;U767.WDS_TI524;22.830000000;100.0 +25/10/2020 02:06:10;U767.WDS_TI524;22.850000000;100.0 +25/10/2020 02:06:15;U767.WDS_TI524;22.840000000;100.0 +25/10/2020 02:06:20;U767.WDS_TI524;22.840000000;100.0 +25/10/2020 02:06:25;U767.WDS_TI524;22.830000000;100.0 +25/10/2020 02:06:30;U767.WDS_TI524;22.830000000;100.0 +25/10/2020 02:06:35;U767.WDS_TI524;22.810000000;100.0 +25/10/2020 02:06:40;U767.WDS_TI524;22.830000000;100.0 +25/10/2020 02:06:45;U767.WDS_TI524;22.820000000;100.0 +25/10/2020 02:06:50;U767.WDS_TI524;22.840000000;100.0 +25/10/2020 02:06:55;U767.WDS_TI524;22.840000000;100.0 +25/10/2020 02:06:00;U767.WDS_TI525;23.170000000;100.0 +25/10/2020 02:06:05;U767.WDS_TI525;23.160000000;100.0 +25/10/2020 02:06:10;U767.WDS_TI525;23.170000000;100.0 +25/10/2020 02:06:15;U767.WDS_TI525;23.150000000;100.0 +25/10/2020 02:06:20;U767.WDS_TI525;23.160000000;100.0 +25/10/2020 02:06:25;U767.WDS_TI525;23.160000000;100.0 +25/10/2020 02:06:30;U767.WDS_TI525;23.170000000;100.0 +25/10/2020 02:06:35;U767.WDS_TI525;23.160000000;100.0 +25/10/2020 02:06:40;U767.WDS_TI525;23.160000000;100.0 +25/10/2020 02:06:45;U767.WDS_TI525;23.170000000;100.0 +25/10/2020 02:06:50;U767.WDS_TI525;23.170000000;100.0 +25/10/2020 02:06:55;U767.WDS_TI525;23.190000000;100.0 +25/10/2020 02:06:00;U767.WDS_TI531;23.170000000;100.0 +25/10/2020 02:06:05;U767.WDS_TI531;23.190000000;100.0 +25/10/2020 02:06:10;U767.WDS_TI531;23.170000000;100.0 +25/10/2020 02:06:15;U767.WDS_TI531;23.170000000;100.0 +25/10/2020 02:06:20;U767.WDS_TI531;23.170000000;100.0 +25/10/2020 02:06:25;U767.WDS_TI531;23.170000000;100.0 +25/10/2020 02:06:30;U767.WDS_TI531;23.180000000;100.0 +25/10/2020 02:06:35;U767.WDS_TI531;23.170000000;100.0 +25/10/2020 02:06:40;U767.WDS_TI531;23.190000000;100.0 +25/10/2020 02:06:45;U767.WDS_TI531;23.170000000;100.0 +25/10/2020 02:06:50;U767.WDS_TI531;23.190000000;100.0 +25/10/2020 02:06:55;U767.WDS_TI531;23.180000000;100.0 +25/10/2020 02:06:00;U767.WDS_TI532;22.760000000;100.0 +25/10/2020 02:06:05;U767.WDS_TI532;22.760000000;100.0 +25/10/2020 02:06:10;U767.WDS_TI532;22.770000000;100.0 +25/10/2020 02:06:15;U767.WDS_TI532;22.740000000;100.0 +25/10/2020 02:06:20;U767.WDS_TI532;22.770000000;100.0 +25/10/2020 02:06:25;U767.WDS_TI532;22.750000000;100.0 +25/10/2020 02:06:30;U767.WDS_TI532;22.760000000;100.0 +25/10/2020 02:06:35;U767.WDS_TI532;22.770000000;100.0 +25/10/2020 02:06:40;U767.WDS_TI532;22.760000000;100.0 +25/10/2020 02:06:45;U767.WDS_TI532;22.760000000;100.0 +25/10/2020 02:06:50;U767.WDS_TI532;22.780000000;100.0 +25/10/2020 02:06:55;U767.WDS_TI532;22.780000000;100.0 +25/10/2020 02:06:00;U767.WDS_TI533;23.070000000;100.0 +25/10/2020 02:06:05;U767.WDS_TI533;23.060000000;100.0 +25/10/2020 02:06:10;U767.WDS_TI533;23.070000000;100.0 +25/10/2020 02:06:15;U767.WDS_TI533;23.060000000;100.0 +25/10/2020 02:06:20;U767.WDS_TI533;23.060000000;100.0 +25/10/2020 02:06:25;U767.WDS_TI533;23.070000000;100.0 +25/10/2020 02:06:30;U767.WDS_TI533;23.060000000;100.0 +25/10/2020 02:06:35;U767.WDS_TI533;23.070000000;100.0 +25/10/2020 02:06:40;U767.WDS_TI533;23.070000000;100.0 +25/10/2020 02:06:45;U767.WDS_TI533;23.060000000;100.0 +25/10/2020 02:06:50;U767.WDS_TI533;23.070000000;100.0 +25/10/2020 02:06:55;U767.WDS_TI533;23.060000000;100.0 +25/10/2020 02:06:00;U767.WDS_TI534;22.880000000;100.0 +25/10/2020 02:06:05;U767.WDS_TI534;22.860000000;100.0 +25/10/2020 02:06:10;U767.WDS_TI534;22.870000000;100.0 +25/10/2020 02:06:15;U767.WDS_TI534;22.870000000;100.0 +25/10/2020 02:06:20;U767.WDS_TI534;22.870000000;100.0 +25/10/2020 02:06:25;U767.WDS_TI534;22.860000000;100.0 +25/10/2020 02:06:30;U767.WDS_TI534;22.870000000;100.0 +25/10/2020 02:06:35;U767.WDS_TI534;22.860000000;100.0 +25/10/2020 02:06:40;U767.WDS_TI534;22.860000000;100.0 +25/10/2020 02:06:45;U767.WDS_TI534;22.870000000;100.0 +25/10/2020 02:06:50;U767.WDS_TI534;22.880000000;100.0 +25/10/2020 02:06:55;U767.WDS_TI534;22.860000000;100.0 +25/10/2020 02:06:00;U767.WDS_TI535;23.340000000;100.0 +25/10/2020 02:06:05;U767.WDS_TI535;23.350000000;100.0 +25/10/2020 02:06:10;U767.WDS_TI535;23.350000000;100.0 +25/10/2020 02:06:15;U767.WDS_TI535;23.330000000;100.0 +25/10/2020 02:06:20;U767.WDS_TI535;23.350000000;100.0 +25/10/2020 02:06:25;U767.WDS_TI535;23.340000000;100.0 +25/10/2020 02:06:30;U767.WDS_TI535;23.310000000;100.0 +25/10/2020 02:06:35;U767.WDS_TI535;23.340000000;100.0 +25/10/2020 02:06:40;U767.WDS_TI535;23.330000000;100.0 +25/10/2020 02:06:45;U767.WDS_TI535;23.350000000;100.0 +25/10/2020 02:06:50;U767.WDS_TI535;23.350000000;100.0 +25/10/2020 02:06:55;U767.WDS_TI535;23.350000000;100.0 +25/10/2020 02:06:00;U767.WDS_ZSF520_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U767.WDS_ZSF520_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U767.WDS_ZSF520_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U767.WDS_ZSF520_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U767.WDS_ZSF520_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U767.WDS_ZSF520_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U767.WDS_ZSF520_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U767.WDS_ZSF520_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U767.WDS_ZSF520_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U767.WDS_ZSF520_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U767.WDS_ZSF520_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U767.WDS_ZSF520_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U767.WDS_ZSF520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U767.WDS_ZSF520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U767.WDS_ZSF520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U767.WDS_ZSF520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U767.WDS_ZSF520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U767.WDS_ZSF520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U767.WDS_ZSF520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U767.WDS_ZSF520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U767.WDS_ZSF520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U767.WDS_ZSF520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U767.WDS_ZSF520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U767.WDS_ZSF520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U767.WDS_ZSF530_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U767.WDS_ZSF530_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U767.WDS_ZSF530_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U767.WDS_ZSF530_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U767.WDS_ZSF530_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U767.WDS_ZSF530_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U767.WDS_ZSF530_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U767.WDS_ZSF530_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U767.WDS_ZSF530_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U767.WDS_ZSF530_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U767.WDS_ZSF530_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U767.WDS_ZSF530_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U767.WDS_ZSF530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U767.WDS_ZSF530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U767.WDS_ZSF530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U767.WDS_ZSF530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U767.WDS_ZSF530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U767.WDS_ZSF530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U767.WDS_ZSF530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U767.WDS_ZSF530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U767.WDS_ZSF530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U767.WDS_ZSF530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U767.WDS_ZSF530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U767.WDS_ZSF530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U767.WDS_ZSO520_PV.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U767.WDS_ZSO520_PV.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U767.WDS_ZSO520_PV.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U767.WDS_ZSO520_PV.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U767.WDS_ZSO520_PV.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U767.WDS_ZSO520_PV.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U767.WDS_ZSO520_PV.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U767.WDS_ZSO520_PV.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U767.WDS_ZSO520_PV.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U767.WDS_ZSO520_PV.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U767.WDS_ZSO520_PV.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U767.WDS_ZSO520_PV.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U767.WDS_ZSO520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U767.WDS_ZSO520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U767.WDS_ZSO520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U767.WDS_ZSO520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U767.WDS_ZSO520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U767.WDS_ZSO520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U767.WDS_ZSO520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U767.WDS_ZSO520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U767.WDS_ZSO520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U767.WDS_ZSO520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U767.WDS_ZSO520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U767.WDS_ZSO520_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U767.WDS_ZSO530_PV.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U767.WDS_ZSO530_PV.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U767.WDS_ZSO530_PV.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U767.WDS_ZSO530_PV.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U767.WDS_ZSO530_PV.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U767.WDS_ZSO530_PV.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U767.WDS_ZSO530_PV.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U767.WDS_ZSO530_PV.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U767.WDS_ZSO530_PV.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U767.WDS_ZSO530_PV.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U767.WDS_ZSO530_PV.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U767.WDS_ZSO530_PV.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U767.WDS_ZSO530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U767.WDS_ZSO530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U767.WDS_ZSO530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U767.WDS_ZSO530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U767.WDS_ZSO530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U767.WDS_ZSO530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U767.WDS_ZSO530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U767.WDS_ZSO530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U767.WDS_ZSO530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U767.WDS_ZSO530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U767.WDS_ZSO530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U767.WDS_ZSO530_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.Z300_D_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.Z300_H_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.Z300_M_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.Z300_MN_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.Z300_S_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.Z300_T_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U767.Z300_Y_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U805.FC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.FC03_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.FI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.FIX.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.FQ02.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.LC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.LI03.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.PC04_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;U805.PC1003_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.PI04.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;U805.PI1000.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TC05_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TC09_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TI03.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TI04.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TI05.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TI06.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TI07.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TI08.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TI10.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TI11.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TI12.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TI13.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TI14.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TI15.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TI16.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TI17.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TI18.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TI19.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TI20.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TI21.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TI22.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TI23.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.TI24.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.WI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;U805.WI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.FC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.FC100_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.FI200.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.FI500.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.FQ500_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;U806.FT40_MESURE.F_CV;9.115871429;100.0 +25/10/2020 02:06:01;U806.FT40_MESURE.F_CV;9.118993759;100.0 +25/10/2020 02:06:02;U806.FT40_MESURE.F_CV;9.122115135;100.0 +25/10/2020 02:06:03;U806.FT40_MESURE.F_CV;9.122115135;100.0 +25/10/2020 02:06:04;U806.FT40_MESURE.F_CV;9.122115135;100.0 +25/10/2020 02:06:05;U806.FT40_MESURE.F_CV;9.122115135;100.0 +25/10/2020 02:06:06;U806.FT40_MESURE.F_CV;9.122115135;100.0 +25/10/2020 02:06:07;U806.FT40_MESURE.F_CV;9.122115135;100.0 +25/10/2020 02:06:08;U806.FT40_MESURE.F_CV;9.118993759;100.0 +25/10/2020 02:06:09;U806.FT40_MESURE.F_CV;9.122115135;100.0 +25/10/2020 02:06:10;U806.FT40_MESURE.F_CV;9.122115135;100.0 +25/10/2020 02:06:11;U806.FT40_MESURE.F_CV;9.122115135;100.0 +25/10/2020 02:06:12;U806.FT40_MESURE.F_CV;9.118993759;100.0 +25/10/2020 02:06:13;U806.FT40_MESURE.F_CV;9.118993759;100.0 +25/10/2020 02:06:14;U806.FT40_MESURE.F_CV;9.118993759;100.0 +25/10/2020 02:06:15;U806.FT40_MESURE.F_CV;9.118993759;100.0 +25/10/2020 02:06:16;U806.FT40_MESURE.F_CV;9.118993759;100.0 +25/10/2020 02:06:17;U806.FT40_MESURE.F_CV;9.118993759;100.0 +25/10/2020 02:06:18;U806.FT40_MESURE.F_CV;9.121215820;100.0 +25/10/2020 02:06:19;U806.FT40_MESURE.F_CV;9.121215820;100.0 +25/10/2020 02:06:20;U806.FT40_MESURE.F_CV;9.115871429;100.0 +25/10/2020 02:06:21;U806.FT40_MESURE.F_CV;9.115871429;100.0 +25/10/2020 02:06:22;U806.FT40_MESURE.F_CV;9.115871429;100.0 +25/10/2020 02:06:23;U806.FT40_MESURE.F_CV;9.115871429;100.0 +25/10/2020 02:06:24;U806.FT40_MESURE.F_CV;9.115871429;100.0 +25/10/2020 02:06:25;U806.FT40_MESURE.F_CV;9.115871429;100.0 +25/10/2020 02:06:26;U806.FT40_MESURE.F_CV;9.115871429;100.0 +25/10/2020 02:06:27;U806.FT40_MESURE.F_CV;9.118993759;100.0 +25/10/2020 02:06:28;U806.FT40_MESURE.F_CV;9.118993759;100.0 +25/10/2020 02:06:29;U806.FT40_MESURE.F_CV;9.121215820;100.0 +25/10/2020 02:06:30;U806.FT40_MESURE.F_CV;9.121215820;100.0 +25/10/2020 02:06:31;U806.FT40_MESURE.F_CV;9.121215820;100.0 +25/10/2020 02:06:32;U806.FT40_MESURE.F_CV;9.121215820;100.0 +25/10/2020 02:06:33;U806.FT40_MESURE.F_CV;9.118993759;100.0 +25/10/2020 02:06:34;U806.FT40_MESURE.F_CV;9.115871429;100.0 +25/10/2020 02:06:35;U806.FT40_MESURE.F_CV;9.115871429;100.0 +25/10/2020 02:06:36;U806.FT40_MESURE.F_CV;9.118093491;100.0 +25/10/2020 02:06:37;U806.FT40_MESURE.F_CV;9.118093491;100.0 +25/10/2020 02:06:38;U806.FT40_MESURE.F_CV;9.118093491;100.0 +25/10/2020 02:06:39;U806.FT40_MESURE.F_CV;9.114972115;100.0 +25/10/2020 02:06:40;U806.FT40_MESURE.F_CV;9.114972115;100.0 +25/10/2020 02:06:41;U806.FT40_MESURE.F_CV;9.114972115;100.0 +25/10/2020 02:06:42;U806.FT40_MESURE.F_CV;9.114972115;100.0 +25/10/2020 02:06:43;U806.FT40_MESURE.F_CV;9.114972115;100.0 +25/10/2020 02:06:44;U806.FT40_MESURE.F_CV;9.114972115;100.0 +25/10/2020 02:06:45;U806.FT40_MESURE.F_CV;9.115871429;100.0 +25/10/2020 02:06:46;U806.FT40_MESURE.F_CV;9.115871429;100.0 +25/10/2020 02:06:47;U806.FT40_MESURE.F_CV;9.115871429;100.0 +25/10/2020 02:06:48;U806.FT40_MESURE.F_CV;9.121215820;100.0 +25/10/2020 02:06:49;U806.FT40_MESURE.F_CV;9.118993759;100.0 +25/10/2020 02:06:50;U806.FT40_MESURE.F_CV;9.118993759;100.0 +25/10/2020 02:06:51;U806.FT40_MESURE.F_CV;9.118993759;100.0 +25/10/2020 02:06:52;U806.FT40_MESURE.F_CV;9.118993759;100.0 +25/10/2020 02:06:53;U806.FT40_MESURE.F_CV;9.122115135;100.0 +25/10/2020 02:06:54;U806.FT40_MESURE.F_CV;9.122115135;100.0 +25/10/2020 02:06:55;U806.FT40_MESURE.F_CV;9.118993759;100.0 +25/10/2020 02:06:56;U806.FT40_MESURE.F_CV;9.118993759;100.0 +25/10/2020 02:06:57;U806.FT40_MESURE.F_CV;9.118993759;100.0 +25/10/2020 02:06:58;U806.FT40_MESURE.F_CV;9.115871429;100.0 +25/10/2020 02:06:59;U806.FT40_MESURE.F_CV;9.115871429;100.0 +25/10/2020 02:06:59;U806.LC400_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U806.PC500_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U806.PDI203.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.PDI206.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.T-ARM.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TC200_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TC201_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TC203_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TC300_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TC301_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TC302_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TC303_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TC304_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TC305_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TC306_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TC307_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TC400_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TC401_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TC402_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TC403_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TC500_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:17;U806.TI01.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U806.TI200_MESURE.F_CV;14.908170700;100.0 +25/10/2020 02:06:01;U806.TI200_MESURE.F_CV;14.908170700;100.0 +25/10/2020 02:06:02;U806.TI200_MESURE.F_CV;14.908170700;100.0 +25/10/2020 02:06:03;U806.TI200_MESURE.F_CV;14.908170700;100.0 +25/10/2020 02:06:04;U806.TI200_MESURE.F_CV;14.908170700;100.0 +25/10/2020 02:06:05;U806.TI200_MESURE.F_CV;15.033449173;100.0 +25/10/2020 02:06:06;U806.TI200_MESURE.F_CV;15.033449173;100.0 +25/10/2020 02:06:07;U806.TI200_MESURE.F_CV;15.033449173;100.0 +25/10/2020 02:06:08;U806.TI200_MESURE.F_CV;15.033449173;100.0 +25/10/2020 02:06:09;U806.TI200_MESURE.F_CV;14.983337402;100.0 +25/10/2020 02:06:10;U806.TI200_MESURE.F_CV;14.983337402;100.0 +25/10/2020 02:06:11;U806.TI200_MESURE.F_CV;14.983337402;100.0 +25/10/2020 02:06:12;U806.TI200_MESURE.F_CV;14.983337402;100.0 +25/10/2020 02:06:13;U806.TI200_MESURE.F_CV;14.983337402;100.0 +25/10/2020 02:06:14;U806.TI200_MESURE.F_CV;14.983337402;100.0 +25/10/2020 02:06:15;U806.TI200_MESURE.F_CV;14.983337402;100.0 +25/10/2020 02:06:16;U806.TI200_MESURE.F_CV;14.983337402;100.0 +25/10/2020 02:06:17;U806.TI200_MESURE.F_CV;14.983337402;100.0 +25/10/2020 02:06:18;U806.TI200_MESURE.F_CV;15.033449173;100.0 +25/10/2020 02:06:19;U806.TI200_MESURE.F_CV;15.033449173;100.0 +25/10/2020 02:06:20;U806.TI200_MESURE.F_CV;14.983337402;100.0 +25/10/2020 02:06:21;U806.TI200_MESURE.F_CV;14.983337402;100.0 +25/10/2020 02:06:22;U806.TI200_MESURE.F_CV;14.983337402;100.0 +25/10/2020 02:06:23;U806.TI200_MESURE.F_CV;14.908170700;100.0 +25/10/2020 02:06:24;U806.TI200_MESURE.F_CV;14.908170700;100.0 +25/10/2020 02:06:25;U806.TI200_MESURE.F_CV;14.983337402;100.0 +25/10/2020 02:06:26;U806.TI200_MESURE.F_CV;14.983337402;100.0 +25/10/2020 02:06:27;U806.TI200_MESURE.F_CV;14.833003044;100.0 +25/10/2020 02:06:28;U806.TI200_MESURE.F_CV;14.833003044;100.0 +25/10/2020 02:06:29;U806.TI200_MESURE.F_CV;14.833003044;100.0 +25/10/2020 02:06:30;U806.TI200_MESURE.F_CV;14.908170700;100.0 +25/10/2020 02:06:31;U806.TI200_MESURE.F_CV;14.908170700;100.0 +25/10/2020 02:06:32;U806.TI200_MESURE.F_CV;14.908170700;100.0 +25/10/2020 02:06:33;U806.TI200_MESURE.F_CV;14.908170700;100.0 +25/10/2020 02:06:34;U806.TI200_MESURE.F_CV;14.908170700;100.0 +25/10/2020 02:06:35;U806.TI200_MESURE.F_CV;14.908170700;100.0 +25/10/2020 02:06:36;U806.TI200_MESURE.F_CV;14.908170700;100.0 +25/10/2020 02:06:37;U806.TI200_MESURE.F_CV;14.908170700;100.0 +25/10/2020 02:06:38;U806.TI200_MESURE.F_CV;14.833003044;100.0 +25/10/2020 02:06:39;U806.TI200_MESURE.F_CV;14.833003044;100.0 +25/10/2020 02:06:40;U806.TI200_MESURE.F_CV;14.833003044;100.0 +25/10/2020 02:06:41;U806.TI200_MESURE.F_CV;14.833003044;100.0 +25/10/2020 02:06:42;U806.TI200_MESURE.F_CV;14.833003044;100.0 +25/10/2020 02:06:43;U806.TI200_MESURE.F_CV;14.908170700;100.0 +25/10/2020 02:06:44;U806.TI200_MESURE.F_CV;14.908170700;100.0 +25/10/2020 02:06:45;U806.TI200_MESURE.F_CV;14.908170700;100.0 +25/10/2020 02:06:46;U806.TI200_MESURE.F_CV;14.908170700;100.0 +25/10/2020 02:06:47;U806.TI200_MESURE.F_CV;14.983337402;100.0 +25/10/2020 02:06:48;U806.TI200_MESURE.F_CV;14.983337402;100.0 +25/10/2020 02:06:49;U806.TI200_MESURE.F_CV;14.983337402;100.0 +25/10/2020 02:06:50;U806.TI200_MESURE.F_CV;14.983337402;100.0 +25/10/2020 02:06:51;U806.TI200_MESURE.F_CV;14.983337402;100.0 +25/10/2020 02:06:52;U806.TI200_MESURE.F_CV;14.983337402;100.0 +25/10/2020 02:06:53;U806.TI200_MESURE.F_CV;14.983337402;100.0 +25/10/2020 02:06:54;U806.TI200_MESURE.F_CV;14.908170700;100.0 +25/10/2020 02:06:55;U806.TI200_MESURE.F_CV;14.908170700;100.0 +25/10/2020 02:06:56;U806.TI200_MESURE.F_CV;14.833003044;100.0 +25/10/2020 02:06:57;U806.TI200_MESURE.F_CV;14.833003044;100.0 +25/10/2020 02:06:58;U806.TI200_MESURE.F_CV;14.833003044;100.0 +25/10/2020 02:06:59;U806.TI200_MESURE.F_CV;14.833003044;100.0 +25/10/2020 02:06:05;U806.TI220.F_CV;16.296634674;100.0 +25/10/2020 02:06:59;U806.TI308.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TI310.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TI311.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TI312.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TI313.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TI314.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TI315.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TI320.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TI321.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TI322.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TI323.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TI324.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TI325.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.TI501.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.U806_COEF_A_TI310.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.U806_COEF_A_TI311.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.U806_COEF_A_TI312.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.U806_COEF_A_TI313.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.U806_COEF_A_TI314.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.U806_COEF_A_TI315.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.U806_COEF_B_TI310.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.U806_COEF_B_TI311.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.U806_COEF_B_TI312.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.U806_COEF_B_TI313.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.U806_COEF_B_TI314.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.U806_COEF_B_TI315.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.WI200.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.WI400.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U806.WIA400.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;U807.AI1.F_CV;0.624986529;100.0 +25/10/2020 02:06:57;U807.AI10.F_CV;0.829049051;100.0 +25/10/2020 02:06:02;U807.AI2.F_CV;9999.000000000;100.0 +25/10/2020 02:06:02;U807.AI3.F_CV;9999.000000000;100.0 +25/10/2020 02:06:56;U807.AI4.F_CV;9999.000000000;100.0 +25/10/2020 02:06:25;U807.BILAN.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U807.FC10_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U807.FC10_PV.F_CV;1.727646947;100.0 +25/10/2020 02:06:52;U807.FC11_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;U807.FC11_PV.F_CV;202.582443237;100.0 +25/10/2020 02:06:07;U807.FC11_PV.F_CV;203.096862793;100.0 +25/10/2020 02:06:24;U807.FC11_PV.F_CV;202.558898926;100.0 +25/10/2020 02:06:06;U807.FC15_OP.F_CV;62.352367401;100.0 +25/10/2020 02:06:06;U807.FC15_PV.F_CV;20.638702393;100.0 +25/10/2020 02:06:06;U807.FC15B.F_CV;20.638702393;100.0 +25/10/2020 02:06:44;U807.FI10.F_CV;1.728240609;100.0 +25/10/2020 02:06:52;U807.FI11.F_CV;0.000000000;0.0 +25/10/2020 02:06:11;U807.FI12.F_CV;105.129653931;100.0 +25/10/2020 02:06:12;U807.FI12.F_CV;107.332588196;100.0 +25/10/2020 02:06:30;U807.FI12.F_CV;104.047782898;100.0 +25/10/2020 02:06:42;U807.FI12.F_CV;106.489410400;100.0 +25/10/2020 02:06:49;U807.FI12.F_CV;107.195114136;100.0 +25/10/2020 02:06:36;U807.FI14.F_CV;1.308587432;100.0 +25/10/2020 02:06:12;U807.FI16.F_CV;49.390048981;100.0 +25/10/2020 02:06:23;U807.FI16.F_CV;49.390048981;100.0 +25/10/2020 02:06:24;U807.FI16.F_CV;45.005455017;100.0 +25/10/2020 02:06:48;U807.FI16.F_CV;44.323139191;100.0 +25/10/2020 02:06:49;U807.FI16.F_CV;49.583045959;100.0 +25/10/2020 02:06:59;U807.FI16.F_CV;49.583045959;100.0 +25/10/2020 02:06:57;U807.FI20.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U807.FQ12.F_CV;0.000000000;0.0 +25/10/2020 02:06:25;U807.FQ12BIL.F_CV;322.579986572;100.0 +25/10/2020 02:06:52;U807.FQ14.F_CV;0.000000000;0.0 +25/10/2020 02:06:13;U807.FQ14BIL.F_CV;3.743999720;100.0 +25/10/2020 02:06:00;U807.LC2_OP.F_CV;44.212165833;100.0 +25/10/2020 02:06:06;U807.LC2_OP.F_CV;44.212165833;100.0 +25/10/2020 02:06:07;U807.LC2_OP.F_CV;43.064670563;100.0 +25/10/2020 02:06:11;U807.LC2_OP.F_CV;43.064670563;100.0 +25/10/2020 02:06:12;U807.LC2_OP.F_CV;40.916164398;100.0 +25/10/2020 02:06:17;U807.LC2_OP.F_CV;40.916164398;100.0 +25/10/2020 02:06:18;U807.LC2_OP.F_CV;39.133884430;100.0 +25/10/2020 02:06:23;U807.LC2_OP.F_CV;39.133884430;100.0 +25/10/2020 02:06:24;U807.LC2_OP.F_CV;40.086063385;100.0 +25/10/2020 02:06:29;U807.LC2_OP.F_CV;40.086063385;100.0 +25/10/2020 02:06:30;U807.LC2_OP.F_CV;37.522506714;100.0 +25/10/2020 02:06:35;U807.LC2_OP.F_CV;37.522506714;100.0 +25/10/2020 02:06:36;U807.LC2_OP.F_CV;39.011810303;100.0 +25/10/2020 02:06:41;U807.LC2_OP.F_CV;39.011810303;100.0 +25/10/2020 02:06:42;U807.LC2_OP.F_CV;38.670001984;100.0 +25/10/2020 02:06:48;U807.LC2_OP.F_CV;38.670001984;100.0 +25/10/2020 02:06:49;U807.LC2_OP.F_CV;37.620166779;100.0 +25/10/2020 02:06:53;U807.LC2_OP.F_CV;37.620166779;100.0 +25/10/2020 02:06:54;U807.LC2_OP.F_CV;38.743247986;100.0 +25/10/2020 02:06:59;U807.LC2_OP.F_CV;38.743247986;100.0 +25/10/2020 02:06:00;U807.LC2_PV.F_CV;40.881530762;100.0 +25/10/2020 02:06:06;U807.LC2_PV.F_CV;40.881530762;100.0 +25/10/2020 02:06:07;U807.LC2_PV.F_CV;40.218456268;100.0 +25/10/2020 02:06:11;U807.LC2_PV.F_CV;40.218456268;100.0 +25/10/2020 02:06:12;U807.LC2_PV.F_CV;39.219333649;100.0 +25/10/2020 02:06:17;U807.LC2_PV.F_CV;39.219333649;100.0 +25/10/2020 02:06:18;U807.LC2_PV.F_CV;38.563526154;100.0 +25/10/2020 02:06:23;U807.LC2_PV.F_CV;38.563526154;100.0 +25/10/2020 02:06:24;U807.LC2_PV.F_CV;39.213085175;100.0 +25/10/2020 02:06:29;U807.LC2_PV.F_CV;39.213085175;100.0 +25/10/2020 02:06:30;U807.LC2_PV.F_CV;38.213466644;100.0 +25/10/2020 02:06:35;U807.LC2_PV.F_CV;38.213466644;100.0 +25/10/2020 02:06:36;U807.LC2_PV.F_CV;39.216423035;100.0 +25/10/2020 02:06:48;U807.LC2_PV.F_CV;39.216423035;100.0 +25/10/2020 02:06:49;U807.LC2_PV.F_CV;38.917804718;100.0 +25/10/2020 02:06:53;U807.LC2_PV.F_CV;38.917804718;100.0 +25/10/2020 02:06:54;U807.LC2_PV.F_CV;39.593650818;100.0 +25/10/2020 02:06:59;U807.LC2_PV.F_CV;39.593650818;100.0 +25/10/2020 02:06:00;U807.LC2B.F_CV;40.881530762;100.0 +25/10/2020 02:06:06;U807.LC2B.F_CV;40.881530762;100.0 +25/10/2020 02:06:07;U807.LC2B.F_CV;40.218456268;100.0 +25/10/2020 02:06:11;U807.LC2B.F_CV;40.218456268;100.0 +25/10/2020 02:06:12;U807.LC2B.F_CV;39.219333649;100.0 +25/10/2020 02:06:17;U807.LC2B.F_CV;39.219333649;100.0 +25/10/2020 02:06:18;U807.LC2B.F_CV;38.563526154;100.0 +25/10/2020 02:06:23;U807.LC2B.F_CV;38.563526154;100.0 +25/10/2020 02:06:24;U807.LC2B.F_CV;39.213085175;100.0 +25/10/2020 02:06:29;U807.LC2B.F_CV;39.213085175;100.0 +25/10/2020 02:06:30;U807.LC2B.F_CV;38.213466644;100.0 +25/10/2020 02:06:35;U807.LC2B.F_CV;38.213466644;100.0 +25/10/2020 02:06:36;U807.LC2B.F_CV;39.216423035;100.0 +25/10/2020 02:06:48;U807.LC2B.F_CV;39.216423035;100.0 +25/10/2020 02:06:49;U807.LC2B.F_CV;38.917804718;100.0 +25/10/2020 02:06:53;U807.LC2B.F_CV;38.917804718;100.0 +25/10/2020 02:06:54;U807.LC2B.F_CV;39.593650818;100.0 +25/10/2020 02:06:59;U807.LC2B.F_CV;39.593650818;100.0 +25/10/2020 02:06:02;U807.LI2.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U807.LI2B.F_CV;40.881530762;100.0 +25/10/2020 02:06:06;U807.LI2B.F_CV;40.881530762;100.0 +25/10/2020 02:06:07;U807.LI2B.F_CV;40.221363068;100.0 +25/10/2020 02:06:11;U807.LI2B.F_CV;40.221363068;100.0 +25/10/2020 02:06:12;U807.LI2B.F_CV;39.219333649;100.0 +25/10/2020 02:06:17;U807.LI2B.F_CV;39.219333649;100.0 +25/10/2020 02:06:18;U807.LI2B.F_CV;38.563526154;100.0 +25/10/2020 02:06:23;U807.LI2B.F_CV;38.563526154;100.0 +25/10/2020 02:06:24;U807.LI2B.F_CV;39.213085175;100.0 +25/10/2020 02:06:29;U807.LI2B.F_CV;39.213085175;100.0 +25/10/2020 02:06:30;U807.LI2B.F_CV;38.213466644;100.0 +25/10/2020 02:06:35;U807.LI2B.F_CV;38.213466644;100.0 +25/10/2020 02:06:36;U807.LI2B.F_CV;39.216423035;100.0 +25/10/2020 02:06:48;U807.LI2B.F_CV;39.216423035;100.0 +25/10/2020 02:06:49;U807.LI2B.F_CV;38.917804718;100.0 +25/10/2020 02:06:53;U807.LI2B.F_CV;38.917804718;100.0 +25/10/2020 02:06:54;U807.LI2B.F_CV;39.558322906;100.0 +25/10/2020 02:06:59;U807.LI2B.F_CV;39.558322906;100.0 +25/10/2020 02:06:42;U807.LI6.F_CV;41.044071198;100.0 +25/10/2020 02:06:00;U807.PC3_OP.F_CV;54.588459015;100.0 +25/10/2020 02:06:07;U807.PC3_OP.F_CV;54.759361267;100.0 +25/10/2020 02:06:11;U807.PC3_OP.F_CV;54.759361267;100.0 +25/10/2020 02:06:12;U807.PC3_OP.F_CV;53.245643616;100.0 +25/10/2020 02:06:23;U807.PC3_OP.F_CV;53.172397614;100.0 +25/10/2020 02:06:24;U807.PC3_OP.F_CV;54.026916504;100.0 +25/10/2020 02:06:41;U807.PC3_OP.F_CV;54.026916504;100.0 +25/10/2020 02:06:42;U807.PC3_OP.F_CV;54.734947205;100.0 +25/10/2020 02:06:48;U807.PC3_OP.F_CV;54.734947205;100.0 +25/10/2020 02:06:49;U807.PC3_OP.F_CV;53.196815491;100.0 +25/10/2020 02:06:53;U807.PC3_OP.F_CV;53.196815491;100.0 +25/10/2020 02:06:54;U807.PC3_OP.F_CV;53.416545868;100.0 +25/10/2020 02:06:51;U807.PC3_PV.F_CV;3.995065451;100.0 +25/10/2020 02:06:51;U807.PC3B.F_CV;3.995065451;100.0 +25/10/2020 02:06:06;U807.PDI15.F_CV;12.271506310;100.0 +25/10/2020 02:06:48;U807.PI0.F_CV;1039.506835938;100.0 +25/10/2020 02:06:56;U807.PI108.F_CV;0.036160946;100.0 +25/10/2020 02:06:51;U807.PI3.F_CV;3.995065451;100.0 +25/10/2020 02:06:41;U807.PI5.F_CV;4.034013748;100.0 +25/10/2020 02:06:00;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U807.SDC_ALRM.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U807.TC21_OP.F_CV;16.281623840;100.0 +25/10/2020 02:06:06;U807.TC21_OP.F_CV;16.281623840;100.0 +25/10/2020 02:06:07;U807.TC21_OP.F_CV;16.672262192;100.0 +25/10/2020 02:06:17;U807.TC21_OP.F_CV;16.672262192;100.0 +25/10/2020 02:06:18;U807.TC21_OP.F_CV;16.232795715;100.0 +25/10/2020 02:06:23;U807.TC21_OP.F_CV;16.232795715;100.0 +25/10/2020 02:06:24;U807.TC21_OP.F_CV;16.452528000;100.0 +25/10/2020 02:06:36;U807.TC21_OP.F_CV;16.257209778;100.0 +25/10/2020 02:06:48;U807.TC21_OP.F_CV;16.257209778;100.0 +25/10/2020 02:06:49;U807.TC21_OP.F_CV;16.476943970;100.0 +25/10/2020 02:06:53;U807.TC21_OP.F_CV;16.476943970;100.0 +25/10/2020 02:06:54;U807.TC21_OP.F_CV;16.769920349;100.0 +25/10/2020 02:06:06;U807.TC21_PV.F_CV;93.997413635;100.0 +25/10/2020 02:06:24;U807.TC3_OP.F_CV;28.342538834;100.0 +25/10/2020 02:06:30;U807.TC3_OP.F_CV;28.415784836;100.0 +25/10/2020 02:06:48;U807.TC3_OP.F_CV;28.415784836;100.0 +25/10/2020 02:06:49;U807.TC3_OP.F_CV;28.659933090;100.0 +25/10/2020 02:06:59;U807.TC3_OP.F_CV;28.733177185;100.0 +25/10/2020 02:06:50;U807.TC3_PV.F_CV;483.309204102;100.0 +25/10/2020 02:06:00;U807.TC4_OP.F_CV;32.053588867;100.0 +25/10/2020 02:06:17;U807.TC4_OP.F_CV;32.053588867;100.0 +25/10/2020 02:06:18;U807.TC4_OP.F_CV;31.565294266;100.0 +25/10/2020 02:06:24;U807.TC4_OP.F_CV;31.760612488;100.0 +25/10/2020 02:06:29;U807.TC4_OP.F_CV;31.760612488;100.0 +25/10/2020 02:06:30;U807.TC4_OP.F_CV;31.199071884;100.0 +25/10/2020 02:06:35;U807.TC4_OP.F_CV;31.199071884;100.0 +25/10/2020 02:06:36;U807.TC4_OP.F_CV;31.614124298;100.0 +25/10/2020 02:06:48;U807.TC4_OP.F_CV;31.614124298;100.0 +25/10/2020 02:06:49;U807.TC4_OP.F_CV;32.566303253;100.0 +25/10/2020 02:06:59;U807.TC4_OP.F_CV;32.566303253;100.0 +25/10/2020 02:06:43;U807.TC4_PV.F_CV;493.471496582;100.0 +25/10/2020 02:06:00;U807.TC5_OP.F_CV;31.785028458;100.0 +25/10/2020 02:06:06;U807.TC5_OP.F_CV;31.785028458;100.0 +25/10/2020 02:06:07;U807.TC5_OP.F_CV;32.004760742;100.0 +25/10/2020 02:06:17;U807.TC5_OP.F_CV;32.004760742;100.0 +25/10/2020 02:06:18;U807.TC5_OP.F_CV;32.370983124;100.0 +25/10/2020 02:06:23;U807.TC5_OP.F_CV;32.370983124;100.0 +25/10/2020 02:06:24;U807.TC5_OP.F_CV;32.029174805;100.0 +25/10/2020 02:06:29;U807.TC5_OP.F_CV;32.029174805;100.0 +25/10/2020 02:06:30;U807.TC5_OP.F_CV;30.759605408;100.0 +25/10/2020 02:06:35;U807.TC5_OP.F_CV;30.759605408;100.0 +25/10/2020 02:06:36;U807.TC5_OP.F_CV;31.687368393;100.0 +25/10/2020 02:06:48;U807.TC5_OP.F_CV;31.687368393;100.0 +25/10/2020 02:06:49;U807.TC5_OP.F_CV;32.200080872;100.0 +25/10/2020 02:06:53;U807.TC5_OP.F_CV;32.200080872;100.0 +25/10/2020 02:06:54;U807.TC5_OP.F_CV;32.615131378;100.0 +25/10/2020 02:06:59;U807.TC5_OP.F_CV;32.615131378;100.0 +25/10/2020 02:06:06;U807.TC5_PV.F_CV;493.761596680;100.0 +25/10/2020 02:06:00;U807.TC6_OP.F_CV;30.100406647;100.0 +25/10/2020 02:06:07;U807.TC6_OP.F_CV;29.953916550;100.0 +25/10/2020 02:06:18;U807.TC6_OP.F_CV;30.149234772;100.0 +25/10/2020 02:06:29;U807.TC6_OP.F_CV;30.149234772;100.0 +25/10/2020 02:06:30;U807.TC6_OP.F_CV;29.050569534;100.0 +25/10/2020 02:06:35;U807.TC6_OP.F_CV;29.050569534;100.0 +25/10/2020 02:06:36;U807.TC6_OP.F_CV;29.319131851;100.0 +25/10/2020 02:06:48;U807.TC6_OP.F_CV;29.319131851;100.0 +25/10/2020 02:06:49;U807.TC6_OP.F_CV;30.149234772;100.0 +25/10/2020 02:06:53;U807.TC6_OP.F_CV;30.149234772;100.0 +25/10/2020 02:06:54;U807.TC6_OP.F_CV;30.832849503;100.0 +25/10/2020 02:06:59;U807.TC6_OP.F_CV;30.832849503;100.0 +25/10/2020 02:06:06;U807.TC6_PV.F_CV;493.545623779;100.0 +25/10/2020 02:06:00;U807.TC7_OP.F_CV;49.143955231;100.0 +25/10/2020 02:06:06;U807.TC7_OP.F_CV;49.143955231;100.0 +25/10/2020 02:06:07;U807.TC7_OP.F_CV;49.705497742;100.0 +25/10/2020 02:06:17;U807.TC7_OP.F_CV;49.705497742;100.0 +25/10/2020 02:06:18;U807.TC7_OP.F_CV;50.364696503;100.0 +25/10/2020 02:06:29;U807.TC7_OP.F_CV;50.364696503;100.0 +25/10/2020 02:06:30;U807.TC7_OP.F_CV;49.705497742;100.0 +25/10/2020 02:06:35;U807.TC7_OP.F_CV;49.705497742;100.0 +25/10/2020 02:06:36;U807.TC7_OP.F_CV;48.655658722;100.0 +25/10/2020 02:06:48;U807.TC7_OP.F_CV;48.655658722;100.0 +25/10/2020 02:06:49;U807.TC7_OP.F_CV;49.143955231;100.0 +25/10/2020 02:06:53;U807.TC7_OP.F_CV;49.143955231;100.0 +25/10/2020 02:06:54;U807.TC7_OP.F_CV;50.022888184;100.0 +25/10/2020 02:06:59;U807.TC7_OP.F_CV;50.022888184;100.0 +25/10/2020 02:06:30;U807.TC7_PV.F_CV;493.214996338;100.0 +25/10/2020 02:06:00;U807.TC8_OP.F_CV;28.122806549;100.0 +25/10/2020 02:06:18;U807.TC8_OP.F_CV;28.318124771;100.0 +25/10/2020 02:06:29;U807.TC8_OP.F_CV;28.244880676;100.0 +25/10/2020 02:06:30;U807.TC8_OP.F_CV;28.489028931;100.0 +25/10/2020 02:06:36;U807.TC8_OP.F_CV;28.684347153;100.0 +25/10/2020 02:06:53;U807.TC8_OP.F_CV;28.855251312;100.0 +25/10/2020 02:06:54;U807.TC8_OP.F_CV;28.269294739;100.0 +25/10/2020 02:06:59;U807.TC8_OP.F_CV;28.269294739;100.0 +25/10/2020 02:06:44;U807.TC8_PV.F_CV;493.366577148;100.0 +25/10/2020 02:06:56;U807.TI10.F_CV;20.137693405;100.0 +25/10/2020 02:06:24;U807.TI113.F_CV;486.785919189;100.0 +25/10/2020 02:06:37;U807.TI114.F_CV;505.827056885;100.0 +25/10/2020 02:06:49;U807.TI115.F_CV;511.033813477;100.0 +25/10/2020 02:06:19;U807.TI116.F_CV;515.530517578;100.0 +25/10/2020 02:06:18;U807.TI117.F_CV;531.688598633;100.0 +25/10/2020 02:06:19;U807.TI118.F_CV;497.909393311;100.0 +25/10/2020 02:06:50;U807.TI13.F_CV;495.306060791;100.0 +25/10/2020 02:06:08;U807.TI14.F_CV;506.773742676;100.0 +25/10/2020 02:06:41;U807.TI15.F_CV;512.131103516;100.0 +25/10/2020 02:06:41;U807.TI16.F_CV;518.305969238;100.0 +25/10/2020 02:06:41;U807.TI17.F_CV;535.174072266;100.0 +25/10/2020 02:06:14;U807.TI18.F_CV;493.886016846;100.0 +25/10/2020 02:06:06;U807.TI21.F_CV;93.997413635;100.0 +25/10/2020 02:06:56;U807.TI212.F_CV;23.838209152;100.0 +25/10/2020 02:06:56;U807.TI214.F_CV;24.203958511;100.0 +25/10/2020 02:06:41;U807.TI22.F_CV;19.363166809;100.0 +25/10/2020 02:06:52;U807.TI23.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;U807.TI24.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;U807.TI25.F_CV;23.062028885;100.0 +25/10/2020 02:06:52;U807.TI26.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;U807.TI27.F_CV;0.000000000;0.0 +25/10/2020 02:06:41;U807.TI28.F_CV;26.396556854;100.0 +25/10/2020 02:06:50;U807.TI3.F_CV;483.309204102;100.0 +25/10/2020 02:06:43;U807.TI4.F_CV;493.471496582;100.0 +25/10/2020 02:06:06;U807.TI5.F_CV;493.761596680;100.0 +25/10/2020 02:06:41;U807.TI50.F_CV;19.104990005;100.0 +25/10/2020 02:06:06;U807.TI6.F_CV;493.545623779;100.0 +25/10/2020 02:06:30;U807.TI7.F_CV;493.214996338;100.0 +25/10/2020 02:06:44;U807.TI8.F_CV;493.366577148;100.0 +25/10/2020 02:06:56;U807.U807_COEF_A_TI03.F_CV;0.983299971;100.0 +25/10/2020 02:06:56;U807.U807_COEF_A_TI04.F_CV;0.990599990;100.0 +25/10/2020 02:06:56;U807.U807_COEF_A_TI05.F_CV;0.988499999;100.0 +25/10/2020 02:06:56;U807.U807_COEF_A_TI06.F_CV;0.989799976;100.0 +25/10/2020 02:06:56;U807.U807_COEF_A_TI07.F_CV;0.989000022;100.0 +25/10/2020 02:06:56;U807.U807_COEF_A_TI08.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U807.U807_COEF_B_TI03.F_CV;3.961800098;100.0 +25/10/2020 02:06:56;U807.U807_COEF_B_TI04.F_CV;0.340700001;100.0 +25/10/2020 02:06:56;U807.U807_COEF_B_TI05.F_CV;1.404700041;100.0 +25/10/2020 02:06:56;U807.U807_COEF_B_TI06.F_CV;0.299100012;100.0 +25/10/2020 02:06:56;U807.U807_COEF_B_TI07.F_CV;0.870299995;100.0 +25/10/2020 02:06:56;U807.U807_COEF_B_TI08.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U807.WI1.F_CV;150.300003052;100.0 +25/10/2020 02:06:06;U807.WI1.F_CV;150.300003052;100.0 +25/10/2020 02:06:07;U807.WI1.F_CV;150.600006104;100.0 +25/10/2020 02:06:11;U807.WI1.F_CV;150.600006104;100.0 +25/10/2020 02:06:12;U807.WI1.F_CV;150.899993896;100.0 +25/10/2020 02:06:17;U807.WI1.F_CV;150.899993896;100.0 +25/10/2020 02:06:18;U807.WI1.F_CV;151.199996948;100.0 +25/10/2020 02:06:23;U807.WI1.F_CV;151.199996948;100.0 +25/10/2020 02:06:24;U807.WI1.F_CV;151.600006104;100.0 +25/10/2020 02:06:29;U807.WI1.F_CV;151.600006104;100.0 +25/10/2020 02:06:30;U807.WI1.F_CV;151.899993896;100.0 +25/10/2020 02:06:35;U807.WI1.F_CV;151.899993896;100.0 +25/10/2020 02:06:36;U807.WI1.F_CV;152.199996948;100.0 +25/10/2020 02:06:41;U807.WI1.F_CV;152.199996948;100.0 +25/10/2020 02:06:42;U807.WI1.F_CV;152.600006104;100.0 +25/10/2020 02:06:48;U807.WI1.F_CV;152.600006104;100.0 +25/10/2020 02:06:49;U807.WI1.F_CV;153.000000000;100.0 +25/10/2020 02:06:53;U807.WI1.F_CV;153.000000000;100.0 +25/10/2020 02:06:54;U807.WI1.F_CV;153.300003052;100.0 +25/10/2020 02:06:59;U807.WI1.F_CV;153.300003052;100.0 +25/10/2020 02:06:25;U807.WI1FB.F_CV;600.100036621;100.0 +25/10/2020 02:06:36;U807.WI2.F_CV;69.400001526;100.0 +25/10/2020 02:06:25;U807.WI2FB.F_CV;522.200012207;100.0 +25/10/2020 02:06:03;U808.AI1.F_CV;0.700061619;100.0 +25/10/2020 02:06:03;U808.AI10.F_CV;0.815203786;100.0 +25/10/2020 02:06:58;U808.AI2.F_CV;0.000000000;0.0 +25/10/2020 02:06:03;U808.AI3.F_CV;9999.000000000;100.0 +25/10/2020 02:06:03;U808.AI4.F_CV;9999.000000000;100.0 +25/10/2020 02:06:09;U808.AI5.F_CV;3.255444765;100.0 +25/10/2020 02:06:03;U808.AI6.F_CV;2.489367247;100.0 +25/10/2020 02:06:15;U808.AI7.F_CV;10.397333145;100.0 +25/10/2020 02:06:18;U808.BILAN.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U808.COEF_K.F_CV;4.000000000;100.0 +25/10/2020 02:06:29;U808.DESACT.F_CV;3.000000000;100.0 +25/10/2020 02:06:40;U808.FC10_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U808.FC10_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U808.FC11_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:33;U808.FC11_PV.F_CV;9999.000000000;100.0 +25/10/2020 02:06:28;U808.FC15_OP.F_CV;87.157814026;100.0 +25/10/2020 02:06:16;U808.FC15_PV.F_CV;53.137683868;100.0 +25/10/2020 02:06:16;U808.FC15B.F_CV;53.137683868;100.0 +25/10/2020 02:06:28;U808.FI10.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U808.FI11.F_CV;9999.000000000;100.0 +25/10/2020 02:06:10;U808.FI12.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U808.FI14.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U808.FI16.F_CV;5.400130749;100.0 +25/10/2020 02:06:09;U808.FI20.F_CV;-0.000486821;100.0 +25/10/2020 02:06:46;U808.FQ12.F_CV;48522.031250000;100.0 +25/10/2020 02:06:03;U808.FQ12BIL.F_CV;231.069992065;100.0 +25/10/2020 02:06:34;U808.FQ14.F_CV;2486.914062500;100.0 +25/10/2020 02:06:03;U808.FQ14BIL.F_CV;20.920000076;100.0 +25/10/2020 02:06:27;U808.LC2_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U808.LC2_PV.F_CV;100.000000000;100.0 +25/10/2020 02:06:10;U808.LC2B.F_CV;100.000000000;100.0 +25/10/2020 02:06:04;U808.LI2.F_CV;25.180255890;100.0 +25/10/2020 02:06:10;U808.LI2B.F_CV;100.000000000;100.0 +25/10/2020 02:06:46;U808.LI6.F_CV;39.929897308;100.0 +25/10/2020 02:06:52;U808.PC3_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U808.PC3_PV.F_CV;2.216661692;100.0 +25/10/2020 02:06:04;U808.PC3B.F_CV;2.216661692;100.0 +25/10/2020 02:06:16;U808.PDI15.F_CV;15.002665520;100.0 +25/10/2020 02:06:28;U808.PDI15.F_CV;14.068358421;100.0 +25/10/2020 02:06:46;U808.PDI15.F_CV;14.722478867;100.0 +25/10/2020 02:06:52;U808.PDI15.F_CV;14.198282242;100.0 +25/10/2020 02:06:58;U808.PDI15.F_CV;14.737932205;100.0 +25/10/2020 02:06:46;U808.PI0.F_CV;1040.010986328;100.0 +25/10/2020 02:06:03;U808.PI108.F_CV;-10.000000000;100.0 +25/10/2020 02:06:37;U808.PI3.F_CV;2.220296860;100.0 +25/10/2020 02:06:10;U808.PI5.F_CV;2.590193033;100.0 +25/10/2020 02:06:58;U808.TC21_OP.F_CV;10.000000000;100.0 +25/10/2020 02:06:39;U808.TC21_PV.F_CV;22.461271286;100.0 +25/10/2020 02:06:27;U808.TC3_OP.F_CV;25.000000000;100.0 +25/10/2020 02:06:58;U808.TC3_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:27;U808.TC4_OP.F_CV;30.000000000;100.0 +25/10/2020 02:06:58;U808.TC4_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:27;U808.TC5_OP.F_CV;35.000000000;100.0 +25/10/2020 02:06:52;U808.TC5_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:33;U808.TC6_OP.F_CV;30.000000000;100.0 +25/10/2020 02:06:46;U808.TC6_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:33;U808.TC7_OP.F_CV;30.000000000;100.0 +25/10/2020 02:06:46;U808.TC7_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:33;U808.TC8_OP.F_CV;25.000000000;100.0 +25/10/2020 02:06:58;U808.TC8_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:15;U808.TI10.F_CV;9.896729469;100.0 +25/10/2020 02:06:28;U808.TI113.F_CV;21.214185715;100.0 +25/10/2020 02:06:16;U808.TI114.F_CV;21.300247192;100.0 +25/10/2020 02:06:18;U808.TI115.F_CV;0.000000000;0.0 +25/10/2020 02:06:58;U808.TI116.F_CV;21.364791870;100.0 +25/10/2020 02:06:16;U808.TI117.F_CV;21.536914825;100.0 +25/10/2020 02:06:22;U808.TI118.F_CV;21.536914825;100.0 +25/10/2020 02:06:10;U808.TI13.F_CV;22.010253906;100.0 +25/10/2020 02:06:40;U808.TI14.F_CV;22.074802399;100.0 +25/10/2020 02:06:58;U808.TI15.F_CV;21.924192429;100.0 +25/10/2020 02:06:10;U808.TI16.F_CV;22.010253906;100.0 +25/10/2020 02:06:58;U808.TI17.F_CV;22.182378769;100.0 +25/10/2020 02:06:34;U808.TI18.F_CV;22.419048309;100.0 +25/10/2020 02:06:39;U808.TI21.F_CV;22.461271286;100.0 +25/10/2020 02:06:03;U808.TI212.F_CV;23.085197449;100.0 +25/10/2020 02:06:03;U808.TI214.F_CV;23.042167664;100.0 +25/10/2020 02:06:45;U808.TI22.F_CV;20.245265961;100.0 +25/10/2020 02:06:58;U808.TI23.F_CV;0.000000000;0.0 +25/10/2020 02:06:58;U808.TI24.F_CV;0.000000000;0.0 +25/10/2020 02:06:58;U808.TI25.F_CV;24.051631927;100.0 +25/10/2020 02:06:58;U808.TI26.F_CV;0.000000000;0.0 +25/10/2020 02:06:58;U808.TI27.F_CV;0.000000000;0.0 +25/10/2020 02:06:40;U808.TI28.F_CV;25.923269272;100.0 +25/10/2020 02:06:58;U808.TI3.F_CV;600.000000000;100.0 +25/10/2020 02:06:58;U808.TI4.F_CV;600.000000000;100.0 +25/10/2020 02:06:52;U808.TI5.F_CV;600.000000000;100.0 +25/10/2020 02:06:10;U808.TI50.F_CV;21.277969360;100.0 +25/10/2020 02:06:46;U808.TI6.F_CV;600.000000000;100.0 +25/10/2020 02:06:46;U808.TI7.F_CV;600.000000000;100.0 +25/10/2020 02:06:58;U808.TI8.F_CV;600.000000000;100.0 +25/10/2020 02:06:58;U808.TPS_RATTR.F_CV;12.000000000;100.0 +25/10/2020 02:06:58;U808.U808_COEF_A_TI03.F_CV;0.997900069;100.0 +25/10/2020 02:06:58;U808.U808_COEF_A_TI04.F_CV;0.991400063;100.0 +25/10/2020 02:06:58;U808.U808_COEF_A_TI05.F_CV;0.991800070;100.0 +25/10/2020 02:06:58;U808.U808_COEF_A_TI06.F_CV;0.992200077;100.0 +25/10/2020 02:06:58;U808.U808_COEF_A_TI07.F_CV;0.992600083;100.0 +25/10/2020 02:06:58;U808.U808_COEF_A_TI08.F_CV;0.990200043;100.0 +25/10/2020 02:06:58;U808.U808_COEF_B_TI03.F_CV;0.868100047;100.0 +25/10/2020 02:06:58;U808.U808_COEF_B_TI04.F_CV;2.414900064;100.0 +25/10/2020 02:06:58;U808.U808_COEF_B_TI05.F_CV;0.950500071;100.0 +25/10/2020 02:06:58;U808.U808_COEF_B_TI06.F_CV;0.697500050;100.0 +25/10/2020 02:06:58;U808.U808_COEF_B_TI07.F_CV;0.249400020;100.0 +25/10/2020 02:06:58;U808.U808_COEF_B_TI08.F_CV;1.666100025;100.0 +25/10/2020 02:06:22;U808.WI1.F_CV;834.700012207;100.0 +25/10/2020 02:06:03;U808.WI1FB.F_CV;600.099975586;100.0 +25/10/2020 02:06:09;U808.WI2.F_CV;933.000000000;100.0 +25/10/2020 02:06:10;U808.WI2.F_CV;932.900024414;100.0 +25/10/2020 02:06:45;U808.WI2.F_CV;932.900024414;100.0 +25/10/2020 02:06:46;U808.WI2.F_CV;933.000000000;100.0 +25/10/2020 02:06:51;U808.WI2.F_CV;933.000000000;100.0 +25/10/2020 02:06:52;U808.WI2.F_CV;932.900024414;100.0 +25/10/2020 02:06:03;U808.WI2FB.F_CV;503.900024414;100.0 +25/10/2020 02:06:47;U810.AI1.F_CV;0.700086653;100.0 +25/10/2020 02:06:47;U810.AI2.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;U810.AI3.F_CV;9999.000000000;100.0 +25/10/2020 02:06:47;U810.AI4.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;U810.BILAN.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U810.FC10_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U810.FC10_PV.F_CV;92.228904724;100.0 +25/10/2020 02:06:47;U810.FC11_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:04;U810.FC11_PV.F_CV;9999.000000000;100.0 +25/10/2020 02:06:47;U810.FC15_OP.F_CV;68.651390076;100.0 +25/10/2020 02:06:47;U810.FC15_PV.F_CV;48.344753265;100.0 +25/10/2020 02:06:47;U810.FC15B.F_CV;48.344753265;100.0 +25/10/2020 02:06:47;U810.FI10.F_CV;92.228904724;100.0 +25/10/2020 02:06:47;U810.FI11.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;U810.FI12.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U810.FI14.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U810.FI16.F_CV;999.900024414;100.0 +25/10/2020 02:06:47;U810.FI20.F_CV;0.003476143;100.0 +25/10/2020 02:06:47;U810.FQ12.F_CV;9380.754882813;100.0 +25/10/2020 02:06:47;U810.FQ12BIL.F_CV;21.927997589;100.0 +25/10/2020 02:06:47;U810.FQ14.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U810.FQ14BIL.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U810.LC2_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U810.LC2_PV.F_CV;4.121437550;100.0 +25/10/2020 02:06:40;U810.LC2_PV.F_CV;3.939402103;100.0 +25/10/2020 02:06:46;U810.LC2_PV.F_CV;4.135224342;100.0 +25/10/2020 02:06:34;U810.LC2B.F_CV;4.121437550;100.0 +25/10/2020 02:06:40;U810.LC2B.F_CV;3.939402103;100.0 +25/10/2020 02:06:46;U810.LC2B.F_CV;4.135224342;100.0 +25/10/2020 02:06:47;U810.LI2.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U810.LI2B.F_CV;4.052150249;100.0 +25/10/2020 02:06:10;U810.LI2B.F_CV;4.130366325;100.0 +25/10/2020 02:06:40;U810.LI2B.F_CV;3.939402103;100.0 +25/10/2020 02:06:46;U810.LI2B.F_CV;4.135224342;100.0 +25/10/2020 02:06:46;U810.LI6.F_CV;44.628192902;100.0 +25/10/2020 02:06:47;U810.PC3_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:47;U810.PC3_PV.F_CV;2.277347803;100.0 +25/10/2020 02:06:47;U810.PC3B.F_CV;2.277347803;100.0 +25/10/2020 02:06:46;U810.PDI15.F_CV;13.084749222;100.0 +25/10/2020 02:06:58;U810.PDI15M.F_CV;13.220736504;100.0 +25/10/2020 02:06:47;U810.PI0.F_CV;1040.077026367;100.0 +25/10/2020 02:06:47;U810.PI3.F_CV;2.278361082;100.0 +25/10/2020 02:06:47;U810.PI5.F_CV;0.133567750;100.0 +25/10/2020 02:06:47;U810.TC21_OP.F_CV;14.000000000;100.0 +25/10/2020 02:06:47;U810.TC21_PV.F_CV;22.568845749;100.0 +25/10/2020 02:06:22;U810.TC2_PV.F_CV;20.138414383;100.0 +25/10/2020 02:06:47;U810.TC3_OP.F_CV;20.000000000;100.0 +25/10/2020 02:06:47;U810.TC3_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:47;U810.TC4_OP.F_CV;13.000000000;100.0 +25/10/2020 02:06:47;U810.TC4_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:18;U810.TC51_PV.F_CV;19.105674744;100.0 +25/10/2020 02:06:47;U810.TC5_OP.F_CV;16.000000000;100.0 +25/10/2020 02:06:47;U810.TC5_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:47;U810.TC6_OP.F_CV;16.000000000;100.0 +25/10/2020 02:06:47;U810.TC6_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:47;U810.TC7_OP.F_CV;15.000000000;100.0 +25/10/2020 02:06:47;U810.TC7_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:47;U810.TC8_OP.F_CV;30.000000000;100.0 +25/10/2020 02:06:47;U810.TC8_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:47;U810.TI10.F_CV;20.417383194;100.0 +25/10/2020 02:06:22;U810.TI112.F_CV;24.075733185;100.0 +25/10/2020 02:06:47;U810.TI113.F_CV;22.096317291;100.0 +25/10/2020 02:06:47;U810.TI114.F_CV;22.160861969;100.0 +25/10/2020 02:06:47;U810.TI115.F_CV;22.074802399;100.0 +25/10/2020 02:06:47;U810.TI116.F_CV;22.182378769;100.0 +25/10/2020 02:06:47;U810.TI117.F_CV;22.031770706;100.0 +25/10/2020 02:06:47;U810.TI118.F_CV;22.139347076;100.0 +25/10/2020 02:06:04;U810.TI12.F_CV;22.784809113;100.0 +25/10/2020 02:06:47;U810.TI13.F_CV;20.630916595;100.0 +25/10/2020 02:06:47;U810.TI14.F_CV;21.146074295;100.0 +25/10/2020 02:06:47;U810.TI15.F_CV;21.278306961;100.0 +25/10/2020 02:06:02;U810.TI151.F_CV;19.277797699;100.0 +25/10/2020 02:06:07;U810.TI151.F_CV;19.277797699;100.0 +25/10/2020 02:06:08;U810.TI151.F_CV;19.062644958;100.0 +25/10/2020 02:06:14;U810.TI151.F_CV;19.127189636;100.0 +25/10/2020 02:06:20;U810.TI151.F_CV;19.062644958;100.0 +25/10/2020 02:06:26;U810.TI151.F_CV;19.213253021;100.0 +25/10/2020 02:06:38;U810.TI151.F_CV;19.127189636;100.0 +25/10/2020 02:06:50;U810.TI151.F_CV;19.213253021;100.0 +25/10/2020 02:06:56;U810.TI151.F_CV;19.148706436;100.0 +25/10/2020 02:06:47;U810.TI16.F_CV;19.614213943;100.0 +25/10/2020 02:06:47;U810.TI17.F_CV;19.165838242;100.0 +25/10/2020 02:06:47;U810.TI18.F_CV;20.794937134;100.0 +25/10/2020 02:06:47;U810.TI21.F_CV;22.568845749;100.0 +25/10/2020 02:06:47;U810.TI212.F_CV;23.752151489;100.0 +25/10/2020 02:06:47;U810.TI214.F_CV;23.472461700;100.0 +25/10/2020 02:06:52;U810.TI22.F_CV;20.847675323;100.0 +25/10/2020 02:06:47;U810.TI23.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;U810.TI24.F_CV;0.000000000;0.0 +25/10/2020 02:06:40;U810.TI25.F_CV;24.309787750;100.0 +25/10/2020 02:06:47;U810.TI26.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;U810.TI27.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;U810.TI28.F_CV;27.601289749;100.0 +25/10/2020 02:06:47;U810.TI3.F_CV;600.000000000;100.0 +25/10/2020 02:06:47;U810.TI4.F_CV;600.000000000;100.0 +25/10/2020 02:06:47;U810.TI5.F_CV;600.000000000;100.0 +25/10/2020 02:06:27;U810.TI50.F_CV;21.708259583;100.0 +25/10/2020 02:06:28;U810.TI51.F_CV;19.170221329;100.0 +25/10/2020 02:06:34;U810.TI51.F_CV;19.105674744;100.0 +25/10/2020 02:06:52;U810.TI51.F_CV;19.170221329;100.0 +25/10/2020 02:06:58;U810.TI51.F_CV;19.105674744;100.0 +25/10/2020 02:06:47;U810.TI6.F_CV;600.000000000;100.0 +25/10/2020 02:06:47;U810.TI7.F_CV;600.000000000;100.0 +25/10/2020 02:06:47;U810.TI8.F_CV;600.000000000;100.0 +25/10/2020 02:06:47;U810.U810_COEF_A_FI10.F_CV;0.941100001;100.0 +25/10/2020 02:06:47;U810.U810_COEF_A_TI03.F_CV;0.995800018;100.0 +25/10/2020 02:06:47;U810.U810_COEF_A_TI04.F_CV;0.990999997;100.0 +25/10/2020 02:06:47;U810.U810_COEF_A_TI05.F_CV;0.993700027;100.0 +25/10/2020 02:06:47;U810.U810_COEF_A_TI06.F_CV;1.001099944;100.0 +25/10/2020 02:06:47;U810.U810_COEF_A_TI07.F_CV;1.001500010;100.0 +25/10/2020 02:06:47;U810.U810_COEF_A_TI08.F_CV;0.998199999;100.0 +25/10/2020 02:06:47;U810.U810_COEF_B_FI10.F_CV;0.074699998;100.0 +25/10/2020 02:06:47;U810.U810_COEF_B_TI03.F_CV;-1.087499976;100.0 +25/10/2020 02:06:47;U810.U810_COEF_B_TI04.F_CV;1.494899988;100.0 +25/10/2020 02:06:47;U810.U810_COEF_B_TI05.F_CV;0.310099989;100.0 +25/10/2020 02:06:47;U810.U810_COEF_B_TI06.F_CV;-1.430099964;100.0 +25/10/2020 02:06:47;U810.U810_COEF_B_TI07.F_CV;-1.761800051;100.0 +25/10/2020 02:06:47;U810.U810_COEF_B_TI08.F_CV;0.416299999;100.0 +25/10/2020 02:06:47;U810.VOLCHLORE.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U810.WI1.F_CV;1124.500000000;100.0 +25/10/2020 02:06:47;U810.WI1FB.F_CV;720.099975586;100.0 +25/10/2020 02:06:21;U810.WI2.F_CV;72.800003052;100.0 +25/10/2020 02:06:22;U810.WI2.F_CV;72.699996948;100.0 +25/10/2020 02:06:27;U810.WI2.F_CV;72.699996948;100.0 +25/10/2020 02:06:28;U810.WI2.F_CV;72.800003052;100.0 +25/10/2020 02:06:33;U810.WI2.F_CV;72.800003052;100.0 +25/10/2020 02:06:34;U810.WI2.F_CV;72.900001526;100.0 +25/10/2020 02:06:45;U810.WI2.F_CV;72.900001526;100.0 +25/10/2020 02:06:46;U810.WI2.F_CV;72.699996948;100.0 +25/10/2020 02:06:51;U810.WI2.F_CV;72.699996948;100.0 +25/10/2020 02:06:52;U810.WI2.F_CV;72.800003052;100.0 +25/10/2020 02:06:57;U810.WI2.F_CV;72.800003052;100.0 +25/10/2020 02:06:58;U810.WI2.F_CV;72.699996948;100.0 +25/10/2020 02:06:47;U810.WI2FB.F_CV;544.299987793;100.0 +25/10/2020 02:06:40;U810.WI3.F_CV;158.000000000;100.0 +25/10/2020 02:06:05;U82.FI_P100.F_CV;-0.000048828;100.0 +25/10/2020 02:06:05;U82.FI_P200.F_CV;-0.000048828;100.0 +25/10/2020 02:06:05;U82.FI_P300.F_CV;-0.000048828;100.0 +25/10/2020 02:06:05;U82.FI_P400.F_CV;-0.000048828;100.0 +25/10/2020 02:06:09;U82.FT111.F_CV;0.060000278;100.0 +25/10/2020 02:06:14;U82.FT121.F_CV;-0.190004870;100.0 +25/10/2020 02:06:12;U82.FT130.F_CV;0.056000277;100.0 +25/10/2020 02:06:13;U82.FT130.F_CV;0.123000279;100.0 +25/10/2020 02:06:15;U82.FT130.F_CV;0.034000278;100.0 +25/10/2020 02:06:16;U82.FT130.F_CV;0.073000282;100.0 +25/10/2020 02:06:18;U82.FT130.F_CV;0.000000275;100.0 +25/10/2020 02:06:19;U82.FT130.F_CV;0.141000286;100.0 +25/10/2020 02:06:21;U82.FT130.F_CV;0.000000275;100.0 +25/10/2020 02:06:24;U82.FT130.F_CV;0.071000278;100.0 +25/10/2020 02:06:27;U82.FT130.F_CV;0.000000275;100.0 +25/10/2020 02:06:35;U82.FT130.F_CV;0.137000278;100.0 +25/10/2020 02:06:37;U82.FT130.F_CV;0.000000275;100.0 +25/10/2020 02:06:41;U82.FT130.F_CV;0.076000281;100.0 +25/10/2020 02:06:44;U82.FT130.F_CV;0.000000275;100.0 +25/10/2020 02:06:52;U82.FT130.F_CV;0.118000284;100.0 +25/10/2020 02:06:55;U82.FT130.F_CV;0.000000275;100.0 +25/10/2020 02:06:56;U82.FT130.F_CV;0.079000279;100.0 +25/10/2020 02:06:57;U82.FT130.F_CV;0.017000275;100.0 +25/10/2020 02:06:58;U82.FT130.F_CV;0.095000282;100.0 +25/10/2020 02:06:20;U82.FT211.F_CV;0.020000275;100.0 +25/10/2020 02:06:21;U82.FT211.F_CV;-0.019999726;100.0 +25/10/2020 02:06:16;U82.FT221.F_CV;1.179995060;100.0 +25/10/2020 02:06:01;U82.FT230.F_CV;0.000000275;100.0 +25/10/2020 02:06:02;U82.FT230.F_CV;0.248000294;100.0 +25/10/2020 02:06:03;U82.FT230.F_CV;0.138000280;100.0 +25/10/2020 02:06:06;U82.FT230.F_CV;0.000000275;100.0 +25/10/2020 02:06:10;U82.FT230.F_CV;0.192000285;100.0 +25/10/2020 02:06:11;U82.FT230.F_CV;0.046000276;100.0 +25/10/2020 02:06:12;U82.FT230.F_CV;0.000000275;100.0 +25/10/2020 02:06:15;U82.FT230.F_CV;0.086000279;100.0 +25/10/2020 02:06:16;U82.FT230.F_CV;0.000000275;100.0 +25/10/2020 02:06:17;U82.FT230.F_CV;0.142000288;100.0 +25/10/2020 02:06:18;U82.FT230.F_CV;0.000000275;100.0 +25/10/2020 02:06:19;U82.FT230.F_CV;0.074000277;100.0 +25/10/2020 02:06:20;U82.FT230.F_CV;0.000000275;100.0 +25/10/2020 02:06:22;U82.FT230.F_CV;0.195000291;100.0 +25/10/2020 02:06:24;U82.FT230.F_CV;0.000000275;100.0 +25/10/2020 02:06:28;U82.FT230.F_CV;0.078000277;100.0 +25/10/2020 02:06:29;U82.FT230.F_CV;0.000000275;100.0 +25/10/2020 02:06:31;U82.FT230.F_CV;0.044000275;100.0 +25/10/2020 02:06:34;U82.FT230.F_CV;0.000000275;100.0 +25/10/2020 02:06:35;U82.FT230.F_CV;0.106000282;100.0 +25/10/2020 02:06:37;U82.FT230.F_CV;0.000000275;100.0 +25/10/2020 02:06:38;U82.FT230.F_CV;0.072000280;100.0 +25/10/2020 02:06:39;U82.FT230.F_CV;0.000000275;100.0 +25/10/2020 02:06:42;U82.FT230.F_CV;0.068000279;100.0 +25/10/2020 02:06:43;U82.FT230.F_CV;0.000000275;100.0 +25/10/2020 02:06:44;U82.FT230.F_CV;0.137000278;100.0 +25/10/2020 02:06:45;U82.FT230.F_CV;0.196000293;100.0 +25/10/2020 02:06:46;U82.FT230.F_CV;0.050000276;100.0 +25/10/2020 02:06:48;U82.FT230.F_CV;0.130000278;100.0 +25/10/2020 02:06:51;U82.FT230.F_CV;0.000000275;100.0 +25/10/2020 02:06:54;U82.FT230.F_CV;0.126000285;100.0 +25/10/2020 02:06:56;U82.FT230.F_CV;0.000000275;100.0 +25/10/2020 02:06:58;U82.FT230.F_CV;0.125000283;100.0 +25/10/2020 02:06:34;U82.FT311.F_CV;-0.063999727;100.0 +25/10/2020 02:06:47;U82.FT321.F_CV;5.439994812;100.0 +25/10/2020 02:06:17;U82.FT330.F_CV;0.037000276;100.0 +25/10/2020 02:06:21;U82.FT330.F_CV;0.002000275;100.0 +25/10/2020 02:06:58;U82.FT330.F_CV;0.036000278;100.0 +25/10/2020 02:06:57;U82.FT411.F_CV;0.002000275;100.0 +25/10/2020 02:06:36;U82.FT421.F_CV;-0.360004872;100.0 +25/10/2020 02:06:00;U82.FT430.F_CV;0.171000287;100.0 +25/10/2020 02:06:01;U82.FT430.F_CV;0.318000287;100.0 +25/10/2020 02:06:02;U82.FT430.F_CV;0.354000300;100.0 +25/10/2020 02:06:03;U82.FT430.F_CV;0.306000292;100.0 +25/10/2020 02:06:04;U82.FT430.F_CV;0.087000281;100.0 +25/10/2020 02:06:06;U82.FT430.F_CV;0.241000295;100.0 +25/10/2020 02:06:07;U82.FT430.F_CV;0.136000276;100.0 +25/10/2020 02:06:08;U82.FT430.F_CV;0.177000284;100.0 +25/10/2020 02:06:09;U82.FT430.F_CV;0.307000279;100.0 +25/10/2020 02:06:13;U82.FT430.F_CV;0.126000285;100.0 +25/10/2020 02:06:16;U82.FT430.F_CV;0.263000280;100.0 +25/10/2020 02:06:19;U82.FT430.F_CV;0.000000275;100.0 +25/10/2020 02:06:23;U82.FT430.F_CV;0.259000301;100.0 +25/10/2020 02:06:24;U82.FT430.F_CV;0.150000289;100.0 +25/10/2020 02:06:26;U82.FT430.F_CV;0.298000306;100.0 +25/10/2020 02:06:28;U82.FT430.F_CV;0.170000285;100.0 +25/10/2020 02:06:32;U82.FT430.F_CV;0.062000278;100.0 +25/10/2020 02:06:33;U82.FT430.F_CV;0.224000290;100.0 +25/10/2020 02:06:34;U82.FT430.F_CV;0.095000282;100.0 +25/10/2020 02:06:35;U82.FT430.F_CV;0.211000293;100.0 +25/10/2020 02:06:36;U82.FT430.F_CV;0.119000278;100.0 +25/10/2020 02:06:37;U82.FT430.F_CV;0.192000285;100.0 +25/10/2020 02:06:38;U82.FT430.F_CV;0.410000294;100.0 +25/10/2020 02:06:39;U82.FT430.F_CV;0.222000286;100.0 +25/10/2020 02:06:43;U82.FT430.F_CV;0.308000296;100.0 +25/10/2020 02:06:44;U82.FT430.F_CV;0.199000284;100.0 +25/10/2020 02:06:45;U82.FT430.F_CV;0.000000275;100.0 +25/10/2020 02:06:46;U82.FT430.F_CV;0.170000285;100.0 +25/10/2020 02:06:47;U82.FT430.F_CV;0.260000288;100.0 +25/10/2020 02:06:49;U82.FT430.F_CV;0.109000280;100.0 +25/10/2020 02:06:50;U82.FT430.F_CV;0.357000291;100.0 +25/10/2020 02:06:51;U82.FT430.F_CV;0.225000292;100.0 +25/10/2020 02:06:53;U82.FT430.F_CV;0.169000283;100.0 +25/10/2020 02:06:55;U82.FT430.F_CV;0.308000296;100.0 +25/10/2020 02:06:56;U82.FT430.F_CV;0.218000293;100.0 +25/10/2020 02:06:36;U82.LT61.F_CV;49.399951935;100.0 +25/10/2020 02:06:06;U82.LT71.F_CV;35.299949646;100.0 +25/10/2020 02:06:16;U82.MV71.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U82.OPTIC101.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U82.OPTIC102.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U82.OPTIC103.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U82.OPTIC108.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U82.OPTIC121.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U82.OPTIC201.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U82.OPTIC202.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U82.OPTIC203.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U82.OPTIC208.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U82.OPTIC221.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U82.OPTIC301.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U82.OPTIC302.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U82.OPTIC303.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U82.OPTIC308.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U82.OPTIC321.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U82.OPTIC401.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U82.OPTIC402.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U82.OPTIC403.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U82.OPTIC408.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U82.OPTIC421.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U82.OPTIC51.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U82.OPTIC53.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U82.OPTIC54.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U82.PI_P100.F_CV;-1.000000000;100.0 +25/10/2020 02:06:05;U82.PI_P200.F_CV;-13.000000000;100.0 +25/10/2020 02:06:05;U82.PI_P300.F_CV;-10.000000000;100.0 +25/10/2020 02:06:05;U82.PI_P400.F_CV;-2.000000000;100.0 +25/10/2020 02:06:47;U82.PT11.F_CV;67.999954224;100.0 +25/10/2020 02:06:09;U82.PT132.F_CV;-0.000048828;100.0 +25/10/2020 02:06:16;U82.PT21.F_CV;70.199951172;100.0 +25/10/2020 02:06:36;U82.PT232.F_CV;-0.000048828;100.0 +25/10/2020 02:06:55;U82.PT332.F_CV;-0.000048828;100.0 +25/10/2020 02:06:36;U82.PT432.F_CV;-0.000048828;100.0 +25/10/2020 02:06:47;U82.PT61.F_CV;-0.200048834;100.0 +25/10/2020 02:06:05;U82.PT71.F_CV;0.199951172;100.0 +25/10/2020 02:06:05;U82.TI100.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;U82.TI101.F_CV;18.999950409;100.0 +25/10/2020 02:06:55;U82.TI102.F_CV;23.999950409;100.0 +25/10/2020 02:06:16;U82.TI103.F_CV;18.999950409;100.0 +25/10/2020 02:06:05;U82.TI104.F_CV;999.899963379;100.0 +25/10/2020 02:06:05;U82.TI105.F_CV;999.899963379;100.0 +25/10/2020 02:06:05;U82.TI105_6.F_CV;999.899963379;100.0 +25/10/2020 02:06:05;U82.TI106.F_CV;999.899963379;100.0 +25/10/2020 02:06:47;U82.TI107.F_CV;999.899963379;100.0 +25/10/2020 02:06:19;U82.TI108.F_CV;23.699951172;100.0 +25/10/2020 02:06:21;U82.TI121.F_CV;23.199951172;100.0 +25/10/2020 02:06:09;U82.TI201.F_CV;18.599950790;100.0 +25/10/2020 02:06:05;U82.TI202.F_CV;23.599950790;100.0 +25/10/2020 02:06:47;U82.TI203.F_CV;18.499950409;100.0 +25/10/2020 02:06:47;U82.TI204.F_CV;999.899963379;100.0 +25/10/2020 02:06:47;U82.TI205.F_CV;999.899963379;100.0 +25/10/2020 02:06:47;U82.TI205_6.F_CV;999.899291992;100.0 +25/10/2020 02:06:47;U82.TI206.F_CV;999.899963379;100.0 +25/10/2020 02:06:47;U82.TI207.F_CV;999.899963379;100.0 +25/10/2020 02:06:47;U82.TI208.F_CV;23.099950790;100.0 +25/10/2020 02:06:47;U82.TI221.F_CV;23.199951172;100.0 +25/10/2020 02:06:47;U82.TI301.F_CV;19.099950790;100.0 +25/10/2020 02:06:05;U82.TI302.F_CV;24.199951172;100.0 +25/10/2020 02:06:27;U82.TI303.F_CV;19.099950790;100.0 +25/10/2020 02:06:09;U82.TI304.F_CV;999.899963379;100.0 +25/10/2020 02:06:25;U82.TI305.F_CV;999.899963379;100.0 +25/10/2020 02:06:09;U82.TI305_6.F_CV;999.899963379;100.0 +25/10/2020 02:06:09;U82.TI306.F_CV;999.899963379;100.0 +25/10/2020 02:06:17;U82.TI307.F_CV;999.899963379;100.0 +25/10/2020 02:06:47;U82.TI308.F_CV;23.699951172;100.0 +25/10/2020 02:06:16;U82.TI321.F_CV;24.599950790;100.0 +25/10/2020 02:06:20;U82.TI401.F_CV;18.699951172;100.0 +25/10/2020 02:06:55;U82.TI402.F_CV;23.799951553;100.0 +25/10/2020 02:06:25;U82.TI403.F_CV;13.699951172;100.0 +25/10/2020 02:06:29;U82.TI404.F_CV;999.899963379;100.0 +25/10/2020 02:06:16;U82.TI405.F_CV;999.899963379;100.0 +25/10/2020 02:06:27;U82.TI405_6.F_CV;999.899963379;100.0 +25/10/2020 02:06:27;U82.TI406.F_CV;999.899963379;100.0 +25/10/2020 02:06:16;U82.TI407.F_CV;999.899963379;100.0 +25/10/2020 02:06:05;U82.TI408.F_CV;23.099950790;100.0 +25/10/2020 02:06:05;U82.TI42.F_CV;999.899963379;100.0 +25/10/2020 02:06:47;U82.TI421.F_CV;23.399951935;100.0 +25/10/2020 02:06:01;U82.TI50.F_CV;24.099950790;100.0 +25/10/2020 02:06:46;U82.TI51.F_CV;23.399951935;100.0 +25/10/2020 02:06:46;U82.TI52.F_CV;23.399951935;100.0 +25/10/2020 02:06:52;U82.TI53.F_CV;23.199951172;100.0 +25/10/2020 02:06:16;U82.TI54.F_CV;23.299951553;100.0 +25/10/2020 02:06:00;U823.937TC5_OP.F_CV;3.663536072;100.0 +25/10/2020 02:06:19;U824.FC1_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.FC2_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.FC2_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.FC60_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.FC61_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.FC66_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.FI3.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.FQ65.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.FQ65TOT.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.LC61_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.LC64_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.LC69_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.LC70_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.LC71_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.LC72_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.LI1.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.PC62_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.PC62_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.PC73_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.PDI60.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.PDI67.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC101_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC11_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC13_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC1_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC1C_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC20_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC20_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC20E_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC20E_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC21_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC21_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC21E_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC21E_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC22_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC22_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC22E_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC22E_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC23_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC23_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC23E_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC23E_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC24_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC24_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC24E_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC24E_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC25_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC25_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC25E_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC25E_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC26_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC26_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC26E_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC26E_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC3_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC5_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC60_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC62_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC65_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC68_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC70_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC74_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC76_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC79_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC7_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC81_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC83_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC87_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC91_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC93_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TC9_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI10.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI102.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI103.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI104.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI105.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI106.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI110.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI111.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI114.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI119.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI12.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI14.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI15.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI2.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI20.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI21.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI22.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI23.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI24.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI25.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI26.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI2C_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI38.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI39.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI4.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI40.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI41.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI42.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI43.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI44.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI45.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI46.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI47.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI48.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI49.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI50.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI51.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI6.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI61.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI63.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI66.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI67.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI71.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI75.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI77.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI8.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI80.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI82.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI84.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI85.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI88.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI92.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TI94.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TIBAL2.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.TIBAL3.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.U824_COEF_A_TI20.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.U824_COEF_A_TI22.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.U824_COEF_A_TI23.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.U824_COEF_A_TI24.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.U824_COEF_A_TI25.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.U824_COEF_A_TI26.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.U824_COEF_B_TI22.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.U824_COEF_B_TI23.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.U824_COEF_B_TI24.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.U824_COEF_B_TI25.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.U824_COEF_B_TI26.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.WI1.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.WI60.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;U824.WI61.F_CV;0.000000000;0.0 +25/10/2020 02:06:05;U83.ACTIVE_CONS_P200.F_CV;0.000000275;100.0 +25/10/2020 02:06:05;U83.ACTIVE_CONS_P300.F_CV;0.000000275;100.0 +25/10/2020 02:06:18;U83.ACTIVE_CONS_P400.F_CV;0.005000275;100.0 +25/10/2020 02:06:05;U83.FI_P100.F_CV;-0.000048828;100.0 +25/10/2020 02:06:05;U83.FI_P200.F_CV;-0.000048828;100.0 +25/10/2020 02:06:05;U83.FI_P300.F_CV;-0.000048828;100.0 +25/10/2020 02:06:05;U83.FI_P400.F_CV;-0.000048828;100.0 +25/10/2020 02:06:05;U83.FT10.F_CV;0.049999237;100.0 +25/10/2020 02:06:26;U83.FT111.F_CV;3.879000425;100.0 +25/10/2020 02:06:10;U83.FT121.F_CV;9.689994812;100.0 +25/10/2020 02:06:28;U83.FT20.F_CV;0.049999237;100.0 +25/10/2020 02:06:25;U83.FT211.F_CV;3.902000427;100.0 +25/10/2020 02:06:26;U83.FT221.F_CV;9.839994431;100.0 +25/10/2020 02:06:51;U83.FT30.F_CV;0.049999237;100.0 +25/10/2020 02:06:14;U83.FT311.F_CV;3.872000456;100.0 +25/10/2020 02:06:13;U83.FT321.F_CV;9.669994354;100.0 +25/10/2020 02:06:05;U83.FT40.F_CV;0.049999237;100.0 +25/10/2020 02:06:02;U83.FT411.F_CV;3.885000467;100.0 +25/10/2020 02:06:05;U83.FT411.F_CV;3.961000443;100.0 +25/10/2020 02:06:06;U83.FT411.F_CV;3.884000540;100.0 +25/10/2020 02:06:15;U83.FT411.F_CV;3.922000408;100.0 +25/10/2020 02:06:23;U83.FT411.F_CV;3.885000467;100.0 +25/10/2020 02:06:29;U83.FT411.F_CV;3.923000574;100.0 +25/10/2020 02:06:30;U83.FT411.F_CV;3.884000540;100.0 +25/10/2020 02:06:51;U83.FT411.F_CV;3.943000555;100.0 +25/10/2020 02:06:52;U83.FT411.F_CV;3.904000521;100.0 +25/10/2020 02:06:58;U83.FT411.F_CV;3.942000389;100.0 +25/10/2020 02:06:35;U83.FT421.F_CV;9.959994316;100.0 +25/10/2020 02:06:05;U83.GAIN_GEN.F_17;1.000000358;100.0 +25/10/2020 02:06:05;U83.GAIN_GEN.F_18;1.000000358;100.0 +25/10/2020 02:06:05;U83.GAIN_R100.F_19;0.948000312;100.0 +25/10/2020 02:06:05;U83.GAIN_R100.F_3;1.000000358;100.0 +25/10/2020 02:06:05;U83.GAIN_R100.F_4;1.000000358;100.0 +25/10/2020 02:06:05;U83.GAIN_R100.F_5;1.000000358;100.0 +25/10/2020 02:06:05;U83.GAIN_R100.F_6;1.000000358;100.0 +25/10/2020 02:06:05;U83.GAIN_R200.F_19;0.945000350;100.0 +25/10/2020 02:06:05;U83.GAIN_R200.F_3;1.000000358;100.0 +25/10/2020 02:06:05;U83.GAIN_R200.F_4;1.000000358;100.0 +25/10/2020 02:06:05;U83.GAIN_R200.F_5;1.000000358;100.0 +25/10/2020 02:06:05;U83.GAIN_R200.F_6;1.000000358;100.0 +25/10/2020 02:06:05;U83.GAIN_R300.F_19;0.964000344;100.0 +25/10/2020 02:06:05;U83.GAIN_R300.F_3;1.002000332;100.0 +25/10/2020 02:06:05;U83.GAIN_R300.F_4;1.003000379;100.0 +25/10/2020 02:06:05;U83.GAIN_R300.F_5;1.000000358;100.0 +25/10/2020 02:06:05;U83.GAIN_R300.F_6;1.000000358;100.0 +25/10/2020 02:06:05;U83.GAIN_R400.F_19;0.950000346;100.0 +25/10/2020 02:06:05;U83.GAIN_R400.F_3;1.000000358;100.0 +25/10/2020 02:06:05;U83.GAIN_R400.F_4;1.003000379;100.0 +25/10/2020 02:06:05;U83.GAIN_R400.F_5;1.000000358;100.0 +25/10/2020 02:06:05;U83.GAIN_R400.F_6;1.000000358;100.0 +25/10/2020 02:06:28;U83.LT61.F_CV;15.799951553;100.0 +25/10/2020 02:06:28;U83.LT71.F_CV;15.299951553;100.0 +25/10/2020 02:06:05;U83.MV71.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U83.OPTIC101.F_CV;40.000000000;100.0 +25/10/2020 02:06:01;U83.OPTIC101.F_CV;35.000000000;100.0 +25/10/2020 02:06:42;U83.OPTIC101.F_CV;35.000000000;100.0 +25/10/2020 02:06:43;U83.OPTIC101.F_CV;42.000000000;100.0 +25/10/2020 02:06:44;U83.OPTIC101.F_CV;36.000000000;100.0 +25/10/2020 02:06:46;U83.OPTIC101.F_CV;30.000000000;100.0 +25/10/2020 02:06:47;U83.OPTIC101.F_CV;36.000000000;100.0 +25/10/2020 02:06:53;U83.OPTIC101.F_CV;36.000000000;100.0 +25/10/2020 02:06:54;U83.OPTIC101.F_CV;42.000000000;100.0 +25/10/2020 02:06:55;U83.OPTIC101.F_CV;30.000000000;100.0 +25/10/2020 02:06:56;U83.OPTIC101.F_CV;42.000000000;100.0 +25/10/2020 02:06:57;U83.OPTIC101.F_CV;37.000000000;100.0 +25/10/2020 02:06:58;U83.OPTIC101.F_CV;30.000000000;100.0 +25/10/2020 02:06:59;U83.OPTIC101.F_CV;36.000000000;100.0 +25/10/2020 02:06:04;U83.OPTIC102.F_CV;4.000000000;100.0 +25/10/2020 02:06:05;U83.OPTIC102.F_CV;11.000000000;100.0 +25/10/2020 02:06:06;U83.OPTIC102.F_CV;5.000000000;100.0 +25/10/2020 02:06:07;U83.OPTIC102.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U83.OPTIC102.F_CV;4.000000000;100.0 +25/10/2020 02:06:09;U83.OPTIC102.F_CV;5.000000000;100.0 +25/10/2020 02:06:12;U83.OPTIC102.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U83.OPTIC102.F_CV;11.000000000;100.0 +25/10/2020 02:06:14;U83.OPTIC102.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U83.OPTIC102.F_CV;11.000000000;100.0 +25/10/2020 02:06:16;U83.OPTIC102.F_CV;5.000000000;100.0 +25/10/2020 02:06:24;U83.OPTIC102.F_CV;5.000000000;100.0 +25/10/2020 02:06:25;U83.OPTIC102.F_CV;6.000000000;100.0 +25/10/2020 02:06:28;U83.OPTIC102.F_CV;12.000000000;100.0 +25/10/2020 02:06:29;U83.OPTIC102.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U83.OPTIC102.F_CV;6.000000000;100.0 +25/10/2020 02:06:33;U83.OPTIC102.F_CV;12.000000000;100.0 +25/10/2020 02:06:34;U83.OPTIC102.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U83.OPTIC102.F_CV;12.000000000;100.0 +25/10/2020 02:06:36;U83.OPTIC102.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U83.OPTIC102.F_CV;6.000000000;100.0 +25/10/2020 02:06:59;U83.OPTIC102.F_CV;6.000000000;100.0 +25/10/2020 02:06:10;U83.OPTIC103.F_CV;34.000000000;100.0 +25/10/2020 02:06:11;U83.OPTIC103.F_CV;40.000000000;100.0 +25/10/2020 02:06:12;U83.OPTIC103.F_CV;29.000000000;100.0 +25/10/2020 02:06:13;U83.OPTIC103.F_CV;40.000000000;100.0 +25/10/2020 02:06:14;U83.OPTIC103.F_CV;35.000000000;100.0 +25/10/2020 02:06:15;U83.OPTIC103.F_CV;29.000000000;100.0 +25/10/2020 02:06:16;U83.OPTIC103.F_CV;34.000000000;100.0 +25/10/2020 02:06:17;U83.OPTIC103.F_CV;40.000000000;100.0 +25/10/2020 02:06:18;U83.OPTIC103.F_CV;35.000000000;100.0 +25/10/2020 02:06:29;U83.OPTIC103.F_CV;35.000000000;100.0 +25/10/2020 02:06:30;U83.OPTIC103.F_CV;41.000000000;100.0 +25/10/2020 02:06:31;U83.OPTIC103.F_CV;36.000000000;100.0 +25/10/2020 02:06:33;U83.OPTIC103.F_CV;41.000000000;100.0 +25/10/2020 02:06:34;U83.OPTIC103.F_CV;36.000000000;100.0 +25/10/2020 02:06:51;U83.OPTIC103.F_CV;36.000000000;100.0 +25/10/2020 02:06:52;U83.OPTIC103.F_CV;43.000000000;100.0 +25/10/2020 02:06:53;U83.OPTIC103.F_CV;37.000000000;100.0 +25/10/2020 02:06:57;U83.OPTIC103.F_CV;31.000000000;100.0 +25/10/2020 02:06:58;U83.OPTIC103.F_CV;43.000000000;100.0 +25/10/2020 02:06:59;U83.OPTIC103.F_CV;37.000000000;100.0 +25/10/2020 02:06:00;U83.OPTIC108.F_CV;62.000000000;100.0 +25/10/2020 02:06:01;U83.OPTIC108.F_CV;43.000000000;100.0 +25/10/2020 02:06:02;U83.OPTIC108.F_CV;40.000000000;100.0 +25/10/2020 02:06:03;U83.OPTIC108.F_CV;56.000000000;100.0 +25/10/2020 02:06:04;U83.OPTIC108.F_CV;55.000000000;100.0 +25/10/2020 02:06:05;U83.OPTIC108.F_CV;36.000000000;100.0 +25/10/2020 02:06:06;U83.OPTIC108.F_CV;33.000000000;100.0 +25/10/2020 02:06:07;U83.OPTIC108.F_CV;48.000000000;100.0 +25/10/2020 02:06:08;U83.OPTIC108.F_CV;47.000000000;100.0 +25/10/2020 02:06:09;U83.OPTIC108.F_CV;65.000000000;100.0 +25/10/2020 02:06:10;U83.OPTIC108.F_CV;68.000000000;100.0 +25/10/2020 02:06:11;U83.OPTIC108.F_CV;74.000000000;100.0 +25/10/2020 02:06:12;U83.OPTIC108.F_CV;58.000000000;100.0 +25/10/2020 02:06:15;U83.OPTIC108.F_CV;77.000000000;100.0 +25/10/2020 02:06:16;U83.OPTIC108.F_CV;61.000000000;100.0 +25/10/2020 02:06:18;U83.OPTIC108.F_CV;62.000000000;100.0 +25/10/2020 02:06:19;U83.OPTIC108.F_CV;80.000000000;100.0 +25/10/2020 02:06:20;U83.OPTIC108.F_CV;65.000000000;100.0 +25/10/2020 02:06:22;U83.OPTIC108.F_CV;84.000000000;100.0 +25/10/2020 02:06:23;U83.OPTIC108.F_CV;69.000000000;100.0 +25/10/2020 02:06:24;U83.OPTIC108.F_CV;88.000000000;100.0 +25/10/2020 02:06:25;U83.OPTIC108.F_CV;73.000000000;100.0 +25/10/2020 02:06:26;U83.OPTIC108.F_CV;93.000000000;100.0 +25/10/2020 02:06:27;U83.OPTIC108.F_CV;96.000000000;100.0 +25/10/2020 02:06:28;U83.OPTIC108.F_CV;63.000000000;100.0 +25/10/2020 02:06:29;U83.OPTIC108.F_CV;79.000000000;100.0 +25/10/2020 02:06:30;U83.OPTIC108.F_CV;61.000000000;100.0 +25/10/2020 02:06:31;U83.OPTIC108.F_CV;59.000000000;100.0 +25/10/2020 02:06:33;U83.OPTIC108.F_CV;53.000000000;100.0 +25/10/2020 02:06:34;U83.OPTIC108.F_CV;32.000000000;100.0 +25/10/2020 02:06:35;U83.OPTIC108.F_CV;41.000000000;100.0 +25/10/2020 02:06:36;U83.OPTIC108.F_CV;19.000000000;100.0 +25/10/2020 02:06:37;U83.OPTIC108.F_CV;30.000000000;100.0 +25/10/2020 02:06:38;U83.OPTIC108.F_CV;8.000000000;100.0 +25/10/2020 02:06:39;U83.OPTIC108.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U83.OPTIC108.F_CV;12.000000000;100.0 +25/10/2020 02:06:41;U83.OPTIC108.F_CV;7.000000000;100.0 +25/10/2020 02:06:42;U83.OPTIC108.F_CV;21.000000000;100.0 +25/10/2020 02:06:43;U83.OPTIC108.F_CV;19.000000000;100.0 +25/10/2020 02:06:44;U83.OPTIC108.F_CV;36.000000000;100.0 +25/10/2020 02:06:45;U83.OPTIC108.F_CV;56.000000000;100.0 +25/10/2020 02:06:46;U83.OPTIC108.F_CV;42.000000000;100.0 +25/10/2020 02:06:47;U83.OPTIC108.F_CV;63.000000000;100.0 +25/10/2020 02:06:48;U83.OPTIC108.F_CV;50.000000000;100.0 +25/10/2020 02:06:49;U83.OPTIC108.F_CV;71.000000000;100.0 +25/10/2020 02:06:50;U83.OPTIC108.F_CV;58.000000000;100.0 +25/10/2020 02:06:52;U83.OPTIC108.F_CV;100.000000000;100.0 +25/10/2020 02:06:53;U83.OPTIC108.F_CV;94.000000000;100.0 +25/10/2020 02:06:54;U83.OPTIC108.F_CV;100.000000000;100.0 +25/10/2020 02:06:55;U83.OPTIC108.F_CV;89.000000000;100.0 +25/10/2020 02:06:56;U83.OPTIC108.F_CV;100.000000000;100.0 +25/10/2020 02:06:57;U83.OPTIC108.F_CV;99.000000000;100.0 +25/10/2020 02:06:58;U83.OPTIC108.F_CV;85.000000000;100.0 +25/10/2020 02:06:59;U83.OPTIC108.F_CV;86.000000000;100.0 +25/10/2020 02:06:00;U83.OPTIC121.F_CV;68.000000000;100.0 +25/10/2020 02:06:01;U83.OPTIC121.F_CV;52.000000000;100.0 +25/10/2020 02:06:14;U83.OPTIC121.F_CV;52.000000000;100.0 +25/10/2020 02:06:15;U83.OPTIC121.F_CV;71.000000000;100.0 +25/10/2020 02:06:16;U83.OPTIC121.F_CV;37.000000000;100.0 +25/10/2020 02:06:17;U83.OPTIC121.F_CV;53.000000000;100.0 +25/10/2020 02:06:26;U83.OPTIC121.F_CV;53.000000000;100.0 +25/10/2020 02:06:27;U83.OPTIC121.F_CV;71.000000000;100.0 +25/10/2020 02:06:28;U83.OPTIC121.F_CV;37.000000000;100.0 +25/10/2020 02:06:29;U83.OPTIC121.F_CV;53.000000000;100.0 +25/10/2020 02:06:36;U83.OPTIC121.F_CV;53.000000000;100.0 +25/10/2020 02:06:37;U83.OPTIC121.F_CV;34.000000000;100.0 +25/10/2020 02:06:38;U83.OPTIC121.F_CV;68.000000000;100.0 +25/10/2020 02:06:39;U83.OPTIC121.F_CV;53.000000000;100.0 +25/10/2020 02:06:44;U83.OPTIC121.F_CV;53.000000000;100.0 +25/10/2020 02:06:45;U83.OPTIC121.F_CV;34.000000000;100.0 +25/10/2020 02:06:46;U83.OPTIC121.F_CV;68.000000000;100.0 +25/10/2020 02:06:47;U83.OPTIC121.F_CV;52.000000000;100.0 +25/10/2020 02:06:51;U83.OPTIC121.F_CV;52.000000000;100.0 +25/10/2020 02:06:52;U83.OPTIC121.F_CV;34.000000000;100.0 +25/10/2020 02:06:53;U83.OPTIC121.F_CV;49.000000000;100.0 +25/10/2020 02:06:57;U83.OPTIC121.F_CV;49.000000000;100.0 +25/10/2020 02:06:58;U83.OPTIC121.F_CV;48.000000000;100.0 +25/10/2020 02:06:18;U83.OPTIC201.F_CV;33.000000000;100.0 +25/10/2020 02:06:19;U83.OPTIC201.F_CV;39.000000000;100.0 +25/10/2020 02:06:20;U83.OPTIC201.F_CV;28.000000000;100.0 +25/10/2020 02:06:21;U83.OPTIC201.F_CV;33.000000000;100.0 +25/10/2020 02:06:25;U83.OPTIC201.F_CV;33.000000000;100.0 +25/10/2020 02:06:26;U83.OPTIC201.F_CV;39.000000000;100.0 +25/10/2020 02:06:27;U83.OPTIC201.F_CV;28.000000000;100.0 +25/10/2020 02:06:28;U83.OPTIC201.F_CV;39.000000000;100.0 +25/10/2020 02:06:29;U83.OPTIC201.F_CV;34.000000000;100.0 +25/10/2020 02:06:47;U83.OPTIC201.F_CV;34.000000000;100.0 +25/10/2020 02:06:48;U83.OPTIC201.F_CV;40.000000000;100.0 +25/10/2020 02:06:49;U83.OPTIC201.F_CV;29.000000000;100.0 +25/10/2020 02:06:50;U83.OPTIC201.F_CV;40.000000000;100.0 +25/10/2020 02:06:51;U83.OPTIC201.F_CV;35.000000000;100.0 +25/10/2020 02:06:19;U83.OPTIC202.F_CV;3.000000000;100.0 +25/10/2020 02:06:20;U83.OPTIC202.F_CV;9.000000000;100.0 +25/10/2020 02:06:21;U83.OPTIC202.F_CV;4.000000000;100.0 +25/10/2020 02:06:23;U83.OPTIC202.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U83.OPTIC202.F_CV;9.000000000;100.0 +25/10/2020 02:06:25;U83.OPTIC202.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U83.OPTIC202.F_CV;9.000000000;100.0 +25/10/2020 02:06:27;U83.OPTIC202.F_CV;4.000000000;100.0 +25/10/2020 02:06:07;U83.OPTIC203.F_CV;35.000000000;100.0 +25/10/2020 02:06:08;U83.OPTIC203.F_CV;42.000000000;100.0 +25/10/2020 02:06:09;U83.OPTIC203.F_CV;36.000000000;100.0 +25/10/2020 02:06:15;U83.OPTIC203.F_CV;36.000000000;100.0 +25/10/2020 02:06:16;U83.OPTIC203.F_CV;37.000000000;100.0 +25/10/2020 02:06:20;U83.OPTIC203.F_CV;43.000000000;100.0 +25/10/2020 02:06:21;U83.OPTIC203.F_CV;38.000000000;100.0 +25/10/2020 02:06:38;U83.OPTIC203.F_CV;38.000000000;100.0 +25/10/2020 02:06:39;U83.OPTIC203.F_CV;32.000000000;100.0 +25/10/2020 02:06:40;U83.OPTIC203.F_CV;43.000000000;100.0 +25/10/2020 02:06:41;U83.OPTIC203.F_CV;38.000000000;100.0 +25/10/2020 02:06:43;U83.OPTIC203.F_CV;32.000000000;100.0 +25/10/2020 02:06:44;U83.OPTIC203.F_CV;37.000000000;100.0 +25/10/2020 02:06:53;U83.OPTIC203.F_CV;37.000000000;100.0 +25/10/2020 02:06:54;U83.OPTIC203.F_CV;31.000000000;100.0 +25/10/2020 02:06:55;U83.OPTIC203.F_CV;36.000000000;100.0 +25/10/2020 02:06:01;U83.OPTIC208.F_CV;56.000000000;100.0 +25/10/2020 02:06:02;U83.OPTIC208.F_CV;40.000000000;100.0 +25/10/2020 02:06:03;U83.OPTIC208.F_CV;41.000000000;100.0 +25/10/2020 02:06:07;U83.OPTIC208.F_CV;42.000000000;100.0 +25/10/2020 02:06:10;U83.OPTIC208.F_CV;43.000000000;100.0 +25/10/2020 02:06:11;U83.OPTIC208.F_CV;40.000000000;100.0 +25/10/2020 02:06:15;U83.OPTIC208.F_CV;22.000000000;100.0 +25/10/2020 02:06:16;U83.OPTIC208.F_CV;56.000000000;100.0 +25/10/2020 02:06:17;U83.OPTIC208.F_CV;41.000000000;100.0 +25/10/2020 02:06:18;U83.OPTIC208.F_CV;22.000000000;100.0 +25/10/2020 02:06:19;U83.OPTIC208.F_CV;38.000000000;100.0 +25/10/2020 02:06:21;U83.OPTIC208.F_CV;19.000000000;100.0 +25/10/2020 02:06:22;U83.OPTIC208.F_CV;34.000000000;100.0 +25/10/2020 02:06:25;U83.OPTIC208.F_CV;15.000000000;100.0 +25/10/2020 02:06:26;U83.OPTIC208.F_CV;31.000000000;100.0 +25/10/2020 02:06:27;U83.OPTIC208.F_CV;30.000000000;100.0 +25/10/2020 02:06:29;U83.OPTIC208.F_CV;49.000000000;100.0 +25/10/2020 02:06:30;U83.OPTIC208.F_CV;14.000000000;100.0 +25/10/2020 02:06:31;U83.OPTIC208.F_CV;29.000000000;100.0 +25/10/2020 02:06:32;U83.OPTIC208.F_CV;48.000000000;100.0 +25/10/2020 02:06:33;U83.OPTIC208.F_CV;13.000000000;100.0 +25/10/2020 02:06:34;U83.OPTIC208.F_CV;47.000000000;100.0 +25/10/2020 02:06:36;U83.OPTIC208.F_CV;31.000000000;100.0 +25/10/2020 02:06:40;U83.OPTIC208.F_CV;31.000000000;100.0 +25/10/2020 02:06:41;U83.OPTIC208.F_CV;49.000000000;100.0 +25/10/2020 02:06:42;U83.OPTIC208.F_CV;34.000000000;100.0 +25/10/2020 02:06:43;U83.OPTIC208.F_CV;15.000000000;100.0 +25/10/2020 02:06:44;U83.OPTIC208.F_CV;49.000000000;100.0 +25/10/2020 02:06:45;U83.OPTIC208.F_CV;33.000000000;100.0 +25/10/2020 02:06:59;U83.OPTIC208.F_CV;33.000000000;100.0 +25/10/2020 02:06:00;U83.OPTIC221.F_CV;91.000000000;100.0 +25/10/2020 02:06:02;U83.OPTIC221.F_CV;100.000000000;100.0 +25/10/2020 02:06:03;U83.OPTIC221.F_CV;94.000000000;100.0 +25/10/2020 02:06:08;U83.OPTIC221.F_CV;94.000000000;100.0 +25/10/2020 02:06:09;U83.OPTIC221.F_CV;95.000000000;100.0 +25/10/2020 02:06:11;U83.OPTIC221.F_CV;76.000000000;100.0 +25/10/2020 02:06:12;U83.OPTIC221.F_CV;92.000000000;100.0 +25/10/2020 02:06:13;U83.OPTIC221.F_CV;100.000000000;100.0 +25/10/2020 02:06:14;U83.OPTIC221.F_CV;95.000000000;100.0 +25/10/2020 02:06:15;U83.OPTIC221.F_CV;76.000000000;100.0 +25/10/2020 02:06:16;U83.OPTIC221.F_CV;92.000000000;100.0 +25/10/2020 02:06:18;U83.OPTIC221.F_CV;100.000000000;100.0 +25/10/2020 02:06:19;U83.OPTIC221.F_CV;95.000000000;100.0 +25/10/2020 02:06:22;U83.OPTIC221.F_CV;96.000000000;100.0 +25/10/2020 02:06:26;U83.OPTIC221.F_CV;77.000000000;100.0 +25/10/2020 02:06:27;U83.OPTIC221.F_CV;100.000000000;100.0 +25/10/2020 02:06:28;U83.OPTIC221.F_CV;78.000000000;100.0 +25/10/2020 02:06:29;U83.OPTIC221.F_CV;93.000000000;100.0 +25/10/2020 02:06:36;U83.OPTIC221.F_CV;93.000000000;100.0 +25/10/2020 02:06:37;U83.OPTIC221.F_CV;100.000000000;100.0 +25/10/2020 02:06:38;U83.OPTIC221.F_CV;78.000000000;100.0 +25/10/2020 02:06:39;U83.OPTIC221.F_CV;93.000000000;100.0 +25/10/2020 02:06:44;U83.OPTIC221.F_CV;93.000000000;100.0 +25/10/2020 02:06:45;U83.OPTIC221.F_CV;100.000000000;100.0 +25/10/2020 02:06:46;U83.OPTIC221.F_CV;96.000000000;100.0 +25/10/2020 02:06:47;U83.OPTIC221.F_CV;78.000000000;100.0 +25/10/2020 02:06:48;U83.OPTIC221.F_CV;100.000000000;100.0 +25/10/2020 02:06:49;U83.OPTIC221.F_CV;78.000000000;100.0 +25/10/2020 02:06:50;U83.OPTIC221.F_CV;93.000000000;100.0 +25/10/2020 02:06:56;U83.OPTIC221.F_CV;93.000000000;100.0 +25/10/2020 02:06:57;U83.OPTIC221.F_CV;75.000000000;100.0 +25/10/2020 02:06:58;U83.OPTIC221.F_CV;100.000000000;100.0 +25/10/2020 02:06:59;U83.OPTIC221.F_CV;75.000000000;100.0 +25/10/2020 02:06:10;U83.OPTIC301.F_CV;36.000000000;100.0 +25/10/2020 02:06:11;U83.OPTIC301.F_CV;43.000000000;100.0 +25/10/2020 02:06:13;U83.OPTIC301.F_CV;31.000000000;100.0 +25/10/2020 02:06:14;U83.OPTIC301.F_CV;43.000000000;100.0 +25/10/2020 02:06:15;U83.OPTIC301.F_CV;37.000000000;100.0 +25/10/2020 02:06:24;U83.OPTIC301.F_CV;37.000000000;100.0 +25/10/2020 02:06:25;U83.OPTIC301.F_CV;38.000000000;100.0 +25/10/2020 02:06:29;U83.OPTIC301.F_CV;44.000000000;100.0 +25/10/2020 02:06:30;U83.OPTIC301.F_CV;32.000000000;100.0 +25/10/2020 02:06:31;U83.OPTIC301.F_CV;38.000000000;100.0 +25/10/2020 02:06:33;U83.OPTIC301.F_CV;32.000000000;100.0 +25/10/2020 02:06:35;U83.OPTIC301.F_CV;38.000000000;100.0 +25/10/2020 02:06:38;U83.OPTIC301.F_CV;44.000000000;100.0 +25/10/2020 02:06:39;U83.OPTIC301.F_CV;32.000000000;100.0 +25/10/2020 02:06:40;U83.OPTIC301.F_CV;38.000000000;100.0 +25/10/2020 02:06:42;U83.OPTIC301.F_CV;44.000000000;100.0 +25/10/2020 02:06:43;U83.OPTIC301.F_CV;33.000000000;100.0 +25/10/2020 02:06:44;U83.OPTIC301.F_CV;38.000000000;100.0 +25/10/2020 02:06:54;U83.OPTIC301.F_CV;38.000000000;100.0 +25/10/2020 02:06:55;U83.OPTIC301.F_CV;32.000000000;100.0 +25/10/2020 02:06:56;U83.OPTIC301.F_CV;43.000000000;100.0 +25/10/2020 02:06:57;U83.OPTIC301.F_CV;32.000000000;100.0 +25/10/2020 02:06:58;U83.OPTIC301.F_CV;37.000000000;100.0 +25/10/2020 02:06:49;U83.OPTIC302.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U83.OPTIC303.F_CV;34.000000000;100.0 +25/10/2020 02:06:07;U83.OPTIC303.F_CV;40.000000000;100.0 +25/10/2020 02:06:08;U83.OPTIC303.F_CV;29.000000000;100.0 +25/10/2020 02:06:09;U83.OPTIC303.F_CV;34.000000000;100.0 +25/10/2020 02:06:10;U83.OPTIC303.F_CV;40.000000000;100.0 +25/10/2020 02:06:12;U83.OPTIC303.F_CV;35.000000000;100.0 +25/10/2020 02:06:16;U83.OPTIC303.F_CV;35.000000000;100.0 +25/10/2020 02:06:17;U83.OPTIC303.F_CV;41.000000000;100.0 +25/10/2020 02:06:18;U83.OPTIC303.F_CV;30.000000000;100.0 +25/10/2020 02:06:19;U83.OPTIC303.F_CV;35.000000000;100.0 +25/10/2020 02:06:20;U83.OPTIC303.F_CV;41.000000000;100.0 +25/10/2020 02:06:21;U83.OPTIC303.F_CV;36.000000000;100.0 +25/10/2020 02:06:23;U83.OPTIC303.F_CV;30.000000000;100.0 +25/10/2020 02:06:24;U83.OPTIC303.F_CV;41.000000000;100.0 +25/10/2020 02:06:25;U83.OPTIC303.F_CV;30.000000000;100.0 +25/10/2020 02:06:26;U83.OPTIC303.F_CV;41.000000000;100.0 +25/10/2020 02:06:27;U83.OPTIC303.F_CV;36.000000000;100.0 +25/10/2020 02:06:32;U83.OPTIC303.F_CV;36.000000000;100.0 +25/10/2020 02:06:33;U83.OPTIC303.F_CV;42.000000000;100.0 +25/10/2020 02:06:35;U83.OPTIC303.F_CV;37.000000000;100.0 +25/10/2020 02:06:47;U83.OPTIC303.F_CV;37.000000000;100.0 +25/10/2020 02:06:48;U83.OPTIC303.F_CV;43.000000000;100.0 +25/10/2020 02:06:49;U83.OPTIC303.F_CV;38.000000000;100.0 +25/10/2020 02:06:00;U83.OPTIC308.F_CV;64.000000000;100.0 +25/10/2020 02:06:01;U83.OPTIC308.F_CV;49.000000000;100.0 +25/10/2020 02:06:02;U83.OPTIC308.F_CV;51.000000000;100.0 +25/10/2020 02:06:07;U83.OPTIC308.F_CV;56.000000000;100.0 +25/10/2020 02:06:08;U83.OPTIC308.F_CV;39.000000000;100.0 +25/10/2020 02:06:09;U83.OPTIC308.F_CV;55.000000000;100.0 +25/10/2020 02:06:10;U83.OPTIC308.F_CV;56.000000000;100.0 +25/10/2020 02:06:11;U83.OPTIC308.F_CV;55.000000000;100.0 +25/10/2020 02:06:12;U83.OPTIC308.F_CV;37.000000000;100.0 +25/10/2020 02:06:14;U83.OPTIC308.F_CV;33.000000000;100.0 +25/10/2020 02:06:15;U83.OPTIC308.F_CV;30.000000000;100.0 +25/10/2020 02:06:16;U83.OPTIC308.F_CV;46.000000000;100.0 +25/10/2020 02:06:17;U83.OPTIC308.F_CV;27.000000000;100.0 +25/10/2020 02:06:21;U83.OPTIC308.F_CV;15.000000000;100.0 +25/10/2020 02:06:22;U83.OPTIC308.F_CV;11.000000000;100.0 +25/10/2020 02:06:23;U83.OPTIC308.F_CV;8.000000000;100.0 +25/10/2020 02:06:25;U83.OPTIC308.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U83.OPTIC308.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U83.OPTIC308.F_CV;4.000000000;100.0 +25/10/2020 02:06:31;U83.OPTIC308.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U83.OPTIC308.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U83.OPTIC308.F_CV;12.000000000;100.0 +25/10/2020 02:06:44;U83.OPTIC308.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U83.OPTIC308.F_CV;13.000000000;100.0 +25/10/2020 02:06:48;U83.OPTIC308.F_CV;14.000000000;100.0 +25/10/2020 02:06:49;U83.OPTIC308.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U83.OPTIC308.F_CV;15.000000000;100.0 +25/10/2020 02:06:51;U83.OPTIC308.F_CV;17.000000000;100.0 +25/10/2020 02:06:52;U83.OPTIC308.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U83.OPTIC308.F_CV;18.000000000;100.0 +25/10/2020 02:06:54;U83.OPTIC308.F_CV;19.000000000;100.0 +25/10/2020 02:06:55;U83.OPTIC308.F_CV;22.000000000;100.0 +25/10/2020 02:06:57;U83.OPTIC308.F_CV;26.000000000;100.0 +25/10/2020 02:06:58;U83.OPTIC308.F_CV;10.000000000;100.0 +25/10/2020 02:06:59;U83.OPTIC308.F_CV;28.000000000;100.0 +25/10/2020 02:06:04;U83.OPTIC321.F_CV;77.000000000;100.0 +25/10/2020 02:06:05;U83.OPTIC321.F_CV;78.000000000;100.0 +25/10/2020 02:06:07;U83.OPTIC321.F_CV;59.000000000;100.0 +25/10/2020 02:06:08;U83.OPTIC321.F_CV;93.000000000;100.0 +25/10/2020 02:06:09;U83.OPTIC321.F_CV;78.000000000;100.0 +25/10/2020 02:06:11;U83.OPTIC321.F_CV;60.000000000;100.0 +25/10/2020 02:06:12;U83.OPTIC321.F_CV;94.000000000;100.0 +25/10/2020 02:06:13;U83.OPTIC321.F_CV;79.000000000;100.0 +25/10/2020 02:06:15;U83.OPTIC321.F_CV;60.000000000;100.0 +25/10/2020 02:06:16;U83.OPTIC321.F_CV;76.000000000;100.0 +25/10/2020 02:06:18;U83.OPTIC321.F_CV;94.000000000;100.0 +25/10/2020 02:06:19;U83.OPTIC321.F_CV;60.000000000;100.0 +25/10/2020 02:06:20;U83.OPTIC321.F_CV;76.000000000;100.0 +25/10/2020 02:06:21;U83.OPTIC321.F_CV;95.000000000;100.0 +25/10/2020 02:06:22;U83.OPTIC321.F_CV;60.000000000;100.0 +25/10/2020 02:06:23;U83.OPTIC321.F_CV;76.000000000;100.0 +25/10/2020 02:06:34;U83.OPTIC321.F_CV;76.000000000;100.0 +25/10/2020 02:06:35;U83.OPTIC321.F_CV;95.000000000;100.0 +25/10/2020 02:06:36;U83.OPTIC321.F_CV;61.000000000;100.0 +25/10/2020 02:06:37;U83.OPTIC321.F_CV;76.000000000;100.0 +25/10/2020 02:06:42;U83.OPTIC321.F_CV;76.000000000;100.0 +25/10/2020 02:06:43;U83.OPTIC321.F_CV;57.000000000;100.0 +25/10/2020 02:06:44;U83.OPTIC321.F_CV;92.000000000;100.0 +25/10/2020 02:06:45;U83.OPTIC321.F_CV;76.000000000;100.0 +25/10/2020 02:06:47;U83.OPTIC321.F_CV;57.000000000;100.0 +25/10/2020 02:06:48;U83.OPTIC321.F_CV;92.000000000;100.0 +25/10/2020 02:06:49;U83.OPTIC321.F_CV;76.000000000;100.0 +25/10/2020 02:06:51;U83.OPTIC321.F_CV;57.000000000;100.0 +25/10/2020 02:06:52;U83.OPTIC321.F_CV;91.000000000;100.0 +25/10/2020 02:06:53;U83.OPTIC321.F_CV;76.000000000;100.0 +25/10/2020 02:06:56;U83.OPTIC321.F_CV;57.000000000;100.0 +25/10/2020 02:06:57;U83.OPTIC321.F_CV;73.000000000;100.0 +25/10/2020 02:06:58;U83.OPTIC321.F_CV;72.000000000;100.0 +25/10/2020 02:06:05;U83.OPTIC401.F_CV;31.000000000;100.0 +25/10/2020 02:06:06;U83.OPTIC401.F_CV;25.000000000;100.0 +25/10/2020 02:06:07;U83.OPTIC401.F_CV;30.000000000;100.0 +25/10/2020 02:06:11;U83.OPTIC401.F_CV;24.000000000;100.0 +25/10/2020 02:06:12;U83.OPTIC401.F_CV;35.000000000;100.0 +25/10/2020 02:06:13;U83.OPTIC401.F_CV;30.000000000;100.0 +25/10/2020 02:06:16;U83.OPTIC401.F_CV;36.000000000;100.0 +25/10/2020 02:06:17;U83.OPTIC401.F_CV;25.000000000;100.0 +25/10/2020 02:06:18;U83.OPTIC401.F_CV;36.000000000;100.0 +25/10/2020 02:06:19;U83.OPTIC401.F_CV;31.000000000;100.0 +25/10/2020 02:06:28;U83.OPTIC401.F_CV;31.000000000;100.0 +25/10/2020 02:06:29;U83.OPTIC401.F_CV;37.000000000;100.0 +25/10/2020 02:06:30;U83.OPTIC401.F_CV;26.000000000;100.0 +25/10/2020 02:06:31;U83.OPTIC401.F_CV;37.000000000;100.0 +25/10/2020 02:06:32;U83.OPTIC401.F_CV;26.000000000;100.0 +25/10/2020 02:06:33;U83.OPTIC401.F_CV;31.000000000;100.0 +25/10/2020 02:06:46;U83.OPTIC401.F_CV;31.000000000;100.0 +25/10/2020 02:06:47;U83.OPTIC401.F_CV;25.000000000;100.0 +25/10/2020 02:06:48;U83.OPTIC401.F_CV;30.000000000;100.0 +25/10/2020 02:06:50;U83.OPTIC401.F_CV;24.000000000;100.0 +25/10/2020 02:06:51;U83.OPTIC401.F_CV;35.000000000;100.0 +25/10/2020 02:06:52;U83.OPTIC401.F_CV;30.000000000;100.0 +25/10/2020 02:06:00;U83.OPTIC402.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U83.OPTIC402.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U83.OPTIC402.F_CV;5.000000000;100.0 +25/10/2020 02:06:07;U83.OPTIC402.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U83.OPTIC402.F_CV;5.000000000;100.0 +25/10/2020 02:06:12;U83.OPTIC402.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U83.OPTIC402.F_CV;5.000000000;100.0 +25/10/2020 02:06:15;U83.OPTIC402.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U83.OPTIC402.F_CV;5.000000000;100.0 +25/10/2020 02:06:17;U83.OPTIC402.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U83.OPTIC402.F_CV;5.000000000;100.0 +25/10/2020 02:06:22;U83.OPTIC402.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U83.OPTIC402.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U83.OPTIC402.F_CV;4.000000000;100.0 +25/10/2020 02:06:43;U83.OPTIC402.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U83.OPTIC402.F_CV;4.000000000;100.0 +25/10/2020 02:06:48;U83.OPTIC402.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U83.OPTIC402.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U83.OPTIC402.F_CV;4.000000000;100.0 +25/10/2020 02:06:59;U83.OPTIC402.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U83.OPTIC403.F_CV;28.000000000;100.0 +25/10/2020 02:06:01;U83.OPTIC403.F_CV;33.000000000;100.0 +25/10/2020 02:06:03;U83.OPTIC403.F_CV;39.000000000;100.0 +25/10/2020 02:06:04;U83.OPTIC403.F_CV;34.000000000;100.0 +25/10/2020 02:06:05;U83.OPTIC403.F_CV;28.000000000;100.0 +25/10/2020 02:06:06;U83.OPTIC403.F_CV;33.000000000;100.0 +25/10/2020 02:06:09;U83.OPTIC403.F_CV;39.000000000;100.0 +25/10/2020 02:06:10;U83.OPTIC403.F_CV;34.000000000;100.0 +25/10/2020 02:06:11;U83.OPTIC403.F_CV;28.000000000;100.0 +25/10/2020 02:06:12;U83.OPTIC403.F_CV;39.000000000;100.0 +25/10/2020 02:06:13;U83.OPTIC403.F_CV;34.000000000;100.0 +25/10/2020 02:06:14;U83.OPTIC403.F_CV;28.000000000;100.0 +25/10/2020 02:06:15;U83.OPTIC403.F_CV;39.000000000;100.0 +25/10/2020 02:06:16;U83.OPTIC403.F_CV;34.000000000;100.0 +25/10/2020 02:06:17;U83.OPTIC403.F_CV;28.000000000;100.0 +25/10/2020 02:06:18;U83.OPTIC403.F_CV;39.000000000;100.0 +25/10/2020 02:06:19;U83.OPTIC403.F_CV;28.000000000;100.0 +25/10/2020 02:06:20;U83.OPTIC403.F_CV;39.000000000;100.0 +25/10/2020 02:06:21;U83.OPTIC403.F_CV;34.000000000;100.0 +25/10/2020 02:06:24;U83.OPTIC403.F_CV;28.000000000;100.0 +25/10/2020 02:06:25;U83.OPTIC403.F_CV;33.000000000;100.0 +25/10/2020 02:06:43;U83.OPTIC403.F_CV;33.000000000;100.0 +25/10/2020 02:06:44;U83.OPTIC403.F_CV;27.000000000;100.0 +25/10/2020 02:06:45;U83.OPTIC403.F_CV;32.000000000;100.0 +25/10/2020 02:06:46;U83.OPTIC403.F_CV;38.000000000;100.0 +25/10/2020 02:06:47;U83.OPTIC403.F_CV;27.000000000;100.0 +25/10/2020 02:06:48;U83.OPTIC403.F_CV;32.000000000;100.0 +25/10/2020 02:06:50;U83.OPTIC403.F_CV;38.000000000;100.0 +25/10/2020 02:06:51;U83.OPTIC403.F_CV;33.000000000;100.0 +25/10/2020 02:06:55;U83.OPTIC403.F_CV;33.000000000;100.0 +25/10/2020 02:06:56;U83.OPTIC403.F_CV;27.000000000;100.0 +25/10/2020 02:06:57;U83.OPTIC403.F_CV;38.000000000;100.0 +25/10/2020 02:06:58;U83.OPTIC403.F_CV;27.000000000;100.0 +25/10/2020 02:06:59;U83.OPTIC403.F_CV;38.000000000;100.0 +25/10/2020 02:06:00;U83.OPTIC408.F_CV;50.000000000;100.0 +25/10/2020 02:06:01;U83.OPTIC408.F_CV;55.000000000;100.0 +25/10/2020 02:06:02;U83.OPTIC408.F_CV;61.000000000;100.0 +25/10/2020 02:06:03;U83.OPTIC408.F_CV;49.000000000;100.0 +25/10/2020 02:06:04;U83.OPTIC408.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U83.OPTIC408.F_CV;15.000000000;100.0 +25/10/2020 02:06:08;U83.OPTIC408.F_CV;52.000000000;100.0 +25/10/2020 02:06:09;U83.OPTIC408.F_CV;95.000000000;100.0 +25/10/2020 02:06:10;U83.OPTIC408.F_CV;71.000000000;100.0 +25/10/2020 02:06:11;U83.OPTIC408.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U83.OPTIC408.F_CV;32.000000000;100.0 +25/10/2020 02:06:15;U83.OPTIC408.F_CV;53.000000000;100.0 +25/10/2020 02:06:16;U83.OPTIC408.F_CV;96.000000000;100.0 +25/10/2020 02:06:17;U83.OPTIC408.F_CV;34.000000000;100.0 +25/10/2020 02:06:18;U83.OPTIC408.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U83.OPTIC408.F_CV;16.000000000;100.0 +25/10/2020 02:06:22;U83.OPTIC408.F_CV;71.000000000;100.0 +25/10/2020 02:06:23;U83.OPTIC408.F_CV;80.000000000;100.0 +25/10/2020 02:06:24;U83.OPTIC408.F_CV;71.000000000;100.0 +25/10/2020 02:06:25;U83.OPTIC408.F_CV;3.000000000;100.0 +25/10/2020 02:06:26;U83.OPTIC408.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U83.OPTIC408.F_CV;13.000000000;100.0 +25/10/2020 02:06:29;U83.OPTIC408.F_CV;50.000000000;100.0 +25/10/2020 02:06:30;U83.OPTIC408.F_CV;56.000000000;100.0 +25/10/2020 02:06:31;U83.OPTIC408.F_CV;43.000000000;100.0 +25/10/2020 02:06:32;U83.OPTIC408.F_CV;9.000000000;100.0 +25/10/2020 02:06:33;U83.OPTIC408.F_CV;5.000000000;100.0 +25/10/2020 02:06:34;U83.OPTIC408.F_CV;2.000000000;100.0 +25/10/2020 02:06:35;U83.OPTIC408.F_CV;57.000000000;100.0 +25/10/2020 02:06:36;U83.OPTIC408.F_CV;63.000000000;100.0 +25/10/2020 02:06:37;U83.OPTIC408.F_CV;14.000000000;100.0 +25/10/2020 02:06:38;U83.OPTIC408.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U83.OPTIC408.F_CV;36.000000000;100.0 +25/10/2020 02:06:41;U83.OPTIC408.F_CV;58.000000000;100.0 +25/10/2020 02:06:42;U83.OPTIC408.F_CV;64.000000000;100.0 +25/10/2020 02:06:43;U83.OPTIC408.F_CV;33.000000000;100.0 +25/10/2020 02:06:44;U83.OPTIC408.F_CV;14.000000000;100.0 +25/10/2020 02:06:45;U83.OPTIC408.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U83.OPTIC408.F_CV;34.000000000;100.0 +25/10/2020 02:06:48;U83.OPTIC408.F_CV;55.000000000;100.0 +25/10/2020 02:06:49;U83.OPTIC408.F_CV;61.000000000;100.0 +25/10/2020 02:06:50;U83.OPTIC408.F_CV;30.000000000;100.0 +25/10/2020 02:06:51;U83.OPTIC408.F_CV;11.000000000;100.0 +25/10/2020 02:06:52;U83.OPTIC408.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U83.OPTIC408.F_CV;2.000000000;100.0 +25/10/2020 02:06:54;U83.OPTIC408.F_CV;55.000000000;100.0 +25/10/2020 02:06:56;U83.OPTIC408.F_CV;67.000000000;100.0 +25/10/2020 02:06:57;U83.OPTIC408.F_CV;36.000000000;100.0 +25/10/2020 02:06:58;U83.OPTIC408.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U83.OPTIC421.F_CV;70.000000000;100.0 +25/10/2020 02:06:05;U83.OPTIC421.F_CV;51.000000000;100.0 +25/10/2020 02:06:06;U83.OPTIC421.F_CV;86.000000000;100.0 +25/10/2020 02:06:07;U83.OPTIC421.F_CV;70.000000000;100.0 +25/10/2020 02:06:09;U83.OPTIC421.F_CV;71.000000000;100.0 +25/10/2020 02:06:11;U83.OPTIC421.F_CV;87.000000000;100.0 +25/10/2020 02:06:12;U83.OPTIC421.F_CV;71.000000000;100.0 +25/10/2020 02:06:14;U83.OPTIC421.F_CV;53.000000000;100.0 +25/10/2020 02:06:15;U83.OPTIC421.F_CV;68.000000000;100.0 +25/10/2020 02:06:16;U83.OPTIC421.F_CV;87.000000000;100.0 +25/10/2020 02:06:17;U83.OPTIC421.F_CV;71.000000000;100.0 +25/10/2020 02:06:18;U83.OPTIC421.F_CV;72.000000000;100.0 +25/10/2020 02:06:20;U83.OPTIC421.F_CV;53.000000000;100.0 +25/10/2020 02:06:21;U83.OPTIC421.F_CV;88.000000000;100.0 +25/10/2020 02:06:22;U83.OPTIC421.F_CV;72.000000000;100.0 +25/10/2020 02:06:23;U83.OPTIC421.F_CV;53.000000000;100.0 +25/10/2020 02:06:24;U83.OPTIC421.F_CV;88.000000000;100.0 +25/10/2020 02:06:25;U83.OPTIC421.F_CV;54.000000000;100.0 +25/10/2020 02:06:26;U83.OPTIC421.F_CV;88.000000000;100.0 +25/10/2020 02:06:27;U83.OPTIC421.F_CV;54.000000000;100.0 +25/10/2020 02:06:28;U83.OPTIC421.F_CV;69.000000000;100.0 +25/10/2020 02:06:32;U83.OPTIC421.F_CV;88.000000000;100.0 +25/10/2020 02:06:33;U83.OPTIC421.F_CV;54.000000000;100.0 +25/10/2020 02:06:34;U83.OPTIC421.F_CV;70.000000000;100.0 +25/10/2020 02:06:39;U83.OPTIC421.F_CV;70.000000000;100.0 +25/10/2020 02:06:40;U83.OPTIC421.F_CV;88.000000000;100.0 +25/10/2020 02:06:41;U83.OPTIC421.F_CV;54.000000000;100.0 +25/10/2020 02:06:42;U83.OPTIC421.F_CV;70.000000000;100.0 +25/10/2020 02:06:47;U83.OPTIC421.F_CV;70.000000000;100.0 +25/10/2020 02:06:48;U83.OPTIC421.F_CV;51.000000000;100.0 +25/10/2020 02:06:49;U83.OPTIC421.F_CV;66.000000000;100.0 +25/10/2020 02:06:50;U83.OPTIC421.F_CV;85.000000000;100.0 +25/10/2020 02:06:51;U83.OPTIC421.F_CV;69.000000000;100.0 +25/10/2020 02:06:52;U83.OPTIC421.F_CV;51.000000000;100.0 +25/10/2020 02:06:53;U83.OPTIC421.F_CV;66.000000000;100.0 +25/10/2020 02:06:57;U83.OPTIC421.F_CV;66.000000000;100.0 +25/10/2020 02:06:58;U83.OPTIC421.F_CV;65.000000000;100.0 +25/10/2020 02:06:04;U83.OPTIC51.F_CV;52.000000000;100.0 +25/10/2020 02:06:05;U83.OPTIC51.F_CV;49.000000000;100.0 +25/10/2020 02:06:06;U83.OPTIC51.F_CV;54.000000000;100.0 +25/10/2020 02:06:07;U83.OPTIC51.F_CV;52.000000000;100.0 +25/10/2020 02:06:10;U83.OPTIC51.F_CV;50.000000000;100.0 +25/10/2020 02:06:11;U83.OPTIC51.F_CV;54.000000000;100.0 +25/10/2020 02:06:12;U83.OPTIC51.F_CV;50.000000000;100.0 +25/10/2020 02:06:14;U83.OPTIC51.F_CV;54.000000000;100.0 +25/10/2020 02:06:15;U83.OPTIC51.F_CV;50.000000000;100.0 +25/10/2020 02:06:16;U83.OPTIC51.F_CV;52.000000000;100.0 +25/10/2020 02:06:19;U83.OPTIC51.F_CV;54.000000000;100.0 +25/10/2020 02:06:20;U83.OPTIC51.F_CV;50.000000000;100.0 +25/10/2020 02:06:21;U83.OPTIC51.F_CV;52.000000000;100.0 +25/10/2020 02:06:25;U83.OPTIC51.F_CV;54.000000000;100.0 +25/10/2020 02:06:26;U83.OPTIC51.F_CV;50.000000000;100.0 +25/10/2020 02:06:27;U83.OPTIC51.F_CV;52.000000000;100.0 +25/10/2020 02:06:31;U83.OPTIC51.F_CV;52.000000000;100.0 +25/10/2020 02:06:32;U83.OPTIC51.F_CV;54.000000000;100.0 +25/10/2020 02:06:33;U83.OPTIC51.F_CV;50.000000000;100.0 +25/10/2020 02:06:34;U83.OPTIC51.F_CV;52.000000000;100.0 +25/10/2020 02:06:35;U83.OPTIC51.F_CV;50.000000000;100.0 +25/10/2020 02:06:36;U83.OPTIC51.F_CV;54.000000000;100.0 +25/10/2020 02:06:37;U83.OPTIC51.F_CV;50.000000000;100.0 +25/10/2020 02:06:38;U83.OPTIC51.F_CV;52.000000000;100.0 +25/10/2020 02:06:40;U83.OPTIC51.F_CV;54.000000000;100.0 +25/10/2020 02:06:41;U83.OPTIC51.F_CV;50.000000000;100.0 +25/10/2020 02:06:42;U83.OPTIC51.F_CV;54.000000000;100.0 +25/10/2020 02:06:44;U83.OPTIC51.F_CV;50.000000000;100.0 +25/10/2020 02:06:45;U83.OPTIC51.F_CV;54.000000000;100.0 +25/10/2020 02:06:46;U83.OPTIC51.F_CV;52.000000000;100.0 +25/10/2020 02:06:48;U83.OPTIC51.F_CV;50.000000000;100.0 +25/10/2020 02:06:49;U83.OPTIC51.F_CV;52.000000000;100.0 +25/10/2020 02:06:53;U83.OPTIC51.F_CV;54.000000000;100.0 +25/10/2020 02:06:54;U83.OPTIC51.F_CV;50.000000000;100.0 +25/10/2020 02:06:55;U83.OPTIC51.F_CV;52.000000000;100.0 +25/10/2020 02:06:05;U83.OPTIC53.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U83.OPTIC54.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U83.PI_P100.F_CV;11.000000000;100.0 +25/10/2020 02:06:11;U83.PI_P100.F_CV;10.000000000;100.0 +25/10/2020 02:06:20;U83.PI_P200.F_CV;-7.000000000;100.0 +25/10/2020 02:06:41;U83.PI_P200.F_CV;-6.000000000;100.0 +25/10/2020 02:06:45;U83.PI_P200.F_CV;-7.000000000;100.0 +25/10/2020 02:06:18;U83.PI_P300.F_CV;5.000000000;100.0 +25/10/2020 02:06:23;U83.PI_P300.F_CV;6.000000000;100.0 +25/10/2020 02:06:42;U83.PI_P300.F_CV;5.000000000;100.0 +25/10/2020 02:06:52;U83.PI_P300.F_CV;6.000000000;100.0 +25/10/2020 02:06:05;U83.PI_P400.F_CV;-2.000000000;100.0 +25/10/2020 02:06:10;U83.PI_P400.F_CV;-3.000000000;100.0 +25/10/2020 02:06:48;U83.PI_P400.F_CV;-2.000000000;100.0 +25/10/2020 02:06:53;U83.PI_P400.F_CV;-3.000000000;100.0 +25/10/2020 02:06:05;U83.PT11.F_CV;59.599952698;100.0 +25/10/2020 02:06:16;U83.PT132.F_CV;12.099950790;100.0 +25/10/2020 02:06:08;U83.PT21.F_CV;53.899951935;100.0 +25/10/2020 02:06:16;U83.PT232.F_CV;11.899950981;100.0 +25/10/2020 02:06:16;U83.PT332.F_CV;11.899950981;100.0 +25/10/2020 02:06:29;U83.PT432.F_CV;11.799951553;100.0 +25/10/2020 02:06:29;U83.PT61.F_CV;11.899950981;100.0 +25/10/2020 02:06:05;U83.PT71.F_CV;12.099950790;100.0 +25/10/2020 02:06:05;U83.TI100.F_CV;33.769992828;100.0 +25/10/2020 02:06:03;U83.TI101.F_CV;419.899963379;100.0 +25/10/2020 02:06:07;U83.TI101.F_CV;417.599945068;100.0 +25/10/2020 02:06:11;U83.TI101.F_CV;416.999938965;100.0 +25/10/2020 02:06:14;U83.TI101.F_CV;417.599945068;100.0 +25/10/2020 02:06:32;U83.TI101.F_CV;416.699951172;100.0 +25/10/2020 02:06:37;U83.TI101.F_CV;417.499938965;100.0 +25/10/2020 02:06:41;U83.TI101.F_CV;416.999938965;100.0 +25/10/2020 02:06:44;U83.TI101.F_CV;418.599945068;100.0 +25/10/2020 02:06:45;U83.TI101.F_CV;419.799957275;100.0 +25/10/2020 02:06:46;U83.TI101.F_CV;420.299957275;100.0 +25/10/2020 02:06:52;U83.TI101.F_CV;417.999938965;100.0 +25/10/2020 02:06:57;U83.TI101.F_CV;420.499938965;100.0 +25/10/2020 02:06:58;U83.TI101.F_CV;421.499938965;100.0 +25/10/2020 02:06:04;U83.TI102.F_CV;398.899963379;100.0 +25/10/2020 02:06:10;U83.TI102.F_CV;400.999938965;100.0 +25/10/2020 02:06:12;U83.TI102.F_CV;402.699951172;100.0 +25/10/2020 02:06:21;U83.TI102.F_CV;403.699951172;100.0 +25/10/2020 02:06:24;U83.TI102.F_CV;405.599945068;100.0 +25/10/2020 02:06:29;U83.TI102.F_CV;404.599945068;100.0 +25/10/2020 02:06:30;U83.TI102.F_CV;403.899963379;100.0 +25/10/2020 02:06:35;U83.TI102.F_CV;405.299957275;100.0 +25/10/2020 02:06:38;U83.TI102.F_CV;403.899963379;100.0 +25/10/2020 02:06:40;U83.TI102.F_CV;404.699951172;100.0 +25/10/2020 02:06:41;U83.TI102.F_CV;404.199951172;100.0 +25/10/2020 02:06:44;U83.TI102.F_CV;405.599945068;100.0 +25/10/2020 02:06:51;U83.TI102.F_CV;404.599945068;100.0 +25/10/2020 02:06:53;U83.TI102.F_CV;405.699951172;100.0 +25/10/2020 02:06:58;U83.TI102.F_CV;406.699951172;100.0 +25/10/2020 02:06:02;U83.TI103.F_CV;418.999938965;100.0 +25/10/2020 02:06:05;U83.TI103.F_CV;419.699951172;100.0 +25/10/2020 02:06:09;U83.TI103.F_CV;418.399963379;100.0 +25/10/2020 02:06:13;U83.TI103.F_CV;419.099945068;100.0 +25/10/2020 02:06:15;U83.TI103.F_CV;420.699951172;100.0 +25/10/2020 02:06:30;U83.TI103.F_CV;418.999938965;100.0 +25/10/2020 02:06:35;U83.TI103.F_CV;420.799957275;100.0 +25/10/2020 02:06:40;U83.TI103.F_CV;420.199951172;100.0 +25/10/2020 02:06:41;U83.TI103.F_CV;419.499938965;100.0 +25/10/2020 02:06:46;U83.TI103.F_CV;419.899963379;100.0 +25/10/2020 02:06:49;U83.TI103.F_CV;419.399963379;100.0 +25/10/2020 02:06:53;U83.TI103.F_CV;419.899963379;100.0 +25/10/2020 02:06:56;U83.TI103.F_CV;423.299957275;100.0 +25/10/2020 02:06:14;U83.TI104.F_CV;399.799957275;100.0 +25/10/2020 02:06:24;U83.TI105.F_CV;399.199951172;100.0 +25/10/2020 02:06:05;U83.TI105_6.F_CV;399.799957275;100.0 +25/10/2020 02:06:36;U83.TI106.F_CV;399.799957275;100.0 +25/10/2020 02:06:50;U83.TI107.F_CV;399.799957275;100.0 +25/10/2020 02:06:04;U83.TI108.F_CV;250.299957275;100.0 +25/10/2020 02:06:25;U83.TI108.F_CV;249.499954224;100.0 +25/10/2020 02:06:35;U83.TI108.F_CV;250.299957275;100.0 +25/10/2020 02:06:38;U83.TI108.F_CV;250.899948120;100.0 +25/10/2020 02:06:50;U83.TI108.F_CV;249.999954224;100.0 +25/10/2020 02:06:54;U83.TI108.F_CV;249.199951172;100.0 +25/10/2020 02:06:52;U83.TI121.F_CV;230.099945068;100.0 +25/10/2020 02:06:03;U83.TI201.F_CV;422.599945068;100.0 +25/10/2020 02:06:09;U83.TI201.F_CV;423.299957275;100.0 +25/10/2020 02:06:19;U83.TI201.F_CV;422.399963379;100.0 +25/10/2020 02:06:20;U83.TI201.F_CV;422.899963379;100.0 +25/10/2020 02:06:24;U83.TI201.F_CV;422.499938965;100.0 +25/10/2020 02:06:28;U83.TI201.F_CV;423.699951172;100.0 +25/10/2020 02:06:29;U83.TI201.F_CV;424.499938965;100.0 +25/10/2020 02:06:33;U83.TI201.F_CV;423.099945068;100.0 +25/10/2020 02:06:37;U83.TI201.F_CV;422.499938965;100.0 +25/10/2020 02:06:41;U83.TI201.F_CV;423.199951172;100.0 +25/10/2020 02:06:47;U83.TI201.F_CV;422.299957275;100.0 +25/10/2020 02:06:50;U83.TI201.F_CV;423.899963379;100.0 +25/10/2020 02:06:51;U83.TI201.F_CV;424.899963379;100.0 +25/10/2020 02:06:55;U83.TI201.F_CV;422.599945068;100.0 +25/10/2020 02:06:22;U83.TI202.F_CV;397.199951172;100.0 +25/10/2020 02:06:25;U83.TI202.F_CV;397.999938965;100.0 +25/10/2020 02:06:27;U83.TI202.F_CV;399.399963379;100.0 +25/10/2020 02:06:35;U83.TI202.F_CV;396.999938965;100.0 +25/10/2020 02:06:41;U83.TI202.F_CV;396.599945068;100.0 +25/10/2020 02:06:02;U83.TI203.F_CV;428.099945068;100.0 +25/10/2020 02:06:07;U83.TI203.F_CV;426.399963379;100.0 +25/10/2020 02:06:08;U83.TI203.F_CV;426.999938965;100.0 +25/10/2020 02:06:11;U83.TI203.F_CV;431.099945068;100.0 +25/10/2020 02:06:16;U83.TI203.F_CV;434.599945068;100.0 +25/10/2020 02:06:17;U83.TI203.F_CV;435.399963379;100.0 +25/10/2020 02:06:19;U83.TI203.F_CV;435.999938965;100.0 +25/10/2020 02:06:23;U83.TI203.F_CV;434.699951172;100.0 +25/10/2020 02:06:29;U83.TI203.F_CV;436.799957275;100.0 +25/10/2020 02:06:32;U83.TI203.F_CV;436.199951172;100.0 +25/10/2020 02:06:38;U83.TI203.F_CV;437.399963379;100.0 +25/10/2020 02:06:41;U83.TI203.F_CV;435.899963379;100.0 +25/10/2020 02:06:43;U83.TI203.F_CV;436.699951172;100.0 +25/10/2020 02:06:45;U83.TI203.F_CV;435.099945068;100.0 +25/10/2020 02:06:48;U83.TI203.F_CV;436.799957275;100.0 +25/10/2020 02:06:50;U83.TI203.F_CV;437.299957275;100.0 +25/10/2020 02:06:54;U83.TI203.F_CV;437.299957275;100.0 +25/10/2020 02:06:57;U83.TI203.F_CV;432.899963379;100.0 +25/10/2020 02:06:48;U83.TI204.F_CV;399.999938965;100.0 +25/10/2020 02:06:25;U83.TI205.F_CV;399.299957275;100.0 +25/10/2020 02:06:05;U83.TI205_6.F_CV;399.999938965;100.0 +25/10/2020 02:06:10;U83.TI206.F_CV;399.999938965;100.0 +25/10/2020 02:06:57;U83.TI207.F_CV;399.999938965;100.0 +25/10/2020 02:06:58;U83.TI208.F_CV;249.999954224;100.0 +25/10/2020 02:06:25;U83.TI221.F_CV;229.899948120;100.0 +25/10/2020 02:06:04;U83.TI301.F_CV;422.399963379;100.0 +25/10/2020 02:06:17;U83.TI301.F_CV;424.999938965;100.0 +25/10/2020 02:06:22;U83.TI301.F_CV;427.999938965;100.0 +25/10/2020 02:06:24;U83.TI301.F_CV;427.399963379;100.0 +25/10/2020 02:06:28;U83.TI301.F_CV;429.099945068;100.0 +25/10/2020 02:06:32;U83.TI301.F_CV;427.799957275;100.0 +25/10/2020 02:06:34;U83.TI301.F_CV;428.599945068;100.0 +25/10/2020 02:06:35;U83.TI301.F_CV;427.599945068;100.0 +25/10/2020 02:06:39;U83.TI301.F_CV;428.599945068;100.0 +25/10/2020 02:06:40;U83.TI301.F_CV;427.599945068;100.0 +25/10/2020 02:06:50;U83.TI301.F_CV;429.299957275;100.0 +25/10/2020 02:06:51;U83.TI301.F_CV;429.999938965;100.0 +25/10/2020 02:06:56;U83.TI301.F_CV;428.899963379;100.0 +25/10/2020 02:06:57;U83.TI301.F_CV;429.499938965;100.0 +25/10/2020 02:06:58;U83.TI301.F_CV;428.599945068;100.0 +25/10/2020 02:06:46;U83.TI302.F_CV;398.799957275;100.0 +25/10/2020 02:06:00;U83.TI303.F_CV;419.999938965;100.0 +25/10/2020 02:06:04;U83.TI303.F_CV;419.199951172;100.0 +25/10/2020 02:06:08;U83.TI303.F_CV;421.299957275;100.0 +25/10/2020 02:06:11;U83.TI303.F_CV;421.699951172;100.0 +25/10/2020 02:06:16;U83.TI303.F_CV;420.499938965;100.0 +25/10/2020 02:06:17;U83.TI303.F_CV;419.999938965;100.0 +25/10/2020 02:06:21;U83.TI303.F_CV;420.399963379;100.0 +25/10/2020 02:06:23;U83.TI303.F_CV;419.499938965;100.0 +25/10/2020 02:06:26;U83.TI303.F_CV;420.499938965;100.0 +25/10/2020 02:06:27;U83.TI303.F_CV;421.299957275;100.0 +25/10/2020 02:06:31;U83.TI303.F_CV;419.699951172;100.0 +25/10/2020 02:06:33;U83.TI303.F_CV;418.499938965;100.0 +25/10/2020 02:06:37;U83.TI303.F_CV;421.299957275;100.0 +25/10/2020 02:06:39;U83.TI303.F_CV;420.699951172;100.0 +25/10/2020 02:06:41;U83.TI303.F_CV;421.399963379;100.0 +25/10/2020 02:06:43;U83.TI303.F_CV;422.899963379;100.0 +25/10/2020 02:06:44;U83.TI303.F_CV;422.399963379;100.0 +25/10/2020 02:06:46;U83.TI303.F_CV;422.799957275;100.0 +25/10/2020 02:06:51;U83.TI303.F_CV;425.699951172;100.0 +25/10/2020 02:06:53;U83.TI303.F_CV;424.899963379;100.0 +25/10/2020 02:06:57;U83.TI303.F_CV;425.299957275;100.0 +25/10/2020 02:06:44;U83.TI304.F_CV;399.799957275;100.0 +25/10/2020 02:06:15;U83.TI305.F_CV;398.199951172;100.0 +25/10/2020 02:06:08;U83.TI305_6.F_CV;401.099945068;100.0 +25/10/2020 02:06:05;U83.TI306.F_CV;401.099945068;100.0 +25/10/2020 02:06:45;U83.TI307.F_CV;399.999938965;100.0 +25/10/2020 02:06:17;U83.TI308.F_CV;249.999954224;100.0 +25/10/2020 02:06:30;U83.TI308.F_CV;251.199951172;100.0 +25/10/2020 02:06:56;U83.TI308.F_CV;250.399948120;100.0 +25/10/2020 02:06:33;U83.TI321.F_CV;229.999954224;100.0 +25/10/2020 02:06:02;U83.TI401.F_CV;431.599945068;100.0 +25/10/2020 02:06:10;U83.TI401.F_CV;432.699951172;100.0 +25/10/2020 02:06:11;U83.TI401.F_CV;433.199951172;100.0 +25/10/2020 02:06:13;U83.TI401.F_CV;431.599945068;100.0 +25/10/2020 02:06:15;U83.TI401.F_CV;432.199951172;100.0 +25/10/2020 02:06:18;U83.TI401.F_CV;431.499938965;100.0 +25/10/2020 02:06:22;U83.TI401.F_CV;432.899963379;100.0 +25/10/2020 02:06:23;U83.TI401.F_CV;433.499938965;100.0 +25/10/2020 02:06:28;U83.TI401.F_CV;432.699951172;100.0 +25/10/2020 02:06:31;U83.TI401.F_CV;431.799957275;100.0 +25/10/2020 02:06:32;U83.TI401.F_CV;432.999938965;100.0 +25/10/2020 02:06:34;U83.TI401.F_CV;432.099945068;100.0 +25/10/2020 02:06:42;U83.TI401.F_CV;433.099945068;100.0 +25/10/2020 02:06:45;U83.TI401.F_CV;432.599945068;100.0 +25/10/2020 02:06:48;U83.TI401.F_CV;431.199951172;100.0 +25/10/2020 02:06:51;U83.TI401.F_CV;430.599945068;100.0 +25/10/2020 02:06:55;U83.TI401.F_CV;431.599945068;100.0 +25/10/2020 02:06:56;U83.TI401.F_CV;432.299957275;100.0 +25/10/2020 02:06:59;U83.TI401.F_CV;432.699951172;100.0 +25/10/2020 02:06:00;U83.TI402.F_CV;399.899963379;100.0 +25/10/2020 02:06:04;U83.TI402.F_CV;399.099945068;100.0 +25/10/2020 02:06:07;U83.TI402.F_CV;399.699951172;100.0 +25/10/2020 02:06:11;U83.TI402.F_CV;399.299957275;100.0 +25/10/2020 02:06:18;U83.TI402.F_CV;401.399963379;100.0 +25/10/2020 02:06:20;U83.TI402.F_CV;400.699951172;100.0 +25/10/2020 02:06:34;U83.TI402.F_CV;398.399963379;100.0 +25/10/2020 02:06:02;U83.TI403.F_CV;436.099945068;100.0 +25/10/2020 02:06:04;U83.TI403.F_CV;437.199951172;100.0 +25/10/2020 02:06:07;U83.TI403.F_CV;436.399963379;100.0 +25/10/2020 02:06:08;U83.TI403.F_CV;435.299957275;100.0 +25/10/2020 02:06:11;U83.TI403.F_CV;436.599945068;100.0 +25/10/2020 02:06:12;U83.TI403.F_CV;435.999938965;100.0 +25/10/2020 02:06:13;U83.TI403.F_CV;436.399963379;100.0 +25/10/2020 02:06:15;U83.TI403.F_CV;435.899963379;100.0 +25/10/2020 02:06:20;U83.TI403.F_CV;436.299957275;100.0 +25/10/2020 02:06:39;U83.TI403.F_CV;431.799957275;100.0 +25/10/2020 02:06:41;U83.TI403.F_CV;432.899963379;100.0 +25/10/2020 02:06:43;U83.TI403.F_CV;432.099945068;100.0 +25/10/2020 02:06:45;U83.TI403.F_CV;432.599945068;100.0 +25/10/2020 02:06:48;U83.TI403.F_CV;434.299957275;100.0 +25/10/2020 02:06:51;U83.TI403.F_CV;434.899963379;100.0 +25/10/2020 02:06:56;U83.TI403.F_CV;433.699951172;100.0 +25/10/2020 02:06:59;U83.TI404.F_CV;400.099945068;100.0 +25/10/2020 02:06:05;U83.TI405.F_CV;397.699951172;100.0 +25/10/2020 02:06:05;U83.TI405_6.F_CV;399.999938965;100.0 +25/10/2020 02:06:08;U83.TI406.F_CV;400.099945068;100.0 +25/10/2020 02:06:54;U83.TI407.F_CV;399.999938965;100.0 +25/10/2020 02:06:01;U83.TI408.F_CV;249.899948120;100.0 +25/10/2020 02:06:05;U83.TI408.F_CV;250.399948120;100.0 +25/10/2020 02:06:08;U83.TI408.F_CV;249.799957275;100.0 +25/10/2020 02:06:12;U83.TI408.F_CV;250.399948120;100.0 +25/10/2020 02:06:16;U83.TI408.F_CV;249.799957275;100.0 +25/10/2020 02:06:18;U83.TI408.F_CV;250.199951172;100.0 +25/10/2020 02:06:23;U83.TI408.F_CV;249.699951172;100.0 +25/10/2020 02:06:26;U83.TI408.F_CV;250.499954224;100.0 +25/10/2020 02:06:30;U83.TI408.F_CV;249.999954224;100.0 +25/10/2020 02:06:46;U83.TI408.F_CV;250.399948120;100.0 +25/10/2020 02:06:48;U83.TI408.F_CV;249.999954224;100.0 +25/10/2020 02:06:49;U83.TI42.F_CV;21.399951935;100.0 +25/10/2020 02:06:59;U83.TI421.F_CV;230.099945068;100.0 +25/10/2020 02:06:37;U83.TI50.F_CV;21.599950790;100.0 +25/10/2020 02:06:35;U83.TI51.F_CV;229.999954224;100.0 +25/10/2020 02:06:27;U83.TI52.F_CV;230.399948120;100.0 +25/10/2020 02:06:00;U83.TI53.F_CV;22.499950409;100.0 +25/10/2020 02:06:49;U83.TI54.F_CV;22.099950790;100.0 +25/10/2020 02:06:05;U83.UV72.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.AI01_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;U841.AI01B_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;U841.AI_CO.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.AI_CO2.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.AI_O2.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.ATI01_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;U841.FC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.FC02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.FC03_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.FC04_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.FC08_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.FI01.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.FI02.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.FI03.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.FI04.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.FI05.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.FI06.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.LC02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.LI01.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.LI02.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.PC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.PC03_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.PDI02.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.PI01.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.PI03.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TC11_OP_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;U841.TC11_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TC12_OP_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;U841.TC12_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TC13_OP_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;U841.TC13_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TC14_OP_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;U841.TC14_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TC15_OP_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;U841.TC15_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TC16_OP_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;U841.TC16_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TC40_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;U841.TC42_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;U841.TC43_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TC44_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI01.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI02.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI11.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI12.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI13.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI14.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI15.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI16.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI22.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI23.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI24.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI25.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI26.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI32.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI33.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI34.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI35.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI36.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI40.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI41.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI42.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;U841.TI43.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI44.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI45.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI46.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI47.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI48.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI50.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;U841.TI51.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;U841.TI55.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI56.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI57.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.TI58.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U841.U841_COEF_A_FQ05_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U841.U841_COEF_A_FQ06_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U841.U841_COEF_A_FT02_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U841.U841_COEF_A_FT03_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U841.U841_COEF_A_TT11_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U841.U841_COEF_A_TT12_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U841.U841_COEF_A_TT13_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U841.U841_COEF_A_TT14_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U841.U841_COEF_A_TT15_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U841.U841_COEF_A_TT16_MES.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.U841_COEF_B_FQ05_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;U841.U841_COEF_B_FQ06_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:01;U841.U841_COEF_B_FT02_MES.F_CV;0.000152590;100.0 +25/10/2020 02:06:01;U841.U841_COEF_B_FT03_MES.F_CV;0.000152590;100.0 +25/10/2020 02:06:48;U841.U841_COEF_B_TT11_MES.F_CV;0.000152590;100.0 +25/10/2020 02:06:48;U841.U841_COEF_B_TT12_MES.F_CV;0.000152590;100.0 +25/10/2020 02:06:48;U841.U841_COEF_B_TT13_MES.F_CV;0.000152590;100.0 +25/10/2020 02:06:48;U841.U841_COEF_B_TT14_MES.F_CV;0.000152590;100.0 +25/10/2020 02:06:48;U841.U841_COEF_B_TT15_MES.F_CV;0.000152590;100.0 +25/10/2020 02:06:48;U841.U841_COEF_B_TT16_MES.F_CV;0.000152590;100.0 +25/10/2020 02:06:48;U841.WI01.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.WI02.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U841.WI03.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;U841.WI03_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;U841.WI04_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:01;U842.FC1_PV.F_CV;26.321708679;100.0 +25/10/2020 02:06:03;U842.FC1_PV.F_CV;28.916254044;100.0 +25/10/2020 02:06:06;U842.FC1_PV.F_CV;32.374134064;100.0 +25/10/2020 02:06:07;U842.FC1_PV.F_CV;33.276153564;100.0 +25/10/2020 02:06:10;U842.FC1_PV.F_CV;33.499343872;100.0 +25/10/2020 02:06:11;U842.FC1_PV.F_CV;29.674270630;100.0 +25/10/2020 02:06:13;U842.FC1_PV.F_CV;27.257850647;100.0 +25/10/2020 02:06:14;U842.FC1_PV.F_CV;25.703504562;100.0 +25/10/2020 02:06:16;U842.FC1_PV.F_CV;27.397684097;100.0 +25/10/2020 02:06:18;U842.FC1_PV.F_CV;31.278450012;100.0 +25/10/2020 02:06:20;U842.FC1_PV.F_CV;32.422290802;100.0 +25/10/2020 02:06:21;U842.FC1_PV.F_CV;33.411033630;100.0 +25/10/2020 02:06:23;U842.FC1_PV.F_CV;30.736009598;100.0 +25/10/2020 02:06:25;U842.FC1_PV.F_CV;27.865413666;100.0 +25/10/2020 02:06:27;U842.FC1_PV.F_CV;26.615810394;100.0 +25/10/2020 02:06:31;U842.FC1_PV.F_CV;29.049299240;100.0 +25/10/2020 02:06:32;U842.FC1_PV.F_CV;31.916879654;100.0 +25/10/2020 02:06:33;U842.FC1_PV.F_CV;34.573379517;100.0 +25/10/2020 02:06:34;U842.FC1_PV.F_CV;34.802753448;100.0 +25/10/2020 02:06:37;U842.FC1_PV.F_CV;30.628982544;100.0 +25/10/2020 02:06:39;U842.FC1_PV.F_CV;28.042409897;100.0 +25/10/2020 02:06:40;U842.FC1_PV.F_CV;25.537452698;100.0 +25/10/2020 02:06:42;U842.FC1_PV.F_CV;27.048788071;100.0 +25/10/2020 02:06:43;U842.FC1_PV.F_CV;31.323324203;100.0 +25/10/2020 02:06:46;U842.FC1_PV.F_CV;33.195526123;100.0 +25/10/2020 02:06:47;U842.FC1_PV.F_CV;34.342468262;100.0 +25/10/2020 02:06:50;U842.FC1_PV.F_CV;30.808767319;100.0 +25/10/2020 02:06:51;U842.FC1_PV.F_CV;28.042106628;100.0 +25/10/2020 02:06:53;U842.FC1_PV.F_CV;25.751337051;100.0 +25/10/2020 02:06:54;U842.FC1_PV.F_CV;26.383703232;100.0 +25/10/2020 02:06:57;U842.FC1_PV.F_CV;30.906335831;100.0 +25/10/2020 02:06:58;U842.FC1_PV.F_CV;32.949069977;100.0 +25/10/2020 02:06:08;U842.FC2_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U842.FC2_PV.F_CV;1.532524586;100.0 +25/10/2020 02:06:03;U842.FC2_PV.F_CV;2.013849020;100.0 +25/10/2020 02:06:05;U842.FC2_PV.F_CV;1.560639620;100.0 +25/10/2020 02:06:07;U842.FC2_PV.F_CV;2.053690672;100.0 +25/10/2020 02:06:12;U842.FC2_PV.F_CV;1.673407912;100.0 +25/10/2020 02:06:21;U842.FC2_PV.F_CV;1.938450694;100.0 +25/10/2020 02:06:27;U842.FC2_PV.F_CV;1.589049816;100.0 +25/10/2020 02:06:30;U842.FC2_PV.F_CV;2.045684576;100.0 +25/10/2020 02:06:32;U842.FC2_PV.F_CV;1.655797482;100.0 +25/10/2020 02:06:34;U842.FC2_PV.F_CV;2.034844398;100.0 +25/10/2020 02:06:35;U842.FC2_PV.F_CV;1.783691287;100.0 +25/10/2020 02:06:39;U842.FC2_PV.F_CV;1.990368366;100.0 +25/10/2020 02:06:43;U842.FC2_PV.F_CV;1.537159085;100.0 +25/10/2020 02:06:45;U842.FC2_PV.F_CV;1.844864249;100.0 +25/10/2020 02:06:47;U842.FC2_PV.F_CV;1.584120035;100.0 +25/10/2020 02:06:53;U842.FC2_PV.F_CV;1.584120035;100.0 +25/10/2020 02:06:54;U842.FC2_PV.F_CV;1.984498382;100.0 +25/10/2020 02:06:59;U842.FC2_PV.F_CV;1.984498382;100.0 +25/10/2020 02:06:22;U842.FC3_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U842.FC3_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U842.FC4_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U842.FC5_PV.F_CV;-5.001945496;100.0 +25/10/2020 02:06:52;U842.FI03A_MES.F_CV;0.000000000;0.0 +25/10/2020 02:06:03;U842.FI7_PV.F_CV;27.868251801;100.0 +25/10/2020 02:06:10;U842.FI7_PV.F_CV;28.708061218;100.0 +25/10/2020 02:06:13;U842.FI7_PV.F_CV;29.454650879;100.0 +25/10/2020 02:06:17;U842.FI7_PV.F_CV;31.418270111;100.0 +25/10/2020 02:06:18;U842.FI7_PV.F_CV;32.452735901;100.0 +25/10/2020 02:06:20;U842.FI7_PV.F_CV;33.370407104;100.0 +25/10/2020 02:06:24;U842.FI7_PV.F_CV;32.877368927;100.0 +25/10/2020 02:06:26;U842.FI7_PV.F_CV;31.946899414;100.0 +25/10/2020 02:06:27;U842.FI7_PV.F_CV;30.724960327;100.0 +25/10/2020 02:06:29;U842.FI7_PV.F_CV;29.537078857;100.0 +25/10/2020 02:06:30;U842.FI7_PV.F_CV;29.343297958;100.0 +25/10/2020 02:06:37;U842.FI7_PV.F_CV;30.392734528;100.0 +25/10/2020 02:06:42;U842.FI7_PV.F_CV;32.022075653;100.0 +25/10/2020 02:06:45;U842.FI7_PV.F_CV;31.647958755;100.0 +25/10/2020 02:06:47;U842.FI7_PV.F_CV;30.752969742;100.0 +25/10/2020 02:06:48;U842.FI7_PV.F_CV;30.492765427;100.0 +25/10/2020 02:06:52;U842.FI7_PV.F_CV;31.522014618;100.0 +25/10/2020 02:06:53;U842.FI7_PV.F_CV;32.484741211;100.0 +25/10/2020 02:06:59;U842.FI7_PV.F_CV;34.532073975;100.0 +25/10/2020 02:06:38;U842.FQ1.F_CV;371141.000000000;100.0 +25/10/2020 02:06:29;U842.FQ2.F_CV;552179.000000000;100.0 +25/10/2020 02:06:21;U842.FQ3.F_CV;303225.000000000;100.0 +25/10/2020 02:06:52;U842.FQ5.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U842.FQ7.F_CV;456667.000000000;100.0 +25/10/2020 02:06:00;U842.FQ7_PV.F_CV;456667.000000000;100.0 +25/10/2020 02:06:01;U842.FT1.F_CV;26.321708679;100.0 +25/10/2020 02:06:03;U842.FT1.F_CV;28.916254044;100.0 +25/10/2020 02:06:06;U842.FT1.F_CV;32.374134064;100.0 +25/10/2020 02:06:07;U842.FT1.F_CV;33.276153564;100.0 +25/10/2020 02:06:10;U842.FT1.F_CV;33.499343872;100.0 +25/10/2020 02:06:11;U842.FT1.F_CV;29.674270630;100.0 +25/10/2020 02:06:13;U842.FT1.F_CV;27.257850647;100.0 +25/10/2020 02:06:14;U842.FT1.F_CV;25.703504562;100.0 +25/10/2020 02:06:16;U842.FT1.F_CV;27.397684097;100.0 +25/10/2020 02:06:18;U842.FT1.F_CV;31.278450012;100.0 +25/10/2020 02:06:20;U842.FT1.F_CV;32.422290802;100.0 +25/10/2020 02:06:21;U842.FT1.F_CV;33.411033630;100.0 +25/10/2020 02:06:25;U842.FT1.F_CV;27.865413666;100.0 +25/10/2020 02:06:27;U842.FT1.F_CV;26.615810394;100.0 +25/10/2020 02:06:31;U842.FT1.F_CV;29.049299240;100.0 +25/10/2020 02:06:33;U842.FT1.F_CV;34.573379517;100.0 +25/10/2020 02:06:34;U842.FT1.F_CV;34.802753448;100.0 +25/10/2020 02:06:39;U842.FT1.F_CV;28.042409897;100.0 +25/10/2020 02:06:40;U842.FT1.F_CV;25.537452698;100.0 +25/10/2020 02:06:42;U842.FT1.F_CV;27.048788071;100.0 +25/10/2020 02:06:43;U842.FT1.F_CV;31.323324203;100.0 +25/10/2020 02:06:46;U842.FT1.F_CV;33.195526123;100.0 +25/10/2020 02:06:47;U842.FT1.F_CV;34.342468262;100.0 +25/10/2020 02:06:50;U842.FT1.F_CV;30.808767319;100.0 +25/10/2020 02:06:51;U842.FT1.F_CV;28.042106628;100.0 +25/10/2020 02:06:53;U842.FT1.F_CV;25.751337051;100.0 +25/10/2020 02:06:54;U842.FT1.F_CV;26.383703232;100.0 +25/10/2020 02:06:57;U842.FT1.F_CV;30.906335831;100.0 +25/10/2020 02:06:58;U842.FT1.F_CV;32.949069977;100.0 +25/10/2020 02:06:00;U842.FT2.F_CV;1.532524586;100.0 +25/10/2020 02:06:03;U842.FT2.F_CV;2.013849020;100.0 +25/10/2020 02:06:05;U842.FT2.F_CV;1.560639620;100.0 +25/10/2020 02:06:07;U842.FT2.F_CV;2.053690672;100.0 +25/10/2020 02:06:12;U842.FT2.F_CV;1.673407912;100.0 +25/10/2020 02:06:21;U842.FT2.F_CV;1.938450694;100.0 +25/10/2020 02:06:27;U842.FT2.F_CV;1.589049816;100.0 +25/10/2020 02:06:30;U842.FT2.F_CV;2.045684576;100.0 +25/10/2020 02:06:32;U842.FT2.F_CV;1.655797482;100.0 +25/10/2020 02:06:34;U842.FT2.F_CV;2.034844398;100.0 +25/10/2020 02:06:35;U842.FT2.F_CV;1.783691287;100.0 +25/10/2020 02:06:39;U842.FT2.F_CV;1.990368366;100.0 +25/10/2020 02:06:43;U842.FT2.F_CV;1.537159085;100.0 +25/10/2020 02:06:45;U842.FT2.F_CV;1.844864249;100.0 +25/10/2020 02:06:47;U842.FT2.F_CV;1.584120035;100.0 +25/10/2020 02:06:53;U842.FT2.F_CV;1.584120035;100.0 +25/10/2020 02:06:54;U842.FT2.F_CV;1.984498382;100.0 +25/10/2020 02:06:59;U842.FT2.F_CV;1.984498382;100.0 +25/10/2020 02:06:29;U842.FT3.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U842.FT5.F_CV;-5.001945496;100.0 +25/10/2020 02:06:00;U842.FT7.F_CV;28.485677719;100.0 +25/10/2020 02:06:03;U842.FT7.F_CV;27.868251801;100.0 +25/10/2020 02:06:11;U842.FT7.F_CV;29.079334259;100.0 +25/10/2020 02:06:13;U842.FT7.F_CV;29.454650879;100.0 +25/10/2020 02:06:17;U842.FT7.F_CV;31.418270111;100.0 +25/10/2020 02:06:18;U842.FT7.F_CV;32.452735901;100.0 +25/10/2020 02:06:20;U842.FT7.F_CV;33.370407104;100.0 +25/10/2020 02:06:25;U842.FT7.F_CV;32.481430054;100.0 +25/10/2020 02:06:26;U842.FT7.F_CV;31.946899414;100.0 +25/10/2020 02:06:27;U842.FT7.F_CV;30.724960327;100.0 +25/10/2020 02:06:29;U842.FT7.F_CV;29.537078857;100.0 +25/10/2020 02:06:31;U842.FT7.F_CV;29.281717300;100.0 +25/10/2020 02:06:38;U842.FT7.F_CV;30.559619904;100.0 +25/10/2020 02:06:42;U842.FT7.F_CV;32.022075653;100.0 +25/10/2020 02:06:45;U842.FT7.F_CV;31.647958755;100.0 +25/10/2020 02:06:48;U842.FT7.F_CV;30.492765427;100.0 +25/10/2020 02:06:52;U842.FT7.F_CV;31.522014618;100.0 +25/10/2020 02:06:53;U842.FT7.F_CV;32.484741211;100.0 +25/10/2020 02:06:52;U842.LC1_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U842.LC1T_PV.F_CV;104.583381653;100.0 +25/10/2020 02:06:13;U842.LC1T_PV.F_CV;104.507865906;100.0 +25/10/2020 02:06:17;U842.LC1T_PV.F_CV;104.457527161;100.0 +25/10/2020 02:06:18;U842.LC1T_PV.F_CV;106.715110779;100.0 +25/10/2020 02:06:19;U842.LC1T_PV.F_CV;104.382034302;100.0 +25/10/2020 02:06:27;U842.LC1T_PV.F_CV;104.180671692;100.0 +25/10/2020 02:06:39;U842.LC1T_PV.F_CV;104.306510925;100.0 +25/10/2020 02:06:42;U842.LC1T_PV.F_CV;104.457527161;100.0 +25/10/2020 02:06:55;U842.LC1T_PV.F_CV;104.835075378;100.0 +25/10/2020 02:06:58;U842.LC1T_PV.F_CV;107.241287231;100.0 +25/10/2020 02:06:59;U842.LC1T_PV.F_CV;104.910575867;100.0 +25/10/2020 02:06:52;U842.LC2_PV.F_CV;-1.574614048;100.0 +25/10/2020 02:06:52;U842.LC3_PV.F_CV;105.093528748;100.0 +25/10/2020 02:06:52;U842.LT1.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;U842.LT2.F_CV;-1.574614048;100.0 +25/10/2020 02:06:52;U842.LT3.F_CV;105.093528748;100.0 +25/10/2020 02:06:00;U842.LT5.F_CV;75.928352356;100.0 +25/10/2020 02:06:02;U842.LT5.F_CV;75.535049438;100.0 +25/10/2020 02:06:03;U842.LT5.F_CV;75.679794312;100.0 +25/10/2020 02:06:05;U842.LT5.F_CV;75.500450134;100.0 +25/10/2020 02:06:07;U842.LT5.F_CV;75.802497864;100.0 +25/10/2020 02:06:09;U842.LT5.F_CV;75.865432739;100.0 +25/10/2020 02:06:12;U842.LT5.F_CV;75.548133850;100.0 +25/10/2020 02:06:15;U842.LT5.F_CV;75.387176514;100.0 +25/10/2020 02:06:17;U842.LT5.F_CV;75.713905334;100.0 +25/10/2020 02:06:20;U842.LT5.F_CV;75.820892334;100.0 +25/10/2020 02:06:24;U842.LT5.F_CV;75.549797058;100.0 +25/10/2020 02:06:26;U842.LT5.F_CV;75.752159119;100.0 +25/10/2020 02:06:30;U842.LT5.F_CV;75.441154480;100.0 +25/10/2020 02:06:32;U842.LT5.F_CV;75.554428101;100.0 +25/10/2020 02:06:33;U842.LT5.F_CV;75.831298828;100.0 +25/10/2020 02:06:38;U842.LT5.F_CV;75.774177551;100.0 +25/10/2020 02:06:40;U842.LT5.F_CV;75.544487000;100.0 +25/10/2020 02:06:43;U842.LT5.F_CV;75.367805481;100.0 +25/10/2020 02:06:47;U842.LT5.F_CV;75.739578247;100.0 +25/10/2020 02:06:49;U842.LT5.F_CV;75.585403442;100.0 +25/10/2020 02:06:51;U842.LT5.F_CV;75.827667236;100.0 +25/10/2020 02:06:53;U842.LT5.F_CV;75.743202209;100.0 +25/10/2020 02:06:56;U842.LT5.F_CV;75.411842346;100.0 +25/10/2020 02:06:59;U842.LT5.F_CV;75.543998718;100.0 +25/10/2020 02:06:30;U842.PC7_PV.F_CV;28.924581528;100.0 +25/10/2020 02:06:18;U842.PC9_PV.F_CV;4.886198521;100.0 +25/10/2020 02:06:23;U842.PC9_PV.F_CV;5.054805279;100.0 +25/10/2020 02:06:24;U842.PC9_PV.F_CV;5.171719074;100.0 +25/10/2020 02:06:38;U842.PC9_PV.F_CV;4.889589787;100.0 +25/10/2020 02:06:42;U842.PC9_PV.F_CV;4.943108082;100.0 +25/10/2020 02:06:45;U842.PC9_PV.F_CV;5.201820850;100.0 +25/10/2020 02:06:53;U842.PC9_PV.F_CV;4.985841751;100.0 +25/10/2020 02:06:59;U842.PC9_PV.F_CV;4.929201603;100.0 +25/10/2020 02:06:30;U842.PT7.F_CV;28.924581528;100.0 +25/10/2020 02:06:18;U842.PT9.F_CV;4.886198521;100.0 +25/10/2020 02:06:23;U842.PT9.F_CV;5.054805279;100.0 +25/10/2020 02:06:24;U842.PT9.F_CV;5.171719074;100.0 +25/10/2020 02:06:38;U842.PT9.F_CV;4.889589787;100.0 +25/10/2020 02:06:42;U842.PT9.F_CV;4.943108082;100.0 +25/10/2020 02:06:45;U842.PT9.F_CV;5.201820850;100.0 +25/10/2020 02:06:53;U842.PT9.F_CV;4.985841751;100.0 +25/10/2020 02:06:59;U842.PT9.F_CV;4.929201603;100.0 +25/10/2020 02:06:52;U842.SC1OP.F_CV;5.000000000;100.0 +25/10/2020 02:06:52;U842.ST1.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;U842.TC18_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;U842.TC2.F_CV;0.000000000;0.0 +25/10/2020 02:06:17;U842.TC2_PV.F_CV;120.021087646;100.0 +25/10/2020 02:06:52;U842.TC8_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:41;U842.TI10_PV.F_CV;27.336505890;100.0 +25/10/2020 02:06:47;U842.TI10_PV.F_CV;27.236280441;100.0 +25/10/2020 02:06:35;U842.TI3_PV.F_CV;121.097457886;100.0 +25/10/2020 02:06:27;U842.TI4_PV.F_CV;120.546218872;100.0 +25/10/2020 02:06:25;U842.TI5_PV.F_CV;104.231002808;100.0 +25/10/2020 02:06:53;U842.TI5_PV.F_CV;104.784729004;100.0 +25/10/2020 02:06:12;U842.TI6_PV.F_CV;130.963119507;100.0 +25/10/2020 02:06:52;U842.TT1.F_CV;0.000000000;0.0 +25/10/2020 02:06:41;U842.TT10.F_CV;27.336505890;100.0 +25/10/2020 02:06:47;U842.TT10.F_CV;27.236280441;100.0 +25/10/2020 02:06:52;U842.TT11.F_CV;-99.999572754;100.0 +25/10/2020 02:06:52;U842.TT16.F_CV;-99.999572754;100.0 +25/10/2020 02:06:52;U842.TT17.F_CV;-99.999969482;100.0 +25/10/2020 02:06:52;U842.TT18.F_CV;0.000000000;0.0 +25/10/2020 02:06:17;U842.TT2.F_CV;120.021087646;100.0 +25/10/2020 02:06:42;U842.TT3.F_CV;121.122512817;100.0 +25/10/2020 02:06:14;U842.TT4.F_CV;120.471046448;100.0 +25/10/2020 02:06:51;U842.TT4.F_CV;120.671508789;100.0 +25/10/2020 02:06:23;U842.TT5.F_CV;104.256179810;100.0 +25/10/2020 02:06:58;U842.TT5.F_CV;104.910575867;100.0 +25/10/2020 02:06:12;U842.TT6.F_CV;130.963119507;100.0 +25/10/2020 02:06:52;U842.TT7.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U842.TT8.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;U842.TT9.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;U842.WI02_MES.F_CV;1751.300048828;100.0 +25/10/2020 02:06:44;U842.WI03_MES.F_CV;1203.900024414;100.0 +25/10/2020 02:06:55;U860.FC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U860.FC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U860.FC02_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U860.FC02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U860.FC03_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;U860.FC03_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:41;U860.FC04_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U860.FC04_PV.F_CV;5.491319180;100.0 +25/10/2020 02:06:57;U860.FC11_OP.F_CV;99.978637695;100.0 +25/10/2020 02:06:57;U860.FC11_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U860.FC11_SP.F_CV;100.000000000;100.0 +25/10/2020 02:06:56;U860.FI01_CA.F_CV;1.123800039;100.0 +25/10/2020 02:06:56;U860.FI01_CB.F_CV;-12.452500343;100.0 +25/10/2020 02:06:56;U860.FI02_CA.F_CV;1.128200054;100.0 +25/10/2020 02:06:56;U860.FI02_CB.F_CV;-7.961699963;100.0 +25/10/2020 02:06:53;U860.FI03_CA.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;U860.FI03_CB.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;U860.FI04_CA.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U860.FI04_CB.F_CV;-6.460999966;100.0 +25/10/2020 02:06:55;U860.FI06.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U860.FI06F.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U860.FI12.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U860.FI20.F_CV;6.440018654;100.0 +25/10/2020 02:06:05;U860.FQ01.F_CV;228725.000000000;100.0 +25/10/2020 02:06:12;U860.FQ02.F_CV;389358.000000000;100.0 +25/10/2020 02:06:53;U860.FQ03.F_CV;0.000000000;0.0 +25/10/2020 02:06:06;U860.FQ04.F_CV;394370.000000000;100.0 +25/10/2020 02:06:57;U860.FQ06.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U860.FQ06_CA.F_CV;1.000000000;100.0 +25/10/2020 02:06:57;U860.FQ06_CB.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U860.FQ20.F_CV;230146.000000000;100.0 +25/10/2020 02:06:57;U860.FQ20_COMPTEUR.F_CV;230146.000000000;100.0 +25/10/2020 02:06:53;U860.FY06.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;U860.LC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U860.LC02_PV.F_CV;100.000000000;100.0 +25/10/2020 02:06:04;U860.LC04_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U860.LCR01_OP.F_CV;224.933074951;100.0 +25/10/2020 02:06:36;U860.LCR01_PV.F_CV;214.931747437;100.0 +25/10/2020 02:06:43;U860.LCR01_PV.F_CV;214.862335205;100.0 +25/10/2020 02:06:53;U860.LI05.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;U860.LI11.F_CV;-0.150323808;100.0 +25/10/2020 02:06:27;U860.LI12.F_CV;-0.155867636;100.0 +25/10/2020 02:06:55;U860.PC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U860.PC01_PV.F_CV;29.450851440;100.0 +25/10/2020 02:06:15;U860.PC03_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:56;U860.PC03_PV.F_CV;0.030644774;100.0 +25/10/2020 02:06:00;U860.PC30_OP.F_CV;19.895015717;100.0 +25/10/2020 02:06:01;U860.PC30_OP.F_CV;19.699697495;100.0 +25/10/2020 02:06:02;U860.PC30_OP.F_CV;19.626453400;100.0 +25/10/2020 02:06:03;U860.PC30_OP.F_CV;19.724113464;100.0 +25/10/2020 02:06:05;U860.PC30_OP.F_CV;20.334482193;100.0 +25/10/2020 02:06:06;U860.PC30_OP.F_CV;19.626453400;100.0 +25/10/2020 02:06:07;U860.PC30_OP.F_CV;20.261238098;100.0 +25/10/2020 02:06:09;U860.PC30_OP.F_CV;19.772941589;100.0 +25/10/2020 02:06:12;U860.PC30_OP.F_CV;19.577623367;100.0 +25/10/2020 02:06:14;U860.PC30_OP.F_CV;19.846187592;100.0 +25/10/2020 02:06:15;U860.PC30_OP.F_CV;20.139163971;100.0 +25/10/2020 02:06:17;U860.PC30_OP.F_CV;19.797357559;100.0 +25/10/2020 02:06:18;U860.PC30_OP.F_CV;20.505386353;100.0 +25/10/2020 02:06:19;U860.PC30_OP.F_CV;20.676290512;100.0 +25/10/2020 02:06:20;U860.PC30_OP.F_CV;19.968259811;100.0 +25/10/2020 02:06:22;U860.PC30_OP.F_CV;19.772941589;100.0 +25/10/2020 02:06:24;U860.PC30_OP.F_CV;20.017089844;100.0 +25/10/2020 02:06:25;U860.PC30_OP.F_CV;19.724113464;100.0 +25/10/2020 02:06:26;U860.PC30_OP.F_CV;20.505386353;100.0 +25/10/2020 02:06:27;U860.PC30_OP.F_CV;19.602039337;100.0 +25/10/2020 02:06:28;U860.PC30_OP.F_CV;20.212408066;100.0 +25/10/2020 02:06:29;U860.PC30_OP.F_CV;20.017089844;100.0 +25/10/2020 02:06:30;U860.PC30_OP.F_CV;20.090333939;100.0 +25/10/2020 02:06:31;U860.PC30_OP.F_CV;20.432142258;100.0 +25/10/2020 02:06:32;U860.PC30_OP.F_CV;20.236824036;100.0 +25/10/2020 02:06:33;U860.PC30_OP.F_CV;20.383312225;100.0 +25/10/2020 02:06:34;U860.PC30_OP.F_CV;19.748527527;100.0 +25/10/2020 02:06:35;U860.PC30_OP.F_CV;20.505386353;100.0 +25/10/2020 02:06:36;U860.PC30_OP.F_CV;19.821771622;100.0 +25/10/2020 02:06:37;U860.PC30_OP.F_CV;20.480972290;100.0 +25/10/2020 02:06:38;U860.PC30_OP.F_CV;20.041505814;100.0 +25/10/2020 02:06:40;U860.PC30_OP.F_CV;20.725120544;100.0 +25/10/2020 02:06:41;U860.PC30_OP.F_CV;20.041505814;100.0 +25/10/2020 02:06:42;U860.PC30_OP.F_CV;20.236824036;100.0 +25/10/2020 02:06:43;U860.PC30_OP.F_CV;19.943845749;100.0 +25/10/2020 02:06:44;U860.PC30_OP.F_CV;20.407728195;100.0 +25/10/2020 02:06:45;U860.PC30_OP.F_CV;20.334482193;100.0 +25/10/2020 02:06:46;U860.PC30_OP.F_CV;20.065919876;100.0 +25/10/2020 02:06:47;U860.PC30_OP.F_CV;20.627460480;100.0 +25/10/2020 02:06:49;U860.PC30_OP.F_CV;20.310068130;100.0 +25/10/2020 02:06:50;U860.PC30_OP.F_CV;20.969266891;100.0 +25/10/2020 02:06:51;U860.PC30_OP.F_CV;20.847194672;100.0 +25/10/2020 02:06:52;U860.PC30_OP.F_CV;20.285654068;100.0 +25/10/2020 02:06:53;U860.PC30_OP.F_CV;19.968259811;100.0 +25/10/2020 02:06:54;U860.PC30_OP.F_CV;20.847194672;100.0 +25/10/2020 02:06:55;U860.PC30_OP.F_CV;20.310068130;100.0 +25/10/2020 02:06:56;U860.PC30_OP.F_CV;20.017089844;100.0 +25/10/2020 02:06:57;U860.PC30_OP.F_CV;20.627460480;100.0 +25/10/2020 02:06:58;U860.PC30_OP.F_CV;20.139163971;100.0 +25/10/2020 02:06:59;U860.PC30_OP.F_CV;20.456556320;100.0 +25/10/2020 02:06:18;U860.PC30_PV.F_CV;28.995098114;100.0 +25/10/2020 02:06:55;U860.PC30_SP.F_CV;29.000000000;100.0 +25/10/2020 02:06:57;U860.PDI11.F_CV;-1.096487045;100.0 +25/10/2020 02:06:00;U860.PDI28.F_CV;2.920976639;100.0 +25/10/2020 02:06:01;U860.PDI28.F_CV;2.577980995;100.0 +25/10/2020 02:06:02;U860.PDI28.F_CV;2.862547874;100.0 +25/10/2020 02:06:04;U860.PDI28.F_CV;3.191114426;100.0 +25/10/2020 02:06:05;U860.PDI28.F_CV;2.948746681;100.0 +25/10/2020 02:06:13;U860.PDI28.F_CV;3.325282097;100.0 +25/10/2020 02:06:14;U860.PDI28.F_CV;3.464499474;100.0 +25/10/2020 02:06:16;U860.PDI28.F_CV;3.255673409;100.0 +25/10/2020 02:06:18;U860.PDI28.F_CV;3.328529358;100.0 +25/10/2020 02:06:19;U860.PDI28.F_CV;3.054782867;100.0 +25/10/2020 02:06:20;U860.PDI28.F_CV;3.271903038;100.0 +25/10/2020 02:06:22;U860.PDI28.F_CV;2.942255974;100.0 +25/10/2020 02:06:27;U860.PDI28.F_CV;3.389121056;100.0 +25/10/2020 02:06:29;U860.PDI28.F_CV;3.210952759;100.0 +25/10/2020 02:06:31;U860.PDI28.F_CV;3.283804893;100.0 +25/10/2020 02:06:32;U860.PDI28.F_CV;3.178852081;100.0 +25/10/2020 02:06:33;U860.PDI28.F_CV;3.530501366;100.0 +25/10/2020 02:06:34;U860.PDI28.F_CV;3.667553902;100.0 +25/10/2020 02:06:36;U860.PDI28.F_CV;3.192916870;100.0 +25/10/2020 02:06:40;U860.PDI28.F_CV;3.428432465;100.0 +25/10/2020 02:06:41;U860.PDI28.F_CV;3.249182701;100.0 +25/10/2020 02:06:43;U860.PDI28.F_CV;3.433123589;100.0 +25/10/2020 02:06:44;U860.PDI28.F_CV;3.169113159;100.0 +25/10/2020 02:06:47;U860.PDI28.F_CV;3.379382133;100.0 +25/10/2020 02:06:51;U860.PDI28.F_CV;3.012944221;100.0 +25/10/2020 02:06:53;U860.PDI28.F_CV;3.158654213;100.0 +25/10/2020 02:06:57;U860.PDI28.F_CV;2.919172287;100.0 +25/10/2020 02:06:56;U860.PDI301.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U860.PI01_CA.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U860.PI01_CB.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U860.PI03.F_CV;0.030644774;100.0 +25/10/2020 02:06:56;U860.PI03_CA.F_CV;1.000000000;100.0 +25/10/2020 02:06:56;U860.PI03_CB.F_CV;-1.000000000;100.0 +25/10/2020 02:06:57;U860.PI12.F_CV;109.461349487;100.0 +25/10/2020 02:06:55;U860.PI23.F_CV;0.001283646;100.0 +25/10/2020 02:06:55;U860.PT20.F_CV;0.994686484;100.0 +25/10/2020 02:06:56;U860.SI01.F_CV;7.510408878;100.0 +25/10/2020 02:06:56;U860.SI02.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U860.SV02.F_CV;1800.000000000;100.0 +25/10/2020 02:06:00;U860.TC01_OP.F_CV;7.882930756;100.0 +25/10/2020 02:06:03;U860.TC01_OP.F_CV;8.053834915;100.0 +25/10/2020 02:06:07;U860.TC01_OP.F_CV;7.858516216;100.0 +25/10/2020 02:06:08;U860.TC01_OP.F_CV;7.687612534;100.0 +25/10/2020 02:06:16;U860.TC01_OP.F_CV;7.492293835;100.0 +25/10/2020 02:06:28;U860.TC01_OP.F_CV;7.663197517;100.0 +25/10/2020 02:06:33;U860.TC01_OP.F_CV;8.151494026;100.0 +25/10/2020 02:06:36;U860.TC01_OP.F_CV;8.322397232;100.0 +25/10/2020 02:06:37;U860.TC01_OP.F_CV;8.468886375;100.0 +25/10/2020 02:06:39;U860.TC01_OP.F_CV;8.297983170;100.0 +25/10/2020 02:06:44;U860.TC01_OP.F_CV;8.615375519;100.0 +25/10/2020 02:06:45;U860.TC01_OP.F_CV;8.420056343;100.0 +25/10/2020 02:06:47;U860.TC01_OP.F_CV;8.590960503;100.0 +25/10/2020 02:06:48;U860.TC01_OP.F_CV;8.420056343;100.0 +25/10/2020 02:06:56;U860.TC01_OP.F_CV;8.029419899;100.0 +25/10/2020 02:06:56;U860.TC01_PV.F_CV;229.939941406;100.0 +25/10/2020 02:06:01;U860.TC13_OP.F_CV;20.187994003;100.0 +25/10/2020 02:06:02;U860.TC13_OP.F_CV;20.017089844;100.0 +25/10/2020 02:06:04;U860.TC13_OP.F_CV;20.187994003;100.0 +25/10/2020 02:06:05;U860.TC13_OP.F_CV;20.017089844;100.0 +25/10/2020 02:06:08;U860.TC13_OP.F_CV;19.846187592;100.0 +25/10/2020 02:06:09;U860.TC13_OP.F_CV;20.017089844;100.0 +25/10/2020 02:06:10;U860.TC13_OP.F_CV;19.821771622;100.0 +25/10/2020 02:06:15;U860.TC13_OP.F_CV;19.650867462;100.0 +25/10/2020 02:06:17;U860.TC13_OP.F_CV;19.479965210;100.0 +25/10/2020 02:06:21;U860.TC13_OP.F_CV;19.650867462;100.0 +25/10/2020 02:06:23;U860.TC13_OP.F_CV;19.309061050;100.0 +25/10/2020 02:06:26;U860.TC13_OP.F_CV;19.479965210;100.0 +25/10/2020 02:06:27;U860.TC13_OP.F_CV;19.650867462;100.0 +25/10/2020 02:06:31;U860.TC13_OP.F_CV;19.479965210;100.0 +25/10/2020 02:06:32;U860.TC13_OP.F_CV;19.650867462;100.0 +25/10/2020 02:06:35;U860.TC13_OP.F_CV;19.333475113;100.0 +25/10/2020 02:06:36;U860.TC13_OP.F_CV;19.504379272;100.0 +25/10/2020 02:06:49;U860.TC13_OP.F_CV;19.162572861;100.0 +25/10/2020 02:06:50;U860.TC13_OP.F_CV;19.333475113;100.0 +25/10/2020 02:06:51;U860.TC13_OP.F_CV;19.162572861;100.0 +25/10/2020 02:06:54;U860.TC13_OP.F_CV;19.357891083;100.0 +25/10/2020 02:06:55;U860.TC13_OP.F_CV;19.186986923;100.0 +25/10/2020 02:06:17;U860.TC13_PV.F_CV;129.980255127;100.0 +25/10/2020 02:06:55;U860.TC13_SP.F_CV;130.000000000;100.0 +25/10/2020 02:06:13;U860.TC14_OP.F_CV;30.954923630;100.0 +25/10/2020 02:06:14;U860.TC14_OP.F_CV;31.076997757;100.0 +25/10/2020 02:06:34;U860.TC14_OP.F_CV;30.979339600;100.0 +25/10/2020 02:06:38;U860.TC14_OP.F_CV;31.125827789;100.0 +25/10/2020 02:06:43;U860.TC14_OP.F_CV;31.028167725;100.0 +25/10/2020 02:06:48;U860.TC14_OP.F_CV;31.150241852;100.0 +25/10/2020 02:06:55;U860.TC14_OP.F_CV;31.052583694;100.0 +25/10/2020 02:06:58;U860.TC14_OP.F_CV;31.174657822;100.0 +25/10/2020 02:06:42;U860.TC14_PV.F_CV;149.965423584;100.0 +25/10/2020 02:06:55;U860.TC14_SP.F_CV;150.000000000;100.0 +25/10/2020 02:06:56;U860.TC15_OP.F_CV;75.000000000;100.0 +25/10/2020 02:06:05;U860.TC15_PV.F_CV;181.973052979;100.0 +25/10/2020 02:06:56;U860.TC15_SP.F_CV;200.000000000;100.0 +25/10/2020 02:06:18;U860.TC24_OP.F_CV;32.859279633;100.0 +25/10/2020 02:06:07;U860.TC24_PV.F_CV;149.913009644;100.0 +25/10/2020 02:06:57;U860.TC24_SP.F_CV;150.000000000;100.0 +25/10/2020 02:06:55;U860.TC25_OP.F_CV;90.000000000;100.0 +25/10/2020 02:06:56;U860.TC25_PV.F_CV;131.157012939;100.0 +25/10/2020 02:06:55;U860.TC25_SP.F_CV;150.000000000;100.0 +25/10/2020 02:06:56;U860.TC26_OP.F_CV;90.000000000;100.0 +25/10/2020 02:06:11;U860.TC26_PV.F_CV;137.757385254;100.0 +25/10/2020 02:06:56;U860.TC26_SP.F_CV;160.000000000;100.0 +25/10/2020 02:06:28;U860.TC31_OP.F_CV;239.042327881;100.0 +25/10/2020 02:06:15;U860.TC31_PV.F_CV;229.975341797;100.0 +25/10/2020 02:06:57;U860.TC31_SP.F_CV;230.000000000;100.0 +25/10/2020 02:06:55;U860.TI01.F_CV;229.942855835;100.0 +25/10/2020 02:06:55;U860.TI01_CA.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U860.TI01_CB.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U860.TI02.F_CV;227.562728882;100.0 +25/10/2020 02:06:55;U860.TI02_CA.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U860.TI02_CB.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U860.TI03.F_CV;216.532135010;100.0 +25/10/2020 02:06:55;U860.TI03_CA.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U860.TI03_CB.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U860.TI04.F_CV;214.994964600;100.0 +25/10/2020 02:06:55;U860.TI04_CA.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U860.TI04_CB.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U860.TI05.F_CV;213.870437622;100.0 +25/10/2020 02:06:55;U860.TI05_CA.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U860.TI05_CB.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U860.TI06.F_CV;212.088256836;100.0 +25/10/2020 02:06:55;U860.TI06_CA.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U860.TI06_CB.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U860.TI07.F_CV;24.414724350;100.0 +25/10/2020 02:06:49;U860.TI08.F_CV;104.696853638;100.0 +25/10/2020 02:06:58;U860.TI09.F_CV;100.219161987;100.0 +25/10/2020 02:06:28;U860.TI11.F_CV;205.650421143;100.0 +25/10/2020 02:06:35;U860.TI110.F_CV;28.586114883;100.0 +25/10/2020 02:06:27;U860.TI113.F_CV;130.040969849;100.0 +25/10/2020 02:06:16;U860.TI114.F_CV;133.874588013;100.0 +25/10/2020 02:06:01;U860.TI115.F_CV;184.492431641;100.0 +25/10/2020 02:06:29;U860.TI12.F_CV;26.860610962;100.0 +25/10/2020 02:06:55;U860.TI124.F_CV;141.357513428;100.0 +25/10/2020 02:06:55;U860.TI125.F_CV;121.130126953;100.0 +25/10/2020 02:06:09;U860.TI126.F_CV;129.669815063;100.0 +25/10/2020 02:06:55;U860.TI12_CA.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U860.TI12_CB.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U860.TI131.F_CV;237.843246460;100.0 +25/10/2020 02:06:07;U860.TI132.F_CV;227.509994507;100.0 +25/10/2020 02:06:17;U860.TI132.F_CV;227.720703125;100.0 +25/10/2020 02:06:33;U860.TI132.F_CV;227.354370117;100.0 +25/10/2020 02:06:45;U860.TI132.F_CV;227.678344727;100.0 +25/10/2020 02:06:03;U860.TI32.F_CV;229.856597900;100.0 +25/10/2020 02:06:59;U860.TI33.F_CV;229.962890625;100.0 +25/10/2020 02:06:50;U860.TI34.F_CV;229.845214844;100.0 +25/10/2020 02:06:14;U860.TI35.F_CV;229.961746216;100.0 +25/10/2020 02:06:02;U860.TI36.F_CV;229.893096924;100.0 +25/10/2020 02:06:09;U860.TI37.F_CV;58.396675110;100.0 +25/10/2020 02:06:40;U860.TI38.F_CV;97.711906433;100.0 +25/10/2020 02:06:53;U860.TIARM.F_CV;0.000000000;0.0 +25/10/2020 02:06:26;U860.WI01.F_CV;163.100006104;100.0 +25/10/2020 02:06:58;U860.WI02.F_CV;4574.000000000;100.0 +25/10/2020 02:06:40;U860.WI03.F_CV;3049.000000000;100.0 +25/10/2020 02:06:45;U860.WI03.F_CV;3048.800048828;100.0 +25/10/2020 02:06:50;U860.WI03.F_CV;3048.900146484;100.0 +25/10/2020 02:06:01;U863.CI_CO.F_CV;0.173350424;100.0 +25/10/2020 02:06:03;U863.CI_CO.F_CV;0.173960820;100.0 +25/10/2020 02:06:05;U863.CI_CO.F_CV;0.177623153;100.0 +25/10/2020 02:06:07;U863.CI_CO.F_CV;0.173350424;100.0 +25/10/2020 02:06:09;U863.CI_CO.F_CV;0.177623153;100.0 +25/10/2020 02:06:13;U863.CI_CO.F_CV;0.181285486;100.0 +25/10/2020 02:06:15;U863.CI_CO.F_CV;0.177012756;100.0 +25/10/2020 02:06:17;U863.CI_CO.F_CV;0.177623153;100.0 +25/10/2020 02:06:22;U863.CI_CO.F_CV;0.177623153;100.0 +25/10/2020 02:06:23;U863.CI_CO.F_CV;0.177012756;100.0 +25/10/2020 02:06:25;U863.CI_CO.F_CV;0.177623153;100.0 +25/10/2020 02:06:32;U863.CI_CO.F_CV;0.177623153;100.0 +25/10/2020 02:06:33;U863.CI_CO.F_CV;0.173350424;100.0 +25/10/2020 02:06:35;U863.CI_CO.F_CV;0.177623153;100.0 +25/10/2020 02:06:39;U863.CI_CO.F_CV;0.177012756;100.0 +25/10/2020 02:06:41;U863.CI_CO.F_CV;0.177623153;100.0 +25/10/2020 02:06:43;U863.CI_CO.F_CV;0.177012756;100.0 +25/10/2020 02:06:45;U863.CI_CO.F_CV;0.177623153;100.0 +25/10/2020 02:06:47;U863.CI_CO.F_CV;0.173350424;100.0 +25/10/2020 02:06:49;U863.CI_CO.F_CV;0.177012756;100.0 +25/10/2020 02:06:51;U863.CI_CO.F_CV;0.177623153;100.0 +25/10/2020 02:06:53;U863.CI_CO.F_CV;0.173350424;100.0 +25/10/2020 02:06:26;U863.CI_CO2.F_CV;0.203869864;100.0 +25/10/2020 02:06:27;U863.CI_CO2.F_CV;0.199597150;100.0 +25/10/2020 02:06:29;U863.CI_CO2.F_CV;0.203869864;100.0 +25/10/2020 02:06:31;U863.CI_CO2.F_CV;0.203259483;100.0 +25/10/2020 02:06:33;U863.CI_CO2.F_CV;0.203869864;100.0 +25/10/2020 02:06:35;U863.CI_CO2.F_CV;0.199597150;100.0 +25/10/2020 02:06:37;U863.CI_CO2.F_CV;0.203869864;100.0 +25/10/2020 02:06:41;U863.CI_CO2.F_CV;0.200207531;100.0 +25/10/2020 02:06:43;U863.CI_CO2.F_CV;0.203869864;100.0 +25/10/2020 02:06:48;U863.CI_CO2.F_CV;0.203869864;100.0 +25/10/2020 02:06:49;U863.CI_CO2.F_CV;0.199597150;100.0 +25/10/2020 02:06:51;U863.CI_CO2.F_CV;0.203869864;100.0 +25/10/2020 02:06:16;U863.CI_O2.F_CV;9.169566154;100.0 +25/10/2020 02:06:17;U863.CI_O2.F_CV;9.178721428;100.0 +25/10/2020 02:06:22;U863.CI_O2.F_CV;9.178721428;100.0 +25/10/2020 02:06:23;U863.CI_O2.F_CV;9.175669670;100.0 +25/10/2020 02:06:25;U863.CI_O2.F_CV;9.178721428;100.0 +25/10/2020 02:06:27;U863.CI_O2.F_CV;9.169566154;100.0 +25/10/2020 02:06:44;U863.CI_O2.F_CV;9.169566154;100.0 +25/10/2020 02:06:45;U863.CI_O2.F_CV;9.178721428;100.0 +25/10/2020 02:06:47;U863.CI_O2.F_CV;9.169566154;100.0 +25/10/2020 02:06:52;U863.CI_O2.F_CV;9.169566154;100.0 +25/10/2020 02:06:53;U863.CI_O2.F_CV;9.168040276;100.0 +25/10/2020 02:06:56;U863.CI_O2.F_CV;9.169566154;100.0 +25/10/2020 02:06:39;U863.DI04.F_CV;0.855887175;100.0 +25/10/2020 02:06:08;U863.FQT01.F_CV;29680.910156250;100.0 +25/10/2020 02:06:08;U863.FQT02.F_CV;0.026217885;100.0 +25/10/2020 02:06:08;U863.FQT04.F_CV;143948.531250000;100.0 +25/10/2020 02:06:23;U863.FQT06_CORRECTION.F_CV;304.849060059;100.0 +25/10/2020 02:06:23;U863.FQT06_NCORRECTION.F_CV;332.919891357;100.0 +25/10/2020 02:06:08;U863.FT01.F_CV;0.159999996;100.0 +25/10/2020 02:06:08;U863.FT01_TI.F_CV;25.017517090;100.0 +25/10/2020 02:06:08;U863.FT02.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U863.FT02_TI.F_CV;25.071807861;100.0 +25/10/2020 02:06:00;U863.FT03A.F_CV;0.195099995;100.0 +25/10/2020 02:06:05;U863.FT03A.F_CV;0.195099995;100.0 +25/10/2020 02:06:10;U863.FT03A.F_CV;0.195099995;100.0 +25/10/2020 02:06:15;U863.FT03A.F_CV;0.195099995;100.0 +25/10/2020 02:06:20;U863.FT03A.F_CV;0.195099995;100.0 +25/10/2020 02:06:25;U863.FT03A.F_CV;0.195099995;100.0 +25/10/2020 02:06:30;U863.FT03A.F_CV;0.195099995;100.0 +25/10/2020 02:06:35;U863.FT03A.F_CV;0.195099995;100.0 +25/10/2020 02:06:40;U863.FT03A.F_CV;0.195099995;100.0 +25/10/2020 02:06:45;U863.FT03A.F_CV;0.195099995;100.0 +25/10/2020 02:06:50;U863.FT03A.F_CV;0.195099995;100.0 +25/10/2020 02:06:55;U863.FT03A.F_CV;0.195099995;100.0 +25/10/2020 02:06:08;U863.FT03A_TI.F_CV;25.617492676;100.0 +25/10/2020 02:06:50;U863.FT03B.F_CV;-0.002800000;100.0 +25/10/2020 02:06:01;U863.FT04.F_CV;0.135811508;100.0 +25/10/2020 02:06:05;U863.FT04.F_CV;0.198376372;100.0 +25/10/2020 02:06:07;U863.FT04.F_CV;0.062564857;100.0 +25/10/2020 02:06:09;U863.FT04.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U863.FT04.F_CV;0.025941525;100.0 +25/10/2020 02:06:13;U863.FT04.F_CV;0.015259720;100.0 +25/10/2020 02:06:15;U863.FT04.F_CV;0.036623329;100.0 +25/10/2020 02:06:19;U863.FT04.F_CV;0.146493316;100.0 +25/10/2020 02:06:23;U863.FT04.F_CV;0.173960820;100.0 +25/10/2020 02:06:25;U863.FT04.F_CV;0.244155526;100.0 +25/10/2020 02:06:27;U863.FT04.F_CV;0.178538725;100.0 +25/10/2020 02:06:29;U863.FT04.F_CV;0.134285539;100.0 +25/10/2020 02:06:31;U863.FT04.F_CV;0.036623329;100.0 +25/10/2020 02:06:33;U863.FT04.F_CV;0.077824578;100.0 +25/10/2020 02:06:35;U863.FT04.F_CV;0.199902341;100.0 +25/10/2020 02:06:37;U863.FT04.F_CV;0.244155526;100.0 +25/10/2020 02:06:39;U863.FT04.F_CV;0.164804980;100.0 +25/10/2020 02:06:45;U863.FT04.F_CV;0.108344018;100.0 +25/10/2020 02:06:47;U863.FT04.F_CV;0.215162054;100.0 +25/10/2020 02:06:49;U863.FT04.F_CV;0.296038568;100.0 +25/10/2020 02:06:51;U863.FT04.F_CV;0.169382900;100.0 +25/10/2020 02:06:53;U863.FT04.F_CV;0.132759571;100.0 +25/10/2020 02:06:08;U863.FT05.F_CV;0.028700000;100.0 +25/10/2020 02:06:39;U863.FT11.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U863.FY01_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U863.FY02_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U863.FY04_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U863.HEV06_SP.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U863.LT04.F_CV;-1.255874634;100.0 +25/10/2020 02:06:13;U863.LT04.F_CV;-1.202465057;100.0 +25/10/2020 02:06:27;U863.LT04.F_CV;-1.255874634;100.0 +25/10/2020 02:06:53;U863.LT04.F_CV;-1.202465057;100.0 +25/10/2020 02:06:08;U863.P02_FI.F_CV;0.200000003;100.0 +25/10/2020 02:06:52;U863.P02_VOL.F_CV;20.000000000;100.0 +25/10/2020 02:06:08;U863.P03_FIA.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U863.P03_FIB.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U863.P03_XIR.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U863.PC15_SO.F_CV;100.000000000;100.0 +25/10/2020 02:06:08;U863.PC15_SP.F_CV;0.500000000;100.0 +25/10/2020 02:06:28;U863.PDT31.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U863.PDT41.F_CV;51.376426697;100.0 +25/10/2020 02:06:13;U863.PI01.F_CV;0.024415553;100.0 +25/10/2020 02:06:15;U863.PI01.F_CV;0.146493316;100.0 +25/10/2020 02:06:17;U863.PI01.F_CV;0.073246658;100.0 +25/10/2020 02:06:58;U863.PI06.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U863.PI07.F_CV;0.056155771;100.0 +25/10/2020 02:06:01;U863.PI07.F_CV;0.065921992;100.0 +25/10/2020 02:06:03;U863.PI07.F_CV;0.070805103;100.0 +25/10/2020 02:06:05;U863.PI07.F_CV;0.053714216;100.0 +25/10/2020 02:06:07;U863.PI07.F_CV;0.068363547;100.0 +25/10/2020 02:06:09;U863.PI07.F_CV;0.065921992;100.0 +25/10/2020 02:06:11;U863.PI07.F_CV;0.056155771;100.0 +25/10/2020 02:06:13;U863.PI07.F_CV;0.073246658;100.0 +25/10/2020 02:06:15;U863.PI07.F_CV;0.061038882;100.0 +25/10/2020 02:06:17;U863.PI07.F_CV;0.058597326;100.0 +25/10/2020 02:06:19;U863.PI07.F_CV;0.073246658;100.0 +25/10/2020 02:06:23;U863.PI07.F_CV;0.065921992;100.0 +25/10/2020 02:06:25;U863.PI07.F_CV;0.068363547;100.0 +25/10/2020 02:06:27;U863.PI07.F_CV;0.053714216;100.0 +25/10/2020 02:06:29;U863.PI07.F_CV;0.070805103;100.0 +25/10/2020 02:06:33;U863.PI07.F_CV;0.056155771;100.0 +25/10/2020 02:06:35;U863.PI07.F_CV;0.061038882;100.0 +25/10/2020 02:06:37;U863.PI07.F_CV;0.056155771;100.0 +25/10/2020 02:06:39;U863.PI07.F_CV;0.061038882;100.0 +25/10/2020 02:06:41;U863.PI07.F_CV;0.073246658;100.0 +25/10/2020 02:06:43;U863.PI07.F_CV;0.056155771;100.0 +25/10/2020 02:06:47;U863.PI07.F_CV;0.070805103;100.0 +25/10/2020 02:06:51;U863.PI07.F_CV;0.056155771;100.0 +25/10/2020 02:06:53;U863.PI07.F_CV;0.070805103;100.0 +25/10/2020 02:06:22;U863.PI15.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U863.PI16.F_CV;0.998132229;100.0 +25/10/2020 02:06:08;U863.PT01_SP.F_CV;5.000000000;100.0 +25/10/2020 02:06:08;U863.PT06_SP.F_CV;12.000000000;100.0 +25/10/2020 02:06:08;U863.TC05_SO.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U863.TC05_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:25;U863.TC06_SO.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U863.TC06_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:00;U863.TC11_SO.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U863.TC11_SO.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U863.TC11_SO.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U863.TC11_SO.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U863.TC11_SO.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U863.TC11_SO.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U863.TC11_SO.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U863.TC11_SO.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U863.TC11_SO.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U863.TC11_SO.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U863.TC11_SO.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U863.TC11_SO.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U863.TC11_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:13;U863.TC12_SO.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U863.TC12_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:05;U863.TC13_SO.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U863.TC13_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:51;U863.TC14_SO.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U863.TC14_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:54;U863.TI01.F_CV;23.104747772;100.0 +25/10/2020 02:06:44;U863.TI02.F_CV;21.514751434;100.0 +25/10/2020 02:06:05;U863.TI03.F_CV;22.146701813;100.0 +25/10/2020 02:06:45;U863.TI04.F_CV;24.384382248;100.0 +25/10/2020 02:06:03;U863.TI05.F_CV;23.500000000;100.0 +25/10/2020 02:06:09;U863.TI05.F_CV;23.399999619;100.0 +25/10/2020 02:06:11;U863.TI05.F_CV;23.500000000;100.0 +25/10/2020 02:06:19;U863.TI05.F_CV;23.399999619;100.0 +25/10/2020 02:06:35;U863.TI05.F_CV;23.500000000;100.0 +25/10/2020 02:06:41;U863.TI05.F_CV;23.399999619;100.0 +25/10/2020 02:06:43;U863.TI05.F_CV;23.500000000;100.0 +25/10/2020 02:06:47;U863.TI05.F_CV;23.399999619;100.0 +25/10/2020 02:06:49;U863.TI05.F_CV;23.500000000;100.0 +25/10/2020 02:06:56;U863.TI05.F_CV;23.399999619;100.0 +25/10/2020 02:06:42;U863.TI06.F_CV;23.299999237;100.0 +25/10/2020 02:06:34;U863.TI07.F_CV;24.000000000;100.0 +25/10/2020 02:06:01;U863.TI08.F_CV;23.899999619;100.0 +25/10/2020 02:06:07;U863.TI08.F_CV;23.700000763;100.0 +25/10/2020 02:06:09;U863.TI08.F_CV;23.899999619;100.0 +25/10/2020 02:06:11;U863.TI08.F_CV;23.799999237;100.0 +25/10/2020 02:06:13;U863.TI08.F_CV;23.899999619;100.0 +25/10/2020 02:06:15;U863.TI08.F_CV;23.799999237;100.0 +25/10/2020 02:06:17;U863.TI08.F_CV;23.899999619;100.0 +25/10/2020 02:06:47;U863.TI08.F_CV;23.799999237;100.0 +25/10/2020 02:06:51;U863.TI08.F_CV;23.899999619;100.0 +25/10/2020 02:06:42;U863.TI09.F_CV;21.500000000;100.0 +25/10/2020 02:06:58;U863.TI10.F_CV;22.700000763;100.0 +25/10/2020 02:06:56;U863.TI11.F_CV;24.799999237;100.0 +25/10/2020 02:06:50;U863.TI12.F_CV;24.500000000;100.0 +25/10/2020 02:06:17;U863.TI13.F_CV;24.600000381;100.0 +25/10/2020 02:06:05;U863.TI14.F_CV;23.700000763;100.0 +25/10/2020 02:06:37;U863.WI01.F_CV;16.719699860;100.0 +25/10/2020 02:06:35;U863.WI02.F_CV;12.177399635;100.0 +25/10/2020 02:06:19;U863.WI03.F_CV;3.115000010;100.0 +25/10/2020 02:06:47;U863.WI11.F_CV;16.835500717;100.0 +25/10/2020 02:06:07;U870.DPY101_PV.F_CV;-0.382697850;100.0 +25/10/2020 02:06:14;U870.DPY101_PV.F_CV;-0.411157578;100.0 +25/10/2020 02:06:17;U870.DPY101_PV.F_CV;-0.385014653;100.0 +25/10/2020 02:06:28;U870.DPY101_PV.F_CV;-0.450195193;100.0 +25/10/2020 02:06:33;U870.DPY101_PV.F_CV;-0.377883196;100.0 +25/10/2020 02:06:48;U870.DPY101_PV.F_CV;-0.409267783;100.0 +25/10/2020 02:06:16;U870.DPY201_PV.F_CV;0.059013769;100.0 +25/10/2020 02:06:19;U870.DPY201_PV.F_CV;0.092537031;100.0 +25/10/2020 02:06:22;U870.DPY201_PV.F_CV;0.062779777;100.0 +25/10/2020 02:06:26;U870.DPY201_PV.F_CV;0.092960909;100.0 +25/10/2020 02:06:12;U870.DPY301_PV.F_CV;-0.080895178;100.0 +25/10/2020 02:06:25;U870.DPY301_PV.F_CV;-0.108129531;100.0 +25/10/2020 02:06:32;U870.DPY301_PV.F_CV;-0.081930503;100.0 +25/10/2020 02:06:35;U870.DPY301_PV.F_CV;-0.109488860;100.0 +25/10/2020 02:06:02;U870.DPY401_PV.F_CV;-0.010524891;100.0 +25/10/2020 02:06:04;U870.DPY401_PV.F_CV;-0.042788781;100.0 +25/10/2020 02:06:46;U870.DPY401_PV.F_CV;-0.015740007;100.0 +25/10/2020 02:06:51;U870.DPY401_PV.F_CV;-0.049568728;100.0 +25/10/2020 02:06:20;U870.FC100_CoefA.F_CV;0.938444197;100.0 +25/10/2020 02:06:20;U870.FC100_CoefB.F_CV;1.162755251;100.0 +25/10/2020 02:06:10;U870.FC100_PV.F_CV;1.161999941;100.0 +25/10/2020 02:06:03;U870.FC100_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:04;U870.FC103_PV.F_CV;-0.374003172;100.0 +25/10/2020 02:06:07;U870.FC103_PV.F_CV;-0.212001264;100.0 +25/10/2020 02:06:10;U870.FC103_PV.F_CV;-0.360261828;100.0 +25/10/2020 02:06:22;U870.FC103_PV.F_CV;-0.186222821;100.0 +25/10/2020 02:06:24;U870.FC103_PV.F_CV;-0.342313290;100.0 +25/10/2020 02:06:30;U870.FC103_PV.F_CV;-0.461417288;100.0 +25/10/2020 02:06:33;U870.FC103_PV.F_CV;-0.162048787;100.0 +25/10/2020 02:06:36;U870.FC103_PV.F_CV;-0.269616485;100.0 +25/10/2020 02:06:40;U870.FC103_PV.F_CV;-0.015458578;100.0 +25/10/2020 02:06:43;U870.FC103_PV.F_CV;-0.343287408;100.0 +25/10/2020 02:06:46;U870.FC103_PV.F_CV;-0.472548604;100.0 +25/10/2020 02:06:49;U870.FC103_PV.F_CV;-0.252125680;100.0 +25/10/2020 02:06:52;U870.FC103_PV.F_CV;-0.489641249;100.0 +25/10/2020 02:06:55;U870.FC103_PV.F_CV;-0.118966281;100.0 +25/10/2020 02:06:59;U870.FC103_PV.F_CV;-0.242500558;100.0 +25/10/2020 02:06:20;U870.FC104_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U870.FC109_CoefA.F_CV;1.084933043;100.0 +25/10/2020 02:06:20;U870.FC109_CoefB.F_CV;0.000000000;0.0 +25/10/2020 02:06:33;U870.FC109_PV.F_CV;-0.349374384;100.0 +25/10/2020 02:06:20;U870.FC200_CoefA.F_CV;1.185644150;100.0 +25/10/2020 02:06:20;U870.FC200_CoefB.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;U870.FC200_PV.F_CV;149.998794556;100.0 +25/10/2020 02:06:39;U870.FC200_SP.F_CV;150.000000000;100.0 +25/10/2020 02:06:01;U870.FC203_PV.F_CV;-1.386111617;100.0 +25/10/2020 02:06:03;U870.FC203_PV.F_CV;-1.595218539;100.0 +25/10/2020 02:06:05;U870.FC203_PV.F_CV;-1.429440737;100.0 +25/10/2020 02:06:07;U870.FC203_PV.F_CV;-1.523301125;100.0 +25/10/2020 02:06:08;U870.FC203_PV.F_CV;-1.339540005;100.0 +25/10/2020 02:06:12;U870.FC203_PV.F_CV;-1.245261550;100.0 +25/10/2020 02:06:14;U870.FC203_PV.F_CV;-1.437430024;100.0 +25/10/2020 02:06:18;U870.FC203_PV.F_CV;-1.531483173;100.0 +25/10/2020 02:06:19;U870.FC203_PV.F_CV;-1.664021015;100.0 +25/10/2020 02:06:20;U870.FC203_PV.F_CV;-1.571343303;100.0 +25/10/2020 02:06:21;U870.FC203_PV.F_CV;-1.320190072;100.0 +25/10/2020 02:06:28;U870.FC203_PV.F_CV;-1.126305223;100.0 +25/10/2020 02:06:30;U870.FC203_PV.F_CV;-1.428464532;100.0 +25/10/2020 02:06:31;U870.FC203_PV.F_CV;-1.218648434;100.0 +25/10/2020 02:06:36;U870.FC203_PV.F_CV;-1.371586084;100.0 +25/10/2020 02:06:45;U870.FC203_PV.F_CV;-1.283211589;100.0 +25/10/2020 02:06:47;U870.FC203_PV.F_CV;-1.392801046;100.0 +25/10/2020 02:06:49;U870.FC203_PV.F_CV;-1.225201249;100.0 +25/10/2020 02:06:59;U870.FC203_PV.F_CV;-1.549109459;100.0 +25/10/2020 02:06:20;U870.FC204_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U870.FC209_CoefA.F_CV;1.010162711;100.0 +25/10/2020 02:06:20;U870.FC209_CoefB.F_CV;0.000000000;0.0 +25/10/2020 02:06:36;U870.FC209_PV.F_CV;18.000183105;100.0 +25/10/2020 02:06:20;U870.FC300_CoefA.F_CV;0.946073771;100.0 +25/10/2020 02:06:20;U870.FC300_CoefB.F_CV;1.145970106;100.0 +25/10/2020 02:06:50;U870.FC300_PV.F_CV;1.145699978;100.0 +25/10/2020 02:06:31;U870.FC300_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:09;U870.FC303_PV.F_CV;0.575101733;100.0 +25/10/2020 02:06:12;U870.FC303_PV.F_CV;0.953704357;100.0 +25/10/2020 02:06:16;U870.FC303_PV.F_CV;0.743103683;100.0 +25/10/2020 02:06:17;U870.FC303_PV.F_CV;0.614146352;100.0 +25/10/2020 02:06:18;U870.FC303_PV.F_CV;0.781412721;100.0 +25/10/2020 02:06:20;U870.FC303_PV.F_CV;0.874293625;100.0 +25/10/2020 02:06:24;U870.FC303_PV.F_CV;0.669599652;100.0 +25/10/2020 02:06:27;U870.FC303_PV.F_CV;0.788241923;100.0 +25/10/2020 02:06:29;U870.FC303_PV.F_CV;0.661773801;100.0 +25/10/2020 02:06:30;U870.FC303_PV.F_CV;0.769203901;100.0 +25/10/2020 02:06:35;U870.FC303_PV.F_CV;0.853033066;100.0 +25/10/2020 02:06:38;U870.FC303_PV.F_CV;0.343240857;100.0 +25/10/2020 02:06:41;U870.FC303_PV.F_CV;0.842912853;100.0 +25/10/2020 02:06:43;U870.FC303_PV.F_CV;0.681612074;100.0 +25/10/2020 02:06:47;U870.FC303_PV.F_CV;0.821980476;100.0 +25/10/2020 02:06:48;U870.FC303_PV.F_CV;0.729946554;100.0 +25/10/2020 02:06:49;U870.FC303_PV.F_CV;0.812558115;100.0 +25/10/2020 02:06:53;U870.FC303_PV.F_CV;0.601953268;100.0 +25/10/2020 02:06:58;U870.FC303_PV.F_CV;0.717668176;100.0 +25/10/2020 02:06:20;U870.FC304_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U870.FC309_CoefA.F_CV;1.055940390;100.0 +25/10/2020 02:06:20;U870.FC309_CoefB.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U870.FC309_PV.F_CV;-0.478199989;100.0 +25/10/2020 02:06:20;U870.FC400_CoefA.F_CV;0.935392380;100.0 +25/10/2020 02:06:20;U870.FC400_CoefB.F_CV;0.645466447;100.0 +25/10/2020 02:06:09;U870.FC400_PV.F_CV;0.646200001;100.0 +25/10/2020 02:06:35;U870.FC400_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:03;U870.FC403_PV.F_CV;0.427331835;100.0 +25/10/2020 02:06:16;U870.FC403_PV.F_CV;0.751233578;100.0 +25/10/2020 02:06:21;U870.FC403_PV.F_CV;0.532401979;100.0 +25/10/2020 02:06:23;U870.FC403_PV.F_CV;0.360791832;100.0 +25/10/2020 02:06:27;U870.FC403_PV.F_CV;0.442710698;100.0 +25/10/2020 02:06:31;U870.FC403_PV.F_CV;0.345388204;100.0 +25/10/2020 02:06:35;U870.FC403_PV.F_CV;0.447693467;100.0 +25/10/2020 02:06:42;U870.FC403_PV.F_CV;0.239390403;100.0 +25/10/2020 02:06:49;U870.FC403_PV.F_CV;0.566538692;100.0 +25/10/2020 02:06:50;U870.FC403_PV.F_CV;0.491256088;100.0 +25/10/2020 02:06:54;U870.FC403_PV.F_CV;0.609482765;100.0 +25/10/2020 02:06:57;U870.FC403_PV.F_CV;0.378567696;100.0 +25/10/2020 02:06:59;U870.FC403_PV.F_CV;0.555231929;100.0 +25/10/2020 02:06:20;U870.FC404_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U870.FC409_CoefA.F_CV;1.033051610;100.0 +25/10/2020 02:06:20;U870.FC409_CoefB.F_CV;0.000000000;0.0 +25/10/2020 02:06:43;U870.FC409_PV.F_CV;-0.194499999;100.0 +25/10/2020 02:06:36;U870.FCY102_OP.F_CV;60.000003815;100.0 +25/10/2020 02:06:52;U870.FCY102_PV.F_CV;0.336921513;100.0 +25/10/2020 02:06:36;U870.FCY102_SP.F_CV;23.700000763;100.0 +25/10/2020 02:06:24;U870.FCY202_OP.F_CV;34.729621887;100.0 +25/10/2020 02:06:15;U870.FCY202_PV.F_CV;0.169742316;100.0 +25/10/2020 02:06:41;U870.FCY202_SP.F_CV;23.700000763;100.0 +25/10/2020 02:06:45;U870.FCY302_OP.F_CV;60.000003815;100.0 +25/10/2020 02:06:35;U870.FCY302_PV.F_CV;0.316355705;100.0 +25/10/2020 02:06:36;U870.FCY302_SP.F_CV;23.700000763;100.0 +25/10/2020 02:06:15;U870.FCY402_OP.F_CV;60.000003815;100.0 +25/10/2020 02:06:00;U870.FCY402_PV.F_CV;1.197614789;100.0 +25/10/2020 02:06:34;U870.FCY402_PV.F_CV;1.808242440;100.0 +25/10/2020 02:06:54;U870.FCY402_SP.F_CV;57.000000000;100.0 +25/10/2020 02:06:08;U870.FI130_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U870.FI230_PV.F_CV;182.907958984;100.0 +25/10/2020 02:06:03;U870.FI230_PV.F_CV;179.237823486;100.0 +25/10/2020 02:06:04;U870.FI230_PV.F_CV;171.145416260;100.0 +25/10/2020 02:06:05;U870.FI230_PV.F_CV;165.464828491;100.0 +25/10/2020 02:06:06;U870.FI230_PV.F_CV;172.848602295;100.0 +25/10/2020 02:06:07;U870.FI230_PV.F_CV;175.358154297;100.0 +25/10/2020 02:06:08;U870.FI230_PV.F_CV;177.023162842;100.0 +25/10/2020 02:06:11;U870.FI230_PV.F_CV;177.787841797;100.0 +25/10/2020 02:06:13;U870.FI230_PV.F_CV;184.812850952;100.0 +25/10/2020 02:06:14;U870.FI230_PV.F_CV;187.729507446;100.0 +25/10/2020 02:06:15;U870.FI230_PV.F_CV;189.099288940;100.0 +25/10/2020 02:06:16;U870.FI230_PV.F_CV;192.303207397;100.0 +25/10/2020 02:06:17;U870.FI230_PV.F_CV;189.210723877;100.0 +25/10/2020 02:06:18;U870.FI230_PV.F_CV;178.535003662;100.0 +25/10/2020 02:06:19;U870.FI230_PV.F_CV;170.974456787;100.0 +25/10/2020 02:06:20;U870.FI230_PV.F_CV;165.461853027;100.0 +25/10/2020 02:06:21;U870.FI230_PV.F_CV;162.992950439;100.0 +25/10/2020 02:06:22;U870.FI230_PV.F_CV;163.656417847;100.0 +25/10/2020 02:06:23;U870.FI230_PV.F_CV;170.027313232;100.0 +25/10/2020 02:06:24;U870.FI230_PV.F_CV;173.321563721;100.0 +25/10/2020 02:06:26;U870.FI230_PV.F_CV;171.793502808;100.0 +25/10/2020 02:06:27;U870.FI230_PV.F_CV;169.688049316;100.0 +25/10/2020 02:06:28;U870.FI230_PV.F_CV;162.403396606;100.0 +25/10/2020 02:06:29;U870.FI230_PV.F_CV;162.820434570;100.0 +25/10/2020 02:06:30;U870.FI230_PV.F_CV;170.020584106;100.0 +25/10/2020 02:06:31;U870.FI230_PV.F_CV;173.215103149;100.0 +25/10/2020 02:06:32;U870.FI230_PV.F_CV;171.890014648;100.0 +25/10/2020 02:06:33;U870.FI230_PV.F_CV;175.320434570;100.0 +25/10/2020 02:06:34;U870.FI230_PV.F_CV;176.830673218;100.0 +25/10/2020 02:06:36;U870.FI230_PV.F_CV;177.345092773;100.0 +25/10/2020 02:06:37;U870.FI230_PV.F_CV;180.128890991;100.0 +25/10/2020 02:06:38;U870.FI230_PV.F_CV;185.193679810;100.0 +25/10/2020 02:06:40;U870.FI230_PV.F_CV;188.507690430;100.0 +25/10/2020 02:06:41;U870.FI230_PV.F_CV;185.663009644;100.0 +25/10/2020 02:06:42;U870.FI230_PV.F_CV;171.563354492;100.0 +25/10/2020 02:06:43;U870.FI230_PV.F_CV;167.115020752;100.0 +25/10/2020 02:06:44;U870.FI230_PV.F_CV;164.276046753;100.0 +25/10/2020 02:06:45;U870.FI230_PV.F_CV;162.095550537;100.0 +25/10/2020 02:06:48;U870.FI230_PV.F_CV;171.654296875;100.0 +25/10/2020 02:06:49;U870.FI230_PV.F_CV;172.795104980;100.0 +25/10/2020 02:06:50;U870.FI230_PV.F_CV;171.338562012;100.0 +25/10/2020 02:06:51;U870.FI230_PV.F_CV;170.778305054;100.0 +25/10/2020 02:06:52;U870.FI230_PV.F_CV;161.602066040;100.0 +25/10/2020 02:06:53;U870.FI230_PV.F_CV;163.531188965;100.0 +25/10/2020 02:06:54;U870.FI230_PV.F_CV;170.149810791;100.0 +25/10/2020 02:06:55;U870.FI230_PV.F_CV;172.963180542;100.0 +25/10/2020 02:06:59;U870.FI230_PV.F_CV;176.363250732;100.0 +25/10/2020 02:06:20;U870.FI330_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U870.FI430_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U870.FQ130_CoefA.F_CV;0.976592302;100.0 +25/10/2020 02:06:20;U870.FQ130_PV.F_CV;50152.675781250;100.0 +25/10/2020 02:06:20;U870.FQ230_CoefA.F_CV;1.014740467;100.0 +25/10/2020 02:06:20;U870.FQ230_PV.F_CV;71612.984375000;100.0 +25/10/2020 02:06:20;U870.FQ330_CoefA.F_CV;0.959807158;100.0 +25/10/2020 02:06:20;U870.FQ330_PV.F_CV;43961.417968750;100.0 +25/10/2020 02:06:20;U870.FQ430_CoefA.F_CV;0.961333036;100.0 +25/10/2020 02:06:20;U870.FQ430_PV.F_CV;69527.429687500;100.0 +25/10/2020 02:06:04;U870.LC121_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:23;U870.LC121_PV.F_CV;-0.576923072;100.0 +25/10/2020 02:06:29;U870.LC121_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U870.LC131_PV.F_CV;3.019113064;100.0 +25/10/2020 02:06:33;U870.LC131_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U870.LC221_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U870.LC221_PV.F_CV;4.230753899;100.0 +25/10/2020 02:06:53;U870.LC221_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:18;U870.LC231_PV.F_CV;19.185342789;100.0 +25/10/2020 02:06:36;U870.LC231_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:57;U870.LC321_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:29;U870.LC321_PV.F_CV;-0.576923072;100.0 +25/10/2020 02:06:42;U870.LC321_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U870.LC331_PV.F_CV;1.674867868;100.0 +25/10/2020 02:06:54;U870.LC331_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U870.LC421_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:54;U870.LC421_PV.F_CV;-0.576923072;100.0 +25/10/2020 02:06:56;U870.LC421_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U870.LC431_PV.F_CV;-0.585909426;100.0 +25/10/2020 02:06:05;U870.LC431_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U870.PC121_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:01;U870.PC121_PV.F_CV;0.386000365;100.0 +25/10/2020 02:06:26;U870.PC121_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U870.PC221_OP.F_CV;77.578788757;100.0 +25/10/2020 02:06:36;U870.PC221_OP.F_CV;77.512039185;100.0 +25/10/2020 02:06:45;U870.PC221_OP.F_CV;77.660499573;100.0 +25/10/2020 02:06:57;U870.PC221_OP.F_CV;77.475013733;100.0 +25/10/2020 02:06:08;U870.PC221_PV.F_CV;89.990348816;100.0 +25/10/2020 02:06:20;U870.PC221_SP.F_CV;90.000000000;100.0 +25/10/2020 02:06:31;U870.PC321_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:44;U870.PC321_PV.F_CV;-0.000000000;100.0 +25/10/2020 02:06:31;U870.PC321_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U870.PC421_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:42;U870.PC421_PV.F_CV;-0.130149096;100.0 +25/10/2020 02:06:36;U870.PC421_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U870.PI103_PV.F_CV;0.045935910;100.0 +25/10/2020 02:06:07;U870.PI113_PV.F_CV;0.000641026;100.0 +25/10/2020 02:06:07;U870.PI131_PV.F_CV;0.002010522;100.0 +25/10/2020 02:06:57;U870.PI203_PV.F_CV;90.112884521;100.0 +25/10/2020 02:06:39;U870.PI213_PV.F_CV;0.587589860;100.0 +25/10/2020 02:06:39;U870.PI231_PV.F_CV;0.572436035;100.0 +25/10/2020 02:06:34;U870.PI303_PV.F_CV;-0.082819536;100.0 +25/10/2020 02:06:06;U870.PI313_PV.F_CV;0.005773742;100.0 +25/10/2020 02:06:06;U870.PI331_PV.F_CV;0.008333336;100.0 +25/10/2020 02:06:52;U870.PI403_PV.F_CV;-0.054200482;100.0 +25/10/2020 02:06:33;U870.PI413_PV.F_CV;0.005714871;100.0 +25/10/2020 02:06:33;U870.PI431_PV.F_CV;0.010843975;100.0 +25/10/2020 02:06:00;U870.QI104_C_PV.F_CV;740.884887695;100.0 +25/10/2020 02:06:00;U870.QI204_C_PV.F_CV;73.432983398;100.0 +25/10/2020 02:06:00;U870.QI304_C_PV.F_CV;457.978942871;100.0 +25/10/2020 02:06:00;U870.QI404_C_PV.F_CV;1255.754760742;100.0 +25/10/2020 02:06:36;U870.TC102_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U870.TC102_PV.F_CV;22.025474548;100.0 +25/10/2020 02:06:11;U870.TC102_PV.F_CV;21.666250229;100.0 +25/10/2020 02:06:47;U870.TC102_PV.F_CV;21.938240051;100.0 +25/10/2020 02:06:36;U870.TC102_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:01;U870.TC103_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U870.TC103_PV.F_CV;21.579406738;100.0 +25/10/2020 02:06:42;U870.TC103_PV.F_CV;21.328859329;100.0 +25/10/2020 02:06:13;U870.TC103_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:03;U870.TC104_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U870.TC104_PV.F_CV;21.934652328;100.0 +25/10/2020 02:06:36;U870.TC104_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:12;U870.TC105_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U870.TC105_PV.F_CV;21.157962799;100.0 +25/10/2020 02:06:10;U870.TC105_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:48;U870.TC112_PV.F_CV;21.016437531;100.0 +25/10/2020 02:06:00;U870.TC121_PV.F_CV;21.749134064;100.0 +25/10/2020 02:06:07;U870.TC121_PV.F_CV;21.503681183;100.0 +25/10/2020 02:06:10;U870.TC121_PV.F_CV;21.658187866;100.0 +25/10/2020 02:06:21;U870.TC121_PV.F_CV;21.311391830;100.0 +25/10/2020 02:06:23;U870.TC121_PV.F_CV;21.538309097;100.0 +25/10/2020 02:06:27;U870.TC121_PV.F_CV;21.312482834;100.0 +25/10/2020 02:06:43;U870.TC121_PV.F_CV;21.548791885;100.0 +25/10/2020 02:06:54;U870.TC121_PV.F_CV;21.422336578;100.0 +25/10/2020 02:06:57;U870.TC121_PV.F_CV;21.733675003;100.0 +25/10/2020 02:06:05;U870.TC124_PV.F_CV;11.701712608;100.0 +25/10/2020 02:06:10;U870.TC124_PV.F_CV;11.447344780;100.0 +25/10/2020 02:06:13;U870.TC124_PV.F_CV;11.623022079;100.0 +25/10/2020 02:06:17;U870.TC124_PV.F_CV;11.510107040;100.0 +25/10/2020 02:06:18;U870.TC124_PV.F_CV;11.772239685;100.0 +25/10/2020 02:06:21;U870.TC124_PV.F_CV;11.579390526;100.0 +25/10/2020 02:06:35;U870.TC124_PV.F_CV;11.686256409;100.0 +25/10/2020 02:06:38;U870.TC124_PV.F_CV;11.583914757;100.0 +25/10/2020 02:06:50;U870.TC124_PV.F_CV;11.759773254;100.0 +25/10/2020 02:06:52;U870.TC124_PV.F_CV;11.574323654;100.0 +25/10/2020 02:06:01;U870.TC129_PV.F_CV;18.913415909;100.0 +25/10/2020 02:06:07;U870.TC129_PV.F_CV;19.241624832;100.0 +25/10/2020 02:06:21;U870.TC129_PV.F_CV;19.133552551;100.0 +25/10/2020 02:06:23;U870.TC129_PV.F_CV;19.238067627;100.0 +25/10/2020 02:06:41;U870.TC129_PV.F_CV;19.004384995;100.0 +25/10/2020 02:06:47;U870.TC129_PV.F_CV;19.270906448;100.0 +25/10/2020 02:06:50;U870.TC129_PV.F_CV;19.132532120;100.0 +25/10/2020 02:06:55;U870.TC129_PV.F_CV;19.258178711;100.0 +25/10/2020 02:06:01;U870.TC131_PV.F_CV;20.292922974;100.0 +25/10/2020 02:06:10;U870.TC131_PV.F_CV;20.547014236;100.0 +25/10/2020 02:06:14;U870.TC131_PV.F_CV;20.161848068;100.0 +25/10/2020 02:06:22;U870.TC131_PV.F_CV;20.479009628;100.0 +25/10/2020 02:06:31;U870.TC131_PV.F_CV;20.220956802;100.0 +25/10/2020 02:06:33;U870.TC131_PV.F_CV;20.518363953;100.0 +25/10/2020 02:06:43;U870.TC131_PV.F_CV;20.132863998;100.0 +25/10/2020 02:06:46;U870.TC131_PV.F_CV;20.517271042;100.0 +25/10/2020 02:06:48;U870.TC131_PV.F_CV;20.413997650;100.0 +25/10/2020 02:06:51;U870.TC131_PV.F_CV;20.541097641;100.0 +25/10/2020 02:06:56;U870.TC131_PV.F_CV;20.304636002;100.0 +25/10/2020 02:06:59;U870.TC131_PV.F_CV;20.519796371;100.0 +25/10/2020 02:06:01;U870.TC202_OP.F_CV;5.343111038;100.0 +25/10/2020 02:06:02;U870.TC202_OP.F_CV;5.253529072;100.0 +25/10/2020 02:06:03;U870.TC202_OP.F_CV;5.907902718;100.0 +25/10/2020 02:06:04;U870.TC202_OP.F_CV;6.095664024;100.0 +25/10/2020 02:06:05;U870.TC202_OP.F_CV;5.950848103;100.0 +25/10/2020 02:06:06;U870.TC202_OP.F_CV;5.512153149;100.0 +25/10/2020 02:06:07;U870.TC202_OP.F_CV;5.445806026;100.0 +25/10/2020 02:06:09;U870.TC202_OP.F_CV;5.527555466;100.0 +25/10/2020 02:06:11;U870.TC202_OP.F_CV;6.126226902;100.0 +25/10/2020 02:06:12;U870.TC202_OP.F_CV;6.307379246;100.0 +25/10/2020 02:06:13;U870.TC202_OP.F_CV;6.212179661;100.0 +25/10/2020 02:06:14;U870.TC202_OP.F_CV;5.949121475;100.0 +25/10/2020 02:06:15;U870.TC202_OP.F_CV;5.876049519;100.0 +25/10/2020 02:06:17;U870.TC202_OP.F_CV;6.197877884;100.0 +25/10/2020 02:06:21;U870.TC202_OP.F_CV;6.138500690;100.0 +25/10/2020 02:06:25;U870.TC202_OP.F_CV;6.440578938;100.0 +25/10/2020 02:06:26;U870.TC202_OP.F_CV;6.240024090;100.0 +25/10/2020 02:06:27;U870.TC202_OP.F_CV;5.770311356;100.0 +25/10/2020 02:06:28;U870.TC202_OP.F_CV;5.684819221;100.0 +25/10/2020 02:06:29;U870.TC202_OP.F_CV;6.145524979;100.0 +25/10/2020 02:06:30;U870.TC202_OP.F_CV;6.415692806;100.0 +25/10/2020 02:06:33;U870.TC202_OP.F_CV;6.052362442;100.0 +25/10/2020 02:06:35;U870.TC202_OP.F_CV;5.389554977;100.0 +25/10/2020 02:06:38;U870.TC202_OP.F_CV;6.176764965;100.0 +25/10/2020 02:06:39;U870.TC202_OP.F_CV;6.116124630;100.0 +25/10/2020 02:06:40;U870.TC202_OP.F_CV;5.879715919;100.0 +25/10/2020 02:06:41;U870.TC202_OP.F_CV;5.826214314;100.0 +25/10/2020 02:06:43;U870.TC202_OP.F_CV;6.172106743;100.0 +25/10/2020 02:06:48;U870.TC202_OP.F_CV;6.118093967;100.0 +25/10/2020 02:06:51;U870.TC202_OP.F_CV;5.757421017;100.0 +25/10/2020 02:06:52;U870.TC202_OP.F_CV;5.857091427;100.0 +25/10/2020 02:06:53;U870.TC202_OP.F_CV;6.102047443;100.0 +25/10/2020 02:06:54;U870.TC202_OP.F_CV;6.155350208;100.0 +25/10/2020 02:06:55;U870.TC202_OP.F_CV;6.374017715;100.0 +25/10/2020 02:06:56;U870.TC202_OP.F_CV;6.474852085;100.0 +25/10/2020 02:06:58;U870.TC202_OP.F_CV;6.128957272;100.0 +25/10/2020 02:06:59;U870.TC202_OP.F_CV;6.043707371;100.0 +25/10/2020 02:06:06;U870.TC202_PV.F_CV;50.167720795;100.0 +25/10/2020 02:06:25;U870.TC202_PV.F_CV;49.908588409;100.0 +25/10/2020 02:06:35;U870.TC202_PV.F_CV;50.172496796;100.0 +25/10/2020 02:06:56;U870.TC202_PV.F_CV;49.911296844;100.0 +25/10/2020 02:06:24;U870.TC202_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:02;U870.TC203_OP.F_CV;2.354861736;100.0 +25/10/2020 02:06:07;U870.TC203_OP.F_CV;2.698096752;100.0 +25/10/2020 02:06:09;U870.TC203_OP.F_CV;2.332360506;100.0 +25/10/2020 02:06:13;U870.TC203_OP.F_CV;2.332360506;100.0 +25/10/2020 02:06:14;U870.TC203_OP.F_CV;2.610862017;100.0 +25/10/2020 02:06:15;U870.TC203_OP.F_CV;2.699011564;100.0 +25/10/2020 02:06:16;U870.TC203_OP.F_CV;2.603411198;100.0 +25/10/2020 02:06:17;U870.TC203_OP.F_CV;2.361788034;100.0 +25/10/2020 02:06:18;U870.TC203_OP.F_CV;2.311365366;100.0 +25/10/2020 02:06:20;U870.TC203_OP.F_CV;2.666665077;100.0 +25/10/2020 02:06:22;U870.TC203_OP.F_CV;2.081182480;100.0 +25/10/2020 02:06:23;U870.TC203_OP.F_CV;1.964987040;100.0 +25/10/2020 02:06:25;U870.TC203_OP.F_CV;2.360251904;100.0 +25/10/2020 02:06:31;U870.TC203_OP.F_CV;2.416515350;100.0 +25/10/2020 02:06:32;U870.TC203_OP.F_CV;2.635012388;100.0 +25/10/2020 02:06:33;U870.TC203_OP.F_CV;2.749439955;100.0 +25/10/2020 02:06:36;U870.TC203_OP.F_CV;2.697801828;100.0 +25/10/2020 02:06:41;U870.TC203_OP.F_CV;1.952765942;100.0 +25/10/2020 02:06:42;U870.TC203_OP.F_CV;2.077515602;100.0 +25/10/2020 02:06:43;U870.TC203_OP.F_CV;2.353407860;100.0 +25/10/2020 02:06:44;U870.TC203_OP.F_CV;2.433197737;100.0 +25/10/2020 02:06:46;U870.TC203_OP.F_CV;2.118664265;100.0 +25/10/2020 02:06:48;U870.TC203_OP.F_CV;1.845402002;100.0 +25/10/2020 02:06:50;U870.TC203_OP.F_CV;2.365262270;100.0 +25/10/2020 02:06:51;U870.TC203_OP.F_CV;2.890061855;100.0 +25/10/2020 02:06:52;U870.TC203_OP.F_CV;2.963159084;100.0 +25/10/2020 02:06:54;U870.TC203_OP.F_CV;2.854316235;100.0 +25/10/2020 02:06:55;U870.TC203_OP.F_CV;2.518377542;100.0 +25/10/2020 02:06:56;U870.TC203_OP.F_CV;1.817881465;100.0 +25/10/2020 02:06:57;U870.TC203_OP.F_CV;1.702279329;100.0 +25/10/2020 02:06:58;U870.TC203_OP.F_CV;2.267829418;100.0 +25/10/2020 02:06:59;U870.TC203_OP.F_CV;2.496079206;100.0 +25/10/2020 02:06:38;U870.TC203_PV.F_CV;49.400043488;100.0 +25/10/2020 02:06:48;U870.TC203_PV.F_CV;49.677936554;100.0 +25/10/2020 02:06:52;U870.TC203_PV.F_CV;49.412940979;100.0 +25/10/2020 02:06:51;U870.TC203_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:30;U870.TC204_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U870.TC204_PV.F_CV;58.282859802;100.0 +25/10/2020 02:06:30;U870.TC204_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:16;U870.TC205_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U870.TC205_PV.F_CV;62.801311493;100.0 +25/10/2020 02:06:41;U870.TC205_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:44;U870.TC212_PV.F_CV;21.584222794;100.0 +25/10/2020 02:06:02;U870.TC221_PV.F_CV;69.834396362;100.0 +25/10/2020 02:06:17;U870.TC221_PV.F_CV;69.947326660;100.0 +25/10/2020 02:06:18;U870.TC221_PV.F_CV;70.117202759;100.0 +25/10/2020 02:06:21;U870.TC221_PV.F_CV;69.880973816;100.0 +25/10/2020 02:06:28;U870.TC221_PV.F_CV;70.015861511;100.0 +25/10/2020 02:06:31;U870.TC221_PV.F_CV;69.895347595;100.0 +25/10/2020 02:06:00;U870.TC224_PV.F_CV;90.092903137;100.0 +25/10/2020 02:06:24;U870.TC224_PV.F_CV;90.256622314;100.0 +25/10/2020 02:06:29;U870.TC224_PV.F_CV;90.098136902;100.0 +25/10/2020 02:06:45;U870.TC224_PV.F_CV;90.378837585;100.0 +25/10/2020 02:06:49;U870.TC224_PV.F_CV;90.013832092;100.0 +25/10/2020 02:06:54;U870.TC224_PV.F_CV;90.286857605;100.0 +25/10/2020 02:06:11;U870.TC229_PV.F_CV;49.906890869;100.0 +25/10/2020 02:06:12;U870.TC229_PV.F_CV;50.036724091;100.0 +25/10/2020 02:06:16;U870.TC229_PV.F_CV;49.913013458;100.0 +25/10/2020 02:06:20;U870.TC229_PV.F_CV;50.065940857;100.0 +25/10/2020 02:06:44;U870.TC229_PV.F_CV;50.186538696;100.0 +25/10/2020 02:06:46;U870.TC229_PV.F_CV;50.050983429;100.0 +25/10/2020 02:06:09;U870.TC231_PV.F_CV;20.558115005;100.0 +25/10/2020 02:06:15;U870.TC231_PV.F_CV;20.426790237;100.0 +25/10/2020 02:06:22;U870.TC231_PV.F_CV;20.536197662;100.0 +25/10/2020 02:06:26;U870.TC231_PV.F_CV;20.413009644;100.0 +25/10/2020 02:06:27;U870.TC231_PV.F_CV;20.538726807;100.0 +25/10/2020 02:06:31;U870.TC231_PV.F_CV;20.413036346;100.0 +25/10/2020 02:06:37;U870.TC231_PV.F_CV;20.548660278;100.0 +25/10/2020 02:06:43;U870.TC231_PV.F_CV;20.441879272;100.0 +25/10/2020 02:06:46;U870.TC231_PV.F_CV;20.567918777;100.0 +25/10/2020 02:06:51;U870.TC231_PV.F_CV;20.433431625;100.0 +25/10/2020 02:06:40;U870.TC302_OP.F_CV;5.566413403;100.0 +25/10/2020 02:06:45;U870.TC302_PV.F_CV;18.212690353;100.0 +25/10/2020 02:06:49;U870.TC302_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:12;U870.TC303_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U870.TC303_PV.F_CV;18.129470825;100.0 +25/10/2020 02:06:41;U870.TC303_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:33;U870.TC304_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U870.TC304_PV.F_CV;22.342376709;100.0 +25/10/2020 02:06:12;U870.TC304_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:51;U870.TC305_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U870.TC305_PV.F_CV;21.439214706;100.0 +25/10/2020 02:06:41;U870.TC305_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:07;U870.TC312_PV.F_CV;20.788963318;100.0 +25/10/2020 02:06:07;U870.TC321_PV.F_CV;20.250770569;100.0 +25/10/2020 02:06:15;U870.TC321_PV.F_CV;20.133548737;100.0 +25/10/2020 02:06:19;U870.TC321_PV.F_CV;20.246372223;100.0 +25/10/2020 02:06:26;U870.TC321_PV.F_CV;20.007604599;100.0 +25/10/2020 02:06:30;U870.TC321_PV.F_CV;20.221443176;100.0 +25/10/2020 02:06:37;U870.TC321_PV.F_CV;20.003871918;100.0 +25/10/2020 02:06:46;U870.TC321_PV.F_CV;20.249668121;100.0 +25/10/2020 02:06:48;U870.TC321_PV.F_CV;20.092899323;100.0 +25/10/2020 02:06:04;U870.TC324_PV.F_CV;11.835818291;100.0 +25/10/2020 02:06:08;U870.TC324_PV.F_CV;11.726102829;100.0 +25/10/2020 02:06:23;U870.TC324_PV.F_CV;11.938447952;100.0 +25/10/2020 02:06:27;U870.TC324_PV.F_CV;11.712483406;100.0 +25/10/2020 02:06:33;U870.TC324_PV.F_CV;11.996288300;100.0 +25/10/2020 02:06:36;U870.TC324_PV.F_CV;11.841813087;100.0 +25/10/2020 02:06:41;U870.TC324_PV.F_CV;11.947729111;100.0 +25/10/2020 02:06:52;U870.TC324_PV.F_CV;11.713426590;100.0 +25/10/2020 02:06:57;U870.TC324_PV.F_CV;11.949719429;100.0 +25/10/2020 02:06:10;U870.TC329_PV.F_CV;18.217697144;100.0 +25/10/2020 02:06:28;U870.TC329_PV.F_CV;18.465435028;100.0 +25/10/2020 02:06:31;U870.TC329_PV.F_CV;18.340724945;100.0 +25/10/2020 02:06:07;U870.TC331_PV.F_CV;21.332912445;100.0 +25/10/2020 02:06:12;U870.TC331_PV.F_CV;21.577306747;100.0 +25/10/2020 02:06:14;U870.TC331_PV.F_CV;21.395866394;100.0 +25/10/2020 02:06:17;U870.TC331_PV.F_CV;21.540458679;100.0 +25/10/2020 02:06:22;U870.TC331_PV.F_CV;21.427431107;100.0 +25/10/2020 02:06:27;U870.TC331_PV.F_CV;21.534566879;100.0 +25/10/2020 02:06:43;U870.TC331_PV.F_CV;21.322116852;100.0 +25/10/2020 02:06:46;U870.TC331_PV.F_CV;21.458835602;100.0 +25/10/2020 02:06:51;U870.TC331_PV.F_CV;21.341787338;100.0 +25/10/2020 02:06:54;U870.TC331_PV.F_CV;21.467916489;100.0 +25/10/2020 02:06:56;U870.TC331_PV.F_CV;21.362091064;100.0 +25/10/2020 02:06:36;U870.TC402_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U870.TC402_PV.F_CV;17.369010925;100.0 +25/10/2020 02:06:11;U870.TC402_PV.F_CV;17.107999802;100.0 +25/10/2020 02:06:20;U870.TC402_PV.F_CV;17.401597977;100.0 +25/10/2020 02:06:32;U870.TC402_PV.F_CV;17.121086121;100.0 +25/10/2020 02:06:44;U870.TC402_PV.F_CV;17.416990280;100.0 +25/10/2020 02:06:47;U870.TC402_PV.F_CV;17.140029907;100.0 +25/10/2020 02:06:56;U870.TC402_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:46;U870.TC403_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U870.TC403_PV.F_CV;17.003356934;100.0 +25/10/2020 02:06:28;U870.TC403_PV.F_CV;17.336278915;100.0 +25/10/2020 02:06:39;U870.TC403_PV.F_CV;17.040864944;100.0 +25/10/2020 02:06:41;U870.TC403_PV.F_CV;17.299587250;100.0 +25/10/2020 02:06:50;U870.TC403_PV.F_CV;17.042964935;100.0 +25/10/2020 02:06:52;U870.TC403_PV.F_CV;17.420726776;100.0 +25/10/2020 02:06:55;U870.TC403_PV.F_CV;17.140161514;100.0 +25/10/2020 02:06:09;U870.TC403_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:36;U870.TC404_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U870.TC404_PV.F_CV;22.215276718;100.0 +25/10/2020 02:06:36;U870.TC404_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:36;U870.TC405_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U870.TC405_PV.F_CV;20.144876480;100.0 +25/10/2020 02:06:58;U870.TC405_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:18;U870.TC412_PV.F_CV;21.158092499;100.0 +25/10/2020 02:06:15;U870.TC421_PV.F_CV;19.451202393;100.0 +25/10/2020 02:06:21;U870.TC421_PV.F_CV;19.558120728;100.0 +25/10/2020 02:06:40;U870.TC421_PV.F_CV;19.426105499;100.0 +25/10/2020 02:06:49;U870.TC421_PV.F_CV;19.535806656;100.0 +25/10/2020 02:06:07;U870.TC424_PV.F_CV;20.183176041;100.0 +25/10/2020 02:06:11;U870.TC424_PV.F_CV;20.034374237;100.0 +25/10/2020 02:06:24;U870.TC424_PV.F_CV;20.165870667;100.0 +25/10/2020 02:06:27;U870.TC424_PV.F_CV;20.051227570;100.0 +25/10/2020 02:06:32;U870.TC424_PV.F_CV;20.165622711;100.0 +25/10/2020 02:06:38;U870.TC424_PV.F_CV;20.026802063;100.0 +25/10/2020 02:06:40;U870.TC424_PV.F_CV;20.150449753;100.0 +25/10/2020 02:06:53;U870.TC424_PV.F_CV;20.026216507;100.0 +25/10/2020 02:06:56;U870.TC424_PV.F_CV;20.167367935;100.0 +25/10/2020 02:06:03;U870.TC429_PV.F_CV;17.522743225;100.0 +25/10/2020 02:06:06;U870.TC429_PV.F_CV;17.347614288;100.0 +25/10/2020 02:06:08;U870.TC429_PV.F_CV;17.506809235;100.0 +25/10/2020 02:06:21;U870.TC429_PV.F_CV;17.296501160;100.0 +25/10/2020 02:06:29;U870.TC429_PV.F_CV;17.522651672;100.0 +25/10/2020 02:06:34;U870.TC429_PV.F_CV;17.232580185;100.0 +25/10/2020 02:06:42;U870.TC429_PV.F_CV;17.536945343;100.0 +25/10/2020 02:06:45;U870.TC429_PV.F_CV;17.431335449;100.0 +25/10/2020 02:06:47;U870.TC429_PV.F_CV;17.537828445;100.0 +25/10/2020 02:06:50;U870.TC429_PV.F_CV;17.281700134;100.0 +25/10/2020 02:06:55;U870.TC429_PV.F_CV;17.520513535;100.0 +25/10/2020 02:06:58;U870.TC429_PV.F_CV;17.264312744;100.0 +25/10/2020 02:06:07;U870.TC431_PV.F_CV;20.306871414;100.0 +25/10/2020 02:06:11;U870.TC431_PV.F_CV;20.619634628;100.0 +25/10/2020 02:06:16;U870.TC431_PV.F_CV;20.467483521;100.0 +25/10/2020 02:06:26;U870.TC431_PV.F_CV;20.594083786;100.0 +25/10/2020 02:06:30;U870.TC431_PV.F_CV;20.430990219;100.0 +25/10/2020 02:06:32;U870.TC431_PV.F_CV;20.640413284;100.0 +25/10/2020 02:06:34;U870.TC431_PV.F_CV;20.516481400;100.0 +25/10/2020 02:06:37;U870.TC431_PV.F_CV;20.625455856;100.0 +25/10/2020 02:06:44;U870.TC431_PV.F_CV;20.403873444;100.0 +25/10/2020 02:06:20;U870.TI104A_CoefA.F_CV;0.999481201;100.0 +25/10/2020 02:06:20;U870.TI104A_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U870.TI104A_PV.F_CV;21.485879898;100.0 +25/10/2020 02:06:06;U870.TI104A_PV.F_CV;21.223691940;100.0 +25/10/2020 02:06:29;U870.TI104A_PV.F_CV;21.501693726;100.0 +25/10/2020 02:06:39;U870.TI104A_PV.F_CV;21.251518250;100.0 +25/10/2020 02:06:43;U870.TI104A_PV.F_CV;21.557645798;100.0 +25/10/2020 02:06:52;U870.TI104A_PV.F_CV;21.259202957;100.0 +25/10/2020 02:06:20;U870.TI104B_CoefA.F_CV;0.996429384;100.0 +25/10/2020 02:06:20;U870.TI104B_CoefB.F_CV;0.000000000;0.0 +25/10/2020 02:06:03;U870.TI104B_PV.F_CV;21.182193756;100.0 +25/10/2020 02:06:18;U870.TI104B_PV.F_CV;20.904731750;100.0 +25/10/2020 02:06:19;U870.TI104B_PV.F_CV;21.162174225;100.0 +25/10/2020 02:06:25;U870.TI104B_PV.F_CV;20.904321671;100.0 +25/10/2020 02:06:30;U870.TI104B_PV.F_CV;21.220806122;100.0 +25/10/2020 02:06:40;U870.TI104B_PV.F_CV;20.916395187;100.0 +25/10/2020 02:06:59;U870.TI104B_PV.F_CV;21.167631149;100.0 +25/10/2020 02:06:20;U870.TI105A_CoefA.F_CV;1.005584955;100.0 +25/10/2020 02:06:20;U870.TI105A_CoefB.F_CV;0.000000000;0.0 +25/10/2020 02:06:05;U870.TI105A_PV.F_CV;18.994646072;100.0 +25/10/2020 02:06:41;U870.TI105A_PV.F_CV;18.732944489;100.0 +25/10/2020 02:06:57;U870.TI105A_PV.F_CV;18.998081207;100.0 +25/10/2020 02:06:20;U870.TI105B_CoefA.F_CV;0.994903386;100.0 +25/10/2020 02:06:20;U870.TI105B_CoefB.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;U870.TI105B_PV.F_CV;21.374395370;100.0 +25/10/2020 02:06:20;U870.TI107_CoefA.F_CV;0.999481201;100.0 +25/10/2020 02:06:20;U870.TI107_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U870.TI107_PV.F_CV;21.178716660;100.0 +25/10/2020 02:06:20;U870.TI108_CoefA.F_CV;0.997955263;100.0 +25/10/2020 02:06:20;U870.TI108_CoefB.F_CV;1.052888632;100.0 +25/10/2020 02:06:00;U870.TI108_PV.F_CV;21.948410034;100.0 +25/10/2020 02:06:20;U870.TI109_CoefA.F_CV;0.996429384;100.0 +25/10/2020 02:06:09;U870.TI109_PV.F_CV;21.786193848;100.0 +25/10/2020 02:06:07;U870.TI1102_PV.F_CV;18.299999237;100.0 +25/10/2020 02:06:56;U870.TI1103_PV.F_CV;18.700000763;100.0 +25/10/2020 02:06:02;U870.TI1104_PV.F_CV;18.899999619;100.0 +25/10/2020 02:06:10;U870.TI1104_PV.F_CV;19.200000763;100.0 +25/10/2020 02:06:47;U870.TI1104_PV.F_CV;18.899999619;100.0 +25/10/2020 02:06:49;U870.TI1104_PV.F_CV;19.200000763;100.0 +25/10/2020 02:06:30;U870.TI1105_PV.F_CV;17.700000763;100.0 +25/10/2020 02:06:05;U870.TI1202_PV.F_CV;50.500000000;100.0 +25/10/2020 02:06:18;U870.TI1203_PV.F_CV;50.299999237;100.0 +25/10/2020 02:06:05;U870.TI1204_PV.F_CV;56.500000000;100.0 +25/10/2020 02:06:12;U870.TI1205_PV.F_CV;58.700000763;100.0 +25/10/2020 02:06:00;U870.TI123_PV.F_CV;9.761266708;100.0 +25/10/2020 02:06:01;U870.TI123_PV.F_CV;9.787307739;100.0 +25/10/2020 02:06:02;U870.TI123_PV.F_CV;9.677761078;100.0 +25/10/2020 02:06:03;U870.TI123_PV.F_CV;9.625480652;100.0 +25/10/2020 02:06:05;U870.TI123_PV.F_CV;9.676521301;100.0 +25/10/2020 02:06:08;U870.TI123_PV.F_CV;9.615951538;100.0 +25/10/2020 02:06:11;U870.TI123_PV.F_CV;9.779087067;100.0 +25/10/2020 02:06:15;U870.TI123_PV.F_CV;9.634778976;100.0 +25/10/2020 02:06:21;U870.TI123_PV.F_CV;9.513464928;100.0 +25/10/2020 02:06:25;U870.TI123_PV.F_CV;9.596637726;100.0 +25/10/2020 02:06:29;U870.TI123_PV.F_CV;9.859695435;100.0 +25/10/2020 02:06:31;U870.TI123_PV.F_CV;9.579558372;100.0 +25/10/2020 02:06:34;U870.TI123_PV.F_CV;9.419575691;100.0 +25/10/2020 02:06:35;U870.TI123_PV.F_CV;9.446414948;100.0 +25/10/2020 02:06:36;U870.TI123_PV.F_CV;9.549673080;100.0 +25/10/2020 02:06:37;U870.TI123_PV.F_CV;9.583509445;100.0 +25/10/2020 02:06:39;U870.TI123_PV.F_CV;9.764674187;100.0 +25/10/2020 02:06:42;U870.TI123_PV.F_CV;9.530969620;100.0 +25/10/2020 02:06:44;U870.TI123_PV.F_CV;9.582353592;100.0 +25/10/2020 02:06:53;U870.TI123_PV.F_CV;9.582353592;100.0 +25/10/2020 02:06:54;U870.TI123_PV.F_CV;9.868927002;100.0 +25/10/2020 02:06:55;U870.TI123_PV.F_CV;9.957049370;100.0 +25/10/2020 02:06:56;U870.TI123_PV.F_CV;9.985925674;100.0 +25/10/2020 02:06:04;U870.TI1302_PV.F_CV;18.700000763;100.0 +25/10/2020 02:06:07;U870.TI1302_PV.F_CV;18.399999619;100.0 +25/10/2020 02:06:41;U870.TI1302_PV.F_CV;18.700000763;100.0 +25/10/2020 02:06:43;U870.TI1302_PV.F_CV;18.299999237;100.0 +25/10/2020 02:06:31;U870.TI1303_PV.F_CV;18.600000381;100.0 +25/10/2020 02:06:38;U870.TI1303_PV.F_CV;19.000000000;100.0 +25/10/2020 02:06:47;U870.TI1303_PV.F_CV;18.600000381;100.0 +25/10/2020 02:06:00;U870.TI1304_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:03;U870.TI1304_PV.F_CV;18.899999619;100.0 +25/10/2020 02:06:13;U870.TI1304_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:29;U870.TI1304_PV.F_CV;18.899999619;100.0 +25/10/2020 02:06:31;U870.TI1304_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:34;U870.TI1304_PV.F_CV;18.899999619;100.0 +25/10/2020 02:06:47;U870.TI1304_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:09;U870.TI1305_PV.F_CV;17.899999619;100.0 +25/10/2020 02:06:12;U870.TI1305_PV.F_CV;18.200000763;100.0 +25/10/2020 02:06:43;U870.TI1305_PV.F_CV;17.899999619;100.0 +25/10/2020 02:06:46;U870.TI1305_PV.F_CV;18.399999619;100.0 +25/10/2020 02:06:49;U870.TI1305_PV.F_CV;18.000000000;100.0 +25/10/2020 02:06:23;U870.TI130_PV.F_CV;19.857995987;100.0 +25/10/2020 02:06:27;U870.TI130_PV.F_CV;19.604919434;100.0 +25/10/2020 02:06:30;U870.TI130_PV.F_CV;19.916286469;100.0 +25/10/2020 02:06:35;U870.TI130_PV.F_CV;19.630222321;100.0 +25/10/2020 02:06:59;U870.TI130_PV.F_CV;19.946273804;100.0 +25/10/2020 02:06:00;U870.TI132_PV.F_CV;2.567574263;100.0 +25/10/2020 02:06:02;U870.TI132_PV.F_CV;2.263627291;100.0 +25/10/2020 02:06:03;U870.TI132_PV.F_CV;2.220849276;100.0 +25/10/2020 02:06:06;U870.TI132_PV.F_CV;2.296335459;100.0 +25/10/2020 02:06:07;U870.TI132_PV.F_CV;2.231567144;100.0 +25/10/2020 02:06:10;U870.TI132_PV.F_CV;2.284333467;100.0 +25/10/2020 02:06:14;U870.TI132_PV.F_CV;2.168217421;100.0 +25/10/2020 02:06:15;U870.TI132_PV.F_CV;2.122353554;100.0 +25/10/2020 02:06:23;U870.TI132_PV.F_CV;2.283162355;100.0 +25/10/2020 02:06:36;U870.TI132_PV.F_CV;2.116780043;100.0 +25/10/2020 02:06:43;U870.TI132_PV.F_CV;2.456547260;100.0 +25/10/2020 02:06:44;U870.TI132_PV.F_CV;2.485761404;100.0 +25/10/2020 02:06:45;U870.TI132_PV.F_CV;2.455334187;100.0 +25/10/2020 02:06:46;U870.TI132_PV.F_CV;2.350899935;100.0 +25/10/2020 02:06:47;U870.TI132_PV.F_CV;2.316679001;100.0 +25/10/2020 02:06:49;U870.TI132_PV.F_CV;2.135345459;100.0 +25/10/2020 02:06:51;U870.TI132_PV.F_CV;2.103795052;100.0 +25/10/2020 02:06:58;U870.TI132_PV.F_CV;2.279759884;100.0 +25/10/2020 02:06:59;U870.TI132_PV.F_CV;2.495063782;100.0 +25/10/2020 02:06:36;U870.TI1402_PV.F_CV;21.600000381;100.0 +25/10/2020 02:06:39;U870.TI1403_PV.F_CV;21.799999237;100.0 +25/10/2020 02:06:52;U870.TI1403_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:54;U870.TI1403_PV.F_CV;21.700000763;100.0 +25/10/2020 02:06:57;U870.TI1403_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:59;U870.TI1403_PV.F_CV;21.700000763;100.0 +25/10/2020 02:06:08;U870.TI1404_PV.F_CV;21.700000763;100.0 +25/10/2020 02:06:14;U870.TI1405_PV.F_CV;21.200000763;100.0 +25/10/2020 02:06:17;U870.TI1405_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:22;U870.TI1405_PV.F_CV;21.200000763;100.0 +25/10/2020 02:06:25;U870.TI1405_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:30;U870.TI1405_PV.F_CV;21.200000763;100.0 +25/10/2020 02:06:32;U870.TI1405_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:56;U870.TI1405_PV.F_CV;21.200000763;100.0 +25/10/2020 02:06:59;U870.TI1405_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:20;U870.TI204A_CoefA.F_CV;1.007110834;100.0 +25/10/2020 02:06:20;U870.TI204A_CoefB.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U870.TI204A_PV.F_CV;54.360698700;100.0 +25/10/2020 02:06:51;U870.TI204A_PV.F_CV;54.618301392;100.0 +25/10/2020 02:06:20;U870.TI204B_CoefA.F_CV;0.997955263;100.0 +25/10/2020 02:06:20;U870.TI204B_CoefB.F_CV;2.351451159;100.0 +25/10/2020 02:06:38;U870.TI204B_PV.F_CV;56.829002380;100.0 +25/10/2020 02:06:20;U870.TI205A_CoefA.F_CV;1.010162711;100.0 +25/10/2020 02:06:20;U870.TI205A_CoefB.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;U870.TI205A_PV.F_CV;57.206916809;100.0 +25/10/2020 02:06:20;U870.TI205B_CoefA.F_CV;0.999481201;100.0 +25/10/2020 02:06:20;U870.TI205B_CoefB.F_CV;1.944029093;100.0 +25/10/2020 02:06:55;U870.TI205B_PV.F_CV;59.551246643;100.0 +25/10/2020 02:06:20;U870.TI207_CoefA.F_CV;0.997955263;100.0 +25/10/2020 02:06:20;U870.TI207_CoefB.F_CV;2.127140284;100.0 +25/10/2020 02:06:51;U870.TI207_PV.F_CV;62.857772827;100.0 +25/10/2020 02:06:56;U870.TI207_PV.F_CV;62.592216492;100.0 +25/10/2020 02:06:20;U870.TI208_CoefA.F_CV;1.004058957;100.0 +25/10/2020 02:06:20;U870.TI208_CoefB.F_CV;0.276192516;100.0 +25/10/2020 02:06:10;U870.TI208_PV.F_CV;58.552894592;100.0 +25/10/2020 02:06:18;U870.TI208_PV.F_CV;58.288890839;100.0 +25/10/2020 02:06:20;U870.TI209_CoefA.F_CV;1.007110834;100.0 +25/10/2020 02:06:20;U870.TI209_CoefB.F_CV;0.000000000;0.0 +25/10/2020 02:06:29;U870.TI209_PV.F_CV;56.922496796;100.0 +25/10/2020 02:06:11;U870.TI2102_PV.F_CV;19.799999237;100.0 +25/10/2020 02:06:16;U870.TI2102_PV.F_CV;20.299999237;100.0 +25/10/2020 02:06:21;U870.TI2102_PV.F_CV;19.899999619;100.0 +25/10/2020 02:06:52;U870.TI2102_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:50;U870.TI2103_PV.F_CV;19.799999237;100.0 +25/10/2020 02:06:07;U870.TI2104_PV.F_CV;20.000000000;100.0 +25/10/2020 02:06:12;U870.TI2104_PV.F_CV;19.600000381;100.0 +25/10/2020 02:06:17;U870.TI2104_PV.F_CV;20.000000000;100.0 +25/10/2020 02:06:22;U870.TI2104_PV.F_CV;19.600000381;100.0 +25/10/2020 02:06:43;U870.TI2104_PV.F_CV;20.000000000;100.0 +25/10/2020 02:06:59;U870.TI2104_PV.F_CV;19.600000381;100.0 +25/10/2020 02:06:03;U870.TI2105_PV.F_CV;19.399999619;100.0 +25/10/2020 02:06:05;U870.TI2105_PV.F_CV;19.000000000;100.0 +25/10/2020 02:06:34;U870.TI2105_PV.F_CV;19.399999619;100.0 +25/10/2020 02:06:42;U870.TI2105_PV.F_CV;19.000000000;100.0 +25/10/2020 02:06:27;U870.TI2202_PV.F_CV;51.299999237;100.0 +25/10/2020 02:06:13;U870.TI2203_PV.F_CV;51.099998474;100.0 +25/10/2020 02:06:58;U870.TI2204_PV.F_CV;56.299999237;100.0 +25/10/2020 02:06:25;U870.TI2205_PV.F_CV;58.799999237;100.0 +25/10/2020 02:06:00;U870.TI223_PV.F_CV;75.461791992;100.0 +25/10/2020 02:06:01;U870.TI223_PV.F_CV;75.420249939;100.0 +25/10/2020 02:06:03;U870.TI223_PV.F_CV;75.485397339;100.0 +25/10/2020 02:06:06;U870.TI223_PV.F_CV;75.678009033;100.0 +25/10/2020 02:06:08;U870.TI223_PV.F_CV;75.776672363;100.0 +25/10/2020 02:06:11;U870.TI223_PV.F_CV;75.452873230;100.0 +25/10/2020 02:06:12;U870.TI223_PV.F_CV;75.417320251;100.0 +25/10/2020 02:06:16;U870.TI223_PV.F_CV;75.483421326;100.0 +25/10/2020 02:06:19;U870.TI223_PV.F_CV;75.585990906;100.0 +25/10/2020 02:06:20;U870.TI223_PV.F_CV;75.555412292;100.0 +25/10/2020 02:06:21;U870.TI223_PV.F_CV;75.450927734;100.0 +25/10/2020 02:06:22;U870.TI223_PV.F_CV;75.416687012;100.0 +25/10/2020 02:06:26;U870.TI223_PV.F_CV;75.467422485;100.0 +25/10/2020 02:06:28;U870.TI223_PV.F_CV;75.424499512;100.0 +25/10/2020 02:06:29;U870.TI223_PV.F_CV;75.340789795;100.0 +25/10/2020 02:06:30;U870.TI223_PV.F_CV;75.313369751;100.0 +25/10/2020 02:06:33;U870.TI223_PV.F_CV;75.476074219;100.0 +25/10/2020 02:06:34;U870.TI223_PV.F_CV;75.693862915;100.0 +25/10/2020 02:06:35;U870.TI223_PV.F_CV;75.765228271;100.0 +25/10/2020 02:06:39;U870.TI223_PV.F_CV;75.535972595;100.0 +25/10/2020 02:06:41;U870.TI223_PV.F_CV;75.575866699;100.0 +25/10/2020 02:06:42;U870.TI223_PV.F_CV;75.659324646;100.0 +25/10/2020 02:06:43;U870.TI223_PV.F_CV;75.686668396;100.0 +25/10/2020 02:06:44;U870.TI223_PV.F_CV;75.518508911;100.0 +25/10/2020 02:06:46;U870.TI223_PV.F_CV;75.372726440;100.0 +25/10/2020 02:06:47;U870.TI223_PV.F_CV;75.256599426;100.0 +25/10/2020 02:06:48;U870.TI223_PV.F_CV;75.218536377;100.0 +25/10/2020 02:06:52;U870.TI223_PV.F_CV;75.365646362;100.0 +25/10/2020 02:06:55;U870.TI223_PV.F_CV;75.319763184;100.0 +25/10/2020 02:06:59;U870.TI223_PV.F_CV;75.435829163;100.0 +25/10/2020 02:06:01;U870.TI2302_PV.F_CV;18.899999619;100.0 +25/10/2020 02:06:04;U870.TI2302_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:06;U870.TI2302_PV.F_CV;18.899999619;100.0 +25/10/2020 02:06:14;U870.TI2302_PV.F_CV;19.200000763;100.0 +25/10/2020 02:06:19;U870.TI2302_PV.F_CV;18.899999619;100.0 +25/10/2020 02:06:24;U870.TI2302_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:27;U870.TI2302_PV.F_CV;18.899999619;100.0 +25/10/2020 02:06:33;U870.TI2302_PV.F_CV;19.200000763;100.0 +25/10/2020 02:06:09;U870.TI2303_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:14;U870.TI2303_PV.F_CV;18.899999619;100.0 +25/10/2020 02:06:22;U870.TI2303_PV.F_CV;19.200000763;100.0 +25/10/2020 02:06:36;U870.TI2303_PV.F_CV;18.899999619;100.0 +25/10/2020 02:06:51;U870.TI2303_PV.F_CV;19.200000763;100.0 +25/10/2020 02:06:56;U870.TI2303_PV.F_CV;18.899999619;100.0 +25/10/2020 02:06:59;U870.TI2303_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:00;U870.TI2304_PV.F_CV;19.200000763;100.0 +25/10/2020 02:06:39;U870.TI2304_PV.F_CV;18.899999619;100.0 +25/10/2020 02:06:52;U870.TI2304_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:06;U870.TI2305_PV.F_CV;18.899999619;100.0 +25/10/2020 02:06:16;U870.TI2305_PV.F_CV;18.500000000;100.0 +25/10/2020 02:06:29;U870.TI2305_PV.F_CV;18.899999619;100.0 +25/10/2020 02:06:42;U870.TI2305_PV.F_CV;18.500000000;100.0 +25/10/2020 02:06:51;U870.TI230_PV.F_CV;20.425485611;100.0 +25/10/2020 02:06:02;U870.TI232_PV.F_CV;29.187278748;100.0 +25/10/2020 02:06:04;U870.TI232_PV.F_CV;29.119606018;100.0 +25/10/2020 02:06:07;U870.TI232_PV.F_CV;29.183914185;100.0 +25/10/2020 02:06:09;U870.TI232_PV.F_CV;29.265504837;100.0 +25/10/2020 02:06:12;U870.TI232_PV.F_CV;29.225002289;100.0 +25/10/2020 02:06:15;U870.TI232_PV.F_CV;29.117658615;100.0 +25/10/2020 02:06:23;U870.TI232_PV.F_CV;29.186580658;100.0 +25/10/2020 02:06:25;U870.TI232_PV.F_CV;29.124773026;100.0 +25/10/2020 02:06:35;U870.TI232_PV.F_CV;29.218080521;100.0 +25/10/2020 02:06:36;U870.TI232_PV.F_CV;29.273155212;100.0 +25/10/2020 02:06:39;U870.TI232_PV.F_CV;29.116235733;100.0 +25/10/2020 02:06:41;U870.TI232_PV.F_CV;29.184967041;100.0 +25/10/2020 02:06:56;U870.TI232_PV.F_CV;29.132766724;100.0 +25/10/2020 02:06:59;U870.TI232_PV.F_CV;29.180183411;100.0 +25/10/2020 02:06:15;U870.TI2402_PV.F_CV;21.899999619;100.0 +25/10/2020 02:06:46;U870.TI2403_PV.F_CV;22.000000000;100.0 +25/10/2020 02:06:23;U870.TI2404_PV.F_CV;22.100000381;100.0 +25/10/2020 02:06:48;U870.TI2405_PV.F_CV;22.899999619;100.0 +25/10/2020 02:06:20;U870.TI304A_CoefA.F_CV;1.005584955;100.0 +25/10/2020 02:06:20;U870.TI304A_CoefB.F_CV;0.000000000;0.0 +25/10/2020 02:06:15;U870.TI304A_PV.F_CV;17.660245895;100.0 +25/10/2020 02:06:20;U870.TI304B_CoefA.F_CV;0.999481201;100.0 +25/10/2020 02:06:20;U870.TI304B_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U870.TI304B_PV.F_CV;18.099996567;100.0 +25/10/2020 02:06:20;U870.TI305A_CoefA.F_CV;1.001007080;100.0 +25/10/2020 02:06:20;U870.TI305A_CoefB.F_CV;1.495406985;100.0 +25/10/2020 02:06:19;U870.TI305A_PV.F_CV;20.081586838;100.0 +25/10/2020 02:06:20;U870.TI305B_CoefA.F_CV;0.999481201;100.0 +25/10/2020 02:06:20;U870.TI305B_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U870.TI305B_PV.F_CV;18.300285339;100.0 +25/10/2020 02:06:20;U870.TI307_CoefA.F_CV;0.997955263;100.0 +25/10/2020 02:06:20;U870.TI307_CoefB.F_CV;1.872310638;100.0 +25/10/2020 02:06:58;U870.TI307_PV.F_CV;21.463348389;100.0 +25/10/2020 02:06:20;U870.TI308_CoefA.F_CV;0.996429384;100.0 +25/10/2020 02:06:20;U870.TI308_CoefB.F_CV;2.681051016;100.0 +25/10/2020 02:06:53;U870.TI308_PV.F_CV;22.342302322;100.0 +25/10/2020 02:06:20;U870.TI309_CoefA.F_CV;0.993377507;100.0 +25/10/2020 02:06:20;U870.TI309_CoefB.F_CV;3.616443157;100.0 +25/10/2020 02:06:31;U870.TI309_PV.F_CV;22.399393082;100.0 +25/10/2020 02:06:02;U870.TI323_PV.F_CV;6.722060680;100.0 +25/10/2020 02:06:05;U870.TI323_PV.F_CV;6.873932838;100.0 +25/10/2020 02:06:08;U870.TI323_PV.F_CV;6.899082661;100.0 +25/10/2020 02:06:10;U870.TI323_PV.F_CV;6.816679001;100.0 +25/10/2020 02:06:15;U870.TI323_PV.F_CV;6.879091740;100.0 +25/10/2020 02:06:27;U870.TI323_PV.F_CV;6.827999115;100.0 +25/10/2020 02:06:28;U870.TI323_PV.F_CV;6.741942406;100.0 +25/10/2020 02:06:29;U870.TI323_PV.F_CV;6.713743210;100.0 +25/10/2020 02:06:30;U870.TI323_PV.F_CV;6.822583675;100.0 +25/10/2020 02:06:31;U870.TI323_PV.F_CV;6.874632359;100.0 +25/10/2020 02:06:33;U870.TI323_PV.F_CV;6.823490620;100.0 +25/10/2020 02:06:36;U870.TI323_PV.F_CV;6.967272282;100.0 +25/10/2020 02:06:38;U870.TI323_PV.F_CV;6.929254055;100.0 +25/10/2020 02:06:40;U870.TI323_PV.F_CV;6.831140995;100.0 +25/10/2020 02:06:41;U870.TI323_PV.F_CV;6.742971897;100.0 +25/10/2020 02:06:42;U870.TI323_PV.F_CV;6.714080811;100.0 +25/10/2020 02:06:43;U870.TI323_PV.F_CV;6.763654232;100.0 +25/10/2020 02:06:46;U870.TI323_PV.F_CV;6.719692707;100.0 +25/10/2020 02:06:49;U870.TI323_PV.F_CV;6.867138386;100.0 +25/10/2020 02:06:54;U870.TI323_PV.F_CV;6.722000122;100.0 +25/10/2020 02:06:02;U870.TI330_PV.F_CV;21.991384506;100.0 +25/10/2020 02:06:43;U870.TI330_PV.F_CV;21.734199524;100.0 +25/10/2020 02:06:17;U870.TI332_PV.F_CV;3.332768202;100.0 +25/10/2020 02:06:20;U870.TI332_PV.F_CV;3.222124338;100.0 +25/10/2020 02:06:23;U870.TI332_PV.F_CV;3.373934746;100.0 +25/10/2020 02:06:30;U870.TI332_PV.F_CV;3.467221498;100.0 +25/10/2020 02:06:37;U870.TI332_PV.F_CV;3.380228519;100.0 +25/10/2020 02:06:38;U870.TI332_PV.F_CV;3.326289415;100.0 +25/10/2020 02:06:41;U870.TI332_PV.F_CV;3.300925016;100.0 +25/10/2020 02:06:44;U870.TI332_PV.F_CV;3.473188877;100.0 +25/10/2020 02:06:46;U870.TI332_PV.F_CV;3.423335791;100.0 +25/10/2020 02:06:20;U870.TI404A_CoefA.F_CV;1.004058957;100.0 +25/10/2020 02:06:20;U870.TI404A_CoefB.F_CV;1.983703136;100.0 +25/10/2020 02:06:03;U870.TI404A_PV.F_CV;19.180112839;100.0 +25/10/2020 02:06:13;U870.TI404A_PV.F_CV;18.897197723;100.0 +25/10/2020 02:06:21;U870.TI404A_PV.F_CV;19.197771072;100.0 +25/10/2020 02:06:26;U870.TI404A_PV.F_CV;18.843297958;100.0 +25/10/2020 02:06:29;U870.TI404A_PV.F_CV;19.098241806;100.0 +25/10/2020 02:06:34;U870.TI404A_PV.F_CV;18.805130005;100.0 +25/10/2020 02:06:44;U870.TI404A_PV.F_CV;19.067514420;100.0 +25/10/2020 02:06:52;U870.TI404A_PV.F_CV;18.812370300;100.0 +25/10/2020 02:06:20;U870.TI404B_CoefA.F_CV;0.994903386;100.0 +25/10/2020 02:06:20;U870.TI404B_CoefB.F_CV;4.513687611;100.0 +25/10/2020 02:06:20;U870.TI404B_PV.F_CV;21.615810394;100.0 +25/10/2020 02:06:27;U870.TI404B_PV.F_CV;21.291530609;100.0 +25/10/2020 02:06:20;U870.TI405A_CoefA.F_CV;1.004058957;100.0 +25/10/2020 02:06:20;U870.TI405A_CoefB.F_CV;1.290932894;100.0 +25/10/2020 02:06:56;U870.TI405A_PV.F_CV;18.765108109;100.0 +25/10/2020 02:06:20;U870.TI405B_CoefA.F_CV;0.997955263;100.0 +25/10/2020 02:06:20;U870.TI405B_CoefB.F_CV;2.389599323;100.0 +25/10/2020 02:06:28;U870.TI405B_PV.F_CV;20.013109207;100.0 +25/10/2020 02:06:33;U870.TI405B_PV.F_CV;19.709173203;100.0 +25/10/2020 02:06:57;U870.TI405B_PV.F_CV;19.962526321;100.0 +25/10/2020 02:06:59;U870.TI405B_PV.F_CV;19.648849487;100.0 +25/10/2020 02:06:20;U870.TI407_CoefA.F_CV;0.999481201;100.0 +25/10/2020 02:06:20;U870.TI407_CoefB.F_CV;0.541703522;100.0 +25/10/2020 02:06:57;U870.TI407_PV.F_CV;20.194417953;100.0 +25/10/2020 02:06:20;U870.TI408_CoefA.F_CV;0.996429384;100.0 +25/10/2020 02:06:20;U870.TI408_CoefB.F_CV;2.681051016;100.0 +25/10/2020 02:06:12;U870.TI408_PV.F_CV;22.130226135;100.0 +25/10/2020 02:06:20;U870.TI409_CoefA.F_CV;1.004058957;100.0 +25/10/2020 02:06:20;U870.TI409_CoefB.F_CV;0.000000000;0.0 +25/10/2020 02:06:30;U870.TI409_PV.F_CV;18.207098007;100.0 +25/10/2020 02:06:00;U870.TI423_PV.F_CV;20.522466660;100.0 +25/10/2020 02:06:01;U870.TI423_PV.F_CV;20.574594498;100.0 +25/10/2020 02:06:05;U870.TI423_PV.F_CV;20.599706650;100.0 +25/10/2020 02:06:09;U870.TI423_PV.F_CV;20.421470642;100.0 +25/10/2020 02:06:11;U870.TI423_PV.F_CV;20.560361862;100.0 +25/10/2020 02:06:12;U870.TI423_PV.F_CV;20.587011337;100.0 +25/10/2020 02:06:19;U870.TI423_PV.F_CV;20.516771317;100.0 +25/10/2020 02:06:21;U870.TI423_PV.F_CV;20.434568405;100.0 +25/10/2020 02:06:23;U870.TI423_PV.F_CV;20.475711823;100.0 +25/10/2020 02:06:24;U870.TI423_PV.F_CV;20.559274673;100.0 +25/10/2020 02:06:25;U870.TI423_PV.F_CV;20.586654663;100.0 +25/10/2020 02:06:29;U870.TI423_PV.F_CV;20.532613754;100.0 +25/10/2020 02:06:39;U870.TI423_PV.F_CV;20.635992050;100.0 +25/10/2020 02:06:40;U870.TI423_PV.F_CV;20.679025650;100.0 +25/10/2020 02:06:43;U870.TI423_PV.F_CV;20.431474686;100.0 +25/10/2020 02:06:48;U870.TI423_PV.F_CV;20.585958481;100.0 +25/10/2020 02:06:09;U870.TI430_PV.F_CV;20.878524780;100.0 +25/10/2020 02:06:14;U870.TI430_PV.F_CV;20.614816666;100.0 +25/10/2020 02:06:19;U870.TI430_PV.F_CV;20.865579605;100.0 +25/10/2020 02:06:27;U870.TI430_PV.F_CV;20.613498688;100.0 +25/10/2020 02:06:40;U870.TI430_PV.F_CV;20.868522644;100.0 +25/10/2020 02:06:00;U870.TI432_PV.F_CV;23.707057953;100.0 +25/10/2020 02:06:01;U870.TI432_PV.F_CV;23.500617981;100.0 +25/10/2020 02:06:02;U870.TI432_PV.F_CV;23.432970047;100.0 +25/10/2020 02:06:09;U870.TI432_PV.F_CV;23.578977585;100.0 +25/10/2020 02:06:17;U870.TI432_PV.F_CV;23.500919342;100.0 +25/10/2020 02:06:19;U870.TI432_PV.F_CV;23.567331314;100.0 +25/10/2020 02:06:22;U870.TI432_PV.F_CV;23.519821167;100.0 +25/10/2020 02:06:30;U870.TI432_PV.F_CV;23.599081039;100.0 +25/10/2020 02:06:34;U870.TI432_PV.F_CV;23.503507614;100.0 +25/10/2020 02:06:38;U870.TI432_PV.F_CV;23.586618423;100.0 +25/10/2020 02:06:40;U870.TI432_PV.F_CV;23.524776459;100.0 +25/10/2020 02:06:43;U870.TI432_PV.F_CV;23.667318344;100.0 +25/10/2020 02:06:46;U870.TI432_PV.F_CV;23.520324707;100.0 +25/10/2020 02:06:48;U870.TI432_PV.F_CV;23.660240173;100.0 +25/10/2020 02:06:49;U870.TI432_PV.F_CV;23.686971664;100.0 +25/10/2020 02:06:50;U870.TI432_PV.F_CV;23.577650070;100.0 +25/10/2020 02:06:51;U870.TI432_PV.F_CV;23.525444031;100.0 +25/10/2020 02:06:55;U870.TI432_PV.F_CV;23.500293732;100.0 +25/10/2020 02:06:29;U870.TI801_PV.F_CV;19.999950409;100.0 +25/10/2020 02:06:29;U870.TI802_PV.F_CV;19.698204041;100.0 +25/10/2020 02:06:51;U870.TI802_PV.F_CV;19.417623520;100.0 +25/10/2020 02:06:20;U870.TI803_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:20;U870.TI804_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:57;U870.WI102_PV.F_CV;4901.899902344;100.0 +25/10/2020 02:06:59;U870.WI105_PV.F_CV;2606.800048828;100.0 +25/10/2020 02:06:08;U870.WI202_PV.F_CV;2607.899902344;100.0 +25/10/2020 02:06:48;U870.WI205_PV.F_CV;1783.000000000;100.0 +25/10/2020 02:06:33;U870.WI302_PV.F_CV;3884.399902344;100.0 +25/10/2020 02:06:07;U870.WI305_PV.F_CV;2293.199951172;100.0 +25/10/2020 02:06:58;U870.WI402_PV.F_CV;4483.500000000;100.0 +25/10/2020 02:06:40;U870.WI405_PV.F_CV;2492.800048828;100.0 +25/10/2020 02:06:10;U875.AI501_PV.F_CV;1.481570244;100.0 +25/10/2020 02:06:10;U875.DI500_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U875.DI502_PV.F_CV;853.938720703;100.0 +25/10/2020 02:06:05;U875.DI502_PV.F_CV;862.107177734;100.0 +25/10/2020 02:06:10;U875.DI502_PV.F_CV;868.723266602;100.0 +25/10/2020 02:06:15;U875.DI502_PV.F_CV;874.139221191;100.0 +25/10/2020 02:06:20;U875.DI502_PV.F_CV;878.598144531;100.0 +25/10/2020 02:06:25;U875.DI502_PV.F_CV;881.640441895;100.0 +25/10/2020 02:06:30;U875.DI502_PV.F_CV;884.085021973;100.0 +25/10/2020 02:06:35;U875.DI502_PV.F_CV;887.119567871;100.0 +25/10/2020 02:06:40;U875.DI502_PV.F_CV;889.436767578;100.0 +25/10/2020 02:06:45;U875.DI502_PV.F_CV;891.589050293;100.0 +25/10/2020 02:06:50;U875.DI502_PV.F_CV;893.236511230;100.0 +25/10/2020 02:06:55;U875.DI502_PV.F_CV;894.604125977;100.0 +25/10/2020 02:06:00;U875.DI503_PV.F_CV;873.583312988;100.0 +25/10/2020 02:06:05;U875.DI503_PV.F_CV;873.183410645;100.0 +25/10/2020 02:06:10;U875.DI503_PV.F_CV;873.045227051;100.0 +25/10/2020 02:06:15;U875.DI503_PV.F_CV;872.254699707;100.0 +25/10/2020 02:06:20;U875.DI503_PV.F_CV;871.976074219;100.0 +25/10/2020 02:06:25;U875.DI503_PV.F_CV;871.292968750;100.0 +25/10/2020 02:06:30;U875.DI503_PV.F_CV;870.861511230;100.0 +25/10/2020 02:06:35;U875.DI503_PV.F_CV;870.390319824;100.0 +25/10/2020 02:06:40;U875.DI503_PV.F_CV;869.999023438;100.0 +25/10/2020 02:06:45;U875.DI503_PV.F_CV;869.351562500;100.0 +25/10/2020 02:06:50;U875.DI503_PV.F_CV;869.048339844;100.0 +25/10/2020 02:06:55;U875.DI503_PV.F_CV;868.962219238;100.0 +25/10/2020 02:06:47;U875.DPY_R100_COEFB.F_CV;-1.459060669;100.0 +25/10/2020 02:06:07;U875.DPY_R100_PV.F_CV;0.154504299;100.0 +25/10/2020 02:06:47;U875.DPY_R200_COEFB.F_CV;0.945991516;100.0 +25/10/2020 02:06:45;U875.DPY_R200_PV.F_CV;-0.073858976;100.0 +25/10/2020 02:06:56;U875.DPY_R300_COEFB.F_CV;-0.466201782;100.0 +25/10/2020 02:06:49;U875.DPY_R300_PV.F_CV;0.118978202;100.0 +25/10/2020 02:06:03;U875.DPY_R400_COEFB.F_CV;0.197113037;100.0 +25/10/2020 02:06:15;U875.DPY_R400_PV.F_CV;0.268394828;100.0 +25/10/2020 02:06:58;U875.DPY_R400_PV.F_CV;0.165172994;100.0 +25/10/2020 02:06:47;U875.DPY_U876_COEFB.F_CV;-0.082157135;100.0 +25/10/2020 02:06:23;U875.DPY_U876_PV.F_CV;0.415837824;100.0 +25/10/2020 02:06:51;U875.DPY_U877_COEFB.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U875.DPY_U877_PV.F_CV;0.647957444;100.0 +25/10/2020 02:06:06;U875.EV100.F_CV;0.000000000;0.0 +25/10/2020 02:06:06;U875.EV101.F_CV;0.000000000;0.0 +25/10/2020 02:06:06;U875.EV132.F_CV;0.000000000;0.0 +25/10/2020 02:06:06;U875.EV300.F_CV;0.000000000;0.0 +25/10/2020 02:06:06;U875.EV301.F_CV;0.000000000;0.0 +25/10/2020 02:06:06;U875.EV332.F_CV;0.000000000;0.0 +25/10/2020 02:06:18;U875.FC100_CoefA.F_CV;0.970000029;100.0 +25/10/2020 02:06:06;U875.FC100_CoefB.F_CV;-0.226999998;100.0 +25/10/2020 02:06:22;U875.FC100_PV.F_CV;43.003036499;100.0 +25/10/2020 02:06:11;U875.FC100_SP.F_CV;43.000000000;100.0 +25/10/2020 02:06:08;U875.FC102_PV.F_CV;0.904282689;100.0 +25/10/2020 02:06:11;U875.FC102_PV.F_CV;1.619396567;100.0 +25/10/2020 02:06:17;U875.FC102_PV.F_CV;1.294640064;100.0 +25/10/2020 02:06:20;U875.FC102_PV.F_CV;1.464542508;100.0 +25/10/2020 02:06:22;U875.FC102_PV.F_CV;0.978519738;100.0 +25/10/2020 02:06:26;U875.FC102_PV.F_CV;1.391562343;100.0 +25/10/2020 02:06:30;U875.FC102_PV.F_CV;1.193266511;100.0 +25/10/2020 02:06:32;U875.FC102_PV.F_CV;1.460597634;100.0 +25/10/2020 02:06:36;U875.FC102_PV.F_CV;0.989037335;100.0 +25/10/2020 02:06:41;U875.FC102_PV.F_CV;1.443108916;100.0 +25/10/2020 02:06:50;U875.FC102_PV.F_CV;1.074888587;100.0 +25/10/2020 02:06:53;U875.FC102_PV.F_CV;1.225544930;100.0 +25/10/2020 02:06:55;U875.FC102_PV.F_CV;1.056188822;100.0 +25/10/2020 02:06:31;U875.FC102_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U875.FC103_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.FC103_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U875.FC103_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:06;U875.FC103_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U875.FC104_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U875.FC104_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U875.FC109_CoefA.F_CV;0.982599974;100.0 +25/10/2020 02:06:06;U875.FC109_CoefB.F_CV;0.167999998;100.0 +25/10/2020 02:06:54;U875.FC109_PV.F_CV;10.000014305;100.0 +25/10/2020 02:06:18;U875.FC109_SP.F_CV;10.000000000;100.0 +25/10/2020 02:06:05;U875.FC111_OP.F_CV;53.259998322;100.0 +25/10/2020 02:06:07;U875.FC111_OP.F_CV;53.201927185;100.0 +25/10/2020 02:06:11;U875.FC111_OP.F_CV;53.389873505;100.0 +25/10/2020 02:06:16;U875.FC111_OP.F_CV;53.592430115;100.0 +25/10/2020 02:06:17;U875.FC111_OP.F_CV;53.518474579;100.0 +25/10/2020 02:06:18;U875.FC111_OP.F_CV;53.308578491;100.0 +25/10/2020 02:06:21;U875.FC111_OP.F_CV;53.375007629;100.0 +25/10/2020 02:06:23;U875.FC111_OP.F_CV;53.273880005;100.0 +25/10/2020 02:06:29;U875.FC111_OP.F_CV;53.431503296;100.0 +25/10/2020 02:06:41;U875.FC111_OP.F_CV;54.083145142;100.0 +25/10/2020 02:06:49;U875.FC111_OP.F_CV;54.555011749;100.0 +25/10/2020 02:06:52;U875.FC111_OP.F_CV;54.390407562;100.0 +25/10/2020 02:06:58;U875.FC111_OP.F_CV;54.550258636;100.0 +25/10/2020 02:06:25;U875.FC111_PV.F_CV;116.327911377;100.0 +25/10/2020 02:06:44;U875.FC111_SP.F_CV;111.400001526;100.0 +25/10/2020 02:06:06;U875.FC300_CoefA.F_CV;0.960600019;100.0 +25/10/2020 02:06:06;U875.FC300_CoefB.F_CV;0.143900007;100.0 +25/10/2020 02:06:57;U875.FC300_PV.F_CV;76.001129150;100.0 +25/10/2020 02:06:54;U875.FC300_SP.F_CV;76.000000000;100.0 +25/10/2020 02:06:06;U875.FC302_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.FC302_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U875.FC302_PV.F_CV;0.802985072;100.0 +25/10/2020 02:06:09;U875.FC302_PV.F_CV;0.473044425;100.0 +25/10/2020 02:06:13;U875.FC302_PV.F_CV;0.885912061;100.0 +25/10/2020 02:06:17;U875.FC302_PV.F_CV;0.635569155;100.0 +25/10/2020 02:06:19;U875.FC302_PV.F_CV;0.788738906;100.0 +25/10/2020 02:06:22;U875.FC302_PV.F_CV;0.590521991;100.0 +25/10/2020 02:06:34;U875.FC302_PV.F_CV;0.789775074;100.0 +25/10/2020 02:06:36;U875.FC302_PV.F_CV;0.522374809;100.0 +25/10/2020 02:06:38;U875.FC302_PV.F_CV;0.838684142;100.0 +25/10/2020 02:06:41;U875.FC302_PV.F_CV;0.648747146;100.0 +25/10/2020 02:06:47;U875.FC302_PV.F_CV;1.000478387;100.0 +25/10/2020 02:06:54;U875.FC302_PV.F_CV;0.806545258;100.0 +25/10/2020 02:06:06;U875.FC302_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U875.FC304_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U875.FC304_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U875.FC309_CoefA.F_CV;0.964600027;100.0 +25/10/2020 02:06:06;U875.FC309_CoefB.F_CV;0.096600004;100.0 +25/10/2020 02:06:19;U875.FC309_PV.F_CV;10.000013351;100.0 +25/10/2020 02:06:04;U875.FC309_SP.F_CV;10.000000000;100.0 +25/10/2020 02:06:00;U875.FC311_OP.F_CV;61.794719696;100.0 +25/10/2020 02:06:03;U875.FC311_OP.F_CV;61.698558807;100.0 +25/10/2020 02:06:12;U875.FC311_OP.F_CV;61.811096191;100.0 +25/10/2020 02:06:31;U875.FC311_OP.F_CV;61.751247406;100.0 +25/10/2020 02:06:35;U875.FC311_OP.F_CV;61.815597534;100.0 +25/10/2020 02:06:38;U875.FC311_OP.F_CV;61.754173279;100.0 +25/10/2020 02:06:40;U875.FC311_OP.F_CV;61.870342255;100.0 +25/10/2020 02:06:51;U875.FC311_OP.F_CV;61.819183350;100.0 +25/10/2020 02:06:53;U875.FC311_OP.F_CV;61.749191284;100.0 +25/10/2020 02:06:44;U875.FC311_PV.F_CV;110.835105896;100.0 +25/10/2020 02:06:20;U875.FC311_SP.F_CV;111.400001526;100.0 +25/10/2020 02:06:06;U875.FCY111_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:06;U875.FCY311_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:06;U875.FI130_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U875.FI130_PV.F_CV;46.566761017;100.0 +25/10/2020 02:06:01;U875.FI130_PV.F_CV;49.467918396;100.0 +25/10/2020 02:06:02;U875.FI130_PV.F_CV;63.944046021;100.0 +25/10/2020 02:06:04;U875.FI130_PV.F_CV;51.701683044;100.0 +25/10/2020 02:06:05;U875.FI130_PV.F_CV;46.688961029;100.0 +25/10/2020 02:06:06;U875.FI130_PV.F_CV;66.849365234;100.0 +25/10/2020 02:06:07;U875.FI130_PV.F_CV;54.817363739;100.0 +25/10/2020 02:06:08;U875.FI130_PV.F_CV;40.594692230;100.0 +25/10/2020 02:06:09;U875.FI130_PV.F_CV;63.967018127;100.0 +25/10/2020 02:06:10;U875.FI130_PV.F_CV;57.767379761;100.0 +25/10/2020 02:06:11;U875.FI130_PV.F_CV;43.639427185;100.0 +25/10/2020 02:06:13;U875.FI130_PV.F_CV;62.305690765;100.0 +25/10/2020 02:06:14;U875.FI130_PV.F_CV;49.652896881;100.0 +25/10/2020 02:06:15;U875.FI130_PV.F_CV;52.074207306;100.0 +25/10/2020 02:06:16;U875.FI130_PV.F_CV;65.888191223;100.0 +25/10/2020 02:06:17;U875.FI130_PV.F_CV;53.105499268;100.0 +25/10/2020 02:06:18;U875.FI130_PV.F_CV;39.155193329;100.0 +25/10/2020 02:06:19;U875.FI130_PV.F_CV;28.179307938;100.0 +25/10/2020 02:06:20;U875.FI130_PV.F_CV;20.137392044;100.0 +25/10/2020 02:06:21;U875.FI130_PV.F_CV;35.685565948;100.0 +25/10/2020 02:06:22;U875.FI130_PV.F_CV;49.895462036;100.0 +25/10/2020 02:06:23;U875.FI130_PV.F_CV;77.511680603;100.0 +25/10/2020 02:06:25;U875.FI130_PV.F_CV;67.666465759;100.0 +25/10/2020 02:06:26;U875.FI130_PV.F_CV;50.873649597;100.0 +25/10/2020 02:06:27;U875.FI130_PV.F_CV;58.559562683;100.0 +25/10/2020 02:06:28;U875.FI130_PV.F_CV;66.791542053;100.0 +25/10/2020 02:06:29;U875.FI130_PV.F_CV;52.953403473;100.0 +25/10/2020 02:06:30;U875.FI130_PV.F_CV;75.600967407;100.0 +25/10/2020 02:06:31;U875.FI130_PV.F_CV;65.429771423;100.0 +25/10/2020 02:06:32;U875.FI130_PV.F_CV;49.092693329;100.0 +25/10/2020 02:06:33;U875.FI130_PV.F_CV;35.507118225;100.0 +25/10/2020 02:06:34;U875.FI130_PV.F_CV;64.265129089;100.0 +25/10/2020 02:06:35;U875.FI130_PV.F_CV;54.128341675;100.0 +25/10/2020 02:06:36;U875.FI130_PV.F_CV;40.350414276;100.0 +25/10/2020 02:06:37;U875.FI130_PV.F_CV;58.864059448;100.0 +25/10/2020 02:06:38;U875.FI130_PV.F_CV;59.997074127;100.0 +25/10/2020 02:06:39;U875.FI130_PV.F_CV;46.611690521;100.0 +25/10/2020 02:06:40;U875.FI130_PV.F_CV;34.036930084;100.0 +25/10/2020 02:06:41;U875.FI130_PV.F_CV;63.281330109;100.0 +25/10/2020 02:06:42;U875.FI130_PV.F_CV;53.441051483;100.0 +25/10/2020 02:06:43;U875.FI130_PV.F_CV;39.863658905;100.0 +25/10/2020 02:06:44;U875.FI130_PV.F_CV;66.229103088;100.0 +25/10/2020 02:06:45;U875.FI130_PV.F_CV;55.952480316;100.0 +25/10/2020 02:06:46;U875.FI130_PV.F_CV;41.692653656;100.0 +25/10/2020 02:06:47;U875.FI130_PV.F_CV;30.096147537;100.0 +25/10/2020 02:06:48;U875.FI130_PV.F_CV;37.097999573;100.0 +25/10/2020 02:06:49;U875.FI130_PV.F_CV;54.994895935;100.0 +25/10/2020 02:06:50;U875.FI130_PV.F_CV;45.296577454;100.0 +25/10/2020 02:06:51;U875.FI130_PV.F_CV;33.581329346;100.0 +25/10/2020 02:06:52;U875.FI130_PV.F_CV;59.194465637;100.0 +25/10/2020 02:06:53;U875.FI130_PV.F_CV;55.441413879;100.0 +25/10/2020 02:06:54;U875.FI130_PV.F_CV;42.340347290;100.0 +25/10/2020 02:06:55;U875.FI130_PV.F_CV;30.774190903;100.0 +25/10/2020 02:06:56;U875.FI130_PV.F_CV;57.044425964;100.0 +25/10/2020 02:06:57;U875.FI130_PV.F_CV;53.877460480;100.0 +25/10/2020 02:06:58;U875.FI130_PV.F_CV;41.219200134;100.0 +25/10/2020 02:06:59;U875.FI130_PV.F_CV;55.965072632;100.0 +25/10/2020 02:06:06;U875.FI330_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U875.FI330_PV.F_CV;97.261032104;100.0 +25/10/2020 02:06:01;U875.FI330_PV.F_CV;88.832893372;100.0 +25/10/2020 02:06:03;U875.FI330_PV.F_CV;72.785926819;100.0 +25/10/2020 02:06:04;U875.FI330_PV.F_CV;87.529945374;100.0 +25/10/2020 02:06:05;U875.FI330_PV.F_CV;75.603858948;100.0 +25/10/2020 02:06:06;U875.FI330_PV.F_CV;90.033439636;100.0 +25/10/2020 02:06:07;U875.FI330_PV.F_CV;91.854629517;100.0 +25/10/2020 02:06:09;U875.FI330_PV.F_CV;74.934288025;100.0 +25/10/2020 02:06:10;U875.FI330_PV.F_CV;92.233024597;100.0 +25/10/2020 02:06:12;U875.FI330_PV.F_CV;97.406570435;100.0 +25/10/2020 02:06:13;U875.FI330_PV.F_CV;78.422088623;100.0 +25/10/2020 02:06:14;U875.FI330_PV.F_CV;89.856262207;100.0 +25/10/2020 02:06:15;U875.FI330_PV.F_CV;79.539573669;100.0 +25/10/2020 02:06:16;U875.FI330_PV.F_CV;75.868675232;100.0 +25/10/2020 02:06:17;U875.FI330_PV.F_CV;83.870796204;100.0 +25/10/2020 02:06:18;U875.FI330_PV.F_CV;81.404289246;100.0 +25/10/2020 02:06:19;U875.FI330_PV.F_CV;87.350440979;100.0 +25/10/2020 02:06:20;U875.FI330_PV.F_CV;105.962333679;100.0 +25/10/2020 02:06:21;U875.FI330_PV.F_CV;104.259307861;100.0 +25/10/2020 02:06:22;U875.FI330_PV.F_CV;106.145828247;100.0 +25/10/2020 02:06:23;U875.FI330_PV.F_CV;82.446624756;100.0 +25/10/2020 02:06:25;U875.FI330_PV.F_CV;85.682403564;100.0 +25/10/2020 02:06:26;U875.FI330_PV.F_CV;81.919929504;100.0 +25/10/2020 02:06:27;U875.FI330_PV.F_CV;96.167251587;100.0 +25/10/2020 02:06:28;U875.FI330_PV.F_CV;85.183242798;100.0 +25/10/2020 02:06:32;U875.FI330_PV.F_CV;88.713539124;100.0 +25/10/2020 02:06:33;U875.FI330_PV.F_CV;107.521636963;100.0 +25/10/2020 02:06:34;U875.FI330_PV.F_CV;108.601768494;100.0 +25/10/2020 02:06:35;U875.FI330_PV.F_CV;103.737236023;100.0 +25/10/2020 02:06:36;U875.FI330_PV.F_CV;109.869064331;100.0 +25/10/2020 02:06:37;U875.FI330_PV.F_CV;97.815261841;100.0 +25/10/2020 02:06:38;U875.FI330_PV.F_CV;94.779731750;100.0 +25/10/2020 02:06:39;U875.FI330_PV.F_CV;92.411026001;100.0 +25/10/2020 02:06:40;U875.FI330_PV.F_CV;69.044982910;100.0 +25/10/2020 02:06:41;U875.FI330_PV.F_CV;85.988059998;100.0 +25/10/2020 02:06:42;U875.FI330_PV.F_CV;74.836975098;100.0 +25/10/2020 02:06:43;U875.FI330_PV.F_CV;90.183944702;100.0 +25/10/2020 02:06:44;U875.FI330_PV.F_CV;93.522880554;100.0 +25/10/2020 02:06:45;U875.FI330_PV.F_CV;97.615844727;100.0 +25/10/2020 02:06:46;U875.FI330_PV.F_CV;106.497116089;100.0 +25/10/2020 02:06:47;U875.FI330_PV.F_CV;95.624618530;100.0 +25/10/2020 02:06:48;U875.FI330_PV.F_CV;110.449165344;100.0 +25/10/2020 02:06:49;U875.FI330_PV.F_CV;87.750671387;100.0 +25/10/2020 02:06:50;U875.FI330_PV.F_CV;94.775306702;100.0 +25/10/2020 02:06:51;U875.FI330_PV.F_CV;86.268554688;100.0 +25/10/2020 02:06:52;U875.FI330_PV.F_CV;65.476150513;100.0 +25/10/2020 02:06:53;U875.FI330_PV.F_CV;87.124465942;100.0 +25/10/2020 02:06:54;U875.FI330_PV.F_CV;70.737617493;100.0 +25/10/2020 02:06:55;U875.FI330_PV.F_CV;90.345146179;100.0 +25/10/2020 02:06:56;U875.FI330_PV.F_CV;99.419998169;100.0 +25/10/2020 02:06:57;U875.FI330_PV.F_CV;94.047882080;100.0 +25/10/2020 02:06:58;U875.FI330_PV.F_CV;80.346099854;100.0 +25/10/2020 02:06:59;U875.FI330_PV.F_CV;90.958290100;100.0 +25/10/2020 02:06:00;U875.FI503_PV.F_CV;102.432708740;100.0 +25/10/2020 02:06:05;U875.FI503_PV.F_CV;86.501548767;100.0 +25/10/2020 02:06:10;U875.FI503_PV.F_CV;76.448020935;100.0 +25/10/2020 02:06:20;U875.FI503_PV.F_CV;62.074768066;100.0 +25/10/2020 02:06:25;U875.FI503_PV.F_CV;57.980331421;100.0 +25/10/2020 02:06:30;U875.FI503_PV.F_CV;55.308242798;100.0 +25/10/2020 02:06:35;U875.FI503_PV.F_CV;50.988933563;100.0 +25/10/2020 02:06:45;U875.FI503_PV.F_CV;46.590400696;100.0 +25/10/2020 02:06:55;U875.FI503_PV.F_CV;44.177711487;100.0 +25/10/2020 02:06:45;U875.FQ130_PV.F_CV;16745.337890625;100.0 +25/10/2020 02:06:20;U875.FQ330_PV.F_CV;26912.306640625;100.0 +25/10/2020 02:06:05;U875.LC121_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U875.LC121_OP.F_CV;1.279356003;100.0 +25/10/2020 02:06:08;U875.LC121_OP.F_CV;6.957478046;100.0 +25/10/2020 02:06:11;U875.LC121_OP.F_CV;16.270057678;100.0 +25/10/2020 02:06:12;U875.LC121_OP.F_CV;19.258142471;100.0 +25/10/2020 02:06:13;U875.LC121_OP.F_CV;22.026010513;100.0 +25/10/2020 02:06:16;U875.LC121_OP.F_CV;29.699668884;100.0 +25/10/2020 02:06:17;U875.LC121_OP.F_CV;32.536178589;100.0 +25/10/2020 02:06:19;U875.LC121_OP.F_CV;38.028587341;100.0 +25/10/2020 02:06:20;U875.LC121_OP.F_CV;40.799900055;100.0 +25/10/2020 02:06:22;U875.LC121_OP.F_CV;46.614910126;100.0 +25/10/2020 02:06:23;U875.LC121_OP.F_CV;49.362651825;100.0 +25/10/2020 02:06:25;U875.LC121_OP.F_CV;47.688972473;100.0 +25/10/2020 02:06:26;U875.LC121_OP.F_CV;40.176605225;100.0 +25/10/2020 02:06:27;U875.LC121_OP.F_CV;35.345111847;100.0 +25/10/2020 02:06:28;U875.LC121_OP.F_CV;33.585781097;100.0 +25/10/2020 02:06:29;U875.LC121_OP.F_CV;33.998104095;100.0 +25/10/2020 02:06:30;U875.LC121_OP.F_CV;35.793815613;100.0 +25/10/2020 02:06:32;U875.LC121_OP.F_CV;40.548629761;100.0 +25/10/2020 02:06:33;U875.LC121_OP.F_CV;42.727493286;100.0 +25/10/2020 02:06:34;U875.LC121_OP.F_CV;45.068363190;100.0 +25/10/2020 02:06:36;U875.LC121_OP.F_CV;50.072322845;100.0 +25/10/2020 02:06:39;U875.LC121_OP.F_CV;57.377586365;100.0 +25/10/2020 02:06:40;U875.LC121_OP.F_CV;54.436340332;100.0 +25/10/2020 02:06:41;U875.LC121_OP.F_CV;45.192752838;100.0 +25/10/2020 02:06:42;U875.LC121_OP.F_CV;39.412631989;100.0 +25/10/2020 02:06:43;U875.LC121_OP.F_CV;37.185272217;100.0 +25/10/2020 02:06:44;U875.LC121_OP.F_CV;37.481761932;100.0 +25/10/2020 02:06:45;U875.LC121_OP.F_CV;39.111618042;100.0 +25/10/2020 02:06:46;U875.LC121_OP.F_CV;41.319057465;100.0 +25/10/2020 02:06:49;U875.LC121_OP.F_CV;48.690876007;100.0 +25/10/2020 02:06:50;U875.LC121_OP.F_CV;51.028091431;100.0 +25/10/2020 02:06:51;U875.LC121_OP.F_CV;53.181282043;100.0 +25/10/2020 02:06:52;U875.LC121_OP.F_CV;55.197841644;100.0 +25/10/2020 02:06:54;U875.LC121_OP.F_CV;58.673713684;100.0 +25/10/2020 02:06:55;U875.LC121_OP.F_CV;55.467884064;100.0 +25/10/2020 02:06:56;U875.LC121_OP.F_CV;45.938747406;100.0 +25/10/2020 02:06:57;U875.LC121_OP.F_CV;39.588855743;100.0 +25/10/2020 02:06:58;U875.LC121_OP.F_CV;36.528144836;100.0 +25/10/2020 02:06:59;U875.LC121_OP.F_CV;35.622562408;100.0 +25/10/2020 02:06:00;U875.LC121_PV.F_CV;55.021102905;100.0 +25/10/2020 02:06:01;U875.LC121_PV.F_CV;55.214996338;100.0 +25/10/2020 02:06:02;U875.LC121_PV.F_CV;55.546096802;100.0 +25/10/2020 02:06:04;U875.LC121_PV.F_CV;55.970836639;100.0 +25/10/2020 02:06:08;U875.LC121_PV.F_CV;57.871341705;100.0 +25/10/2020 02:06:09;U875.LC121_PV.F_CV;58.508914948;100.0 +25/10/2020 02:06:12;U875.LC121_PV.F_CV;60.002323151;100.0 +25/10/2020 02:06:20;U875.LC121_PV.F_CV;63.538932800;100.0 +25/10/2020 02:06:22;U875.LC121_PV.F_CV;64.449203491;100.0 +25/10/2020 02:06:25;U875.LC121_PV.F_CV;63.185012817;100.0 +25/10/2020 02:06:26;U875.LC121_PV.F_CV;62.256900787;100.0 +25/10/2020 02:06:27;U875.LC121_PV.F_CV;61.860580444;100.0 +25/10/2020 02:06:29;U875.LC121_PV.F_CV;62.101310730;100.0 +25/10/2020 02:06:38;U875.LC121_PV.F_CV;65.506828308;100.0 +25/10/2020 02:06:39;U875.LC121_PV.F_CV;65.377784729;100.0 +25/10/2020 02:06:40;U875.LC121_PV.F_CV;63.766761780;100.0 +25/10/2020 02:06:41;U875.LC121_PV.F_CV;62.653842926;100.0 +25/10/2020 02:06:42;U875.LC121_PV.F_CV;62.173667908;100.0 +25/10/2020 02:06:44;U875.LC121_PV.F_CV;62.375862122;100.0 +25/10/2020 02:06:49;U875.LC121_PV.F_CV;64.321220398;100.0 +25/10/2020 02:06:52;U875.LC121_PV.F_CV;65.222274780;100.0 +25/10/2020 02:06:53;U875.LC121_PV.F_CV;65.485794067;100.0 +25/10/2020 02:06:54;U875.LC121_PV.F_CV;64.922576904;100.0 +25/10/2020 02:06:55;U875.LC121_PV.F_CV;63.311519623;100.0 +25/10/2020 02:06:56;U875.LC121_PV.F_CV;62.237789154;100.0 +25/10/2020 02:06:57;U875.LC121_PV.F_CV;61.716682434;100.0 +25/10/2020 02:06:58;U875.LC121_PV.F_CV;61.556659698;100.0 +25/10/2020 02:06:59;U875.LC121_PV.F_CV;61.640754700;100.0 +25/10/2020 02:06:05;U875.LC121_SP.F_CV;60.000000000;100.0 +25/10/2020 02:06:10;U875.LC131_OP.F_CV;81.451713562;100.0 +25/10/2020 02:06:15;U875.LC131_OP.F_CV;80.816253662;100.0 +25/10/2020 02:06:21;U875.LC131_OP.F_CV;80.472480774;100.0 +25/10/2020 02:06:33;U875.LC131_OP.F_CV;80.302841187;100.0 +25/10/2020 02:06:37;U875.LC131_OP.F_CV;79.859260559;100.0 +25/10/2020 02:06:44;U875.LC131_OP.F_CV;79.988311768;100.0 +25/10/2020 02:06:52;U875.LC131_OP.F_CV;80.242324829;100.0 +25/10/2020 02:06:57;U875.LC131_OP.F_CV;80.853775024;100.0 +25/10/2020 02:06:09;U875.LC131_PV.F_CV;70.023796082;100.0 +25/10/2020 02:06:15;U875.LC131_PV.F_CV;69.664901733;100.0 +25/10/2020 02:06:20;U875.LC131_PV.F_CV;69.536949158;100.0 +25/10/2020 02:06:34;U875.LC131_PV.F_CV;69.402809143;100.0 +25/10/2020 02:06:36;U875.LC131_PV.F_CV;69.268486023;100.0 +25/10/2020 02:06:49;U875.LC131_PV.F_CV;69.445182800;100.0 +25/10/2020 02:06:54;U875.LC131_PV.F_CV;69.673278809;100.0 +25/10/2020 02:06:56;U875.LC131_PV.F_CV;69.806121826;100.0 +25/10/2020 02:06:27;U875.LC131_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:05;U875.LC321_OP.F_CV;4.279798031;100.0 +25/10/2020 02:06:06;U875.LC321_OP.F_CV;5.158879757;100.0 +25/10/2020 02:06:07;U875.LC321_OP.F_CV;6.383833408;100.0 +25/10/2020 02:06:09;U875.LC321_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U875.LC321_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U875.LC321_OP.F_CV;1.098511100;100.0 +25/10/2020 02:06:16;U875.LC321_OP.F_CV;2.368129730;100.0 +25/10/2020 02:06:17;U875.LC321_OP.F_CV;3.302879572;100.0 +25/10/2020 02:06:18;U875.LC321_OP.F_CV;4.012722492;100.0 +25/10/2020 02:06:20;U875.LC321_OP.F_CV;4.943482876;100.0 +25/10/2020 02:06:22;U875.LC321_OP.F_CV;5.475850582;100.0 +25/10/2020 02:06:31;U875.LC321_OP.F_CV;6.095726013;100.0 +25/10/2020 02:06:35;U875.LC321_OP.F_CV;6.647577763;100.0 +25/10/2020 02:06:36;U875.LC321_OP.F_CV;7.661220551;100.0 +25/10/2020 02:06:38;U875.LC321_OP.F_CV;9.956064224;100.0 +25/10/2020 02:06:39;U875.LC321_OP.F_CV;10.857310295;100.0 +25/10/2020 02:06:40;U875.LC321_OP.F_CV;11.512687683;100.0 +25/10/2020 02:06:42;U875.LC321_OP.F_CV;12.529100418;100.0 +25/10/2020 02:06:43;U875.LC321_OP.F_CV;12.938138008;100.0 +25/10/2020 02:06:44;U875.LC321_OP.F_CV;9.539171219;100.0 +25/10/2020 02:06:45;U875.LC321_OP.F_CV;3.168853045;100.0 +25/10/2020 02:06:46;U875.LC321_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U875.LC321_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U875.LC321_OP.F_CV;0.909290314;100.0 +25/10/2020 02:06:05;U875.LC321_PV.F_CV;58.800056458;100.0 +25/10/2020 02:06:06;U875.LC321_PV.F_CV;59.096355438;100.0 +25/10/2020 02:06:07;U875.LC321_PV.F_CV;58.935741425;100.0 +25/10/2020 02:06:09;U875.LC321_PV.F_CV;56.614170074;100.0 +25/10/2020 02:06:10;U875.LC321_PV.F_CV;56.374057770;100.0 +25/10/2020 02:06:12;U875.LC321_PV.F_CV;56.970497131;100.0 +25/10/2020 02:06:14;U875.LC321_PV.F_CV;57.852146149;100.0 +25/10/2020 02:06:16;U875.LC321_PV.F_CV;58.439365387;100.0 +25/10/2020 02:06:19;U875.LC321_PV.F_CV;58.891929626;100.0 +25/10/2020 02:06:23;U875.LC321_PV.F_CV;59.101745605;100.0 +25/10/2020 02:06:34;U875.LC321_PV.F_CV;59.341674805;100.0 +25/10/2020 02:06:38;U875.LC321_PV.F_CV;60.394420624;100.0 +25/10/2020 02:06:41;U875.LC321_PV.F_CV;60.849552155;100.0 +25/10/2020 02:06:42;U875.LC321_PV.F_CV;60.948066711;100.0 +25/10/2020 02:06:43;U875.LC321_PV.F_CV;60.096149445;100.0 +25/10/2020 02:06:44;U875.LC321_PV.F_CV;58.506481171;100.0 +25/10/2020 02:06:45;U875.LC321_PV.F_CV;57.632667542;100.0 +25/10/2020 02:06:46;U875.LC321_PV.F_CV;57.210079193;100.0 +25/10/2020 02:06:48;U875.LC321_PV.F_CV;56.880790710;100.0 +25/10/2020 02:06:55;U875.LC321_PV.F_CV;56.829830170;100.0 +25/10/2020 02:06:56;U875.LC321_PV.F_CV;57.065990448;100.0 +25/10/2020 02:06:59;U875.LC321_PV.F_CV;58.352943420;100.0 +25/10/2020 02:06:28;U875.LC321_SP.F_CV;60.000000000;100.0 +25/10/2020 02:06:03;U875.LC331_OP.F_CV;2.402707338;100.0 +25/10/2020 02:06:10;U875.LC331_OP.F_CV;2.460057735;100.0 +25/10/2020 02:06:16;U875.LC331_OP.F_CV;2.262561560;100.0 +25/10/2020 02:06:19;U875.LC331_OP.F_CV;2.322794914;100.0 +25/10/2020 02:06:21;U875.LC331_OP.F_CV;3.105651140;100.0 +25/10/2020 02:06:23;U875.LC331_OP.F_CV;3.401894808;100.0 +25/10/2020 02:06:28;U875.LC331_OP.F_CV;3.816913128;100.0 +25/10/2020 02:06:29;U875.LC331_OP.F_CV;3.735236406;100.0 +25/10/2020 02:06:33;U875.LC331_OP.F_CV;3.921024084;100.0 +25/10/2020 02:06:40;U875.LC331_OP.F_CV;4.054423809;100.0 +25/10/2020 02:06:41;U875.LC331_OP.F_CV;4.135655880;100.0 +25/10/2020 02:06:42;U875.LC331_OP.F_CV;4.049111843;100.0 +25/10/2020 02:06:45;U875.LC331_OP.F_CV;4.341959000;100.0 +25/10/2020 02:06:48;U875.LC331_OP.F_CV;4.144766808;100.0 +25/10/2020 02:06:49;U875.LC331_OP.F_CV;4.222646713;100.0 +25/10/2020 02:06:51;U875.LC331_OP.F_CV;4.083345890;100.0 +25/10/2020 02:06:55;U875.LC331_OP.F_CV;4.433593750;100.0 +25/10/2020 02:06:57;U875.LC331_OP.F_CV;5.261557102;100.0 +25/10/2020 02:06:59;U875.LC331_OP.F_CV;3.372436047;100.0 +25/10/2020 02:06:03;U875.LC331_PV.F_CV;69.928886414;100.0 +25/10/2020 02:06:15;U875.LC331_PV.F_CV;69.874206543;100.0 +25/10/2020 02:06:19;U875.LC331_PV.F_CV;70.035491943;100.0 +25/10/2020 02:06:20;U875.LC331_PV.F_CV;70.250305176;100.0 +25/10/2020 02:06:23;U875.LC331_PV.F_CV;70.493637085;100.0 +25/10/2020 02:06:27;U875.LC331_PV.F_CV;70.623748779;100.0 +25/10/2020 02:06:40;U875.LC331_PV.F_CV;70.746849060;100.0 +25/10/2020 02:06:42;U875.LC331_PV.F_CV;70.688903809;100.0 +25/10/2020 02:06:44;U875.LC331_PV.F_CV;70.837661743;100.0 +25/10/2020 02:06:47;U875.LC331_PV.F_CV;70.729026794;100.0 +25/10/2020 02:06:53;U875.LC331_PV.F_CV;70.821159363;100.0 +25/10/2020 02:06:55;U875.LC331_PV.F_CV;71.045120239;100.0 +25/10/2020 02:06:56;U875.LC331_PV.F_CV;71.256683350;100.0 +25/10/2020 02:06:58;U875.LC331_PV.F_CV;70.303756714;100.0 +25/10/2020 02:06:59;U875.LC331_PV.F_CV;68.884162903;100.0 +25/10/2020 02:06:59;U875.LC331_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U875.PC102_OP.F_CV;77.413154602;100.0 +25/10/2020 02:06:06;U875.PC102_OP.F_CV;77.655441284;100.0 +25/10/2020 02:06:11;U875.PC102_OP.F_CV;77.370223999;100.0 +25/10/2020 02:06:12;U875.PC102_OP.F_CV;77.553115845;100.0 +25/10/2020 02:06:16;U875.PC102_OP.F_CV;77.837295532;100.0 +25/10/2020 02:06:18;U875.PC102_OP.F_CV;77.640922546;100.0 +25/10/2020 02:06:20;U875.PC102_OP.F_CV;77.354248047;100.0 +25/10/2020 02:06:22;U875.PC102_OP.F_CV;77.471847534;100.0 +25/10/2020 02:06:23;U875.PC102_OP.F_CV;77.656967163;100.0 +25/10/2020 02:06:30;U875.PC102_OP.F_CV;77.424453735;100.0 +25/10/2020 02:06:35;U875.PC102_OP.F_CV;77.850242615;100.0 +25/10/2020 02:06:39;U875.PC102_OP.F_CV;77.408103943;100.0 +25/10/2020 02:06:42;U875.PC102_OP.F_CV;77.656898499;100.0 +25/10/2020 02:06:46;U875.PC102_OP.F_CV;77.512832642;100.0 +25/10/2020 02:06:50;U875.PC102_OP.F_CV;77.696098328;100.0 +25/10/2020 02:06:52;U875.PC102_OP.F_CV;77.874122620;100.0 +25/10/2020 02:06:55;U875.PC102_OP.F_CV;77.523269653;100.0 +25/10/2020 02:06:57;U875.PC102_OP.F_CV;77.447280884;100.0 +25/10/2020 02:06:59;U875.PC102_OP.F_CV;77.661041260;100.0 +25/10/2020 02:06:00;U875.PC102_PV.F_CV;1.473620057;100.0 +25/10/2020 02:06:08;U875.PC102_PV.F_CV;1.506418705;100.0 +25/10/2020 02:06:09;U875.PC102_PV.F_CV;1.485460520;100.0 +25/10/2020 02:06:12;U875.PC102_PV.F_CV;1.520340681;100.0 +25/10/2020 02:06:14;U875.PC102_PV.F_CV;1.509930611;100.0 +25/10/2020 02:06:15;U875.PC102_PV.F_CV;1.517711282;100.0 +25/10/2020 02:06:19;U875.PC102_PV.F_CV;1.478572965;100.0 +25/10/2020 02:06:22;U875.PC102_PV.F_CV;1.499787569;100.0 +25/10/2020 02:06:25;U875.PC102_PV.F_CV;1.506164670;100.0 +25/10/2020 02:06:27;U875.PC102_PV.F_CV;1.494842410;100.0 +25/10/2020 02:06:30;U875.PC102_PV.F_CV;1.513687015;100.0 +25/10/2020 02:06:34;U875.PC102_PV.F_CV;1.519727588;100.0 +25/10/2020 02:06:39;U875.PC102_PV.F_CV;1.479895115;100.0 +25/10/2020 02:06:40;U875.PC102_PV.F_CV;1.496585727;100.0 +25/10/2020 02:06:43;U875.PC102_PV.F_CV;1.505286455;100.0 +25/10/2020 02:06:45;U875.PC102_PV.F_CV;1.492457747;100.0 +25/10/2020 02:06:49;U875.PC102_PV.F_CV;1.510934114;100.0 +25/10/2020 02:06:51;U875.PC102_PV.F_CV;1.526121616;100.0 +25/10/2020 02:06:54;U875.PC102_PV.F_CV;1.488223553;100.0 +25/10/2020 02:06:56;U875.PC102_PV.F_CV;1.482986450;100.0 +25/10/2020 02:06:58;U875.PC102_PV.F_CV;1.505919099;100.0 +25/10/2020 02:06:06;U875.PC102_SP.F_CV;1.500000000;100.0 +25/10/2020 02:06:00;U875.PC104_PV.F_CV;-0.158798575;100.0 +25/10/2020 02:06:01;U875.PC104_PV.F_CV;-0.159606308;100.0 +25/10/2020 02:06:02;U875.PC104_PV.F_CV;-0.164751008;100.0 +25/10/2020 02:06:04;U875.PC104_PV.F_CV;-0.163400009;100.0 +25/10/2020 02:06:05;U875.PC104_PV.F_CV;-0.159270912;100.0 +25/10/2020 02:06:06;U875.PC104_PV.F_CV;-0.159761086;100.0 +25/10/2020 02:06:07;U875.PC104_PV.F_CV;-0.163608104;100.0 +25/10/2020 02:06:08;U875.PC104_PV.F_CV;-0.161182299;100.0 +25/10/2020 02:06:09;U875.PC104_PV.F_CV;-0.164213941;100.0 +25/10/2020 02:06:10;U875.PC104_PV.F_CV;-0.161380827;100.0 +25/10/2020 02:06:11;U875.PC104_PV.F_CV;-0.160452470;100.0 +25/10/2020 02:06:12;U875.PC104_PV.F_CV;-0.164148271;100.0 +25/10/2020 02:06:13;U875.PC104_PV.F_CV;-0.166901708;100.0 +25/10/2020 02:06:14;U875.PC104_PV.F_CV;-0.162261546;100.0 +25/10/2020 02:06:15;U875.PC104_PV.F_CV;-0.158741057;100.0 +25/10/2020 02:06:16;U875.PC104_PV.F_CV;-0.150960267;100.0 +25/10/2020 02:06:17;U875.PC104_PV.F_CV;-0.153133869;100.0 +25/10/2020 02:06:18;U875.PC104_PV.F_CV;-0.157750115;100.0 +25/10/2020 02:06:19;U875.PC104_PV.F_CV;-0.161262751;100.0 +25/10/2020 02:06:20;U875.PC104_PV.F_CV;-0.167136982;100.0 +25/10/2020 02:06:21;U875.PC104_PV.F_CV;-0.157253861;100.0 +25/10/2020 02:06:22;U875.PC104_PV.F_CV;-0.152376950;100.0 +25/10/2020 02:06:23;U875.PC104_PV.F_CV;-0.152778879;100.0 +25/10/2020 02:06:25;U875.PC104_PV.F_CV;-0.153729796;100.0 +25/10/2020 02:06:26;U875.PC104_PV.F_CV;-0.154041380;100.0 +25/10/2020 02:06:27;U875.PC104_PV.F_CV;-0.160047472;100.0 +25/10/2020 02:06:28;U875.PC104_PV.F_CV;-0.154930770;100.0 +25/10/2020 02:06:29;U875.PC104_PV.F_CV;-0.153615713;100.0 +25/10/2020 02:06:30;U875.PC104_PV.F_CV;-0.154003993;100.0 +25/10/2020 02:06:31;U875.PC104_PV.F_CV;-0.154035226;100.0 +25/10/2020 02:06:32;U875.PC104_PV.F_CV;-0.152503073;100.0 +25/10/2020 02:06:33;U875.PC104_PV.F_CV;-0.147735417;100.0 +25/10/2020 02:06:34;U875.PC104_PV.F_CV;-0.157161936;100.0 +25/10/2020 02:06:35;U875.PC104_PV.F_CV;-0.157889232;100.0 +25/10/2020 02:06:36;U875.PC104_PV.F_CV;-0.156489149;100.0 +25/10/2020 02:06:37;U875.PC104_PV.F_CV;-0.158126369;100.0 +25/10/2020 02:06:38;U875.PC104_PV.F_CV;-0.164928451;100.0 +25/10/2020 02:06:39;U875.PC104_PV.F_CV;-0.161614954;100.0 +25/10/2020 02:06:40;U875.PC104_PV.F_CV;-0.162529185;100.0 +25/10/2020 02:06:41;U875.PC104_PV.F_CV;-0.163551971;100.0 +25/10/2020 02:06:42;U875.PC104_PV.F_CV;-0.154440716;100.0 +25/10/2020 02:06:43;U875.PC104_PV.F_CV;-0.163263142;100.0 +25/10/2020 02:06:44;U875.PC104_PV.F_CV;-0.165792465;100.0 +25/10/2020 02:06:45;U875.PC104_PV.F_CV;-0.161041677;100.0 +25/10/2020 02:06:46;U875.PC104_PV.F_CV;-0.160818145;100.0 +25/10/2020 02:06:47;U875.PC104_PV.F_CV;-0.163391292;100.0 +25/10/2020 02:06:48;U875.PC104_PV.F_CV;-0.161111251;100.0 +25/10/2020 02:06:49;U875.PC104_PV.F_CV;-0.163487330;100.0 +25/10/2020 02:06:50;U875.PC104_PV.F_CV;-0.161142722;100.0 +25/10/2020 02:06:51;U875.PC104_PV.F_CV;-0.167097643;100.0 +25/10/2020 02:06:52;U875.PC104_PV.F_CV;-0.165925756;100.0 +25/10/2020 02:06:53;U875.PC104_PV.F_CV;-0.165541753;100.0 +25/10/2020 02:06:54;U875.PC104_PV.F_CV;-0.164939120;100.0 +25/10/2020 02:06:55;U875.PC104_PV.F_CV;-0.161618456;100.0 +25/10/2020 02:06:56;U875.PC104_PV.F_CV;-0.157407135;100.0 +25/10/2020 02:06:57;U875.PC104_PV.F_CV;-0.159150362;100.0 +25/10/2020 02:06:58;U875.PC104_PV.F_CV;-0.159721598;100.0 +25/10/2020 02:06:59;U875.PC104_PV.F_CV;-0.159431979;100.0 +25/10/2020 02:06:34;U875.PC106_PV.F_CV;0.845562577;100.0 +25/10/2020 02:06:06;U875.PC106_SP.F_CV;180.000000000;100.0 +25/10/2020 02:06:06;U875.PC121_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:06;U875.PC122_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.PC122_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U875.PC122_OP.F_CV;73.643844604;100.0 +25/10/2020 02:06:25;U875.PC122_OP.F_CV;73.528228760;100.0 +25/10/2020 02:06:27;U875.PC122_OP.F_CV;73.429496765;100.0 +25/10/2020 02:06:32;U875.PC122_OP.F_CV;73.497253418;100.0 +25/10/2020 02:06:43;U875.PC122_OP.F_CV;73.382133484;100.0 +25/10/2020 02:06:53;U875.PC122_OP.F_CV;73.450485229;100.0 +25/10/2020 02:06:59;U875.PC122_OP.F_CV;73.675163269;100.0 +25/10/2020 02:06:42;U875.PC122_PV.F_CV;49.921611786;100.0 +25/10/2020 02:06:59;U875.PC122_PV.F_CV;50.053672791;100.0 +25/10/2020 02:06:16;U875.PC122_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:01;U875.PC302_OP.F_CV;77.089614868;100.0 +25/10/2020 02:06:03;U875.PC302_OP.F_CV;76.785285950;100.0 +25/10/2020 02:06:07;U875.PC302_OP.F_CV;76.882240295;100.0 +25/10/2020 02:06:09;U875.PC302_OP.F_CV;77.187133789;100.0 +25/10/2020 02:06:10;U875.PC302_OP.F_CV;77.132766724;100.0 +25/10/2020 02:06:13;U875.PC302_OP.F_CV;76.640083313;100.0 +25/10/2020 02:06:19;U875.PC302_OP.F_CV;77.087936401;100.0 +25/10/2020 02:06:22;U875.PC302_OP.F_CV;76.929107666;100.0 +25/10/2020 02:06:23;U875.PC302_OP.F_CV;76.692245483;100.0 +25/10/2020 02:06:29;U875.PC302_OP.F_CV;77.110084534;100.0 +25/10/2020 02:06:30;U875.PC302_OP.F_CV;77.190010071;100.0 +25/10/2020 02:06:34;U875.PC302_OP.F_CV;76.591590881;100.0 +25/10/2020 02:06:38;U875.PC302_OP.F_CV;77.059730530;100.0 +25/10/2020 02:06:39;U875.PC302_OP.F_CV;76.936431885;100.0 +25/10/2020 02:06:40;U875.PC302_OP.F_CV;77.096488953;100.0 +25/10/2020 02:06:43;U875.PC302_OP.F_CV;76.811492920;100.0 +25/10/2020 02:06:44;U875.PC302_OP.F_CV;76.648628235;100.0 +25/10/2020 02:06:46;U875.PC302_OP.F_CV;76.868942261;100.0 +25/10/2020 02:06:47;U875.PC302_OP.F_CV;76.924652100;100.0 +25/10/2020 02:06:48;U875.PC302_OP.F_CV;77.167709351;100.0 +25/10/2020 02:06:49;U875.PC302_OP.F_CV;77.232650757;100.0 +25/10/2020 02:06:50;U875.PC302_OP.F_CV;77.143417358;100.0 +25/10/2020 02:06:51;U875.PC302_OP.F_CV;76.870361328;100.0 +25/10/2020 02:06:52;U875.PC302_OP.F_CV;76.704261780;100.0 +25/10/2020 02:06:54;U875.PC302_OP.F_CV;76.593215942;100.0 +25/10/2020 02:06:55;U875.PC302_OP.F_CV;76.806625366;100.0 +25/10/2020 02:06:58;U875.PC302_OP.F_CV;77.026405334;100.0 +25/10/2020 02:06:59;U875.PC302_OP.F_CV;76.943054199;100.0 +25/10/2020 02:06:00;U875.PC302_PV.F_CV;1.528902411;100.0 +25/10/2020 02:06:03;U875.PC302_PV.F_CV;1.493624687;100.0 +25/10/2020 02:06:06;U875.PC302_PV.F_CV;1.487220168;100.0 +25/10/2020 02:06:07;U875.PC302_PV.F_CV;1.511621594;100.0 +25/10/2020 02:06:09;U875.PC302_PV.F_CV;1.501641273;100.0 +25/10/2020 02:06:12;U875.PC302_PV.F_CV;1.466974258;100.0 +25/10/2020 02:06:13;U875.PC302_PV.F_CV;1.472072363;100.0 +25/10/2020 02:06:16;U875.PC302_PV.F_CV;1.514471292;100.0 +25/10/2020 02:06:19;U875.PC302_PV.F_CV;1.504304051;100.0 +25/10/2020 02:06:20;U875.PC302_PV.F_CV;1.516063571;100.0 +25/10/2020 02:06:22;U875.PC302_PV.F_CV;1.486035109;100.0 +25/10/2020 02:06:23;U875.PC302_PV.F_CV;1.503593564;100.0 +25/10/2020 02:06:25;U875.PC302_PV.F_CV;1.510404587;100.0 +25/10/2020 02:06:30;U875.PC302_PV.F_CV;1.491172314;100.0 +25/10/2020 02:06:33;U875.PC302_PV.F_CV;1.464351416;100.0 +25/10/2020 02:06:35;U875.PC302_PV.F_CV;1.489219189;100.0 +25/10/2020 02:06:36;U875.PC302_PV.F_CV;1.515685201;100.0 +25/10/2020 02:06:37;U875.PC302_PV.F_CV;1.524841070;100.0 +25/10/2020 02:06:38;U875.PC302_PV.F_CV;1.509706736;100.0 +25/10/2020 02:06:42;U875.PC302_PV.F_CV;1.490287423;100.0 +25/10/2020 02:06:43;U875.PC302_PV.F_CV;1.474586010;100.0 +25/10/2020 02:06:45;U875.PC302_PV.F_CV;1.497418880;100.0 +25/10/2020 02:06:46;U875.PC302_PV.F_CV;1.502982616;100.0 +25/10/2020 02:06:47;U875.PC302_PV.F_CV;1.526793003;100.0 +25/10/2020 02:06:48;U875.PC302_PV.F_CV;1.532302618;100.0 +25/10/2020 02:06:49;U875.PC302_PV.F_CV;1.522467136;100.0 +25/10/2020 02:06:50;U875.PC302_PV.F_CV;1.494871736;100.0 +25/10/2020 02:06:51;U875.PC302_PV.F_CV;1.478702307;100.0 +25/10/2020 02:06:53;U875.PC302_PV.F_CV;1.469263554;100.0 +25/10/2020 02:06:54;U875.PC302_PV.F_CV;1.491262197;100.0 +25/10/2020 02:06:57;U875.PC302_PV.F_CV;1.513258219;100.0 +25/10/2020 02:06:58;U875.PC302_PV.F_CV;1.504624844;100.0 +25/10/2020 02:06:59;U875.PC302_PV.F_CV;1.517644882;100.0 +25/10/2020 02:06:06;U875.PC302_SP.F_CV;1.500000000;100.0 +25/10/2020 02:06:00;U875.PC304_PV.F_CV;-0.303145528;100.0 +25/10/2020 02:06:01;U875.PC304_PV.F_CV;-0.307753950;100.0 +25/10/2020 02:06:03;U875.PC304_PV.F_CV;-0.304274887;100.0 +25/10/2020 02:06:04;U875.PC304_PV.F_CV;-0.305087209;100.0 +25/10/2020 02:06:05;U875.PC304_PV.F_CV;-0.309583783;100.0 +25/10/2020 02:06:06;U875.PC304_PV.F_CV;-0.304983616;100.0 +25/10/2020 02:06:07;U875.PC304_PV.F_CV;-0.307210445;100.0 +25/10/2020 02:06:09;U875.PC304_PV.F_CV;-0.302321911;100.0 +25/10/2020 02:06:10;U875.PC304_PV.F_CV;-0.304760844;100.0 +25/10/2020 02:06:12;U875.PC304_PV.F_CV;-0.300093174;100.0 +25/10/2020 02:06:13;U875.PC304_PV.F_CV;-0.298030555;100.0 +25/10/2020 02:06:14;U875.PC304_PV.F_CV;-0.296535462;100.0 +25/10/2020 02:06:15;U875.PC304_PV.F_CV;-0.300045550;100.0 +25/10/2020 02:06:16;U875.PC304_PV.F_CV;-0.296930134;100.0 +25/10/2020 02:06:17;U875.PC304_PV.F_CV;-0.296994060;100.0 +25/10/2020 02:06:18;U875.PC304_PV.F_CV;-0.300195813;100.0 +25/10/2020 02:06:19;U875.PC304_PV.F_CV;-0.306787372;100.0 +25/10/2020 02:06:20;U875.PC304_PV.F_CV;-0.308947295;100.0 +25/10/2020 02:06:21;U875.PC304_PV.F_CV;-0.305751055;100.0 +25/10/2020 02:06:22;U875.PC304_PV.F_CV;-0.306607693;100.0 +25/10/2020 02:06:23;U875.PC304_PV.F_CV;-0.304165214;100.0 +25/10/2020 02:06:25;U875.PC304_PV.F_CV;-0.306088060;100.0 +25/10/2020 02:06:26;U875.PC304_PV.F_CV;-0.303898931;100.0 +25/10/2020 02:06:27;U875.PC304_PV.F_CV;-0.306362391;100.0 +25/10/2020 02:06:28;U875.PC304_PV.F_CV;-0.304904014;100.0 +25/10/2020 02:06:29;U875.PC304_PV.F_CV;-0.306330174;100.0 +25/10/2020 02:06:30;U875.PC304_PV.F_CV;-0.304074287;100.0 +25/10/2020 02:06:31;U875.PC304_PV.F_CV;-0.302154303;100.0 +25/10/2020 02:06:32;U875.PC304_PV.F_CV;-0.304609925;100.0 +25/10/2020 02:06:33;U875.PC304_PV.F_CV;-0.301510572;100.0 +25/10/2020 02:06:34;U875.PC304_PV.F_CV;-0.304398984;100.0 +25/10/2020 02:06:35;U875.PC304_PV.F_CV;-0.307345480;100.0 +25/10/2020 02:06:36;U875.PC304_PV.F_CV;-0.305226177;100.0 +25/10/2020 02:06:37;U875.PC304_PV.F_CV;-0.310339689;100.0 +25/10/2020 02:06:38;U875.PC304_PV.F_CV;-0.301484108;100.0 +25/10/2020 02:06:39;U875.PC304_PV.F_CV;-0.303305507;100.0 +25/10/2020 02:06:40;U875.PC304_PV.F_CV;-0.304645091;100.0 +25/10/2020 02:06:41;U875.PC304_PV.F_CV;-0.304645300;100.0 +25/10/2020 02:06:42;U875.PC304_PV.F_CV;-0.308722168;100.0 +25/10/2020 02:06:43;U875.PC304_PV.F_CV;-0.299734890;100.0 +25/10/2020 02:06:44;U875.PC304_PV.F_CV;-0.303513139;100.0 +25/10/2020 02:06:45;U875.PC304_PV.F_CV;-0.304274410;100.0 +25/10/2020 02:06:46;U875.PC304_PV.F_CV;-0.301400661;100.0 +25/10/2020 02:06:47;U875.PC304_PV.F_CV;-0.300458968;100.0 +25/10/2020 02:06:48;U875.PC304_PV.F_CV;-0.306873590;100.0 +25/10/2020 02:06:49;U875.PC304_PV.F_CV;-0.302252352;100.0 +25/10/2020 02:06:50;U875.PC304_PV.F_CV;-0.304338068;100.0 +25/10/2020 02:06:51;U875.PC304_PV.F_CV;-0.301421523;100.0 +25/10/2020 02:06:52;U875.PC304_PV.F_CV;-0.304065824;100.0 +25/10/2020 02:06:53;U875.PC304_PV.F_CV;-0.301332295;100.0 +25/10/2020 02:06:54;U875.PC304_PV.F_CV;-0.300436556;100.0 +25/10/2020 02:06:55;U875.PC304_PV.F_CV;-0.303266257;100.0 +25/10/2020 02:06:56;U875.PC304_PV.F_CV;-0.304670304;100.0 +25/10/2020 02:06:57;U875.PC304_PV.F_CV;-0.297930360;100.0 +25/10/2020 02:06:58;U875.PC304_PV.F_CV;-0.296198606;100.0 +25/10/2020 02:06:59;U875.PC304_PV.F_CV;-0.292031139;100.0 +25/10/2020 02:06:35;U875.PC306_PV.F_CV;3.114438534;100.0 +25/10/2020 02:06:06;U875.PC306_SP.F_CV;180.000000000;100.0 +25/10/2020 02:06:06;U875.PC321_PV.F_CV;999999.875000000;100.0 +25/10/2020 02:06:06;U875.PC322_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.PC322_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U875.PC322_OP.F_CV;59.690574646;100.0 +25/10/2020 02:06:09;U875.PC322_OP.F_CV;59.449520111;100.0 +25/10/2020 02:06:12;U875.PC322_OP.F_CV;59.279541016;100.0 +25/10/2020 02:06:14;U875.PC322_OP.F_CV;59.356323242;100.0 +25/10/2020 02:06:15;U875.PC322_OP.F_CV;59.227958679;100.0 +25/10/2020 02:06:16;U875.PC322_OP.F_CV;59.349407196;100.0 +25/10/2020 02:06:26;U875.PC322_OP.F_CV;59.237518311;100.0 +25/10/2020 02:06:27;U875.PC322_OP.F_CV;59.347297668;100.0 +25/10/2020 02:06:42;U875.PC322_OP.F_CV;59.507225037;100.0 +25/10/2020 02:06:46;U875.PC322_OP.F_CV;59.121547699;100.0 +25/10/2020 02:06:51;U875.PC322_OP.F_CV;59.196628571;100.0 +25/10/2020 02:06:54;U875.PC322_OP.F_CV;59.410301208;100.0 +25/10/2020 02:06:56;U875.PC322_OP.F_CV;59.660533905;100.0 +25/10/2020 02:06:59;U875.PC322_OP.F_CV;59.733020782;100.0 +25/10/2020 02:06:45;U875.PC322_PV.F_CV;89.888145447;100.0 +25/10/2020 02:06:55;U875.PC322_PV.F_CV;90.025314331;100.0 +25/10/2020 02:06:03;U875.PC322_SP.F_CV;90.000000000;100.0 +25/10/2020 02:06:06;U875.PI103_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:17;U875.PI103_PV.F_CV;50.464588165;100.0 +25/10/2020 02:06:06;U875.PI103_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:06;U875.PI112_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.PI112_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U875.PI112_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:39;U875.PI112_PV.F_CV;48.902259827;100.0 +25/10/2020 02:06:06;U875.PI112_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:18;U875.PI124_PV.F_CV;0.831999421;100.0 +25/10/2020 02:06:10;U875.PI131_PV.F_CV;0.829728901;100.0 +25/10/2020 02:06:33;U875.PI131_PV.F_CV;0.829728901;100.0 +25/10/2020 02:06:34;U875.PI131_PV.F_CV;0.834912539;100.0 +25/10/2020 02:06:35;U875.PI131_PV.F_CV;0.836122990;100.0 +25/10/2020 02:06:38;U875.PI131_PV.F_CV;0.833431602;100.0 +25/10/2020 02:06:48;U875.PI131_PV.F_CV;0.832348049;100.0 +25/10/2020 02:06:49;U875.PI131_PV.F_CV;0.838457763;100.0 +25/10/2020 02:06:06;U875.PI131_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;U875.PI303_PV.F_CV;90.627326965;100.0 +25/10/2020 02:06:06;U875.PI312_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.PI312_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U875.PI312_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;U875.PI312_PV.F_CV;89.998718262;100.0 +25/10/2020 02:06:06;U875.PI312_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:06;U875.PI324_PV.F_CV;0.804111719;100.0 +25/10/2020 02:06:18;U875.PI324_PV.F_CV;0.806481063;100.0 +25/10/2020 02:06:19;U875.PI324_PV.F_CV;0.808413923;100.0 +25/10/2020 02:06:34;U875.PI324_PV.F_CV;0.803047240;100.0 +25/10/2020 02:06:53;U875.PI324_PV.F_CV;0.803047240;100.0 +25/10/2020 02:06:54;U875.PI324_PV.F_CV;0.807216048;100.0 +25/10/2020 02:06:55;U875.PI324_PV.F_CV;0.808720350;100.0 +25/10/2020 02:06:03;U875.PI331_PV.F_CV;0.803494871;100.0 +25/10/2020 02:06:16;U875.PI331_PV.F_CV;0.803494871;100.0 +25/10/2020 02:06:17;U875.PI331_PV.F_CV;0.809662521;100.0 +25/10/2020 02:06:18;U875.PI331_PV.F_CV;0.810993969;100.0 +25/10/2020 02:06:23;U875.PI331_PV.F_CV;0.805217505;100.0 +25/10/2020 02:06:31;U875.PI331_PV.F_CV;0.802720964;100.0 +25/10/2020 02:06:52;U875.PI331_PV.F_CV;0.802720964;100.0 +25/10/2020 02:06:53;U875.PI331_PV.F_CV;0.812749326;100.0 +25/10/2020 02:06:17;U875.QI104_C_PV.F_CV;462.388946533;100.0 +25/10/2020 02:06:34;U875.QI304_C_PV.F_CV;155.274993896;100.0 +25/10/2020 02:06:10;U875.T_FI503_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U875.TC103_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U875.TC103_PV.F_CV;101.673858643;100.0 +25/10/2020 02:06:25;U875.TC103_PV.F_CV;101.516708374;100.0 +25/10/2020 02:06:48;U875.TC103_PV.F_CV;101.678108215;100.0 +25/10/2020 02:06:17;U875.TC103_SP.F_CV;100.000000000;100.0 +25/10/2020 02:06:00;U875.TC111_OP.F_CV;32.195865631;100.0 +25/10/2020 02:06:01;U875.TC111_OP.F_CV;31.840232849;100.0 +25/10/2020 02:06:02;U875.TC111_OP.F_CV;31.723707199;100.0 +25/10/2020 02:06:05;U875.TC111_OP.F_CV;31.673011780;100.0 +25/10/2020 02:06:07;U875.TC111_OP.F_CV;31.217546463;100.0 +25/10/2020 02:06:08;U875.TC111_OP.F_CV;31.065877914;100.0 +25/10/2020 02:06:10;U875.TC111_OP.F_CV;30.460205078;100.0 +25/10/2020 02:06:11;U875.TC111_OP.F_CV;30.350728989;100.0 +25/10/2020 02:06:12;U875.TC111_OP.F_CV;30.702548981;100.0 +25/10/2020 02:06:13;U875.TC111_OP.F_CV;30.868526459;100.0 +25/10/2020 02:06:14;U875.TC111_OP.F_CV;31.186950684;100.0 +25/10/2020 02:06:15;U875.TC111_OP.F_CV;31.922155380;100.0 +25/10/2020 02:06:16;U875.TC111_OP.F_CV;32.166816711;100.0 +25/10/2020 02:06:17;U875.TC111_OP.F_CV;32.577434540;100.0 +25/10/2020 02:06:18;U875.TC111_OP.F_CV;32.841800690;100.0 +25/10/2020 02:06:19;U875.TC111_OP.F_CV;32.935840607;100.0 +25/10/2020 02:06:20;U875.TC111_OP.F_CV;32.074001312;100.0 +25/10/2020 02:06:21;U875.TC111_OP.F_CV;31.791612625;100.0 +25/10/2020 02:06:22;U875.TC111_OP.F_CV;31.940093994;100.0 +25/10/2020 02:06:23;U875.TC111_OP.F_CV;32.199813843;100.0 +25/10/2020 02:06:25;U875.TC111_OP.F_CV;32.288600922;100.0 +25/10/2020 02:06:26;U875.TC111_OP.F_CV;31.530990601;100.0 +25/10/2020 02:06:27;U875.TC111_OP.F_CV;31.170257568;100.0 +25/10/2020 02:06:28;U875.TC111_OP.F_CV;31.048326492;100.0 +25/10/2020 02:06:30;U875.TC111_OP.F_CV;30.986595154;100.0 +25/10/2020 02:06:35;U875.TC111_OP.F_CV;31.554000854;100.0 +25/10/2020 02:06:37;U875.TC111_OP.F_CV;31.617330551;100.0 +25/10/2020 02:06:40;U875.TC111_OP.F_CV;32.790367126;100.0 +25/10/2020 02:06:43;U875.TC111_OP.F_CV;32.378128052;100.0 +25/10/2020 02:06:44;U875.TC111_OP.F_CV;31.369689941;100.0 +25/10/2020 02:06:45;U875.TC111_OP.F_CV;30.664642334;100.0 +25/10/2020 02:06:46;U875.TC111_OP.F_CV;30.426156998;100.0 +25/10/2020 02:06:47;U875.TC111_OP.F_CV;30.790609360;100.0 +25/10/2020 02:06:48;U875.TC111_OP.F_CV;30.906270981;100.0 +25/10/2020 02:06:54;U875.TC111_OP.F_CV;31.065799713;100.0 +25/10/2020 02:06:55;U875.TC111_OP.F_CV;31.421430588;100.0 +25/10/2020 02:06:56;U875.TC111_OP.F_CV;31.538030624;100.0 +25/10/2020 02:06:57;U875.TC111_OP.F_CV;31.902914047;100.0 +25/10/2020 02:06:58;U875.TC111_OP.F_CV;32.148559570;100.0 +25/10/2020 02:06:59;U875.TC111_OP.F_CV;32.232807159;100.0 +25/10/2020 02:06:06;U875.TC111_PV.F_CV;120.048645020;100.0 +25/10/2020 02:06:09;U875.TC111_PV.F_CV;120.172332764;100.0 +25/10/2020 02:06:16;U875.TC111_PV.F_CV;119.871215820;100.0 +25/10/2020 02:06:26;U875.TC111_PV.F_CV;120.067268372;100.0 +25/10/2020 02:06:40;U875.TC111_PV.F_CV;119.811012268;100.0 +25/10/2020 02:06:43;U875.TC111_PV.F_CV;120.004867554;100.0 +25/10/2020 02:06:44;U875.TC111_PV.F_CV;120.136054993;100.0 +25/10/2020 02:06:57;U875.TC111_PV.F_CV;119.917701721;100.0 +25/10/2020 02:06:06;U875.TC111_SP.F_CV;120.000000000;100.0 +25/10/2020 02:06:01;U875.TC112_OP.F_CV;13.679190636;100.0 +25/10/2020 02:06:07;U875.TC112_OP.F_CV;13.869478226;100.0 +25/10/2020 02:06:10;U875.TC112_OP.F_CV;13.817079544;100.0 +25/10/2020 02:06:16;U875.TC112_OP.F_CV;13.999374390;100.0 +25/10/2020 02:06:20;U875.TC112_OP.F_CV;13.839900970;100.0 +25/10/2020 02:06:23;U875.TC112_OP.F_CV;13.981237411;100.0 +25/10/2020 02:06:26;U875.TC112_OP.F_CV;13.903540611;100.0 +25/10/2020 02:06:29;U875.TC112_OP.F_CV;13.959237099;100.0 +25/10/2020 02:06:32;U875.TC112_OP.F_CV;13.783615112;100.0 +25/10/2020 02:06:36;U875.TC112_OP.F_CV;13.729044914;100.0 +25/10/2020 02:06:39;U875.TC112_OP.F_CV;13.515727043;100.0 +25/10/2020 02:06:43;U875.TC112_OP.F_CV;13.404930115;100.0 +25/10/2020 02:06:46;U875.TC112_OP.F_CV;13.548096657;100.0 +25/10/2020 02:06:51;U875.TC112_OP.F_CV;13.631585121;100.0 +25/10/2020 02:06:53;U875.TC112_OP.F_CV;13.568089485;100.0 +25/10/2020 02:06:56;U875.TC112_OP.F_CV;13.640313148;100.0 +25/10/2020 02:06:06;U875.TC112_PV.F_CV;69.492759705;100.0 +25/10/2020 02:06:37;U875.TC112_PV.F_CV;69.578964233;100.0 +25/10/2020 02:06:08;U875.TC112_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U875.TC113_OP.F_CV;76.416671753;100.0 +25/10/2020 02:06:11;U875.TC113_OP.F_CV;76.416671753;100.0 +25/10/2020 02:06:12;U875.TC113_OP.F_CV;75.977691650;100.0 +25/10/2020 02:06:13;U875.TC113_OP.F_CV;75.397644043;100.0 +25/10/2020 02:06:14;U875.TC113_OP.F_CV;75.200004578;100.0 +25/10/2020 02:06:15;U875.TC113_OP.F_CV;75.523078918;100.0 +25/10/2020 02:06:17;U875.TC113_OP.F_CV;75.861007690;100.0 +25/10/2020 02:06:18;U875.TC113_OP.F_CV;76.234039307;100.0 +25/10/2020 02:06:19;U875.TC113_OP.F_CV;76.356239319;100.0 +25/10/2020 02:06:21;U875.TC113_OP.F_CV;75.849594116;100.0 +25/10/2020 02:06:22;U875.TC113_OP.F_CV;75.773826599;100.0 +25/10/2020 02:06:23;U875.TC113_OP.F_CV;76.195289612;100.0 +25/10/2020 02:06:27;U875.TC113_OP.F_CV;76.393539429;100.0 +25/10/2020 02:06:30;U875.TC113_OP.F_CV;76.983276367;100.0 +25/10/2020 02:06:31;U875.TC113_OP.F_CV;76.914840698;100.0 +25/10/2020 02:06:32;U875.TC113_OP.F_CV;76.578804016;100.0 +25/10/2020 02:06:33;U875.TC113_OP.F_CV;76.468711853;100.0 +25/10/2020 02:06:34;U875.TC113_OP.F_CV;76.105941772;100.0 +25/10/2020 02:06:35;U875.TC113_OP.F_CV;75.860984802;100.0 +25/10/2020 02:06:36;U875.TC113_OP.F_CV;75.776962280;100.0 +25/10/2020 02:06:37;U875.TC113_OP.F_CV;76.195777893;100.0 +25/10/2020 02:06:38;U875.TC113_OP.F_CV;76.332962036;100.0 +25/10/2020 02:06:40;U875.TC113_OP.F_CV;76.392738342;100.0 +25/10/2020 02:06:42;U875.TC113_OP.F_CV;76.849266052;100.0 +25/10/2020 02:06:43;U875.TC113_OP.F_CV;77.000930786;100.0 +25/10/2020 02:06:44;U875.TC113_OP.F_CV;76.920539856;100.0 +25/10/2020 02:06:45;U875.TC113_OP.F_CV;76.580574036;100.0 +25/10/2020 02:06:46;U875.TC113_OP.F_CV;76.469268799;100.0 +25/10/2020 02:06:47;U875.TC113_OP.F_CV;76.106048584;100.0 +25/10/2020 02:06:48;U875.TC113_OP.F_CV;75.860931396;100.0 +25/10/2020 02:06:52;U875.TC113_OP.F_CV;75.723320007;100.0 +25/10/2020 02:06:12;U875.TC113_PV.F_CV;115.147567749;100.0 +25/10/2020 02:06:28;U875.TC113_PV.F_CV;114.951347351;100.0 +25/10/2020 02:06:33;U875.TC113_PV.F_CV;115.032676697;100.0 +25/10/2020 02:06:41;U875.TC113_PV.F_CV;114.941101074;100.0 +25/10/2020 02:06:46;U875.TC113_PV.F_CV;115.046104431;100.0 +25/10/2020 02:06:06;U875.TC113_SP.F_CV;115.000000000;100.0 +25/10/2020 02:06:04;U875.TC115_OP.F_CV;43.578125000;100.0 +25/10/2020 02:06:05;U875.TC115_OP.F_CV;40.944835663;100.0 +25/10/2020 02:06:09;U875.TC115_OP.F_CV;40.944835663;100.0 +25/10/2020 02:06:10;U875.TC115_OP.F_CV;42.897575378;100.0 +25/10/2020 02:06:13;U875.TC115_OP.F_CV;40.905937195;100.0 +25/10/2020 02:06:17;U875.TC115_OP.F_CV;40.905937195;100.0 +25/10/2020 02:06:18;U875.TC115_OP.F_CV;44.197624207;100.0 +25/10/2020 02:06:21;U875.TC115_OP.F_CV;42.908679962;100.0 +25/10/2020 02:06:26;U875.TC115_OP.F_CV;42.908679962;100.0 +25/10/2020 02:06:27;U875.TC115_OP.F_CV;40.258644104;100.0 +25/10/2020 02:06:29;U875.TC115_OP.F_CV;42.233684540;100.0 +25/10/2020 02:06:33;U875.TC115_OP.F_CV;42.233684540;100.0 +25/10/2020 02:06:34;U875.TC115_OP.F_CV;40.894821167;100.0 +25/10/2020 02:06:37;U875.TC115_OP.F_CV;42.869789124;100.0 +25/10/2020 02:06:40;U875.TC115_OP.F_CV;42.217014313;100.0 +25/10/2020 02:06:42;U875.TC115_OP.F_CV;40.208637238;100.0 +25/10/2020 02:06:45;U875.TC115_OP.F_CV;42.836448669;100.0 +25/10/2020 02:06:47;U875.TC115_OP.F_CV;39.500389099;100.0 +25/10/2020 02:06:50;U875.TC115_OP.F_CV;41.442024231;100.0 +25/10/2020 02:06:53;U875.TC115_OP.F_CV;42.764232635;100.0 +25/10/2020 02:06:55;U875.TC115_OP.F_CV;40.097526550;100.0 +25/10/2020 02:06:58;U875.TC115_OP.F_CV;41.386474609;100.0 +25/10/2020 02:06:03;U875.TC115_PV.F_CV;119.800003052;100.0 +25/10/2020 02:06:04;U875.TC115_PV.F_CV;120.199996948;100.0 +25/10/2020 02:06:09;U875.TC115_PV.F_CV;119.900001526;100.0 +25/10/2020 02:06:12;U875.TC115_PV.F_CV;120.199996948;100.0 +25/10/2020 02:06:16;U875.TC115_PV.F_CV;120.199996948;100.0 +25/10/2020 02:06:17;U875.TC115_PV.F_CV;119.699996948;100.0 +25/10/2020 02:06:20;U875.TC115_PV.F_CV;119.900001526;100.0 +25/10/2020 02:06:25;U875.TC115_PV.F_CV;119.900001526;100.0 +25/10/2020 02:06:26;U875.TC115_PV.F_CV;120.300003052;100.0 +25/10/2020 02:06:28;U875.TC115_PV.F_CV;120.000000000;100.0 +25/10/2020 02:06:34;U875.TC115_PV.F_CV;120.199996948;100.0 +25/10/2020 02:06:36;U875.TC115_PV.F_CV;119.900001526;100.0 +25/10/2020 02:06:39;U875.TC115_PV.F_CV;120.000000000;100.0 +25/10/2020 02:06:41;U875.TC115_PV.F_CV;120.300003052;100.0 +25/10/2020 02:06:44;U875.TC115_PV.F_CV;119.900001526;100.0 +25/10/2020 02:06:46;U875.TC115_PV.F_CV;120.400001526;100.0 +25/10/2020 02:06:52;U875.TC115_PV.F_CV;119.900001526;100.0 +25/10/2020 02:06:54;U875.TC115_PV.F_CV;120.300003052;100.0 +25/10/2020 02:06:59;U875.TC115_PV.F_CV;120.000000000;100.0 +25/10/2020 02:06:06;U875.TC115_SP.F_CV;120.000000000;100.0 +25/10/2020 02:06:06;U875.TC120_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TC120_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U875.TC120_OP.F_CV;22.496925354;100.0 +25/10/2020 02:06:03;U875.TC120_OP.F_CV;22.278470993;100.0 +25/10/2020 02:06:05;U875.TC120_OP.F_CV;22.367710114;100.0 +25/10/2020 02:06:06;U875.TC120_OP.F_CV;22.492147446;100.0 +25/10/2020 02:06:10;U875.TC120_OP.F_CV;22.492147446;100.0 +25/10/2020 02:06:11;U875.TC120_OP.F_CV;22.274206161;100.0 +25/10/2020 02:06:14;U875.TC120_OP.F_CV;22.488029480;100.0 +25/10/2020 02:06:27;U875.TC120_OP.F_CV;22.353115082;100.0 +25/10/2020 02:06:28;U875.TC120_OP.F_CV;22.269887924;100.0 +25/10/2020 02:06:30;U875.TC120_OP.F_CV;22.483898163;100.0 +25/10/2020 02:06:32;U875.TC120_OP.F_CV;22.391662598;100.0 +25/10/2020 02:06:33;U875.TC120_OP.F_CV;22.265878677;100.0 +25/10/2020 02:06:35;U875.TC120_OP.F_CV;22.479593277;100.0 +25/10/2020 02:06:38;U875.TC120_OP.F_CV;22.262201309;100.0 +25/10/2020 02:06:41;U875.TC120_OP.F_CV;22.695688248;100.0 +25/10/2020 02:06:43;U875.TC120_OP.F_CV;22.264160156;100.0 +25/10/2020 02:06:45;U875.TC120_OP.F_CV;22.352525711;100.0 +25/10/2020 02:06:48;U875.TC120_OP.F_CV;22.655416489;100.0 +25/10/2020 02:06:50;U875.TC120_OP.F_CV;22.604696274;100.0 +25/10/2020 02:06:51;U875.TC120_OP.F_CV;22.263872147;100.0 +25/10/2020 02:06:54;U875.TC120_OP.F_CV;22.477472305;100.0 +25/10/2020 02:06:56;U875.TC120_OP.F_CV;22.259376526;100.0 +25/10/2020 02:06:58;U875.TC120_OP.F_CV;22.347394943;100.0 +25/10/2020 02:06:16;U875.TC120_PV.F_CV;300.020629883;100.0 +25/10/2020 02:06:47;U875.TC120_SP.F_CV;300.000000000;100.0 +25/10/2020 02:06:06;U875.TC121_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TC121_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U875.TC121_OP.F_CV;19.634740829;100.0 +25/10/2020 02:06:04;U875.TC121_OP.F_CV;19.205846786;100.0 +25/10/2020 02:06:06;U875.TC121_OP.F_CV;19.419429779;100.0 +25/10/2020 02:06:10;U875.TC121_OP.F_CV;19.419429779;100.0 +25/10/2020 02:06:11;U875.TC121_OP.F_CV;19.638324738;100.0 +25/10/2020 02:06:14;U875.TC121_OP.F_CV;19.425029755;100.0 +25/10/2020 02:06:18;U875.TC121_OP.F_CV;19.425029755;100.0 +25/10/2020 02:06:19;U875.TC121_OP.F_CV;19.642578125;100.0 +25/10/2020 02:06:21;U875.TC121_OP.F_CV;19.553644180;100.0 +25/10/2020 02:06:22;U875.TC121_OP.F_CV;19.428760529;100.0 +25/10/2020 02:06:30;U875.TC121_OP.F_CV;19.564069748;100.0 +25/10/2020 02:06:31;U875.TC121_OP.F_CV;19.647499084;100.0 +25/10/2020 02:06:35;U875.TC121_OP.F_CV;19.382120132;100.0 +25/10/2020 02:06:36;U875.TC121_OP.F_CV;19.217208862;100.0 +25/10/2020 02:06:38;U875.TC121_OP.F_CV;19.431722641;100.0 +25/10/2020 02:06:40;U875.TC121_OP.F_CV;19.523992538;100.0 +25/10/2020 02:06:41;U875.TC121_OP.F_CV;19.650373459;100.0 +25/10/2020 02:06:45;U875.TC121_OP.F_CV;19.650373459;100.0 +25/10/2020 02:06:46;U875.TC121_OP.F_CV;19.440626144;100.0 +25/10/2020 02:06:53;U875.TC121_OP.F_CV;19.440626144;100.0 +25/10/2020 02:06:54;U875.TC121_OP.F_CV;19.220514297;100.0 +25/10/2020 02:06:58;U875.TC121_OP.F_CV;19.482526779;100.0 +25/10/2020 02:06:59;U875.TC121_OP.F_CV;19.654170990;100.0 +25/10/2020 02:06:49;U875.TC121_PV.F_CV;319.977447510;100.0 +25/10/2020 02:06:55;U875.TC121_SP.F_CV;320.000000000;100.0 +25/10/2020 02:06:04;U875.TC122_OP.F_CV;20.518276215;100.0 +25/10/2020 02:06:07;U875.TC122_OP.F_CV;21.120555878;100.0 +25/10/2020 02:06:11;U875.TC122_OP.F_CV;20.816114426;100.0 +25/10/2020 02:06:12;U875.TC122_OP.F_CV;20.604530334;100.0 +25/10/2020 02:06:16;U875.TC122_OP.F_CV;20.553947449;100.0 +25/10/2020 02:06:17;U875.TC122_OP.F_CV;20.260622025;100.0 +25/10/2020 02:06:21;U875.TC122_OP.F_CV;20.260622025;100.0 +25/10/2020 02:06:22;U875.TC122_OP.F_CV;20.668844223;100.0 +25/10/2020 02:06:26;U875.TC122_OP.F_CV;20.310150146;100.0 +25/10/2020 02:06:34;U875.TC122_OP.F_CV;20.546661377;100.0 +25/10/2020 02:06:38;U875.TC122_OP.F_CV;20.337781906;100.0 +25/10/2020 02:06:39;U875.TC122_OP.F_CV;20.198589325;100.0 +25/10/2020 02:06:41;U875.TC122_OP.F_CV;20.674686432;100.0 +25/10/2020 02:06:42;U875.TC122_OP.F_CV;20.788734436;100.0 +25/10/2020 02:06:46;U875.TC122_OP.F_CV;20.467159271;100.0 +25/10/2020 02:06:47;U875.TC122_OP.F_CV;20.256200790;100.0 +25/10/2020 02:06:52;U875.TC122_OP.F_CV;20.468391418;100.0 +25/10/2020 02:06:54;U875.TC122_OP.F_CV;20.323194504;100.0 +25/10/2020 02:06:56;U875.TC122_OP.F_CV;19.971492767;100.0 +25/10/2020 02:06:57;U875.TC122_OP.F_CV;19.532283783;100.0 +25/10/2020 02:06:02;U875.TC122_PV.F_CV;349.243499756;100.0 +25/10/2020 02:06:19;U875.TC122_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:05;U875.TC123_OP.F_CV;21.328739166;100.0 +25/10/2020 02:06:09;U875.TC123_OP.F_CV;21.200334549;100.0 +25/10/2020 02:06:10;U875.TC123_OP.F_CV;21.017919540;100.0 +25/10/2020 02:06:12;U875.TC123_OP.F_CV;21.145114899;100.0 +25/10/2020 02:06:15;U875.TC123_OP.F_CV;21.015642166;100.0 +25/10/2020 02:06:19;U875.TC123_OP.F_CV;21.015642166;100.0 +25/10/2020 02:06:20;U875.TC123_OP.F_CV;21.330480576;100.0 +25/10/2020 02:06:28;U875.TC123_OP.F_CV;21.147766113;100.0 +25/10/2020 02:06:29;U875.TC123_OP.F_CV;21.022838593;100.0 +25/10/2020 02:06:36;U875.TC123_OP.F_CV;21.084232330;100.0 +25/10/2020 02:06:39;U875.TC123_OP.F_CV;21.307109833;100.0 +25/10/2020 02:06:45;U875.TC123_OP.F_CV;21.023641586;100.0 +25/10/2020 02:06:49;U875.TC123_OP.F_CV;21.219049454;100.0 +25/10/2020 02:06:50;U875.TC123_OP.F_CV;21.340026855;100.0 +25/10/2020 02:06:53;U875.TC123_OP.F_CV;21.024347305;100.0 +25/10/2020 02:06:55;U875.TC123_OP.F_CV;21.182374954;100.0 +25/10/2020 02:06:47;U875.TC123_PV.F_CV;350.014709473;100.0 +25/10/2020 02:06:47;U875.TC123_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:00;U875.TC124_OP.F_CV;17.262456894;100.0 +25/10/2020 02:06:03;U875.TC124_OP.F_CV;16.944320679;100.0 +25/10/2020 02:06:04;U875.TC124_OP.F_CV;17.012657166;100.0 +25/10/2020 02:06:05;U875.TC124_OP.F_CV;17.264137268;100.0 +25/10/2020 02:06:09;U875.TC124_OP.F_CV;16.945806503;100.0 +25/10/2020 02:06:10;U875.TC124_OP.F_CV;17.265872955;100.0 +25/10/2020 02:06:21;U875.TC124_OP.F_CV;17.123899460;100.0 +25/10/2020 02:06:23;U875.TC124_OP.F_CV;16.964229584;100.0 +25/10/2020 02:06:28;U875.TC124_OP.F_CV;16.964229584;100.0 +25/10/2020 02:06:29;U875.TC124_OP.F_CV;17.221405029;100.0 +25/10/2020 02:06:30;U875.TC124_OP.F_CV;17.282051086;100.0 +25/10/2020 02:06:35;U875.TC124_OP.F_CV;16.802915573;100.0 +25/10/2020 02:06:37;U875.TC124_OP.F_CV;17.280292511;100.0 +25/10/2020 02:06:42;U875.TC124_OP.F_CV;16.995519638;100.0 +25/10/2020 02:06:54;U875.TC124_OP.F_CV;16.995519638;100.0 +25/10/2020 02:06:55;U875.TC124_OP.F_CV;17.277290344;100.0 +25/10/2020 02:06:58;U875.TC124_OP.F_CV;17.444946289;100.0 +25/10/2020 02:06:59;U875.TC124_PV.F_CV;349.878540039;100.0 +25/10/2020 02:06:19;U875.TC124_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:00;U875.TC125_OP.F_CV;17.751071930;100.0 +25/10/2020 02:06:19;U875.TC125_OP.F_CV;17.808343887;100.0 +25/10/2020 02:06:21;U875.TC125_OP.F_CV;18.274564743;100.0 +25/10/2020 02:06:23;U875.TC125_OP.F_CV;17.866432190;100.0 +25/10/2020 02:06:25;U875.TC125_OP.F_CV;17.794860840;100.0 +25/10/2020 02:06:34;U875.TC125_OP.F_CV;17.914682388;100.0 +25/10/2020 02:06:37;U875.TC125_OP.F_CV;18.098278046;100.0 +25/10/2020 02:06:39;U875.TC125_OP.F_CV;18.033800125;100.0 +25/10/2020 02:06:40;U875.TC125_OP.F_CV;17.801807404;100.0 +25/10/2020 02:06:43;U875.TC125_OP.F_CV;18.245916367;100.0 +25/10/2020 02:06:45;U875.TC125_OP.F_CV;17.917186737;100.0 +25/10/2020 02:06:49;U875.TC125_OP.F_CV;17.917186737;100.0 +25/10/2020 02:06:50;U875.TC125_OP.F_CV;18.182338715;100.0 +25/10/2020 02:06:52;U875.TC125_OP.F_CV;18.110137939;100.0 +25/10/2020 02:06:53;U875.TC125_OP.F_CV;17.766166687;100.0 +25/10/2020 02:06:56;U875.TC125_OP.F_CV;18.095611572;100.0 +25/10/2020 02:06:50;U875.TC125_PV.F_CV;349.780517578;100.0 +25/10/2020 02:06:19;U875.TC125_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:00;U875.TC151_OP.F_CV;5.920151711;100.0 +25/10/2020 02:06:14;U875.TC151_OP.F_CV;6.080976963;100.0 +25/10/2020 02:06:17;U875.TC151_OP.F_CV;6.244427204;100.0 +25/10/2020 02:06:19;U875.TC151_OP.F_CV;6.183632851;100.0 +25/10/2020 02:06:25;U875.TC151_OP.F_CV;6.238374710;100.0 +25/10/2020 02:06:29;U875.TC151_OP.F_CV;5.939593792;100.0 +25/10/2020 02:06:31;U875.TC151_OP.F_CV;5.691105843;100.0 +25/10/2020 02:06:36;U875.TC151_OP.F_CV;5.887962341;100.0 +25/10/2020 02:06:42;U875.TC151_OP.F_CV;5.887962341;100.0 +25/10/2020 02:06:44;U875.TC151_OP.F_CV;5.377587795;100.0 +25/10/2020 02:06:45;U875.TC151_OP.F_CV;5.302153587;100.0 +25/10/2020 02:06:46;U875.TC151_OP.F_CV;5.366889000;100.0 +25/10/2020 02:06:52;U875.TC151_OP.F_CV;5.282388687;100.0 +25/10/2020 02:06:54;U875.TC151_OP.F_CV;5.462807655;100.0 +25/10/2020 02:06:56;U875.TC151_OP.F_CV;5.524345398;100.0 +25/10/2020 02:06:00;U875.TC151_PV.F_CV;79.513458252;100.0 +25/10/2020 02:06:16;U875.TC151_PV.F_CV;79.322418213;100.0 +25/10/2020 02:06:21;U875.TC151_PV.F_CV;79.398643494;100.0 +25/10/2020 02:06:25;U875.TC151_PV.F_CV;79.316734314;100.0 +25/10/2020 02:06:30;U875.TC151_PV.F_CV;79.754661560;100.0 +25/10/2020 02:06:35;U875.TC151_PV.F_CV;79.627479553;100.0 +25/10/2020 02:06:42;U875.TC151_PV.F_CV;79.780006409;100.0 +25/10/2020 02:06:43;U875.TC151_PV.F_CV;79.995147705;100.0 +25/10/2020 02:06:51;U875.TC151_PV.F_CV;80.086608887;100.0 +25/10/2020 02:06:53;U875.TC151_PV.F_CV;79.950988770;100.0 +25/10/2020 02:06:44;U875.TC151_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:00;U875.TC160_OP.F_CV;6.828320026;100.0 +25/10/2020 02:06:04;U875.TC160_OP.F_CV;6.828320026;100.0 +25/10/2020 02:06:05;U875.TC160_OP.F_CV;5.974605560;100.0 +25/10/2020 02:06:06;U875.TC160_OP.F_CV;5.684215069;100.0 +25/10/2020 02:06:07;U875.TC160_OP.F_CV;5.830968380;100.0 +25/10/2020 02:06:08;U875.TC160_OP.F_CV;6.089852333;100.0 +25/10/2020 02:06:09;U875.TC160_OP.F_CV;6.177639484;100.0 +25/10/2020 02:06:10;U875.TC160_OP.F_CV;6.603715897;100.0 +25/10/2020 02:06:11;U875.TC160_OP.F_CV;6.802314281;100.0 +25/10/2020 02:06:12;U875.TC160_OP.F_CV;6.604738712;100.0 +25/10/2020 02:06:13;U875.TC160_OP.F_CV;5.912803650;100.0 +25/10/2020 02:06:14;U875.TC160_OP.F_CV;5.687582493;100.0 +25/10/2020 02:06:15;U875.TC160_OP.F_CV;6.267001629;100.0 +25/10/2020 02:06:16;U875.TC160_OP.F_CV;6.706732750;100.0 +25/10/2020 02:06:17;U875.TC160_OP.F_CV;6.855257511;100.0 +25/10/2020 02:06:18;U875.TC160_OP.F_CV;5.561578751;100.0 +25/10/2020 02:06:19;U875.TC160_OP.F_CV;5.137639523;100.0 +25/10/2020 02:06:20;U875.TC160_OP.F_CV;5.239092350;100.0 +25/10/2020 02:06:21;U875.TC160_OP.F_CV;5.481762409;100.0 +25/10/2020 02:06:22;U875.TC160_OP.F_CV;5.562764645;100.0 +25/10/2020 02:06:29;U875.TC160_OP.F_CV;5.614347458;100.0 +25/10/2020 02:06:33;U875.TC160_OP.F_CV;6.220852375;100.0 +25/10/2020 02:06:34;U875.TC160_OP.F_CV;5.552132607;100.0 +25/10/2020 02:06:35;U875.TC160_OP.F_CV;4.707888126;100.0 +25/10/2020 02:06:36;U875.TC160_OP.F_CV;4.429744720;100.0 +25/10/2020 02:06:37;U875.TC160_OP.F_CV;4.786081791;100.0 +25/10/2020 02:06:38;U875.TC160_OP.F_CV;4.902884007;100.0 +25/10/2020 02:06:39;U875.TC160_OP.F_CV;5.341809750;100.0 +25/10/2020 02:06:40;U875.TC160_OP.F_CV;6.433228016;100.0 +25/10/2020 02:06:41;U875.TC160_OP.F_CV;6.795280457;100.0 +25/10/2020 02:06:43;U875.TC160_OP.F_CV;6.406390667;100.0 +25/10/2020 02:06:44;U875.TC160_OP.F_CV;6.348365784;100.0 +25/10/2020 02:06:47;U875.TC160_OP.F_CV;5.611199856;100.0 +25/10/2020 02:06:48;U875.TC160_OP.F_CV;4.750530243;100.0 +25/10/2020 02:06:49;U875.TC160_OP.F_CV;4.467025757;100.0 +25/10/2020 02:06:50;U875.TC160_OP.F_CV;5.270473480;100.0 +25/10/2020 02:06:52;U875.TC160_OP.F_CV;5.890627861;100.0 +25/10/2020 02:06:53;U875.TC160_OP.F_CV;6.640347958;100.0 +25/10/2020 02:06:54;U875.TC160_OP.F_CV;6.890466213;100.0 +25/10/2020 02:06:55;U875.TC160_OP.F_CV;6.188350677;100.0 +25/10/2020 02:06:56;U875.TC160_OP.F_CV;5.850737095;100.0 +25/10/2020 02:06:57;U875.TC160_OP.F_CV;5.741556168;100.0 +25/10/2020 02:06:58;U875.TC160_OP.F_CV;6.605340958;100.0 +25/10/2020 02:06:59;U875.TC160_OP.F_CV;6.892834187;100.0 +25/10/2020 02:06:05;U875.TC160_PV.F_CV;89.866462708;100.0 +25/10/2020 02:06:09;U875.TC160_PV.F_CV;89.753707886;100.0 +25/10/2020 02:06:12;U875.TC160_PV.F_CV;89.836357117;100.0 +25/10/2020 02:06:15;U875.TC160_PV.F_CV;89.739707947;100.0 +25/10/2020 02:06:18;U875.TC160_PV.F_CV;89.961135864;100.0 +25/10/2020 02:06:31;U875.TC160_PV.F_CV;89.840972900;100.0 +25/10/2020 02:06:34;U875.TC160_PV.F_CV;90.022804260;100.0 +25/10/2020 02:06:39;U875.TC160_PV.F_CV;89.799446106;100.0 +25/10/2020 02:06:46;U875.TC160_PV.F_CV;89.907836914;100.0 +25/10/2020 02:06:47;U875.TC160_PV.F_CV;90.037025452;100.0 +25/10/2020 02:06:52;U875.TC160_PV.F_CV;89.754493713;100.0 +25/10/2020 02:06:55;U875.TC160_PV.F_CV;89.875076294;100.0 +25/10/2020 02:06:57;U875.TC160_PV.F_CV;89.762855530;100.0 +25/10/2020 02:06:57;U875.TC160_SP.F_CV;90.000000000;100.0 +25/10/2020 02:06:00;U875.TC165_OP.F_CV;20.833801270;100.0 +25/10/2020 02:06:02;U875.TC165_OP.F_CV;20.965850830;100.0 +25/10/2020 02:06:06;U875.TC165_OP.F_CV;20.858606339;100.0 +25/10/2020 02:06:18;U875.TC165_OP.F_CV;21.062835693;100.0 +25/10/2020 02:06:27;U875.TC165_OP.F_CV;20.863883972;100.0 +25/10/2020 02:06:28;U875.TC165_OP.F_CV;20.756761551;100.0 +25/10/2020 02:06:33;U875.TC165_OP.F_CV;21.084232330;100.0 +25/10/2020 02:06:35;U875.TC165_OP.F_CV;20.988830566;100.0 +25/10/2020 02:06:38;U875.TC165_OP.F_CV;21.098005295;100.0 +25/10/2020 02:06:42;U875.TC165_OP.F_CV;20.960685730;100.0 +25/10/2020 02:06:48;U875.TC165_OP.F_CV;21.107089996;100.0 +25/10/2020 02:06:27;U875.TC165_PV.F_CV;89.566444397;100.0 +25/10/2020 02:06:31;U875.TC165_PV.F_CV;89.467132568;100.0 +25/10/2020 02:06:10;U875.TC165_SP.F_CV;90.000000000;100.0 +25/10/2020 02:06:00;U875.TC203_OP.F_CV;30.386234283;100.0 +25/10/2020 02:06:04;U875.TC203_OP.F_CV;30.208286285;100.0 +25/10/2020 02:06:05;U875.TC203_OP.F_CV;30.071388245;100.0 +25/10/2020 02:06:08;U875.TC203_OP.F_CV;30.374481201;100.0 +25/10/2020 02:06:10;U875.TC203_OP.F_CV;30.088512421;100.0 +25/10/2020 02:06:11;U875.TC203_OP.F_CV;30.034599304;100.0 +25/10/2020 02:06:14;U875.TC203_OP.F_CV;30.283697128;100.0 +25/10/2020 02:06:15;U875.TC203_OP.F_CV;30.504245758;100.0 +25/10/2020 02:06:16;U875.TC203_OP.F_CV;30.577857971;100.0 +25/10/2020 02:06:19;U875.TC203_OP.F_CV;30.425008774;100.0 +25/10/2020 02:06:20;U875.TC203_OP.F_CV;30.017225266;100.0 +25/10/2020 02:06:21;U875.TC203_OP.F_CV;29.883140564;100.0 +25/10/2020 02:06:23;U875.TC203_OP.F_CV;29.823785782;100.0 +25/10/2020 02:06:27;U875.TC203_OP.F_CV;30.173604965;100.0 +25/10/2020 02:06:29;U875.TC203_OP.F_CV;29.895790100;100.0 +25/10/2020 02:06:30;U875.TC203_OP.F_CV;29.841985703;100.0 +25/10/2020 02:06:34;U875.TC203_OP.F_CV;29.961664200;100.0 +25/10/2020 02:06:37;U875.TC203_OP.F_CV;30.345890045;100.0 +25/10/2020 02:06:40;U875.TC203_OP.F_CV;30.057653427;100.0 +25/10/2020 02:06:42;U875.TC203_OP.F_CV;30.497264862;100.0 +25/10/2020 02:06:43;U875.TC203_OP.F_CV;30.580650330;100.0 +25/10/2020 02:06:44;U875.TC203_OP.F_CV;30.254520416;100.0 +25/10/2020 02:06:45;U875.TC203_OP.F_CV;30.098575592;100.0 +25/10/2020 02:06:50;U875.TC203_OP.F_CV;29.855813980;100.0 +25/10/2020 02:06:53;U875.TC203_OP.F_CV;30.322401047;100.0 +25/10/2020 02:06:54;U875.TC203_OP.F_CV;30.390386581;100.0 +25/10/2020 02:06:55;U875.TC203_OP.F_CV;30.144199371;100.0 +25/10/2020 02:06:58;U875.TC203_OP.F_CV;29.869859695;100.0 +25/10/2020 02:06:14;U875.TC203_PV.F_CV;99.766784668;100.0 +25/10/2020 02:06:19;U875.TC203_PV.F_CV;99.975570679;100.0 +25/10/2020 02:06:36;U875.TC203_PV.F_CV;99.843086243;100.0 +25/10/2020 02:06:39;U875.TC203_PV.F_CV;99.974670410;100.0 +25/10/2020 02:06:41;U875.TC203_PV.F_CV;99.775924683;100.0 +25/10/2020 02:06:49;U875.TC203_PV.F_CV;100.083076477;100.0 +25/10/2020 02:06:53;U875.TC203_PV.F_CV;99.816299438;100.0 +25/10/2020 02:06:55;U875.TC203_PV.F_CV;99.980270386;100.0 +25/10/2020 02:06:31;U875.TC203_SP.F_CV;100.000000000;100.0 +25/10/2020 02:06:06;U875.TC220_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TC220_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U875.TC220_OP.F_CV;25.593360901;100.0 +25/10/2020 02:06:02;U875.TC220_OP.F_CV;26.019996643;100.0 +25/10/2020 02:06:04;U875.TC220_OP.F_CV;26.117086411;100.0 +25/10/2020 02:06:05;U875.TC220_OP.F_CV;26.246223450;100.0 +25/10/2020 02:06:07;U875.TC220_OP.F_CV;25.541849136;100.0 +25/10/2020 02:06:09;U875.TC220_OP.F_CV;25.468153000;100.0 +25/10/2020 02:06:10;U875.TC220_OP.F_CV;25.807071686;100.0 +25/10/2020 02:06:13;U875.TC220_OP.F_CV;26.026473999;100.0 +25/10/2020 02:06:15;U875.TC220_OP.F_CV;25.812702179;100.0 +25/10/2020 02:06:17;U875.TC220_OP.F_CV;25.905801773;100.0 +25/10/2020 02:06:18;U875.TC220_OP.F_CV;26.031305313;100.0 +25/10/2020 02:06:20;U875.TC220_OP.F_CV;25.857503891;100.0 +25/10/2020 02:06:22;U875.TC220_OP.F_CV;25.912189484;100.0 +25/10/2020 02:06:23;U875.TC220_OP.F_CV;26.255510330;100.0 +25/10/2020 02:06:26;U875.TC220_OP.F_CV;25.854942322;100.0 +25/10/2020 02:06:27;U875.TC220_OP.F_CV;25.608751297;100.0 +25/10/2020 02:06:29;U875.TC220_OP.F_CV;26.040912628;100.0 +25/10/2020 02:06:31;U875.TC220_OP.F_CV;26.137851715;100.0 +25/10/2020 02:06:32;U875.TC220_OP.F_CV;26.266195297;100.0 +25/10/2020 02:06:34;U875.TC220_OP.F_CV;25.917514801;100.0 +25/10/2020 02:06:35;U875.TC220_OP.F_CV;25.838335037;100.0 +25/10/2020 02:06:41;U875.TC220_OP.F_CV;25.838335037;100.0 +25/10/2020 02:06:42;U875.TC220_OP.F_CV;26.274055481;100.0 +25/10/2020 02:06:44;U875.TC220_OP.F_CV;26.096464157;100.0 +25/10/2020 02:06:45;U875.TC220_OP.F_CV;25.847816467;100.0 +25/10/2020 02:06:47;U875.TC220_OP.F_CV;25.628665924;100.0 +25/10/2020 02:06:57;U875.TC220_OP.F_CV;25.702671051;100.0 +25/10/2020 02:06:58;U875.TC220_OP.F_CV;26.043548584;100.0 +25/10/2020 02:06:33;U875.TC220_PV.F_CV;299.900268555;100.0 +25/10/2020 02:06:47;U875.TC220_SP.F_CV;300.000000000;100.0 +25/10/2020 02:06:06;U875.TC221_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TC221_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U875.TC221_OP.F_CV;19.310720444;100.0 +25/10/2020 02:06:03;U875.TC221_OP.F_CV;19.963361740;100.0 +25/10/2020 02:06:05;U875.TC221_OP.F_CV;19.316720963;100.0 +25/10/2020 02:06:09;U875.TC221_OP.F_CV;19.316720963;100.0 +25/10/2020 02:06:10;U875.TC221_OP.F_CV;19.742469788;100.0 +25/10/2020 02:06:22;U875.TC221_OP.F_CV;19.742469788;100.0 +25/10/2020 02:06:23;U875.TC221_OP.F_CV;19.987215042;100.0 +25/10/2020 02:06:26;U875.TC221_OP.F_CV;19.854129791;100.0 +25/10/2020 02:06:27;U875.TC221_OP.F_CV;19.343059540;100.0 +25/10/2020 02:06:29;U875.TC221_OP.F_CV;20.051027298;100.0 +25/10/2020 02:06:30;U875.TC221_OP.F_CV;20.216695786;100.0 +25/10/2020 02:06:32;U875.TC221_OP.F_CV;19.792013168;100.0 +25/10/2020 02:06:36;U875.TC221_OP.F_CV;19.792013168;100.0 +25/10/2020 02:06:37;U875.TC221_OP.F_CV;20.019390106;100.0 +25/10/2020 02:06:39;U875.TC221_OP.F_CV;19.841381073;100.0 +25/10/2020 02:06:40;U875.TC221_OP.F_CV;19.592662811;100.0 +25/10/2020 02:06:42;U875.TC221_OP.F_CV;19.769859314;100.0 +25/10/2020 02:06:44;U875.TC221_OP.F_CV;19.718940735;100.0 +25/10/2020 02:06:45;U875.TC221_OP.F_CV;19.377614975;100.0 +25/10/2020 02:06:49;U875.TC221_OP.F_CV;19.377614975;100.0 +25/10/2020 02:06:50;U875.TC221_OP.F_CV;19.585149765;100.0 +25/10/2020 02:06:53;U875.TC221_OP.F_CV;19.803161621;100.0 +25/10/2020 02:06:55;U875.TC221_OP.F_CV;19.623273849;100.0 +25/10/2020 02:06:56;U875.TC221_OP.F_CV;19.371711731;100.0 +25/10/2020 02:06:58;U875.TC221_OP.F_CV;19.902421951;100.0 +25/10/2020 02:06:59;U875.TC221_OP.F_CV;20.024990082;100.0 +25/10/2020 02:06:55;U875.TC221_PV.F_CV;320.001800537;100.0 +25/10/2020 02:06:47;U875.TC221_SP.F_CV;320.000000000;100.0 +25/10/2020 02:06:01;U875.TC222_OP.F_CV;24.134698868;100.0 +25/10/2020 02:06:02;U875.TC222_OP.F_CV;24.262825012;100.0 +25/10/2020 02:06:05;U875.TC222_OP.F_CV;23.941183090;100.0 +25/10/2020 02:06:07;U875.TC222_OP.F_CV;24.264883041;100.0 +25/10/2020 02:06:10;U875.TC222_OP.F_CV;24.106884003;100.0 +25/10/2020 02:06:12;U875.TC222_OP.F_CV;23.974689484;100.0 +25/10/2020 02:06:18;U875.TC222_OP.F_CV;24.101631165;100.0 +25/10/2020 02:06:20;U875.TC222_OP.F_CV;23.939935684;100.0 +25/10/2020 02:06:29;U875.TC222_OP.F_CV;24.093814850;100.0 +25/10/2020 02:06:37;U875.TC222_OP.F_CV;23.934200287;100.0 +25/10/2020 02:06:40;U875.TC222_OP.F_CV;24.094310760;100.0 +25/10/2020 02:06:42;U875.TC222_OP.F_CV;23.932062149;100.0 +25/10/2020 02:06:45;U875.TC222_OP.F_CV;24.092311859;100.0 +25/10/2020 02:06:48;U875.TC222_OP.F_CV;24.421562195;100.0 +25/10/2020 02:06:49;U875.TC222_OP.F_CV;24.319454193;100.0 +25/10/2020 02:06:50;U875.TC222_OP.F_CV;23.939291000;100.0 +25/10/2020 02:06:53;U875.TC222_OP.F_CV;24.262783051;100.0 +25/10/2020 02:06:58;U875.TC222_OP.F_CV;23.941469193;100.0 +25/10/2020 02:06:48;U875.TC222_PV.F_CV;349.918975830;100.0 +25/10/2020 02:06:19;U875.TC222_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:00;U875.TC223_OP.F_CV;20.145483017;100.0 +25/10/2020 02:06:03;U875.TC223_OP.F_CV;20.617238998;100.0 +25/10/2020 02:06:05;U875.TC223_OP.F_CV;20.303270340;100.0 +25/10/2020 02:06:09;U875.TC223_OP.F_CV;20.460105896;100.0 +25/10/2020 02:06:10;U875.TC223_OP.F_CV;20.331584930;100.0 +25/10/2020 02:06:16;U875.TC223_OP.F_CV;20.620216370;100.0 +25/10/2020 02:06:18;U875.TC223_OP.F_CV;20.465669632;100.0 +25/10/2020 02:06:23;U875.TC223_OP.F_CV;20.338460922;100.0 +25/10/2020 02:06:33;U875.TC223_OP.F_CV;20.628292084;100.0 +25/10/2020 02:06:35;U875.TC223_OP.F_CV;20.315696716;100.0 +25/10/2020 02:06:45;U875.TC223_OP.F_CV;20.601379395;100.0 +25/10/2020 02:06:48;U875.TC223_OP.F_CV;20.478160858;100.0 +25/10/2020 02:06:52;U875.TC223_OP.F_CV;20.478160858;100.0 +25/10/2020 02:06:53;U875.TC223_OP.F_CV;20.739305496;100.0 +25/10/2020 02:06:54;U875.TC223_OP.F_CV;20.800714493;100.0 +25/10/2020 02:06:56;U875.TC223_OP.F_CV;20.489349365;100.0 +25/10/2020 02:06:39;U875.TC223_PV.F_CV;350.003479004;100.0 +25/10/2020 02:06:19;U875.TC223_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:00;U875.TC224_OP.F_CV;17.853536606;100.0 +25/10/2020 02:06:09;U875.TC224_OP.F_CV;17.997720718;100.0 +25/10/2020 02:06:13;U875.TC224_OP.F_CV;17.712316513;100.0 +25/10/2020 02:06:16;U875.TC224_OP.F_CV;18.004713058;100.0 +25/10/2020 02:06:19;U875.TC224_OP.F_CV;17.689329147;100.0 +25/10/2020 02:06:21;U875.TC224_OP.F_CV;17.849370956;100.0 +25/10/2020 02:06:25;U875.TC224_OP.F_CV;17.530107498;100.0 +25/10/2020 02:06:30;U875.TC224_OP.F_CV;17.682071686;100.0 +25/10/2020 02:06:37;U875.TC224_OP.F_CV;17.750898361;100.0 +25/10/2020 02:06:38;U875.TC224_OP.F_CV;18.002929688;100.0 +25/10/2020 02:06:41;U875.TC224_OP.F_CV;17.526576996;100.0 +25/10/2020 02:06:43;U875.TC224_OP.F_CV;17.683809280;100.0 +25/10/2020 02:06:48;U875.TC224_OP.F_CV;17.551771164;100.0 +25/10/2020 02:06:58;U875.TC224_OP.F_CV;17.909553528;100.0 +25/10/2020 02:06:59;U875.TC224_OP.F_CV;18.004087448;100.0 +25/10/2020 02:06:29;U875.TC224_PV.F_CV;350.044464111;100.0 +25/10/2020 02:06:19;U875.TC224_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:02;U875.TC225_OP.F_CV;17.833168030;100.0 +25/10/2020 02:06:03;U875.TC225_OP.F_CV;17.694755554;100.0 +25/10/2020 02:06:07;U875.TC225_OP.F_CV;17.747056961;100.0 +25/10/2020 02:06:09;U875.TC225_OP.F_CV;18.168788910;100.0 +25/10/2020 02:06:11;U875.TC225_OP.F_CV;17.836246490;100.0 +25/10/2020 02:06:14;U875.TC225_OP.F_CV;17.992710114;100.0 +25/10/2020 02:06:16;U875.TC225_OP.F_CV;17.745532990;100.0 +25/10/2020 02:06:18;U875.TC225_OP.F_CV;17.846305847;100.0 +25/10/2020 02:06:19;U875.TC225_OP.F_CV;18.017068863;100.0 +25/10/2020 02:06:21;U875.TC225_OP.F_CV;17.880962372;100.0 +25/10/2020 02:06:27;U875.TC225_OP.F_CV;18.084449768;100.0 +25/10/2020 02:06:31;U875.TC225_OP.F_CV;17.679649353;100.0 +25/10/2020 02:06:34;U875.TC225_OP.F_CV;17.736652374;100.0 +25/10/2020 02:06:36;U875.TC225_OP.F_CV;18.179723740;100.0 +25/10/2020 02:06:38;U875.TC225_OP.F_CV;17.782676697;100.0 +25/10/2020 02:06:39;U875.TC225_OP.F_CV;17.715862274;100.0 +25/10/2020 02:06:41;U875.TC225_OP.F_CV;17.888933182;100.0 +25/10/2020 02:06:46;U875.TC225_OP.F_CV;17.744598389;100.0 +25/10/2020 02:06:49;U875.TC225_OP.F_CV;17.913297653;100.0 +25/10/2020 02:06:58;U875.TC225_OP.F_CV;17.913297653;100.0 +25/10/2020 02:06:59;U875.TC225_OP.F_CV;18.186040878;100.0 +25/10/2020 02:06:26;U875.TC225_PV.F_CV;349.872619629;100.0 +25/10/2020 02:06:49;U875.TC225_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:01;U875.TC303_OP.F_CV;1.634829521;100.0 +25/10/2020 02:06:04;U875.TC303_OP.F_CV;1.407958031;100.0 +25/10/2020 02:06:07;U875.TC303_OP.F_CV;1.307474852;100.0 +25/10/2020 02:06:20;U875.TC303_OP.F_CV;1.409869790;100.0 +25/10/2020 02:06:26;U875.TC303_OP.F_CV;1.309927940;100.0 +25/10/2020 02:06:36;U875.TC303_OP.F_CV;1.438843846;100.0 +25/10/2020 02:06:37;U875.TC303_OP.F_CV;1.542359233;100.0 +25/10/2020 02:06:42;U875.TC303_OP.F_CV;1.476136804;100.0 +25/10/2020 02:06:45;U875.TC303_OP.F_CV;1.302435398;100.0 +25/10/2020 02:06:06;U875.TC303_PV.F_CV;100.145515442;100.0 +25/10/2020 02:06:20;U875.TC303_PV.F_CV;100.013427734;100.0 +25/10/2020 02:06:25;U875.TC303_PV.F_CV;100.146141052;100.0 +25/10/2020 02:06:36;U875.TC303_PV.F_CV;99.878723145;100.0 +25/10/2020 02:06:43;U875.TC303_PV.F_CV;100.091995239;100.0 +25/10/2020 02:06:59;U875.TC303_PV.F_CV;99.941062927;100.0 +25/10/2020 02:06:06;U875.TC303_SP.F_CV;100.000000000;100.0 +25/10/2020 02:06:02;U875.TC311_OP.F_CV;40.539199829;100.0 +25/10/2020 02:06:03;U875.TC311_OP.F_CV;40.833106995;100.0 +25/10/2020 02:06:06;U875.TC311_OP.F_CV;40.295341492;100.0 +25/10/2020 02:06:07;U875.TC311_OP.F_CV;40.571777344;100.0 +25/10/2020 02:06:09;U875.TC311_OP.F_CV;40.862518311;100.0 +25/10/2020 02:06:10;U875.TC311_OP.F_CV;40.438735962;100.0 +25/10/2020 02:06:12;U875.TC311_OP.F_CV;40.366668701;100.0 +25/10/2020 02:06:13;U875.TC311_OP.F_CV;40.493034363;100.0 +25/10/2020 02:06:15;U875.TC311_OP.F_CV;41.040077209;100.0 +25/10/2020 02:06:16;U875.TC311_OP.F_CV;41.399784088;100.0 +25/10/2020 02:06:17;U875.TC311_OP.F_CV;41.327186584;100.0 +25/10/2020 02:06:18;U875.TC311_OP.F_CV;40.835010529;100.0 +25/10/2020 02:06:19;U875.TC311_OP.F_CV;40.673675537;100.0 +25/10/2020 02:06:25;U875.TC311_OP.F_CV;40.291652679;100.0 +25/10/2020 02:06:28;U875.TC311_OP.F_CV;40.553161621;100.0 +25/10/2020 02:06:30;U875.TC311_OP.F_CV;40.282947540;100.0 +25/10/2020 02:06:31;U875.TC311_OP.F_CV;40.384174347;100.0 +25/10/2020 02:06:32;U875.TC311_OP.F_CV;40.733329773;100.0 +25/10/2020 02:06:33;U875.TC311_OP.F_CV;40.851516724;100.0 +25/10/2020 02:06:35;U875.TC311_OP.F_CV;40.911590576;100.0 +25/10/2020 02:06:38;U875.TC311_OP.F_CV;40.630199432;100.0 +25/10/2020 02:06:44;U875.TC311_OP.F_CV;40.527996063;100.0 +25/10/2020 02:06:45;U875.TC311_OP.F_CV;40.346096039;100.0 +25/10/2020 02:06:46;U875.TC311_OP.F_CV;40.282726288;100.0 +25/10/2020 02:06:48;U875.TC311_OP.F_CV;40.811370850;100.0 +25/10/2020 02:06:49;U875.TC311_OP.F_CV;40.888813019;100.0 +25/10/2020 02:06:50;U875.TC311_OP.F_CV;40.466007233;100.0 +25/10/2020 02:06:51;U875.TC311_OP.F_CV;40.323730469;100.0 +25/10/2020 02:06:52;U875.TC311_OP.F_CV;40.636329651;100.0 +25/10/2020 02:06:53;U875.TC311_OP.F_CV;41.055984497;100.0 +25/10/2020 02:06:54;U875.TC311_OP.F_CV;41.200965881;100.0 +25/10/2020 02:06:55;U875.TC311_OP.F_CV;40.660655975;100.0 +25/10/2020 02:06:56;U875.TC311_OP.F_CV;40.398620605;100.0 +25/10/2020 02:06:57;U875.TC311_OP.F_CV;40.308982849;100.0 +25/10/2020 02:06:01;U875.TC311_PV.F_CV;119.980010986;100.0 +25/10/2020 02:06:05;U875.TC311_PV.F_CV;120.067367554;100.0 +25/10/2020 02:06:07;U875.TC311_PV.F_CV;119.939140320;100.0 +25/10/2020 02:06:09;U875.TC311_PV.F_CV;120.022285461;100.0 +25/10/2020 02:06:14;U875.TC311_PV.F_CV;119.894523621;100.0 +25/10/2020 02:06:15;U875.TC311_PV.F_CV;119.763732910;100.0 +25/10/2020 02:06:23;U875.TC311_PV.F_CV;120.086463928;100.0 +25/10/2020 02:06:27;U875.TC311_PV.F_CV;120.010269165;100.0 +25/10/2020 02:06:30;U875.TC311_PV.F_CV;120.094863892;100.0 +25/10/2020 02:06:31;U875.TC311_PV.F_CV;119.963859558;100.0 +25/10/2020 02:06:44;U875.TC311_PV.F_CV;120.073776245;100.0 +25/10/2020 02:06:47;U875.TC311_PV.F_CV;119.932632446;100.0 +25/10/2020 02:06:49;U875.TC311_PV.F_CV;120.037971497;100.0 +25/10/2020 02:06:52;U875.TC311_PV.F_CV;119.860733032;100.0 +25/10/2020 02:06:55;U875.TC311_PV.F_CV;120.061866760;100.0 +25/10/2020 02:06:06;U875.TC311_SP.F_CV;120.000000000;100.0 +25/10/2020 02:06:03;U875.TC312_OP.F_CV;11.917089462;100.0 +25/10/2020 02:06:12;U875.TC312_OP.F_CV;11.861006737;100.0 +25/10/2020 02:06:15;U875.TC312_OP.F_CV;11.747440338;100.0 +25/10/2020 02:06:16;U875.TC312_OP.F_CV;11.830698967;100.0 +25/10/2020 02:06:18;U875.TC312_OP.F_CV;11.721442223;100.0 +25/10/2020 02:06:21;U875.TC312_OP.F_CV;11.776394844;100.0 +25/10/2020 02:06:23;U875.TC312_OP.F_CV;11.714694977;100.0 +25/10/2020 02:06:34;U875.TC312_OP.F_CV;12.045639038;100.0 +25/10/2020 02:06:38;U875.TC312_OP.F_CV;11.886652946;100.0 +25/10/2020 02:06:45;U875.TC312_OP.F_CV;11.995292664;100.0 +25/10/2020 02:06:50;U875.TC312_OP.F_CV;11.922656059;100.0 +25/10/2020 02:06:52;U875.TC312_OP.F_CV;12.003750801;100.0 +25/10/2020 02:06:54;U875.TC312_OP.F_CV;11.937713623;100.0 +25/10/2020 02:06:55;U875.TC312_OP.F_CV;12.015062332;100.0 +25/10/2020 02:06:57;U875.TC312_OP.F_CV;11.957094193;100.0 +25/10/2020 02:06:59;U875.TC312_OP.F_CV;12.163024902;100.0 +25/10/2020 02:06:03;U875.TC312_PV.F_CV;70.018218994;100.0 +25/10/2020 02:06:22;U875.TC312_PV.F_CV;70.094558716;100.0 +25/10/2020 02:06:33;U875.TC312_PV.F_CV;70.006248474;100.0 +25/10/2020 02:06:56;U875.TC312_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U875.TC313_OP.F_CV;65.288047791;100.0 +25/10/2020 02:06:03;U875.TC313_OP.F_CV;65.082954407;100.0 +25/10/2020 02:06:12;U875.TC313_OP.F_CV;65.668258667;100.0 +25/10/2020 02:06:15;U875.TC313_OP.F_CV;65.572181702;100.0 +25/10/2020 02:06:20;U875.TC313_OP.F_CV;64.971817017;100.0 +25/10/2020 02:06:21;U875.TC313_OP.F_CV;64.778953552;100.0 +25/10/2020 02:06:22;U875.TC313_OP.F_CV;64.712776184;100.0 +25/10/2020 02:06:23;U875.TC313_OP.F_CV;64.851295471;100.0 +25/10/2020 02:06:25;U875.TC313_OP.F_CV;64.956390381;100.0 +25/10/2020 02:06:28;U875.TC313_OP.F_CV;65.300270081;100.0 +25/10/2020 02:06:37;U875.TC313_OP.F_CV;65.174438477;100.0 +25/10/2020 02:06:38;U875.TC313_OP.F_CV;65.058227539;100.0 +25/10/2020 02:06:41;U875.TC313_OP.F_CV;65.597999573;100.0 +25/10/2020 02:06:43;U875.TC313_OP.F_CV;65.133972168;100.0 +25/10/2020 02:06:44;U875.TC313_OP.F_CV;65.043373108;100.0 +25/10/2020 02:06:47;U875.TC313_OP.F_CV;65.128944397;100.0 +25/10/2020 02:06:48;U875.TC313_OP.F_CV;65.486328125;100.0 +25/10/2020 02:06:51;U875.TC313_OP.F_CV;65.939453125;100.0 +25/10/2020 02:06:53;U875.TC313_OP.F_CV;66.003372192;100.0 +25/10/2020 02:06:55;U875.TC313_OP.F_CV;65.897758484;100.0 +25/10/2020 02:06:56;U875.TC313_OP.F_CV;65.757995605;100.0 +25/10/2020 02:06:58;U875.TC313_OP.F_CV;65.250991821;100.0 +25/10/2020 02:06:59;U875.TC313_OP.F_CV;65.097831726;100.0 +25/10/2020 02:06:10;U875.TC313_PV.F_CV;114.921035767;100.0 +25/10/2020 02:06:20;U875.TC313_PV.F_CV;115.165328979;100.0 +25/10/2020 02:06:40;U875.TC313_PV.F_CV;114.920890808;100.0 +25/10/2020 02:06:42;U875.TC313_PV.F_CV;115.060302734;100.0 +25/10/2020 02:06:49;U875.TC313_PV.F_CV;114.856819153;100.0 +25/10/2020 02:06:57;U875.TC313_PV.F_CV;115.032211304;100.0 +25/10/2020 02:06:06;U875.TC313_SP.F_CV;115.000000000;100.0 +25/10/2020 02:06:03;U875.TC315_OP.F_CV;42.822463989;100.0 +25/10/2020 02:06:05;U875.TC315_OP.F_CV;42.599109650;100.0 +25/10/2020 02:06:08;U875.TC315_OP.F_CV;42.840358734;100.0 +25/10/2020 02:06:09;U875.TC315_OP.F_CV;42.666419983;100.0 +25/10/2020 02:06:11;U875.TC315_OP.F_CV;41.951477051;100.0 +25/10/2020 02:06:13;U875.TC315_OP.F_CV;41.572429657;100.0 +25/10/2020 02:06:19;U875.TC315_OP.F_CV;41.408535004;100.0 +25/10/2020 02:06:20;U875.TC315_OP.F_CV;41.590270996;100.0 +25/10/2020 02:06:22;U875.TC315_OP.F_CV;41.822357178;100.0 +25/10/2020 02:06:23;U875.TC315_OP.F_CV;42.184715271;100.0 +25/10/2020 02:06:25;U875.TC315_OP.F_CV;42.303466797;100.0 +25/10/2020 02:06:27;U875.TC315_OP.F_CV;42.072666168;100.0 +25/10/2020 02:06:29;U875.TC315_OP.F_CV;42.017993927;100.0 +25/10/2020 02:06:31;U875.TC315_OP.F_CV;41.760208130;100.0 +25/10/2020 02:06:32;U875.TC315_OP.F_CV;41.461059570;100.0 +25/10/2020 02:06:35;U875.TC315_OP.F_CV;41.278205872;100.0 +25/10/2020 02:06:37;U875.TC315_OP.F_CV;41.489692688;100.0 +25/10/2020 02:06:39;U875.TC315_OP.F_CV;41.215644836;100.0 +25/10/2020 02:06:40;U875.TC315_OP.F_CV;40.973861694;100.0 +25/10/2020 02:06:41;U875.TC315_OP.F_CV;40.879714966;100.0 +25/10/2020 02:06:42;U875.TC315_OP.F_CV;41.511833191;100.0 +25/10/2020 02:06:43;U875.TC315_OP.F_CV;41.715263367;100.0 +25/10/2020 02:06:44;U875.TC315_OP.F_CV;41.778137207;100.0 +25/10/2020 02:06:50;U875.TC315_OP.F_CV;41.431892395;100.0 +25/10/2020 02:06:53;U875.TC315_OP.F_CV;41.112487793;100.0 +25/10/2020 02:06:55;U875.TC315_OP.F_CV;41.279060364;100.0 +25/10/2020 02:06:57;U875.TC315_OP.F_CV;41.086257935;100.0 +25/10/2020 02:06:58;U875.TC315_OP.F_CV;40.787670135;100.0 +25/10/2020 02:06:59;U875.TC315_OP.F_CV;40.674915314;100.0 +25/10/2020 02:06:02;U875.TC315_PV.F_CV;119.917709351;100.0 +25/10/2020 02:06:11;U875.TC315_PV.F_CV;120.225585938;100.0 +25/10/2020 02:06:22;U875.TC315_PV.F_CV;120.067337036;100.0 +25/10/2020 02:06:39;U875.TC315_PV.F_CV;120.359207153;100.0 +25/10/2020 02:06:43;U875.TC315_PV.F_CV;120.110176086;100.0 +25/10/2020 02:06:52;U875.TC315_PV.F_CV;120.283180237;100.0 +25/10/2020 02:06:55;U875.TC315_PV.F_CV;120.207992554;100.0 +25/10/2020 02:06:57;U875.TC315_PV.F_CV;120.358917236;100.0 +25/10/2020 02:06:06;U875.TC315_SP.F_CV;120.000000000;100.0 +25/10/2020 02:06:06;U875.TC320_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TC320_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U875.TC320_OP.F_CV;28.514993668;100.0 +25/10/2020 02:06:03;U875.TC320_OP.F_CV;28.300485611;100.0 +25/10/2020 02:06:07;U875.TC320_OP.F_CV;28.206747055;100.0 +25/10/2020 02:06:10;U875.TC320_OP.F_CV;27.898822784;100.0 +25/10/2020 02:06:13;U875.TC320_OP.F_CV;28.284889221;100.0 +25/10/2020 02:06:20;U875.TC320_OP.F_CV;28.379999161;100.0 +25/10/2020 02:06:21;U875.TC320_OP.F_CV;28.506713867;100.0 +25/10/2020 02:06:23;U875.TC320_OP.F_CV;28.292821884;100.0 +25/10/2020 02:06:26;U875.TC320_OP.F_CV;28.199594498;100.0 +25/10/2020 02:06:27;U875.TC320_OP.F_CV;28.072483063;100.0 +25/10/2020 02:06:31;U875.TC320_OP.F_CV;28.072483063;100.0 +25/10/2020 02:06:32;U875.TC320_OP.F_CV;28.282184601;100.0 +25/10/2020 02:06:36;U875.TC320_OP.F_CV;28.282184601;100.0 +25/10/2020 02:06:37;U875.TC320_OP.F_CV;28.501440048;100.0 +25/10/2020 02:06:42;U875.TC320_OP.F_CV;28.333091736;100.0 +25/10/2020 02:06:55;U875.TC320_OP.F_CV;28.469984055;100.0 +25/10/2020 02:06:57;U875.TC320_OP.F_CV;28.418905258;100.0 +25/10/2020 02:06:58;U875.TC320_OP.F_CV;28.077867508;100.0 +25/10/2020 02:06:28;U875.TC320_PV.F_CV;300.039916992;100.0 +25/10/2020 02:06:01;U875.TC320_SP.F_CV;300.000000000;100.0 +25/10/2020 02:06:06;U875.TC321_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TC321_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U875.TC321_OP.F_CV;20.172658920;100.0 +25/10/2020 02:06:02;U875.TC321_OP.F_CV;20.083866119;100.0 +25/10/2020 02:06:03;U875.TC321_OP.F_CV;19.959442139;100.0 +25/10/2020 02:06:05;U875.TC321_OP.F_CV;20.137359619;100.0 +25/10/2020 02:06:08;U875.TC321_OP.F_CV;19.963951111;100.0 +25/10/2020 02:06:11;U875.TC321_OP.F_CV;20.182468414;100.0 +25/10/2020 02:06:13;U875.TC321_OP.F_CV;19.968612671;100.0 +25/10/2020 02:06:19;U875.TC321_OP.F_CV;20.145996094;100.0 +25/10/2020 02:06:21;U875.TC321_OP.F_CV;19.972270966;100.0 +25/10/2020 02:06:34;U875.TC321_OP.F_CV;19.972270966;100.0 +25/10/2020 02:06:35;U875.TC321_OP.F_CV;19.751672745;100.0 +25/10/2020 02:06:38;U875.TC321_OP.F_CV;20.185071945;100.0 +25/10/2020 02:06:48;U875.TC321_OP.F_CV;20.185071945;100.0 +25/10/2020 02:06:49;U875.TC321_OP.F_CV;19.984035492;100.0 +25/10/2020 02:06:51;U875.TC321_OP.F_CV;20.202375412;100.0 +25/10/2020 02:06:53;U875.TC321_OP.F_CV;19.987871170;100.0 +25/10/2020 02:06:58;U875.TC321_OP.F_CV;20.165048599;100.0 +25/10/2020 02:06:19;U875.TC321_PV.F_CV;319.957153320;100.0 +25/10/2020 02:06:47;U875.TC321_SP.F_CV;320.000000000;100.0 +25/10/2020 02:06:10;U875.TC322_OP.F_CV;31.142866135;100.0 +25/10/2020 02:06:11;U875.TC322_OP.F_CV;31.442506790;100.0 +25/10/2020 02:06:14;U875.TC322_OP.F_CV;30.965414047;100.0 +25/10/2020 02:06:16;U875.TC322_OP.F_CV;31.094154358;100.0 +25/10/2020 02:06:25;U875.TC322_OP.F_CV;30.964738846;100.0 +25/10/2020 02:06:30;U875.TC322_OP.F_CV;31.091640472;100.0 +25/10/2020 02:06:36;U875.TC322_OP.F_CV;30.961305618;100.0 +25/10/2020 02:06:38;U875.TC322_OP.F_CV;31.121006012;100.0 +25/10/2020 02:06:45;U875.TC322_OP.F_CV;31.055721283;100.0 +25/10/2020 02:06:46;U875.TC322_OP.F_CV;30.961957932;100.0 +25/10/2020 02:06:59;U875.TC322_OP.F_CV;31.284555435;100.0 +25/10/2020 02:06:34;U875.TC322_PV.F_CV;370.000793457;100.0 +25/10/2020 02:06:47;U875.TC322_SP.F_CV;370.000000000;100.0 +25/10/2020 02:06:01;U875.TC323_OP.F_CV;21.986652374;100.0 +25/10/2020 02:06:08;U875.TC323_OP.F_CV;21.986652374;100.0 +25/10/2020 02:06:09;U875.TC323_OP.F_CV;22.276002884;100.0 +25/10/2020 02:06:12;U875.TC323_OP.F_CV;22.125265121;100.0 +25/10/2020 02:06:20;U875.TC323_OP.F_CV;21.976078033;100.0 +25/10/2020 02:06:31;U875.TC323_OP.F_CV;22.135829926;100.0 +25/10/2020 02:06:34;U875.TC323_OP.F_CV;21.981107712;100.0 +25/10/2020 02:06:41;U875.TC323_OP.F_CV;22.111646652;100.0 +25/10/2020 02:06:46;U875.TC323_OP.F_CV;21.949771881;100.0 +25/10/2020 02:06:47;U875.TC323_OP.F_CV;21.830173492;100.0 +25/10/2020 02:06:50;U875.TC323_OP.F_CV;22.146492004;100.0 +25/10/2020 02:06:52;U875.TC323_OP.F_CV;21.989826202;100.0 +25/10/2020 02:06:54;U875.TC323_OP.F_CV;22.119859695;100.0 +25/10/2020 02:06:57;U875.TC323_OP.F_CV;21.835670471;100.0 +25/10/2020 02:06:59;U875.TC323_OP.F_CV;22.035255432;100.0 +25/10/2020 02:06:21;U875.TC323_PV.F_CV;369.933654785;100.0 +25/10/2020 02:06:55;U875.TC323_SP.F_CV;370.000000000;100.0 +25/10/2020 02:06:02;U875.TC324_OP.F_CV;23.707904816;100.0 +25/10/2020 02:06:10;U875.TC324_OP.F_CV;24.029664993;100.0 +25/10/2020 02:06:12;U875.TC324_OP.F_CV;23.713487625;100.0 +25/10/2020 02:06:20;U875.TC324_OP.F_CV;23.868295670;100.0 +25/10/2020 02:06:23;U875.TC324_OP.F_CV;23.709938049;100.0 +25/10/2020 02:06:31;U875.TC324_OP.F_CV;23.836679459;100.0 +25/10/2020 02:06:33;U875.TC324_OP.F_CV;23.731239319;100.0 +25/10/2020 02:06:34;U875.TC324_OP.F_CV;23.546590805;100.0 +25/10/2020 02:06:42;U875.TC324_OP.F_CV;23.860778809;100.0 +25/10/2020 02:06:50;U875.TC324_OP.F_CV;23.706159592;100.0 +25/10/2020 02:06:53;U875.TC324_OP.F_CV;24.028886795;100.0 +25/10/2020 02:06:55;U875.TC324_OP.F_CV;23.871524811;100.0 +25/10/2020 02:06:58;U875.TC324_OP.F_CV;24.035036087;100.0 +25/10/2020 02:06:49;U875.TC324_PV.F_CV;369.975372314;100.0 +25/10/2020 02:06:08;U875.TC324_SP.F_CV;370.000000000;100.0 +25/10/2020 02:06:02;U875.TC325_OP.F_CV;18.957469940;100.0 +25/10/2020 02:06:07;U875.TC325_OP.F_CV;18.780572891;100.0 +25/10/2020 02:06:12;U875.TC325_OP.F_CV;19.053731918;100.0 +25/10/2020 02:06:14;U875.TC325_OP.F_CV;18.997543335;100.0 +25/10/2020 02:06:15;U875.TC325_OP.F_CV;18.759529114;100.0 +25/10/2020 02:06:26;U875.TC325_OP.F_CV;18.931604385;100.0 +25/10/2020 02:06:29;U875.TC325_OP.F_CV;18.795436859;100.0 +25/10/2020 02:06:37;U875.TC325_OP.F_CV;18.668514252;100.0 +25/10/2020 02:06:39;U875.TC325_OP.F_CV;18.806873322;100.0 +25/10/2020 02:06:43;U875.TC325_OP.F_CV;18.806873322;100.0 +25/10/2020 02:06:44;U875.TC325_OP.F_CV;19.009836197;100.0 +25/10/2020 02:06:45;U875.TC325_OP.F_CV;19.110374451;100.0 +25/10/2020 02:06:50;U875.TC325_OP.F_CV;18.781843185;100.0 +25/10/2020 02:06:53;U875.TC325_OP.F_CV;18.942312241;100.0 +25/10/2020 02:06:57;U875.TC325_OP.F_CV;18.869398117;100.0 +25/10/2020 02:06:58;U875.TC325_OP.F_CV;18.785730362;100.0 +25/10/2020 02:06:28;U875.TC325_PV.F_CV;369.963317871;100.0 +25/10/2020 02:06:26;U875.TC325_SP.F_CV;370.000000000;100.0 +25/10/2020 02:06:03;U875.TC351_OP.F_CV;5.357121944;100.0 +25/10/2020 02:06:07;U875.TC351_OP.F_CV;5.677493572;100.0 +25/10/2020 02:06:09;U875.TC351_OP.F_CV;5.266981602;100.0 +25/10/2020 02:06:12;U875.TC351_OP.F_CV;4.954876423;100.0 +25/10/2020 02:06:15;U875.TC351_OP.F_CV;4.557913303;100.0 +25/10/2020 02:06:19;U875.TC351_OP.F_CV;4.838665009;100.0 +25/10/2020 02:06:23;U875.TC351_OP.F_CV;4.538294315;100.0 +25/10/2020 02:06:25;U875.TC351_OP.F_CV;4.905093670;100.0 +25/10/2020 02:06:26;U875.TC351_OP.F_CV;5.173843861;100.0 +25/10/2020 02:06:31;U875.TC351_OP.F_CV;5.473230362;100.0 +25/10/2020 02:06:34;U875.TC351_OP.F_CV;5.001094818;100.0 +25/10/2020 02:06:35;U875.TC351_OP.F_CV;4.948239803;100.0 +25/10/2020 02:06:39;U875.TC351_OP.F_CV;5.090215683;100.0 +25/10/2020 02:06:42;U875.TC351_OP.F_CV;5.485014915;100.0 +25/10/2020 02:06:44;U875.TC351_OP.F_CV;5.371929169;100.0 +25/10/2020 02:06:46;U875.TC351_OP.F_CV;4.938843250;100.0 +25/10/2020 02:06:47;U875.TC351_OP.F_CV;4.803614616;100.0 +25/10/2020 02:06:52;U875.TC351_OP.F_CV;5.102225304;100.0 +25/10/2020 02:06:57;U875.TC351_OP.F_CV;4.983714581;100.0 +25/10/2020 02:06:06;U875.TC351_PV.F_CV;79.622184753;100.0 +25/10/2020 02:06:13;U875.TC351_PV.F_CV;80.115463257;100.0 +25/10/2020 02:06:19;U875.TC351_PV.F_CV;80.014236450;100.0 +25/10/2020 02:06:21;U875.TC351_PV.F_CV;80.135986328;100.0 +25/10/2020 02:06:30;U875.TC351_PV.F_CV;79.726524353;100.0 +25/10/2020 02:06:33;U875.TC351_PV.F_CV;79.950599670;100.0 +25/10/2020 02:06:40;U875.TC351_PV.F_CV;79.767318726;100.0 +25/10/2020 02:06:45;U875.TC351_PV.F_CV;79.999702454;100.0 +25/10/2020 02:06:51;U875.TC351_PV.F_CV;79.917572021;100.0 +25/10/2020 02:06:57;U875.TC351_PV.F_CV;79.993148804;100.0 +25/10/2020 02:06:55;U875.TC351_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:00;U875.TC360_OP.F_CV;4.927545547;100.0 +25/10/2020 02:06:01;U875.TC360_OP.F_CV;5.605615616;100.0 +25/10/2020 02:06:03;U875.TC360_OP.F_CV;4.560689926;100.0 +25/10/2020 02:06:04;U875.TC360_OP.F_CV;4.143045902;100.0 +25/10/2020 02:06:05;U875.TC360_OP.F_CV;4.245089531;100.0 +25/10/2020 02:06:06;U875.TC360_OP.F_CV;4.486411572;100.0 +25/10/2020 02:06:10;U875.TC360_OP.F_CV;4.736151218;100.0 +25/10/2020 02:06:12;U875.TC360_OP.F_CV;5.216357231;100.0 +25/10/2020 02:06:13;U875.TC360_OP.F_CV;4.862724781;100.0 +25/10/2020 02:06:14;U875.TC360_OP.F_CV;4.692350864;100.0 +25/10/2020 02:06:15;U875.TC360_OP.F_CV;4.636573792;100.0 +25/10/2020 02:06:16;U875.TC360_OP.F_CV;4.169273376;100.0 +25/10/2020 02:06:17;U875.TC360_OP.F_CV;4.014737606;100.0 +25/10/2020 02:06:19;U875.TC360_OP.F_CV;4.500802994;100.0 +25/10/2020 02:06:20;U875.TC360_OP.F_CV;4.570382118;100.0 +25/10/2020 02:06:26;U875.TC360_OP.F_CV;4.570382118;100.0 +25/10/2020 02:06:27;U875.TC360_OP.F_CV;4.930158138;100.0 +25/10/2020 02:06:28;U875.TC360_OP.F_CV;5.161116600;100.0 +25/10/2020 02:06:29;U875.TC360_OP.F_CV;5.104733467;100.0 +25/10/2020 02:06:30;U875.TC360_OP.F_CV;4.771932125;100.0 +25/10/2020 02:06:31;U875.TC360_OP.F_CV;4.662848473;100.0 +25/10/2020 02:06:33;U875.TC360_OP.F_CV;5.143923283;100.0 +25/10/2020 02:06:34;U875.TC360_OP.F_CV;5.236028194;100.0 +25/10/2020 02:06:35;U875.TC360_OP.F_CV;4.818666935;100.0 +25/10/2020 02:06:36;U875.TC360_OP.F_CV;4.681979656;100.0 +25/10/2020 02:06:47;U875.TC360_OP.F_CV;4.622514725;100.0 +25/10/2020 02:06:48;U875.TC360_OP.F_CV;4.166471481;100.0 +25/10/2020 02:06:49;U875.TC360_OP.F_CV;4.017828941;100.0 +25/10/2020 02:06:51;U875.TC360_OP.F_CV;4.478186607;100.0 +25/10/2020 02:06:52;U875.TC360_OP.F_CV;4.566738605;100.0 +25/10/2020 02:06:55;U875.TC360_OP.F_CV;4.474826336;100.0 +25/10/2020 02:06:56;U875.TC360_OP.F_CV;4.116191387;100.0 +25/10/2020 02:06:57;U875.TC360_OP.F_CV;3.997167349;100.0 +25/10/2020 02:06:58;U875.TC360_OP.F_CV;4.608491421;100.0 +25/10/2020 02:06:59;U875.TC360_OP.F_CV;5.055602074;100.0 +25/10/2020 02:06:00;U875.TC360_PV.F_CV;79.877212524;100.0 +25/10/2020 02:06:03;U875.TC360_PV.F_CV;80.052383423;100.0 +25/10/2020 02:06:10;U875.TC360_PV.F_CV;79.932853699;100.0 +25/10/2020 02:06:15;U875.TC360_PV.F_CV;80.057365417;100.0 +25/10/2020 02:06:26;U875.TC360_PV.F_CV;79.964012146;100.0 +25/10/2020 02:06:47;U875.TC360_PV.F_CV;80.067222595;100.0 +25/10/2020 02:06:58;U875.TC360_PV.F_CV;79.932632446;100.0 +25/10/2020 02:06:15;U875.TC360_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:01;U875.TC365_OP.F_CV;20.683702469;100.0 +25/10/2020 02:06:20;U875.TC365_OP.F_CV;20.633399963;100.0 +25/10/2020 02:06:22;U875.TC365_OP.F_CV;20.699443817;100.0 +25/10/2020 02:06:28;U875.TC365_OP.F_CV;20.649372101;100.0 +25/10/2020 02:06:31;U875.TC365_OP.F_CV;20.702148438;100.0 +25/10/2020 02:06:33;U875.TC365_OP.F_CV;20.652040482;100.0 +25/10/2020 02:06:39;U875.TC365_OP.F_CV;20.702665329;100.0 +25/10/2020 02:06:41;U875.TC365_OP.F_CV;20.646915436;100.0 +25/10/2020 02:06:52;U875.TC365_OP.F_CV;20.700534821;100.0 +25/10/2020 02:06:59;U875.TC365_OP.F_CV;20.489471436;100.0 +25/10/2020 02:06:00;U875.TC365_PV.F_CV;90.062026978;100.0 +25/10/2020 02:06:55;U875.TC365_PV.F_CV;90.156913757;100.0 +25/10/2020 02:06:58;U875.TC365_PV.F_CV;90.272277832;100.0 +25/10/2020 02:06:07;U875.TC365_SP.F_CV;90.000000000;100.0 +25/10/2020 02:06:10;U875.TC403_OP.F_CV;57.602390289;100.0 +25/10/2020 02:06:16;U875.TC403_OP.F_CV;57.444652557;100.0 +25/10/2020 02:06:32;U875.TC403_OP.F_CV;57.569011688;100.0 +25/10/2020 02:06:35;U875.TC403_OP.F_CV;57.453929901;100.0 +25/10/2020 02:06:42;U875.TC403_OP.F_CV;57.515209198;100.0 +25/10/2020 02:06:51;U875.TC403_OP.F_CV;57.437976837;100.0 +25/10/2020 02:06:53;U875.TC403_OP.F_CV;57.521526337;100.0 +25/10/2020 02:06:56;U875.TC403_OP.F_CV;57.443553925;100.0 +25/10/2020 02:06:10;U875.TC403_PV.F_CV;99.822120667;100.0 +25/10/2020 02:06:15;U875.TC403_PV.F_CV;100.046211243;100.0 +25/10/2020 02:06:30;U875.TC403_PV.F_CV;99.908592224;100.0 +25/10/2020 02:06:34;U875.TC403_PV.F_CV;100.034561157;100.0 +25/10/2020 02:06:43;U875.TC403_PV.F_CV;99.907249451;100.0 +25/10/2020 02:06:50;U875.TC403_PV.F_CV;100.067321777;100.0 +25/10/2020 02:06:53;U875.TC403_PV.F_CV;99.920326233;100.0 +25/10/2020 02:06:55;U875.TC403_PV.F_CV;100.060241699;100.0 +25/10/2020 02:06:26;U875.TC403_SP.F_CV;100.000000000;100.0 +25/10/2020 02:06:06;U875.TC420_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TC420_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U875.TC420_OP.F_CV;28.686967850;100.0 +25/10/2020 02:06:04;U875.TC420_OP.F_CV;28.923229218;100.0 +25/10/2020 02:06:06;U875.TC420_OP.F_CV;28.696729660;100.0 +25/10/2020 02:06:07;U875.TC420_OP.F_CV;27.845031738;100.0 +25/10/2020 02:06:10;U875.TC420_OP.F_CV;28.709205627;100.0 +25/10/2020 02:06:14;U875.TC420_OP.F_CV;28.259630203;100.0 +25/10/2020 02:06:15;U875.TC420_OP.F_CV;27.631202698;100.0 +25/10/2020 02:06:19;U875.TC420_OP.F_CV;27.794851303;100.0 +25/10/2020 02:06:20;U875.TC420_OP.F_CV;28.475736618;100.0 +25/10/2020 02:06:22;U875.TC420_OP.F_CV;28.658983231;100.0 +25/10/2020 02:06:28;U875.TC420_OP.F_CV;28.360221863;100.0 +25/10/2020 02:06:29;U875.TC420_OP.F_CV;28.278715134;100.0 +25/10/2020 02:06:31;U875.TC420_OP.F_CV;28.496124268;100.0 +25/10/2020 02:06:38;U875.TC420_OP.F_CV;28.366230011;100.0 +25/10/2020 02:06:39;U875.TC420_OP.F_CV;27.853475571;100.0 +25/10/2020 02:06:42;U875.TC420_OP.F_CV;28.279176712;100.0 +25/10/2020 02:06:44;U875.TC420_OP.F_CV;28.934906006;100.0 +25/10/2020 02:06:46;U875.TC420_OP.F_CV;28.761732101;100.0 +25/10/2020 02:06:47;U875.TC420_OP.F_CV;28.514528275;100.0 +25/10/2020 02:06:50;U875.TC420_OP.F_CV;28.298807144;100.0 +25/10/2020 02:06:51;U875.TC420_OP.F_CV;28.392835617;100.0 +25/10/2020 02:06:52;U875.TC420_OP.F_CV;28.735219955;100.0 +25/10/2020 02:06:57;U875.TC420_OP.F_CV;27.646003723;100.0 +25/10/2020 02:06:59;U875.TC420_OP.F_CV;28.004829407;100.0 +25/10/2020 02:06:07;U875.TC420_PV.F_CV;299.925201416;100.0 +25/10/2020 02:06:18;U875.TC420_PV.F_CV;300.145751953;100.0 +25/10/2020 02:06:34;U875.TC420_PV.F_CV;299.921051025;100.0 +25/10/2020 02:06:47;U875.TC420_SP.F_CV;300.000000000;100.0 +25/10/2020 02:06:06;U875.TC421_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TC421_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U875.TC421_OP.F_CV;18.672283173;100.0 +25/10/2020 02:06:01;U875.TC421_OP.F_CV;18.901371002;100.0 +25/10/2020 02:06:02;U875.TC421_OP.F_CV;19.751199722;100.0 +25/10/2020 02:06:05;U875.TC421_OP.F_CV;19.979152679;100.0 +25/10/2020 02:06:07;U875.TC421_OP.F_CV;19.769470215;100.0 +25/10/2020 02:06:11;U875.TC421_OP.F_CV;19.769470215;100.0 +25/10/2020 02:06:12;U875.TC421_OP.F_CV;19.421194077;100.0 +25/10/2020 02:06:14;U875.TC421_OP.F_CV;19.241436005;100.0 +25/10/2020 02:06:15;U875.TC421_OP.F_CV;18.897356033;100.0 +25/10/2020 02:06:18;U875.TC421_OP.F_CV;19.538526535;100.0 +25/10/2020 02:06:22;U875.TC421_OP.F_CV;19.632381439;100.0 +25/10/2020 02:06:23;U875.TC421_OP.F_CV;19.759548187;100.0 +25/10/2020 02:06:26;U875.TC421_OP.F_CV;19.585645676;100.0 +25/10/2020 02:06:32;U875.TC421_OP.F_CV;19.989917755;100.0 +25/10/2020 02:06:34;U875.TC421_OP.F_CV;19.560508728;100.0 +25/10/2020 02:06:44;U875.TC421_OP.F_CV;19.694049835;100.0 +25/10/2020 02:06:45;U875.TC421_OP.F_CV;19.777410507;100.0 +25/10/2020 02:06:49;U875.TC421_OP.F_CV;19.777410507;100.0 +25/10/2020 02:06:50;U875.TC421_OP.F_CV;19.347978592;100.0 +25/10/2020 02:06:52;U875.TC421_OP.F_CV;19.521074295;100.0 +25/10/2020 02:06:56;U875.TC421_OP.F_CV;19.521074295;100.0 +25/10/2020 02:06:57;U875.TC421_OP.F_CV;19.833856583;100.0 +25/10/2020 02:06:58;U875.TC421_OP.F_CV;20.000728607;100.0 +25/10/2020 02:06:00;U875.TC421_PV.F_CV;320.165557861;100.0 +25/10/2020 02:06:07;U875.TC421_PV.F_CV;319.937316895;100.0 +25/10/2020 02:06:20;U875.TC421_SP.F_CV;320.000000000;100.0 +25/10/2020 02:06:01;U875.TC422_OP.F_CV;33.898689270;100.0 +25/10/2020 02:06:02;U875.TC422_OP.F_CV;33.807380676;100.0 +25/10/2020 02:06:06;U875.TC422_OP.F_CV;34.003932953;100.0 +25/10/2020 02:06:07;U875.TC422_OP.F_CV;34.130187988;100.0 +25/10/2020 02:06:10;U875.TC422_OP.F_CV;33.977931976;100.0 +25/10/2020 02:06:12;U875.TC422_OP.F_CV;34.299419403;100.0 +25/10/2020 02:06:17;U875.TC422_OP.F_CV;34.025333405;100.0 +25/10/2020 02:06:20;U875.TC422_OP.F_CV;33.838138580;100.0 +25/10/2020 02:06:23;U875.TC422_OP.F_CV;33.997531891;100.0 +25/10/2020 02:06:26;U875.TC422_OP.F_CV;33.520889282;100.0 +25/10/2020 02:06:29;U875.TC422_OP.F_CV;33.671630859;100.0 +25/10/2020 02:06:31;U875.TC422_OP.F_CV;34.059734344;100.0 +25/10/2020 02:06:32;U875.TC422_OP.F_CV;34.150432587;100.0 +25/10/2020 02:06:36;U875.TC422_OP.F_CV;33.862602234;100.0 +25/10/2020 02:06:37;U875.TC422_OP.F_CV;33.682487488;100.0 +25/10/2020 02:06:40;U875.TC422_OP.F_CV;33.354938507;100.0 +25/10/2020 02:06:41;U875.TC422_OP.F_CV;33.849224091;100.0 +25/10/2020 02:06:42;U875.TC422_OP.F_CV;34.150012970;100.0 +25/10/2020 02:06:44;U875.TC422_OP.F_CV;33.634586334;100.0 +25/10/2020 02:06:45;U875.TC422_OP.F_CV;33.515102386;100.0 +25/10/2020 02:06:50;U875.TC422_OP.F_CV;33.340496063;100.0 +25/10/2020 02:06:53;U875.TC422_OP.F_CV;33.490379333;100.0 +25/10/2020 02:06:55;U875.TC422_OP.F_CV;34.127658844;100.0 +25/10/2020 02:06:59;U875.TC422_OP.F_CV;34.073444366;100.0 +25/10/2020 02:06:30;U875.TC422_PV.F_CV;370.016693115;100.0 +25/10/2020 02:06:29;U875.TC422_SP.F_CV;370.000000000;100.0 +25/10/2020 02:06:13;U875.TC423_OP.F_CV;25.617038727;100.0 +25/10/2020 02:06:15;U875.TC423_OP.F_CV;25.462284088;100.0 +25/10/2020 02:06:20;U875.TC423_OP.F_CV;25.337186813;100.0 +25/10/2020 02:06:27;U875.TC423_OP.F_CV;25.467132568;100.0 +25/10/2020 02:06:32;U875.TC423_OP.F_CV;25.149450302;100.0 +25/10/2020 02:06:36;U875.TC423_OP.F_CV;25.340333939;100.0 +25/10/2020 02:06:37;U875.TC423_OP.F_CV;25.465566635;100.0 +25/10/2020 02:06:47;U875.TC423_OP.F_CV;25.348426819;100.0 +25/10/2020 02:06:50;U875.TC423_OP.F_CV;25.478824615;100.0 +25/10/2020 02:06:58;U875.TC423_OP.F_CV;25.327724457;100.0 +25/10/2020 02:06:12;U875.TC423_PV.F_CV;369.874816895;100.0 +25/10/2020 02:06:29;U875.TC423_SP.F_CV;370.000000000;100.0 +25/10/2020 02:06:23;U875.TC424_OP.F_CV;23.517650604;100.0 +25/10/2020 02:06:27;U875.TC424_OP.F_CV;23.361185074;100.0 +25/10/2020 02:06:35;U875.TC424_OP.F_CV;23.520067215;100.0 +25/10/2020 02:06:42;U875.TC424_OP.F_CV;23.428714752;100.0 +25/10/2020 02:06:45;U875.TC424_OP.F_CV;23.528089523;100.0 +25/10/2020 02:06:49;U875.TC424_OP.F_CV;23.370485306;100.0 +25/10/2020 02:06:50;U875.TC424_OP.F_CV;23.529897690;100.0 +25/10/2020 02:06:53;U875.TC424_OP.F_CV;23.372985840;100.0 +25/10/2020 02:06:56;U875.TC424_OP.F_CV;23.693872452;100.0 +25/10/2020 02:06:57;U875.TC424_OP.F_CV;23.627000809;100.0 +25/10/2020 02:06:58;U875.TC424_OP.F_CV;23.379276276;100.0 +25/10/2020 02:06:47;U875.TC424_PV.F_CV;369.961791992;100.0 +25/10/2020 02:06:29;U875.TC424_SP.F_CV;370.000000000;100.0 +25/10/2020 02:06:05;U875.TC425_OP.F_CV;24.478612900;100.0 +25/10/2020 02:06:07;U875.TC425_OP.F_CV;24.562564850;100.0 +25/10/2020 02:06:08;U875.TC425_OP.F_CV;24.804887772;100.0 +25/10/2020 02:06:13;U875.TC425_OP.F_CV;24.669498444;100.0 +25/10/2020 02:06:17;U875.TC425_OP.F_CV;24.731943130;100.0 +25/10/2020 02:06:19;U875.TC425_OP.F_CV;24.862724304;100.0 +25/10/2020 02:06:23;U875.TC425_OP.F_CV;24.700033188;100.0 +25/10/2020 02:06:29;U875.TC425_OP.F_CV;24.808055878;100.0 +25/10/2020 02:06:30;U875.TC425_OP.F_CV;24.902017593;100.0 +25/10/2020 02:06:44;U875.TC425_OP.F_CV;25.015174866;100.0 +25/10/2020 02:06:45;U875.TC425_OP.F_CV;24.907814026;100.0 +25/10/2020 02:06:49;U875.TC425_OP.F_CV;25.078458786;100.0 +25/10/2020 02:06:50;U875.TC425_OP.F_CV;25.000936508;100.0 +25/10/2020 02:06:55;U875.TC425_OP.F_CV;25.145421982;100.0 +25/10/2020 02:06:56;U875.TC425_OP.F_CV;25.314725876;100.0 +25/10/2020 02:06:58;U875.TC425_OP.F_CV;25.067317963;100.0 +25/10/2020 02:06:25;U875.TC425_PV.F_CV;368.178131104;100.0 +25/10/2020 02:06:55;U875.TC425_SP.F_CV;370.000000000;100.0 +25/10/2020 02:06:00;U875.TC501_OP.F_CV;11.134344101;100.0 +25/10/2020 02:06:04;U875.TC501_OP.F_CV;11.263969421;100.0 +25/10/2020 02:06:07;U875.TC501_OP.F_CV;11.187314034;100.0 +25/10/2020 02:06:09;U875.TC501_OP.F_CV;11.262032509;100.0 +25/10/2020 02:06:13;U875.TC501_OP.F_CV;11.107520103;100.0 +25/10/2020 02:06:16;U875.TC501_OP.F_CV;11.245649338;100.0 +25/10/2020 02:06:25;U875.TC501_OP.F_CV;11.175433159;100.0 +25/10/2020 02:06:27;U875.TC501_OP.F_CV;11.268903732;100.0 +25/10/2020 02:06:32;U875.TC501_OP.F_CV;11.145046234;100.0 +25/10/2020 02:06:34;U875.TC501_OP.F_CV;11.227344513;100.0 +25/10/2020 02:06:37;U875.TC501_OP.F_CV;11.155673981;100.0 +25/10/2020 02:06:44;U875.TC501_OP.F_CV;11.348999023;100.0 +25/10/2020 02:06:47;U875.TC501_OP.F_CV;11.205088615;100.0 +25/10/2020 02:06:50;U875.TC501_OP.F_CV;11.314051628;100.0 +25/10/2020 02:06:54;U875.TC501_OP.F_CV;11.263638496;100.0 +25/10/2020 02:06:46;U875.TC501_PV.F_CV;89.991539001;100.0 +25/10/2020 02:06:06;U875.TC501_SP.F_CV;90.000000000;100.0 +25/10/2020 02:06:00;U875.TC502_OP.F_CV;31.279100418;100.0 +25/10/2020 02:06:01;U875.TC502_OP.F_CV;31.087358475;100.0 +25/10/2020 02:06:02;U875.TC502_OP.F_CV;31.024547577;100.0 +25/10/2020 02:06:10;U875.TC502_OP.F_CV;31.024547577;100.0 +25/10/2020 02:06:11;U875.TC502_OP.F_CV;30.545082092;100.0 +25/10/2020 02:06:13;U875.TC502_OP.F_CV;30.346271515;100.0 +25/10/2020 02:06:17;U875.TC502_OP.F_CV;30.893703461;100.0 +25/10/2020 02:06:18;U875.TC502_OP.F_CV;30.953512192;100.0 +25/10/2020 02:06:24;U875.TC502_OP.F_CV;30.953512192;100.0 +25/10/2020 02:06:25;U875.TC502_OP.F_CV;31.431495667;100.0 +25/10/2020 02:06:26;U875.TC502_OP.F_CV;31.580141068;100.0 +25/10/2020 02:06:28;U875.TC502_OP.F_CV;32.176795959;100.0 +25/10/2020 02:06:29;U875.TC502_OP.F_CV;32.280097961;100.0 +25/10/2020 02:06:30;U875.TC502_OP.F_CV;31.134128571;100.0 +25/10/2020 02:06:31;U875.TC502_OP.F_CV;30.593597412;100.0 +25/10/2020 02:06:32;U875.TC502_OP.F_CV;30.815670013;100.0 +25/10/2020 02:06:33;U875.TC502_OP.F_CV;31.834449768;100.0 +25/10/2020 02:06:34;U875.TC502_OP.F_CV;32.171237946;100.0 +25/10/2020 02:06:35;U875.TC502_OP.F_CV;32.284572601;100.0 +25/10/2020 02:06:37;U875.TC502_OP.F_CV;32.340915680;100.0 +25/10/2020 02:06:40;U875.TC502_OP.F_CV;31.878919601;100.0 +25/10/2020 02:06:41;U875.TC502_OP.F_CV;31.307270050;100.0 +25/10/2020 02:06:42;U875.TC502_OP.F_CV;31.119937897;100.0 +25/10/2020 02:06:45;U875.TC502_OP.F_CV;30.898334503;100.0 +25/10/2020 02:06:46;U875.TC502_OP.F_CV;30.536581039;100.0 +25/10/2020 02:06:47;U875.TC502_OP.F_CV;30.416532516;100.0 +25/10/2020 02:06:48;U875.TC502_OP.F_CV;31.679233551;100.0 +25/10/2020 02:06:49;U875.TC502_OP.F_CV;32.588111877;100.0 +25/10/2020 02:06:50;U875.TC502_OP.F_CV;32.890472412;100.0 +25/10/2020 02:06:51;U875.TC502_OP.F_CV;31.198198318;100.0 +25/10/2020 02:06:52;U875.TC502_OP.F_CV;30.642118454;100.0 +25/10/2020 02:06:53;U875.TC502_OP.F_CV;30.698839188;100.0 +25/10/2020 02:06:54;U875.TC502_OP.F_CV;30.925218582;100.0 +25/10/2020 02:06:55;U875.TC502_OP.F_CV;30.999437332;100.0 +25/10/2020 02:06:56;U875.TC502_OP.F_CV;31.472633362;100.0 +25/10/2020 02:06:57;U875.TC502_OP.F_CV;31.629337311;100.0 +25/10/2020 02:06:58;U875.TC502_OP.F_CV;31.548543930;100.0 +25/10/2020 02:06:59;U875.TC502_OP.F_CV;31.207719803;100.0 +25/10/2020 02:06:09;U875.TC502_PV.F_CV;90.035987854;100.0 +25/10/2020 02:06:26;U875.TC502_PV.F_CV;89.834571838;100.0 +25/10/2020 02:06:29;U875.TC502_PV.F_CV;90.038307190;100.0 +25/10/2020 02:06:32;U875.TC502_PV.F_CV;89.838104248;100.0 +25/10/2020 02:06:44;U875.TC502_PV.F_CV;90.058792114;100.0 +25/10/2020 02:06:47;U875.TC502_PV.F_CV;89.803405762;100.0 +25/10/2020 02:06:50;U875.TC502_PV.F_CV;90.036529541;100.0 +25/10/2020 02:06:55;U875.TC502_PV.F_CV;89.922119141;100.0 +25/10/2020 02:06:23;U875.TC502_SP.F_CV;90.000000000;100.0 +25/10/2020 02:06:00;U875.TC503_OP.F_CV;4.268141747;100.0 +25/10/2020 02:06:01;U875.TC503_OP.F_CV;3.998569489;100.0 +25/10/2020 02:06:02;U875.TC503_OP.F_CV;3.910245895;100.0 +25/10/2020 02:06:10;U875.TC503_OP.F_CV;3.910245895;100.0 +25/10/2020 02:06:12;U875.TC503_OP.F_CV;4.424063683;100.0 +25/10/2020 02:06:13;U875.TC503_OP.F_CV;4.501225948;100.0 +25/10/2020 02:06:16;U875.TC503_OP.F_CV;4.302717686;100.0 +25/10/2020 02:06:17;U875.TC503_OP.F_CV;4.017671108;100.0 +25/10/2020 02:06:18;U875.TC503_OP.F_CV;3.924290657;100.0 +25/10/2020 02:06:34;U875.TC503_OP.F_CV;3.924290657;100.0 +25/10/2020 02:06:35;U875.TC503_OP.F_CV;4.145911694;100.0 +25/10/2020 02:06:36;U875.TC503_OP.F_CV;4.865120888;100.0 +25/10/2020 02:06:37;U875.TC503_OP.F_CV;5.103777409;100.0 +25/10/2020 02:06:38;U875.TC503_OP.F_CV;4.533229828;100.0 +25/10/2020 02:06:39;U875.TC503_OP.F_CV;4.100888252;100.0 +25/10/2020 02:06:40;U875.TC503_OP.F_CV;3.959258318;100.0 +25/10/2020 02:06:42;U875.TC503_OP.F_CV;3.897625923;100.0 +25/10/2020 02:06:48;U875.TC503_OP.F_CV;4.023757935;100.0 +25/10/2020 02:06:49;U875.TC503_OP.F_CV;4.383381844;100.0 +25/10/2020 02:06:50;U875.TC503_OP.F_CV;4.502710342;100.0 +25/10/2020 02:06:52;U875.TC503_OP.F_CV;4.001285076;100.0 +25/10/2020 02:06:53;U875.TC503_OP.F_CV;3.930451155;100.0 +25/10/2020 02:06:00;U875.TC503_PV.F_CV;49.969108582;100.0 +25/10/2020 02:06:34;U875.TC503_PV.F_CV;49.881916046;100.0 +25/10/2020 02:06:06;U875.TC503_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:00;U875.TC510_PV.F_CV;80.584388733;100.0 +25/10/2020 02:06:04;U875.TC510_PV.F_CV;80.328872681;100.0 +25/10/2020 02:06:22;U875.TC510_PV.F_CV;80.027717590;100.0 +25/10/2020 02:06:30;U875.TC510_PV.F_CV;79.665092468;100.0 +25/10/2020 02:06:36;U875.TC510_PV.F_CV;79.870986938;100.0 +25/10/2020 02:06:41;U875.TC510_PV.F_CV;79.765426636;100.0 +25/10/2020 02:06:45;U875.TC510_PV.F_CV;79.511749268;100.0 +25/10/2020 02:06:46;U875.TC510_PV.F_CV;79.621925354;100.0 +25/10/2020 02:06:51;U875.TC510_PV.F_CV;79.407318115;100.0 +25/10/2020 02:06:54;U875.TC510_PV.F_CV;79.141883850;100.0 +25/10/2020 02:06:00;U875.TC520_OP.F_CV;28.538185120;100.0 +25/10/2020 02:06:01;U875.TC520_OP.F_CV;28.966344833;100.0 +25/10/2020 02:06:05;U875.TC520_OP.F_CV;28.555093765;100.0 +25/10/2020 02:06:08;U875.TC520_OP.F_CV;28.500446320;100.0 +25/10/2020 02:06:09;U875.TC520_OP.F_CV;28.048070908;100.0 +25/10/2020 02:06:10;U875.TC520_OP.F_CV;27.896902084;100.0 +25/10/2020 02:06:12;U875.TC520_OP.F_CV;28.352699280;100.0 +25/10/2020 02:06:16;U875.TC520_OP.F_CV;28.607505798;100.0 +25/10/2020 02:06:17;U875.TC520_OP.F_CV;28.965898514;100.0 +25/10/2020 02:06:18;U875.TC520_OP.F_CV;29.083307266;100.0 +25/10/2020 02:06:19;U875.TC520_OP.F_CV;28.144168854;100.0 +25/10/2020 02:06:20;U875.TC520_OP.F_CV;27.463876724;100.0 +25/10/2020 02:06:21;U875.TC520_OP.F_CV;27.236532211;100.0 +25/10/2020 02:06:22;U875.TC520_OP.F_CV;28.504432678;100.0 +25/10/2020 02:06:23;U875.TC520_OP.F_CV;28.919895172;100.0 +25/10/2020 02:06:26;U875.TC520_OP.F_CV;29.657466888;100.0 +25/10/2020 02:06:27;U875.TC520_OP.F_CV;29.749229431;100.0 +25/10/2020 02:06:28;U875.TC520_OP.F_CV;28.433959961;100.0 +25/10/2020 02:06:29;U875.TC520_OP.F_CV;28.000026703;100.0 +25/10/2020 02:06:30;U875.TC520_OP.F_CV;28.335592270;100.0 +25/10/2020 02:06:31;U875.TC520_OP.F_CV;28.861314774;100.0 +25/10/2020 02:06:32;U875.TC520_OP.F_CV;29.033552170;100.0 +25/10/2020 02:06:33;U875.TC520_OP.F_CV;28.112358093;100.0 +25/10/2020 02:06:34;U875.TC520_OP.F_CV;27.437997818;100.0 +25/10/2020 02:06:35;U875.TC520_OP.F_CV;27.212516785;100.0 +25/10/2020 02:06:36;U875.TC520_OP.F_CV;27.134218216;100.0 +25/10/2020 02:06:38;U875.TC520_OP.F_CV;27.810853958;100.0 +25/10/2020 02:06:39;U875.TC520_OP.F_CV;28.666107178;100.0 +25/10/2020 02:06:40;U875.TC520_OP.F_CV;28.946325302;100.0 +25/10/2020 02:06:41;U875.TC520_OP.F_CV;28.589210510;100.0 +25/10/2020 02:06:42;U875.TC520_OP.F_CV;28.470680237;100.0 +25/10/2020 02:06:44;U875.TC520_OP.F_CV;27.887140274;100.0 +25/10/2020 02:06:45;U875.TC520_OP.F_CV;27.784904480;100.0 +25/10/2020 02:06:46;U875.TC520_OP.F_CV;28.142625809;100.0 +25/10/2020 02:06:48;U875.TC520_OP.F_CV;28.500768661;100.0 +25/10/2020 02:06:49;U875.TC520_OP.F_CV;28.876686096;100.0 +25/10/2020 02:06:50;U875.TC520_OP.F_CV;28.999837875;100.0 +25/10/2020 02:06:52;U875.TC520_OP.F_CV;29.053485870;100.0 +25/10/2020 02:06:55;U875.TC520_OP.F_CV;28.462106705;100.0 +25/10/2020 02:06:56;U875.TC520_OP.F_CV;28.412015915;100.0 +25/10/2020 02:06:00;U875.TC520_PV.F_CV;70.049057007;100.0 +25/10/2020 02:06:07;U875.TC520_PV.F_CV;70.135833740;100.0 +25/10/2020 02:06:15;U875.TC520_PV.F_CV;70.051345825;100.0 +25/10/2020 02:06:18;U875.TC520_PV.F_CV;70.222808838;100.0 +25/10/2020 02:06:23;U875.TC520_PV.F_CV;69.931327820;100.0 +25/10/2020 02:06:27;U875.TC520_PV.F_CV;70.150764465;100.0 +25/10/2020 02:06:29;U875.TC520_PV.F_CV;70.060249329;100.0 +25/10/2020 02:06:36;U875.TC520_PV.F_CV;70.299118042;100.0 +25/10/2020 02:06:37;U875.TC520_PV.F_CV;70.098014832;100.0 +25/10/2020 02:06:43;U875.TC520_PV.F_CV;70.188789368;100.0 +25/10/2020 02:06:48;U875.TC520_PV.F_CV;70.014114380;100.0 +25/10/2020 02:06:58;U875.TC520_PV.F_CV;70.173706055;100.0 +25/10/2020 02:06:06;U875.TC520_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:24;U875.TC525_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:06;U875.TC525_PV.F_CV;78.681938171;100.0 +25/10/2020 02:06:10;U875.TC525_PV.F_CV;78.783767700;100.0 +25/10/2020 02:06:13;U875.TC525_PV.F_CV;78.704925537;100.0 +25/10/2020 02:06:14;U875.TC525_PV.F_CV;78.970542908;100.0 +25/10/2020 02:06:15;U875.TC525_PV.F_CV;79.057579041;100.0 +25/10/2020 02:06:17;U875.TC525_PV.F_CV;78.846694946;100.0 +25/10/2020 02:06:19;U875.TC525_PV.F_CV;78.939483643;100.0 +25/10/2020 02:06:22;U875.TC525_PV.F_CV;78.839813232;100.0 +25/10/2020 02:06:33;U875.TC525_PV.F_CV;79.063636780;100.0 +25/10/2020 02:06:41;U875.TC525_PV.F_CV;78.878639221;100.0 +25/10/2020 02:06:44;U875.TC525_PV.F_CV;79.052429199;100.0 +25/10/2020 02:06:47;U875.TC525_PV.F_CV;78.741271973;100.0 +25/10/2020 02:06:49;U875.TC525_PV.F_CV;79.020545959;100.0 +25/10/2020 02:06:06;U875.TC525_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:00;U875.TC527_OP.F_CV;17.407400131;100.0 +25/10/2020 02:06:11;U875.TC527_OP.F_CV;17.461761475;100.0 +25/10/2020 02:06:19;U875.TC527_OP.F_CV;17.333089828;100.0 +25/10/2020 02:06:22;U875.TC527_OP.F_CV;17.413084030;100.0 +25/10/2020 02:06:25;U875.TC527_OP.F_CV;17.330476761;100.0 +25/10/2020 02:06:38;U875.TC527_OP.F_CV;17.401826859;100.0 +25/10/2020 02:06:41;U875.TC527_OP.F_CV;17.499120712;100.0 +25/10/2020 02:06:44;U875.TC527_OP.F_CV;17.395305634;100.0 +25/10/2020 02:06:56;U875.TC527_OP.F_CV;17.501363754;100.0 +25/10/2020 02:06:57;U875.TC527_OP.F_CV;17.575037003;100.0 +25/10/2020 02:06:06;U875.TC527_PV.F_CV;70.093467712;100.0 +25/10/2020 02:06:10;U875.TC527_PV.F_CV;69.952354431;100.0 +25/10/2020 02:06:18;U875.TC527_PV.F_CV;70.167266846;100.0 +25/10/2020 02:06:20;U875.TC527_PV.F_CV;70.062026978;100.0 +25/10/2020 02:06:23;U875.TC527_PV.F_CV;70.168624878;100.0 +25/10/2020 02:06:36;U875.TC527_PV.F_CV;70.080223083;100.0 +25/10/2020 02:06:39;U875.TC527_PV.F_CV;69.954025269;100.0 +25/10/2020 02:06:42;U875.TC527_PV.F_CV;70.036361694;100.0 +25/10/2020 02:06:55;U875.TC527_PV.F_CV;69.884056091;100.0 +25/10/2020 02:06:58;U875.TC527_PV.F_CV;70.098098755;100.0 +25/10/2020 02:06:02;U875.TC527_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U875.TC528_OP.F_CV;25.056207657;100.0 +25/10/2020 02:06:02;U875.TC528_OP.F_CV;24.832139969;100.0 +25/10/2020 02:06:04;U875.TC528_OP.F_CV;24.747035980;100.0 +25/10/2020 02:06:08;U875.TC528_OP.F_CV;24.860687256;100.0 +25/10/2020 02:06:15;U875.TC528_OP.F_CV;24.806346893;100.0 +25/10/2020 02:06:21;U875.TC528_OP.F_CV;24.955150604;100.0 +25/10/2020 02:06:25;U875.TC528_OP.F_CV;24.848823547;100.0 +25/10/2020 02:06:46;U875.TC528_OP.F_CV;24.958204269;100.0 +25/10/2020 02:06:49;U875.TC528_OP.F_CV;24.831258774;100.0 +25/10/2020 02:06:51;U875.TC528_OP.F_CV;24.928487778;100.0 +25/10/2020 02:06:59;U875.TC528_OP.F_CV;25.022743225;100.0 +25/10/2020 02:06:02;U875.TC528_PV.F_CV;80.235656738;100.0 +25/10/2020 02:06:20;U875.TC528_PV.F_CV;80.022117615;100.0 +25/10/2020 02:06:22;U875.TC528_PV.F_CV;80.120452881;100.0 +25/10/2020 02:06:45;U875.TC528_PV.F_CV;80.016784668;100.0 +25/10/2020 02:06:47;U875.TC528_PV.F_CV;80.136260986;100.0 +25/10/2020 02:06:58;U875.TC528_PV.F_CV;79.941886902;100.0 +25/10/2020 02:06:47;U875.TC528_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:38;U875.TC529_OP.F_CV;20.508134842;100.0 +25/10/2020 02:06:00;U875.TC529_PV.F_CV;79.826263428;100.0 +25/10/2020 02:06:05;U875.TC529_PV.F_CV;80.077308655;100.0 +25/10/2020 02:06:09;U875.TC529_PV.F_CV;79.967254639;100.0 +25/10/2020 02:06:15;U875.TC529_PV.F_CV;80.047653198;100.0 +25/10/2020 02:06:20;U875.TC529_PV.F_CV;79.927497864;100.0 +25/10/2020 02:06:30;U875.TC529_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:21;U875.TC530_OP.F_CV;30.340881348;100.0 +25/10/2020 02:06:29;U875.TC530_OP.F_CV;30.231672287;100.0 +25/10/2020 02:06:30;U875.TC530_OP.F_CV;30.145212173;100.0 +25/10/2020 02:06:33;U875.TC530_OP.F_CV;30.320316315;100.0 +25/10/2020 02:06:36;U875.TC530_OP.F_CV;30.260580063;100.0 +25/10/2020 02:06:42;U875.TC530_OP.F_CV;30.322435379;100.0 +25/10/2020 02:06:48;U875.TC530_OP.F_CV;30.196405411;100.0 +25/10/2020 02:06:51;U875.TC530_OP.F_CV;30.323802948;100.0 +25/10/2020 02:06:56;U875.TC530_OP.F_CV;30.189001083;100.0 +25/10/2020 02:06:01;U875.TC530_PV.F_CV;80.149009705;100.0 +25/10/2020 02:06:04;U875.TC530_PV.F_CV;79.960670471;100.0 +25/10/2020 02:06:27;U875.TC530_PV.F_CV;79.832778931;100.0 +25/10/2020 02:06:28;U875.TC530_PV.F_CV;80.168869019;100.0 +25/10/2020 02:06:29;U875.TC530_PV.F_CV;80.257034302;100.0 +25/10/2020 02:06:31;U875.TC530_PV.F_CV;79.900245667;100.0 +25/10/2020 02:06:34;U875.TC530_PV.F_CV;79.976684570;100.0 +25/10/2020 02:06:42;U875.TC530_PV.F_CV;79.810768127;100.0 +25/10/2020 02:06:45;U875.TC530_PV.F_CV;79.893508911;100.0 +25/10/2020 02:06:47;U875.TC530_PV.F_CV;80.159027100;100.0 +25/10/2020 02:06:49;U875.TC530_PV.F_CV;79.900459290;100.0 +25/10/2020 02:06:55;U875.TC530_PV.F_CV;80.159149170;100.0 +25/10/2020 02:06:57;U875.TC530_PV.F_CV;79.974258423;100.0 +25/10/2020 02:06:06;U875.TC530_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:06;U875.TC532_OP.F_CV;19.042926788;100.0 +25/10/2020 02:06:10;U875.TC532_OP.F_CV;18.905653000;100.0 +25/10/2020 02:06:14;U875.TC532_OP.F_CV;18.961862564;100.0 +25/10/2020 02:06:15;U875.TC532_OP.F_CV;18.908790588;100.0 +25/10/2020 02:06:22;U875.TC532_OP.F_CV;19.042591095;100.0 +25/10/2020 02:06:31;U875.TC532_OP.F_CV;18.907638550;100.0 +25/10/2020 02:06:32;U875.TC532_OP.F_CV;18.835809708;100.0 +25/10/2020 02:06:35;U875.TC532_OP.F_CV;19.018514633;100.0 +25/10/2020 02:06:37;U875.TC532_OP.F_CV;18.924600601;100.0 +25/10/2020 02:06:45;U875.TC532_OP.F_CV;19.017400742;100.0 +25/10/2020 02:06:56;U875.TC532_OP.F_CV;18.829133987;100.0 +25/10/2020 02:06:03;U875.TC532_PV.F_CV;69.843200684;100.0 +25/10/2020 02:06:08;U875.TC532_PV.F_CV;69.946151733;100.0 +25/10/2020 02:06:19;U875.TC532_PV.F_CV;69.841888428;100.0 +25/10/2020 02:06:30;U875.TC532_PV.F_CV;70.034362793;100.0 +25/10/2020 02:06:33;U875.TC532_PV.F_CV;69.860610962;100.0 +25/10/2020 02:06:36;U875.TC532_PV.F_CV;69.975288391;100.0 +25/10/2020 02:06:43;U875.TC532_PV.F_CV;69.863822937;100.0 +25/10/2020 02:06:54;U875.TC532_PV.F_CV;70.038169861;100.0 +25/10/2020 02:06:59;U875.TC532_PV.F_CV;69.823623657;100.0 +25/10/2020 02:06:47;U875.TC532_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:08;U875.TI1103_PV.F_CV;99.842010498;100.0 +25/10/2020 02:06:02;U875.TI1111_PV.F_CV;106.547630310;100.0 +25/10/2020 02:06:08;U875.TI1111_PV.F_CV;106.659011841;100.0 +25/10/2020 02:06:12;U875.TI1111_PV.F_CV;106.326660156;100.0 +25/10/2020 02:06:13;U875.TI1111_PV.F_CV;106.107040405;100.0 +25/10/2020 02:06:15;U875.TI1111_PV.F_CV;106.011489868;100.0 +25/10/2020 02:06:19;U875.TI1111_PV.F_CV;106.457176208;100.0 +25/10/2020 02:06:21;U875.TI1111_PV.F_CV;106.328956604;100.0 +25/10/2020 02:06:23;U875.TI1111_PV.F_CV;106.504798889;100.0 +25/10/2020 02:06:30;U875.TI1111_PV.F_CV;106.760360718;100.0 +25/10/2020 02:06:31;U875.TI1111_PV.F_CV;106.627006531;100.0 +25/10/2020 02:06:32;U875.TI1111_PV.F_CV;106.205459595;100.0 +25/10/2020 02:06:33;U875.TI1111_PV.F_CV;106.067321777;100.0 +25/10/2020 02:06:37;U875.TI1111_PV.F_CV;106.264404297;100.0 +25/10/2020 02:06:40;U875.TI1111_PV.F_CV;106.061660767;100.0 +25/10/2020 02:06:44;U875.TI1111_PV.F_CV;106.662223816;100.0 +25/10/2020 02:06:47;U875.TI1111_PV.F_CV;106.747741699;100.0 +25/10/2020 02:06:52;U875.TI1111_PV.F_CV;106.184913635;100.0 +25/10/2020 02:06:56;U875.TI1111_PV.F_CV;106.014396667;100.0 +25/10/2020 02:06:00;U875.TI1112_PV.F_CV;81.410133362;100.0 +25/10/2020 02:06:01;U875.TI1112_PV.F_CV;81.537780762;100.0 +25/10/2020 02:06:05;U875.TI1112_PV.F_CV;81.439758301;100.0 +25/10/2020 02:06:12;U875.TI1112_PV.F_CV;81.518096924;100.0 +25/10/2020 02:06:18;U875.TI1112_PV.F_CV;81.318519592;100.0 +25/10/2020 02:06:22;U875.TI1112_PV.F_CV;81.408210754;100.0 +25/10/2020 02:06:28;U875.TI1112_PV.F_CV;81.790481567;100.0 +25/10/2020 02:06:32;U875.TI1112_PV.F_CV;81.883117676;100.0 +25/10/2020 02:06:35;U875.TI1112_PV.F_CV;81.542350769;100.0 +25/10/2020 02:06:37;U875.TI1112_PV.F_CV;81.820663452;100.0 +25/10/2020 02:06:40;U875.TI1112_PV.F_CV;81.637474060;100.0 +25/10/2020 02:06:42;U875.TI1112_PV.F_CV;81.825378418;100.0 +25/10/2020 02:06:52;U875.TI1112_PV.F_CV;81.650787354;100.0 +25/10/2020 02:06:02;U875.TI1113_PV.F_CV;164.728302002;100.0 +25/10/2020 02:06:07;U875.TI1113_PV.F_CV;164.728302002;100.0 +25/10/2020 02:06:08;U875.TI1113_PV.F_CV;165.036270142;100.0 +25/10/2020 02:06:09;U875.TI1113_PV.F_CV;165.157073975;100.0 +25/10/2020 02:06:17;U875.TI1113_PV.F_CV;165.033721924;100.0 +25/10/2020 02:06:18;U875.TI1113_PV.F_CV;164.704925537;100.0 +25/10/2020 02:06:19;U875.TI1113_PV.F_CV;164.567153931;100.0 +25/10/2020 02:06:27;U875.TI1113_PV.F_CV;164.746154785;100.0 +25/10/2020 02:06:30;U875.TI1113_PV.F_CV;165.130996704;100.0 +25/10/2020 02:06:33;U875.TI1113_PV.F_CV;164.840515137;100.0 +25/10/2020 02:06:35;U875.TI1113_PV.F_CV;165.120452881;100.0 +25/10/2020 02:06:40;U875.TI1113_PV.F_CV;164.460754395;100.0 +25/10/2020 02:06:43;U875.TI1113_PV.F_CV;164.623489380;100.0 +25/10/2020 02:06:48;U875.TI1113_PV.F_CV;165.069244385;100.0 +25/10/2020 02:06:56;U875.TI1113_PV.F_CV;164.761886597;100.0 +25/10/2020 02:06:00;U875.TI1115_PV.F_CV;120.225448608;100.0 +25/10/2020 02:06:07;U875.TI1115_PV.F_CV;119.942863464;100.0 +25/10/2020 02:06:09;U875.TI1115_PV.F_CV;120.153350830;100.0 +25/10/2020 02:06:16;U875.TI1115_PV.F_CV;120.043197632;100.0 +25/10/2020 02:06:30;U875.TI1115_PV.F_CV;120.232215881;100.0 +25/10/2020 02:06:33;U875.TI1115_PV.F_CV;120.076255798;100.0 +25/10/2020 02:06:36;U875.TI1115_PV.F_CV;120.262420654;100.0 +25/10/2020 02:06:38;U875.TI1115_PV.F_CV;120.094268799;100.0 +25/10/2020 02:06:49;U875.TI1115_PV.F_CV;120.382293701;100.0 +25/10/2020 02:06:59;U875.TI1115_PV.F_CV;120.151069641;100.0 +25/10/2020 02:06:50;U875.TI1120_PV.F_CV;291.032775879;100.0 +25/10/2020 02:06:25;U875.TI1121_PV.F_CV;309.746032715;100.0 +25/10/2020 02:06:56;U875.TI1121_PV.F_CV;309.452484131;100.0 +25/10/2020 02:06:30;U875.TI1122_PV.F_CV;312.732971191;100.0 +25/10/2020 02:06:45;U875.TI1123_PV.F_CV;332.739715576;100.0 +25/10/2020 02:06:05;U875.TI1124_PV.F_CV;334.600280762;100.0 +25/10/2020 02:06:27;U875.TI1125_PV.F_CV;336.799926758;100.0 +25/10/2020 02:06:02;U875.TI1151_PV.F_CV;55.184722900;100.0 +25/10/2020 02:06:08;U875.TI1151_PV.F_CV;54.909118652;100.0 +25/10/2020 02:06:12;U875.TI1151_PV.F_CV;54.207458496;100.0 +25/10/2020 02:06:15;U875.TI1151_PV.F_CV;54.652240753;100.0 +25/10/2020 02:06:16;U875.TI1151_PV.F_CV;55.172348022;100.0 +25/10/2020 02:06:18;U875.TI1151_PV.F_CV;55.643341064;100.0 +25/10/2020 02:06:30;U875.TI1151_PV.F_CV;54.957157135;100.0 +25/10/2020 02:06:34;U875.TI1151_PV.F_CV;54.543609619;100.0 +25/10/2020 02:06:36;U875.TI1151_PV.F_CV;54.978851318;100.0 +25/10/2020 02:06:37;U875.TI1151_PV.F_CV;55.060302734;100.0 +25/10/2020 02:06:39;U875.TI1151_PV.F_CV;55.442050934;100.0 +25/10/2020 02:06:42;U875.TI1151_PV.F_CV;55.930854797;100.0 +25/10/2020 02:06:47;U875.TI1151_PV.F_CV;55.541534424;100.0 +25/10/2020 02:06:49;U875.TI1151_PV.F_CV;55.356887817;100.0 +25/10/2020 02:06:52;U875.TI1151_PV.F_CV;54.802665710;100.0 +25/10/2020 02:06:56;U875.TI1151_PV.F_CV;55.231109619;100.0 +25/10/2020 02:06:59;U875.TI1151_PV.F_CV;55.692234039;100.0 +25/10/2020 02:06:05;U875.TI1160_PV.F_CV;91.253814697;100.0 +25/10/2020 02:06:14;U875.TI1160_PV.F_CV;91.382797241;100.0 +25/10/2020 02:06:15;U875.TI1160_PV.F_CV;91.596054077;100.0 +25/10/2020 02:06:18;U875.TI1160_PV.F_CV;91.874870300;100.0 +25/10/2020 02:06:32;U875.TI1160_PV.F_CV;91.339759827;100.0 +25/10/2020 02:06:36;U875.TI1160_PV.F_CV;91.732116699;100.0 +25/10/2020 02:06:37;U875.TI1160_PV.F_CV;91.844993591;100.0 +25/10/2020 02:06:39;U875.TI1160_PV.F_CV;91.746520996;100.0 +25/10/2020 02:06:42;U875.TI1160_PV.F_CV;91.996772766;100.0 +25/10/2020 02:06:45;U875.TI1160_PV.F_CV;91.664199829;100.0 +25/10/2020 02:06:47;U875.TI1160_PV.F_CV;91.754463196;100.0 +25/10/2020 02:06:50;U875.TI1160_PV.F_CV;91.465507507;100.0 +25/10/2020 02:06:57;U875.TI1160_PV.F_CV;91.874649048;100.0 +25/10/2020 02:06:58;U875.TI1160_PV.F_CV;91.958923340;100.0 +25/10/2020 02:06:00;U875.TI1165_PV.F_CV;133.250595093;100.0 +25/10/2020 02:06:05;U875.TI1165_PV.F_CV;133.070465088;100.0 +25/10/2020 02:06:09;U875.TI1165_PV.F_CV;133.179168701;100.0 +25/10/2020 02:06:11;U875.TI1165_PV.F_CV;133.434844971;100.0 +25/10/2020 02:06:14;U875.TI1165_PV.F_CV;132.978225708;100.0 +25/10/2020 02:06:16;U875.TI1165_PV.F_CV;133.277313232;100.0 +25/10/2020 02:06:19;U875.TI1165_PV.F_CV;133.062789917;100.0 +25/10/2020 02:06:27;U875.TI1165_PV.F_CV;133.218002319;100.0 +25/10/2020 02:06:34;U875.TI1165_PV.F_CV;132.911560059;100.0 +25/10/2020 02:06:35;U875.TI1165_PV.F_CV;133.441635132;100.0 +25/10/2020 02:06:36;U875.TI1165_PV.F_CV;133.615325928;100.0 +25/10/2020 02:06:38;U875.TI1165_PV.F_CV;133.532852173;100.0 +25/10/2020 02:06:41;U875.TI1165_PV.F_CV;133.154846191;100.0 +25/10/2020 02:06:47;U875.TI1165_PV.F_CV;133.488311768;100.0 +25/10/2020 02:06:51;U875.TI1165_PV.F_CV;133.144699097;100.0 +25/10/2020 02:06:54;U875.TI1165_PV.F_CV;133.361297607;100.0 +25/10/2020 02:06:56;U875.TI1165_PV.F_CV;133.174499512;100.0 +25/10/2020 02:06:59;U875.TI1165_PV.F_CV;133.269073486;100.0 +25/10/2020 02:06:01;U875.TI1203_PV.F_CV;133.281951904;100.0 +25/10/2020 02:06:08;U875.TI1203_PV.F_CV;133.121932983;100.0 +25/10/2020 02:06:13;U875.TI1203_PV.F_CV;132.166870117;100.0 +25/10/2020 02:06:15;U875.TI1203_PV.F_CV;131.949127197;100.0 +25/10/2020 02:06:19;U875.TI1203_PV.F_CV;132.442977905;100.0 +25/10/2020 02:06:20;U875.TI1203_PV.F_CV;132.884704590;100.0 +25/10/2020 02:06:23;U875.TI1203_PV.F_CV;133.508544922;100.0 +25/10/2020 02:06:29;U875.TI1203_PV.F_CV;133.085845947;100.0 +25/10/2020 02:06:36;U875.TI1203_PV.F_CV;132.118408203;100.0 +25/10/2020 02:06:41;U875.TI1203_PV.F_CV;132.833694458;100.0 +25/10/2020 02:06:42;U875.TI1203_PV.F_CV;133.281661987;100.0 +25/10/2020 02:06:44;U875.TI1203_PV.F_CV;133.574157715;100.0 +25/10/2020 02:06:50;U875.TI1203_PV.F_CV;133.002380371;100.0 +25/10/2020 02:06:53;U875.TI1203_PV.F_CV;132.278762817;100.0 +25/10/2020 02:06:55;U875.TI1203_PV.F_CV;132.050399780;100.0 +25/10/2020 02:06:59;U875.TI1203_PV.F_CV;132.562973022;100.0 +25/10/2020 02:06:05;U875.TI1220_PV.F_CV;289.081420898;100.0 +25/10/2020 02:06:07;U875.TI1220_PV.F_CV;289.366912842;100.0 +25/10/2020 02:06:17;U875.TI1220_PV.F_CV;289.039245605;100.0 +25/10/2020 02:06:52;U875.TI1220_PV.F_CV;289.318786621;100.0 +25/10/2020 02:06:56;U875.TI1220_PV.F_CV;289.021057129;100.0 +25/10/2020 02:06:23;U875.TI1221_PV.F_CV;311.429138184;100.0 +25/10/2020 02:06:28;U875.TI1221_PV.F_CV;311.126678467;100.0 +25/10/2020 02:06:06;U875.TI1222_PV.F_CV;339.468963623;100.0 +25/10/2020 02:06:16;U875.TI1222_PV.F_CV;339.150665283;100.0 +25/10/2020 02:06:30;U875.TI1222_PV.F_CV;339.431701660;100.0 +25/10/2020 02:06:37;U875.TI1222_PV.F_CV;339.121795654;100.0 +25/10/2020 02:06:56;U875.TI1222_PV.F_CV;339.438140869;100.0 +25/10/2020 02:06:59;U875.TI1222_PV.F_CV;339.151519775;100.0 +25/10/2020 02:06:11;U875.TI1223_PV.F_CV;339.693115234;100.0 +25/10/2020 02:06:16;U875.TI1223_PV.F_CV;339.417633057;100.0 +25/10/2020 02:06:49;U875.TI1223_PV.F_CV;339.693420410;100.0 +25/10/2020 02:06:28;U875.TI1224_PV.F_CV;338.333374023;100.0 +25/10/2020 02:06:32;U875.TI1224_PV.F_CV;338.631225586;100.0 +25/10/2020 02:06:59;U875.TI1224_PV.F_CV;338.324859619;100.0 +25/10/2020 02:06:02;U875.TI1225_PV.F_CV;336.219909668;100.0 +25/10/2020 02:06:08;U875.TI1225_PV.F_CV;336.556579590;100.0 +25/10/2020 02:06:17;U875.TI1225_PV.F_CV;336.241302490;100.0 +25/10/2020 02:06:49;U875.TI1225_PV.F_CV;336.658233643;100.0 +25/10/2020 02:06:06;U875.TI122a_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI122a_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U875.TI122A_PV.F_CV;322.257080078;100.0 +25/10/2020 02:06:06;U875.TI122b_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI122b_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U875.TI122b_PV.F_CV;323.807128906;100.0 +25/10/2020 02:06:06;U875.TI123A_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI123A_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U875.TI123A_PV.F_CV;344.359680176;100.0 +25/10/2020 02:06:06;U875.TI123B_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI123B_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U875.TI123B_PV.F_CV;346.280242920;100.0 +25/10/2020 02:06:06;U875.TI124a_CoefA.F_CV;0.994099975;100.0 +25/10/2020 02:06:06;U875.TI124a_CoefB.F_CV;0.861000001;100.0 +25/10/2020 02:06:40;U875.TI124a_PV.F_CV;346.545501709;100.0 +25/10/2020 02:06:06;U875.TI124b_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI124b_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U875.TI124b_PV.F_CV;349.510040283;100.0 +25/10/2020 02:06:06;U875.TI125a_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI125a_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U875.TI125a_PV.F_CV;346.970672607;100.0 +25/10/2020 02:06:06;U875.TI125b_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI125b_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U875.TI125b_PV.F_CV;349.302062988;100.0 +25/10/2020 02:06:06;U875.TI126_CoefA.F_CV;0.996599972;100.0 +25/10/2020 02:06:06;U875.TI126_CoefB.F_CV;-0.243499994;100.0 +25/10/2020 02:06:06;U875.TI126_PV.F_CV;349.230163574;100.0 +25/10/2020 02:06:56;U875.TI126_PV.F_CV;349.747161865;100.0 +25/10/2020 02:06:06;U875.TI127_CoefA.F_CV;0.997099996;100.0 +25/10/2020 02:06:06;U875.TI127_CoefB.F_CV;-0.738200009;100.0 +25/10/2020 02:06:35;U875.TI127_PV.F_CV;346.899200439;100.0 +25/10/2020 02:06:06;U875.TI128_CoefA.F_CV;0.995999992;100.0 +25/10/2020 02:06:06;U875.TI128_CoefB.F_CV;0.162400007;100.0 +25/10/2020 02:06:08;U875.TI128_PV.F_CV;349.904174805;100.0 +25/10/2020 02:06:06;U875.TI129_CoefA.F_CV;1.003299952;100.0 +25/10/2020 02:06:06;U875.TI129_CoefB.F_CV;-2.203299999;100.0 +25/10/2020 02:06:31;U875.TI129_PV.F_CV;349.945159912;100.0 +25/10/2020 02:06:09;U875.TI1303_PV.F_CV;102.297935486;100.0 +25/10/2020 02:06:12;U875.TI1303_PV.F_CV;102.146736145;100.0 +25/10/2020 02:06:14;U875.TI1303_PV.F_CV;102.306716919;100.0 +25/10/2020 02:06:18;U875.TI1303_PV.F_CV;102.026412964;100.0 +25/10/2020 02:06:28;U875.TI1303_PV.F_CV;102.299888611;100.0 +25/10/2020 02:06:33;U875.TI1303_PV.F_CV;102.145088196;100.0 +25/10/2020 02:06:44;U875.TI1303_PV.F_CV;102.349670410;100.0 +25/10/2020 02:06:46;U875.TI1303_PV.F_CV;102.125671387;100.0 +25/10/2020 02:06:59;U875.TI1303_PV.F_CV;102.323013306;100.0 +25/10/2020 02:06:06;U875.TI130_CoefA.F_CV;0.999000013;100.0 +25/10/2020 02:06:06;U875.TI130_CoefB.F_CV;-0.392500013;100.0 +25/10/2020 02:06:16;U875.TI130_PV.F_CV;349.952972412;100.0 +25/10/2020 02:06:03;U875.TI1311_PV.F_CV;131.340286255;100.0 +25/10/2020 02:06:06;U875.TI1311_PV.F_CV;131.231460571;100.0 +25/10/2020 02:06:13;U875.TI1311_PV.F_CV;130.509643555;100.0 +25/10/2020 02:06:15;U875.TI1311_PV.F_CV;130.411758423;100.0 +25/10/2020 02:06:18;U875.TI1311_PV.F_CV;130.544418335;100.0 +25/10/2020 02:06:21;U875.TI1311_PV.F_CV;130.992706299;100.0 +25/10/2020 02:06:23;U875.TI1311_PV.F_CV;131.088485718;100.0 +25/10/2020 02:06:30;U875.TI1311_PV.F_CV;130.878646851;100.0 +25/10/2020 02:06:33;U875.TI1311_PV.F_CV;130.469863892;100.0 +25/10/2020 02:06:38;U875.TI1311_PV.F_CV;130.558319092;100.0 +25/10/2020 02:06:43;U875.TI1311_PV.F_CV;131.034652710;100.0 +25/10/2020 02:06:50;U875.TI1311_PV.F_CV;130.853317261;100.0 +25/10/2020 02:06:53;U875.TI1311_PV.F_CV;130.474441528;100.0 +25/10/2020 02:06:55;U875.TI1311_PV.F_CV;130.371994019;100.0 +25/10/2020 02:06:01;U875.TI1312_PV.F_CV;97.350891113;100.0 +25/10/2020 02:06:06;U875.TI1312_PV.F_CV;97.631050110;100.0 +25/10/2020 02:06:09;U875.TI1312_PV.F_CV;97.448387146;100.0 +25/10/2020 02:06:14;U875.TI1312_PV.F_CV;97.637268066;100.0 +25/10/2020 02:06:16;U875.TI1312_PV.F_CV;97.398063660;100.0 +25/10/2020 02:06:20;U875.TI1312_PV.F_CV;97.750747681;100.0 +25/10/2020 02:06:22;U875.TI1312_PV.F_CV;97.461822510;100.0 +25/10/2020 02:06:31;U875.TI1312_PV.F_CV;97.226158142;100.0 +25/10/2020 02:06:33;U875.TI1312_PV.F_CV;97.497947693;100.0 +25/10/2020 02:06:39;U875.TI1312_PV.F_CV;97.311798096;100.0 +25/10/2020 02:06:41;U875.TI1312_PV.F_CV;97.550682068;100.0 +25/10/2020 02:06:46;U875.TI1312_PV.F_CV;97.244064331;100.0 +25/10/2020 02:06:58;U875.TI1312_PV.F_CV;97.347503662;100.0 +25/10/2020 02:06:59;U875.TI1312_PV.F_CV;97.517257690;100.0 +25/10/2020 02:06:00;U875.TI1313_PV.F_CV;172.110275269;100.0 +25/10/2020 02:06:04;U875.TI1313_PV.F_CV;171.543853760;100.0 +25/10/2020 02:06:06;U875.TI1313_PV.F_CV;171.425674438;100.0 +25/10/2020 02:06:16;U875.TI1313_PV.F_CV;172.569961548;100.0 +25/10/2020 02:06:20;U875.TI1313_PV.F_CV;172.241455078;100.0 +25/10/2020 02:06:22;U875.TI1313_PV.F_CV;171.871566772;100.0 +25/10/2020 02:06:27;U875.TI1313_PV.F_CV;171.511383057;100.0 +25/10/2020 02:06:33;U875.TI1313_PV.F_CV;172.041824341;100.0 +25/10/2020 02:06:36;U875.TI1313_PV.F_CV;172.514083862;100.0 +25/10/2020 02:06:39;U875.TI1313_PV.F_CV;172.418457031;100.0 +25/10/2020 02:06:44;U875.TI1313_PV.F_CV;171.645385742;100.0 +25/10/2020 02:06:46;U875.TI1313_PV.F_CV;171.525848389;100.0 +25/10/2020 02:06:51;U875.TI1313_PV.F_CV;171.746231079;100.0 +25/10/2020 02:06:56;U875.TI1313_PV.F_CV;172.394287109;100.0 +25/10/2020 02:06:02;U875.TI1315_PV.F_CV;109.833511353;100.0 +25/10/2020 02:06:11;U875.TI1315_PV.F_CV;110.035797119;100.0 +25/10/2020 02:06:20;U875.TI1315_PV.F_CV;109.818618774;100.0 +25/10/2020 02:06:29;U875.TI1315_PV.F_CV;110.147003174;100.0 +25/10/2020 02:06:41;U875.TI1315_PV.F_CV;109.932868958;100.0 +25/10/2020 02:06:50;U875.TI1315_PV.F_CV;110.190460205;100.0 +25/10/2020 02:06:52;U875.TI1320_PV.F_CV;291.732849121;100.0 +25/10/2020 02:06:54;U875.TI1320_PV.F_CV;291.456604004;100.0 +25/10/2020 02:06:17;U875.TI1321_PV.F_CV;300.455444336;100.0 +25/10/2020 02:06:53;U875.TI1321_PV.F_CV;300.767761230;100.0 +25/10/2020 02:06:55;U875.TI1321_PV.F_CV;300.401367188;100.0 +25/10/2020 02:06:00;U875.TI1322_PV.F_CV;354.647338867;100.0 +25/10/2020 02:06:08;U875.TI1322_PV.F_CV;354.947418213;100.0 +25/10/2020 02:06:11;U875.TI1322_PV.F_CV;354.582031250;100.0 +25/10/2020 02:06:14;U875.TI1322_PV.F_CV;354.859924316;100.0 +25/10/2020 02:06:36;U875.TI1323_PV.F_CV;352.399566650;100.0 +25/10/2020 02:06:08;U875.TI1324_PV.F_CV;358.566345215;100.0 +25/10/2020 02:06:19;U875.TI1324_PV.F_CV;358.280029297;100.0 +25/10/2020 02:06:44;U875.TI1324_PV.F_CV;358.567779541;100.0 +25/10/2020 02:06:46;U875.TI1324_PV.F_CV;358.280426025;100.0 +25/10/2020 02:06:51;U875.TI1324_PV.F_CV;358.593994141;100.0 +25/10/2020 02:06:54;U875.TI1324_PV.F_CV;358.280151367;100.0 +25/10/2020 02:06:02;U875.TI1325_PV.F_CV;357.679046631;100.0 +25/10/2020 02:06:26;U875.TI1325_PV.F_CV;357.402770996;100.0 +25/10/2020 02:06:36;U875.TI1325_PV.F_CV;357.799438477;100.0 +25/10/2020 02:06:49;U875.TI1325_PV.F_CV;357.378692627;100.0 +25/10/2020 02:06:54;U875.TI1325_PV.F_CV;357.667419434;100.0 +25/10/2020 02:06:00;U875.TI133_PV.F_CV;20.505475998;100.0 +25/10/2020 02:06:01;U875.TI133_PV.F_CV;20.569026947;100.0 +25/10/2020 02:06:04;U875.TI133_PV.F_CV;20.596673965;100.0 +25/10/2020 02:06:08;U875.TI133_PV.F_CV;20.421436310;100.0 +25/10/2020 02:06:10;U875.TI133_PV.F_CV;20.559898376;100.0 +25/10/2020 02:06:11;U875.TI133_PV.F_CV;20.586858749;100.0 +25/10/2020 02:06:12;U875.TI133_PV.F_CV;20.461229324;100.0 +25/10/2020 02:06:13;U875.TI133_PV.F_CV;20.420064926;100.0 +25/10/2020 02:06:22;U875.TI133_PV.F_CV;20.497602463;100.0 +25/10/2020 02:06:23;U875.TI133_PV.F_CV;20.566446304;100.0 +25/10/2020 02:06:26;U875.TI133_PV.F_CV;20.596395493;100.0 +25/10/2020 02:06:28;U875.TI133_PV.F_CV;20.527612686;100.0 +25/10/2020 02:06:29;U875.TI133_PV.F_CV;20.441816330;100.0 +25/10/2020 02:06:30;U875.TI133_PV.F_CV;20.413702011;100.0 +25/10/2020 02:06:31;U875.TI133_PV.F_CV;20.463527679;100.0 +25/10/2020 02:06:34;U875.TI133_PV.F_CV;20.424930573;100.0 +25/10/2020 02:06:37;U875.TI133_PV.F_CV;20.484098434;100.0 +25/10/2020 02:06:39;U875.TI133_PV.F_CV;20.431060791;100.0 +25/10/2020 02:06:41;U875.TI133_PV.F_CV;20.475334167;100.0 +25/10/2020 02:06:42;U875.TI133_PV.F_CV;20.559148788;100.0 +25/10/2020 02:06:43;U875.TI133_PV.F_CV;20.586614609;100.0 +25/10/2020 02:06:44;U875.TI133_PV.F_CV;20.477533340;100.0 +25/10/2020 02:06:45;U875.TI133_PV.F_CV;20.420324326;100.0 +25/10/2020 02:06:51;U875.TI133_PV.F_CV;20.515626907;100.0 +25/10/2020 02:06:52;U875.TI133_PV.F_CV;20.572353363;100.0 +25/10/2020 02:06:55;U875.TI133_PV.F_CV;20.432580948;100.0 +25/10/2020 02:06:58;U875.TI133_PV.F_CV;20.579671860;100.0 +25/10/2020 02:06:00;U875.TI1351_PV.F_CV;47.384487152;100.0 +25/10/2020 02:06:03;U875.TI1351_PV.F_CV;47.469417572;100.0 +25/10/2020 02:06:06;U875.TI1351_PV.F_CV;48.034500122;100.0 +25/10/2020 02:06:08;U875.TI1351_PV.F_CV;48.260818481;100.0 +25/10/2020 02:06:15;U875.TI1351_PV.F_CV;48.043315887;100.0 +25/10/2020 02:06:21;U875.TI1351_PV.F_CV;47.437301636;100.0 +25/10/2020 02:06:26;U875.TI1351_PV.F_CV;47.869873047;100.0 +25/10/2020 02:06:27;U875.TI1351_PV.F_CV;48.091823578;100.0 +25/10/2020 02:06:29;U875.TI1351_PV.F_CV;48.188385010;100.0 +25/10/2020 02:06:36;U875.TI1351_PV.F_CV;48.010993958;100.0 +25/10/2020 02:06:37;U875.TI1351_PV.F_CV;47.801906586;100.0 +25/10/2020 02:06:42;U875.TI1351_PV.F_CV;47.356342316;100.0 +25/10/2020 02:06:44;U875.TI1351_PV.F_CV;47.522048950;100.0 +25/10/2020 02:06:45;U875.TI1351_PV.F_CV;47.776153564;100.0 +25/10/2020 02:06:48;U875.TI1351_PV.F_CV;48.163433075;100.0 +25/10/2020 02:06:50;U875.TI1351_PV.F_CV;48.269855499;100.0 +25/10/2020 02:06:57;U875.TI1351_PV.F_CV;48.124389648;100.0 +25/10/2020 02:06:45;U875.TI135_PV.F_CV;62.299472809;100.0 +25/10/2020 02:06:02;U875.TI1360_PV.F_CV;79.805480957;100.0 +25/10/2020 02:06:04;U875.TI1360_PV.F_CV;79.889854431;100.0 +25/10/2020 02:06:09;U875.TI1360_PV.F_CV;79.711296082;100.0 +25/10/2020 02:06:11;U875.TI1360_PV.F_CV;79.859268188;100.0 +25/10/2020 02:06:53;U875.TI1360_PV.F_CV;79.959030151;100.0 +25/10/2020 02:06:01;U875.TI1365_PV.F_CV;135.181793213;100.0 +25/10/2020 02:06:04;U875.TI1365_PV.F_CV;135.260940552;100.0 +25/10/2020 02:06:19;U875.TI1365_PV.F_CV;135.132873535;100.0 +25/10/2020 02:06:25;U875.TI1365_PV.F_CV;135.256912231;100.0 +25/10/2020 02:06:28;U875.TI1365_PV.F_CV;135.150924683;100.0 +25/10/2020 02:06:39;U875.TI1365_PV.F_CV;135.273193359;100.0 +25/10/2020 02:06:54;U875.TI1365_PV.F_CV;135.151336670;100.0 +25/10/2020 02:06:59;U875.TI1365_PV.F_CV;135.265182495;100.0 +25/10/2020 02:06:14;U875.TI136_PV.F_CV;20.795053482;100.0 +25/10/2020 02:06:46;U875.TI137_PV.F_CV;20.218759537;100.0 +25/10/2020 02:06:06;U875.TI1403_PV.F_CV;18.378530502;100.0 +25/10/2020 02:06:08;U875.TI1403_PV.F_CV;18.161069870;100.0 +25/10/2020 02:06:10;U875.TI1403_PV.F_CV;18.308252335;100.0 +25/10/2020 02:06:13;U875.TI1403_PV.F_CV;18.175415039;100.0 +25/10/2020 02:06:23;U875.TI1403_PV.F_CV;18.332757950;100.0 +25/10/2020 02:06:37;U875.TI1403_PV.F_CV;18.202812195;100.0 +25/10/2020 02:06:47;U875.TI1403_PV.F_CV;18.371988297;100.0 +25/10/2020 02:06:54;U875.TI1403_PV.F_CV;18.217599869;100.0 +25/10/2020 02:06:28;U875.TI140_PV.F_CV;20.840961456;100.0 +25/10/2020 02:06:35;U875.TI1420_PV.F_CV;286.797515869;100.0 +25/10/2020 02:06:38;U875.TI1421_PV.F_CV;306.979034424;100.0 +25/10/2020 02:06:03;U875.TI1422_PV.F_CV;351.716766357;100.0 +25/10/2020 02:06:11;U875.TI1422_PV.F_CV;351.994781494;100.0 +25/10/2020 02:06:25;U875.TI1422_PV.F_CV;351.711303711;100.0 +25/10/2020 02:06:31;U875.TI1422_PV.F_CV;352.079040527;100.0 +25/10/2020 02:06:41;U875.TI1422_PV.F_CV;351.803771973;100.0 +25/10/2020 02:06:48;U875.TI1422_PV.F_CV;352.082366943;100.0 +25/10/2020 02:06:01;U875.TI1423_PV.F_CV;352.294464111;100.0 +25/10/2020 02:06:06;U875.TI1423_PV.F_CV;352.011291504;100.0 +25/10/2020 02:06:58;U875.TI1423_PV.F_CV;352.286499023;100.0 +25/10/2020 02:06:08;U875.TI1424_PV.F_CV;354.001159668;100.0 +25/10/2020 02:06:41;U875.TI1424_PV.F_CV;354.279754639;100.0 +25/10/2020 02:06:50;U875.TI1424_PV.F_CV;354.001800537;100.0 +25/10/2020 02:06:12;U875.TI1425_PV.F_CV;356.278076172;100.0 +25/10/2020 02:06:19;U875.TI1425_PV.F_CV;356.002929688;100.0 +25/10/2020 02:06:49;U875.TI1425_PV.F_CV;356.278533936;100.0 +25/10/2020 02:06:04;U875.TI1501_PV.F_CV;93.903602600;100.0 +25/10/2020 02:06:09;U875.TI1501_PV.F_CV;94.154548645;100.0 +25/10/2020 02:06:12;U875.TI1501_PV.F_CV;93.977043152;100.0 +25/10/2020 02:06:23;U875.TI1501_PV.F_CV;94.179107666;100.0 +25/10/2020 02:06:26;U875.TI1501_PV.F_CV;93.960670471;100.0 +25/10/2020 02:06:31;U875.TI1501_PV.F_CV;94.195373535;100.0 +25/10/2020 02:06:34;U875.TI1501_PV.F_CV;93.963432312;100.0 +25/10/2020 02:06:39;U875.TI1501_PV.F_CV;94.078109741;100.0 +25/10/2020 02:06:03;U875.TI1502_PV.F_CV;95.615715027;100.0 +25/10/2020 02:06:14;U875.TI1502_PV.F_CV;95.441947937;100.0 +25/10/2020 02:06:21;U875.TI1502_PV.F_CV;95.556800842;100.0 +25/10/2020 02:06:35;U875.TI1502_PV.F_CV;95.441085815;100.0 +25/10/2020 02:06:49;U875.TI1502_PV.F_CV;95.686531067;100.0 +25/10/2020 02:06:51;U875.TI1502_PV.F_CV;95.550979614;100.0 +25/10/2020 02:06:03;U875.TI1503_PV.F_CV;54.332870483;100.0 +25/10/2020 02:06:07;U875.TI1503_PV.F_CV;54.226070404;100.0 +25/10/2020 02:06:09;U875.TI1503_PV.F_CV;54.350372314;100.0 +25/10/2020 02:06:19;U875.TI1503_PV.F_CV;54.252357483;100.0 +25/10/2020 02:06:22;U875.TI1503_PV.F_CV;54.359897614;100.0 +25/10/2020 02:06:41;U875.TI1503_PV.F_CV;54.477935791;100.0 +25/10/2020 02:06:01;U875.TI150_PV.F_CV;23.364185333;100.0 +25/10/2020 02:06:13;U875.TI150_PV.F_CV;23.572340012;100.0 +25/10/2020 02:06:27;U875.TI150_PV.F_CV;23.327579498;100.0 +25/10/2020 02:06:42;U875.TI150_PV.F_CV;23.459030151;100.0 +25/10/2020 02:06:04;U875.TI1510_PV.F_CV;84.273780823;100.0 +25/10/2020 02:06:50;U875.TI1510_PV.F_CV;84.382827759;100.0 +25/10/2020 02:06:56;U875.TI1510_PV.F_CV;84.306854248;100.0 +25/10/2020 02:06:58;U875.TI1510_PV.F_CV;84.389999390;100.0 +25/10/2020 02:06:11;U875.TI1520_PV.F_CV;82.327293396;100.0 +25/10/2020 02:06:13;U875.TI1520_PV.F_CV;82.421005249;100.0 +25/10/2020 02:06:18;U875.TI1520_PV.F_CV;82.246353149;100.0 +25/10/2020 02:06:22;U875.TI1520_PV.F_CV;82.557586670;100.0 +25/10/2020 02:06:33;U875.TI1520_PV.F_CV;82.239601135;100.0 +25/10/2020 02:06:35;U875.TI1520_PV.F_CV;82.425605774;100.0 +25/10/2020 02:06:51;U875.TI1520_PV.F_CV;82.227722168;100.0 +25/10/2020 02:06:54;U875.TI1520_PV.F_CV;82.359275818;100.0 +25/10/2020 02:06:59;U875.TI1520_PV.F_CV;82.252273560;100.0 +25/10/2020 02:06:08;U875.TI152_PV.F_CV;38.851203918;100.0 +25/10/2020 02:06:35;U875.TI152_PV.F_CV;38.956912994;100.0 +25/10/2020 02:06:38;U875.TI152_PV.F_CV;38.850910187;100.0 +25/10/2020 02:06:43;U875.TI152_PV.F_CV;38.965621948;100.0 +25/10/2020 02:06:00;U875.TI153_PV.F_CV;4.065440178;100.0 +25/10/2020 02:06:09;U875.TI153_PV.F_CV;4.158063889;100.0 +25/10/2020 02:06:11;U875.TI153_PV.F_CV;4.077417374;100.0 +25/10/2020 02:06:28;U875.TI153_PV.F_CV;4.173781395;100.0 +25/10/2020 02:06:33;U875.TI153_PV.F_CV;4.065436840;100.0 +25/10/2020 02:06:41;U875.TI153_PV.F_CV;4.159442902;100.0 +25/10/2020 02:06:51;U875.TI153_PV.F_CV;4.050992012;100.0 +25/10/2020 02:06:56;U875.TI153_PV.F_CV;4.165622711;100.0 +25/10/2020 02:06:04;U875.TI170_PV.F_CV;20.920907974;100.0 +25/10/2020 02:06:09;U875.TI170_PV.F_CV;20.973865509;100.0 +25/10/2020 02:06:12;U875.TI170_PV.F_CV;21.082304001;100.0 +25/10/2020 02:06:15;U875.TI170_PV.F_CV;20.920852661;100.0 +25/10/2020 02:06:19;U875.TI170_PV.F_CV;20.967424393;100.0 +25/10/2020 02:06:22;U875.TI170_PV.F_CV;20.915630341;100.0 +25/10/2020 02:06:39;U875.TI170_PV.F_CV;20.986579895;100.0 +25/10/2020 02:06:44;U875.TI170_PV.F_CV;21.083171844;100.0 +25/10/2020 02:06:49;U875.TI170_PV.F_CV;20.917634964;100.0 +25/10/2020 02:06:53;U875.TI170_PV.F_CV;20.995857239;100.0 +25/10/2020 02:06:00;U875.TI171_PV.F_CV;21.622121811;100.0 +25/10/2020 02:06:04;U875.TI171_PV.F_CV;21.684001923;100.0 +25/10/2020 02:06:08;U875.TI171_PV.F_CV;21.555816650;100.0 +25/10/2020 02:06:09;U875.TI171_PV.F_CV;21.367059708;100.0 +25/10/2020 02:06:10;U875.TI171_PV.F_CV;21.321975708;100.0 +25/10/2020 02:06:11;U875.TI171_PV.F_CV;21.508895874;100.0 +25/10/2020 02:06:12;U875.TI171_PV.F_CV;21.570146561;100.0 +25/10/2020 02:06:14;U875.TI171_PV.F_CV;21.359708786;100.0 +25/10/2020 02:06:15;U875.TI171_PV.F_CV;21.319564819;100.0 +25/10/2020 02:06:16;U875.TI171_PV.F_CV;21.542572021;100.0 +25/10/2020 02:06:17;U875.TI171_PV.F_CV;21.648414612;100.0 +25/10/2020 02:06:20;U875.TI171_PV.F_CV;21.515365601;100.0 +25/10/2020 02:06:22;U875.TI171_PV.F_CV;21.668096542;100.0 +25/10/2020 02:06:29;U875.TI171_PV.F_CV;21.696573257;100.0 +25/10/2020 02:06:30;U875.TI171_PV.F_CV;21.581905365;100.0 +25/10/2020 02:06:31;U875.TI171_PV.F_CV;21.526838303;100.0 +25/10/2020 02:06:34;U875.TI171_PV.F_CV;21.500944138;100.0 +25/10/2020 02:06:40;U875.TI171_PV.F_CV;21.536001205;100.0 +25/10/2020 02:06:46;U875.TI171_PV.F_CV;21.777812958;100.0 +25/10/2020 02:06:48;U875.TI171_PV.F_CV;21.461456299;100.0 +25/10/2020 02:06:49;U875.TI171_PV.F_CV;21.352905273;100.0 +25/10/2020 02:06:50;U875.TI171_PV.F_CV;21.317337036;100.0 +25/10/2020 02:06:51;U875.TI171_PV.F_CV;21.507375717;100.0 +25/10/2020 02:06:52;U875.TI171_PV.F_CV;21.569648743;100.0 +25/10/2020 02:06:57;U875.TI171_PV.F_CV;21.686462402;100.0 +25/10/2020 02:06:21;U875.TI2120_PV.F_CV;304.336364746;100.0 +25/10/2020 02:06:32;U875.TI2120_PV.F_CV;304.646362305;100.0 +25/10/2020 02:06:54;U875.TI2121_PV.F_CV;320.258056641;100.0 +25/10/2020 02:06:59;U875.TI2121_PV.F_CV;319.968963623;100.0 +25/10/2020 02:06:16;U875.TI2122_PV.F_CV;319.811004639;100.0 +25/10/2020 02:06:22;U875.TI2122_PV.F_CV;320.174743652;100.0 +25/10/2020 02:06:44;U875.TI2123_PV.F_CV;348.125274658;100.0 +25/10/2020 02:06:01;U875.TI2124_PV.F_CV;349.000976563;100.0 +25/10/2020 02:06:49;U875.TI2124_PV.F_CV;349.285888672;100.0 +25/10/2020 02:06:57;U875.TI2124_PV.F_CV;349.010803223;100.0 +25/10/2020 02:06:47;U875.TI2125_PV.F_CV;349.212066650;100.0 +25/10/2020 02:06:01;U875.TI2151_PV.F_CV;38.949359894;100.0 +25/10/2020 02:06:09;U875.TI2151_PV.F_CV;39.067150116;100.0 +25/10/2020 02:06:14;U875.TI2151_PV.F_CV;38.981796265;100.0 +25/10/2020 02:06:18;U875.TI2151_PV.F_CV;39.083759308;100.0 +25/10/2020 02:06:21;U875.TI2151_PV.F_CV;38.910423279;100.0 +25/10/2020 02:06:22;U875.TI2151_PV.F_CV;39.105113983;100.0 +25/10/2020 02:06:26;U875.TI2151_PV.F_CV;38.959579468;100.0 +25/10/2020 02:06:29;U875.TI2151_PV.F_CV;39.075252533;100.0 +25/10/2020 02:06:34;U875.TI2151_PV.F_CV;38.933464050;100.0 +25/10/2020 02:06:37;U875.TI2151_PV.F_CV;39.347492218;100.0 +25/10/2020 02:06:39;U875.TI2151_PV.F_CV;39.157276154;100.0 +25/10/2020 02:06:52;U875.TI2151_PV.F_CV;39.259147644;100.0 +25/10/2020 02:06:55;U875.TI2151_PV.F_CV;39.038825989;100.0 +25/10/2020 02:06:01;U875.TI2160_PV.F_CV;87.867225647;100.0 +25/10/2020 02:06:05;U875.TI2160_PV.F_CV;87.740783691;100.0 +25/10/2020 02:06:12;U875.TI2160_PV.F_CV;87.858932495;100.0 +25/10/2020 02:06:20;U875.TI2160_PV.F_CV;87.732856750;100.0 +25/10/2020 02:06:23;U875.TI2160_PV.F_CV;87.938247681;100.0 +25/10/2020 02:06:27;U875.TI2160_PV.F_CV;87.824676514;100.0 +25/10/2020 02:06:37;U875.TI2160_PV.F_CV;88.056900024;100.0 +25/10/2020 02:06:40;U875.TI2160_PV.F_CV;87.838745117;100.0 +25/10/2020 02:06:48;U875.TI2160_PV.F_CV;88.247024536;100.0 +25/10/2020 02:06:51;U875.TI2160_PV.F_CV;87.841087341;100.0 +25/10/2020 02:06:58;U875.TI2160_PV.F_CV;88.050788879;100.0 +25/10/2020 02:06:00;U875.TI2220_PV.F_CV;304.241943359;100.0 +25/10/2020 02:06:27;U875.TI2220_PV.F_CV;304.634643555;100.0 +25/10/2020 02:06:42;U875.TI2220_PV.F_CV;304.298217773;100.0 +25/10/2020 02:06:07;U875.TI2221_PV.F_CV;322.304901123;100.0 +25/10/2020 02:06:11;U875.TI2221_PV.F_CV;322.716156006;100.0 +25/10/2020 02:06:14;U875.TI2221_PV.F_CV;322.350708008;100.0 +25/10/2020 02:06:25;U875.TI2221_PV.F_CV;322.649658203;100.0 +25/10/2020 02:06:38;U875.TI2221_PV.F_CV;322.283721924;100.0 +25/10/2020 02:06:18;U875.TI2222_PV.F_CV;344.779022217;100.0 +25/10/2020 02:06:19;U875.TI2222_PV.F_CV;344.497924805;100.0 +25/10/2020 02:06:45;U875.TI2223_PV.F_CV;347.016723633;100.0 +25/10/2020 02:06:51;U875.TI2223_PV.F_CV;347.292358398;100.0 +25/10/2020 02:06:59;U875.TI2223_PV.F_CV;347.010711670;100.0 +25/10/2020 02:06:31;U875.TI2224_PV.F_CV;349.598937988;100.0 +25/10/2020 02:06:43;U875.TI2224_PV.F_CV;349.233551025;100.0 +25/10/2020 02:06:21;U875.TI2225_PV.F_CV;350.386260986;100.0 +25/10/2020 02:06:06;U875.TI222a_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI222a_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U875.TI222a_PV.F_CV;346.689239502;100.0 +25/10/2020 02:06:06;U875.TI222b_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI222b_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U875.TI222b_PV.F_CV;347.337799072;100.0 +25/10/2020 02:06:06;U875.TI223A_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI223A_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U875.TI223A_PV.F_CV;341.203552246;100.0 +25/10/2020 02:06:06;U875.TI223B_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI223B_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U875.TI223B_PV.F_CV;346.844848633;100.0 +25/10/2020 02:06:06;U875.TI224a_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI224a_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U875.TI224a_PV.F_CV;347.415405273;100.0 +25/10/2020 02:06:06;U875.TI224b_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI224b_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U875.TI224b_PV.F_CV;348.842102051;100.0 +25/10/2020 02:06:06;U875.TI225a_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI225a_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U875.TI225a_PV.F_CV;346.974853516;100.0 +25/10/2020 02:06:06;U875.TI225b_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI225b_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U875.TI225b_PV.F_CV;347.225524902;100.0 +25/10/2020 02:06:06;U875.TI226_CoefA.F_CV;1.016700029;100.0 +25/10/2020 02:06:06;U875.TI226_CoefB.F_CV;-5.971300125;100.0 +25/10/2020 02:06:15;U875.TI226_PV.F_CV;350.035644531;100.0 +25/10/2020 02:06:06;U875.TI227_CoefA.F_CV;0.994000018;100.0 +25/10/2020 02:06:06;U875.TI227_CoefB.F_CV;0.723100007;100.0 +25/10/2020 02:06:27;U875.TI227_PV.F_CV;348.935852051;100.0 +25/10/2020 02:06:06;U875.TI228_CoefA.F_CV;0.990700006;100.0 +25/10/2020 02:06:06;U875.TI228_CoefB.F_CV;1.829800010;100.0 +25/10/2020 02:06:11;U875.TI228_PV.F_CV;350.009307861;100.0 +25/10/2020 02:06:06;U875.TI229_CoefA.F_CV;1.004199982;100.0 +25/10/2020 02:06:06;U875.TI229_CoefB.F_CV;-2.059700012;100.0 +25/10/2020 02:06:07;U875.TI229_PV.F_CV;349.888671875;100.0 +25/10/2020 02:06:06;U875.TI230_CoefA.F_CV;1.003900051;100.0 +25/10/2020 02:06:06;U875.TI230_CoefB.F_CV;-1.219099998;100.0 +25/10/2020 02:06:38;U875.TI230_PV.F_CV;349.932952881;100.0 +25/10/2020 02:06:13;U875.TI2320_PV.F_CV;303.611785889;100.0 +25/10/2020 02:06:23;U875.TI2321_PV.F_CV;322.601684570;100.0 +25/10/2020 02:06:28;U875.TI2321_PV.F_CV;322.326324463;100.0 +25/10/2020 02:06:39;U875.TI2321_PV.F_CV;322.628967285;100.0 +25/10/2020 02:06:52;U875.TI2321_PV.F_CV;322.351501465;100.0 +25/10/2020 02:06:56;U875.TI2321_PV.F_CV;322.657653809;100.0 +25/10/2020 02:06:41;U875.TI2322_PV.F_CV;364.277893066;100.0 +25/10/2020 02:06:43;U875.TI2322_PV.F_CV;363.981506348;100.0 +25/10/2020 02:06:46;U875.TI2322_PV.F_CV;364.335754395;100.0 +25/10/2020 02:06:49;U875.TI2322_PV.F_CV;364.032073975;100.0 +25/10/2020 02:06:07;U875.TI2323_PV.F_CV;366.306518555;100.0 +25/10/2020 02:06:28;U875.TI2323_PV.F_CV;366.649658203;100.0 +25/10/2020 02:06:53;U875.TI2323_PV.F_CV;366.367126465;100.0 +25/10/2020 02:06:04;U875.TI2324_PV.F_CV;368.721527100;100.0 +25/10/2020 02:06:10;U875.TI2324_PV.F_CV;368.434265137;100.0 +25/10/2020 02:06:21;U875.TI2324_PV.F_CV;368.711212158;100.0 +25/10/2020 02:06:29;U875.TI2324_PV.F_CV;368.412445068;100.0 +25/10/2020 02:06:41;U875.TI2324_PV.F_CV;368.721343994;100.0 +25/10/2020 02:06:45;U875.TI2324_PV.F_CV;368.416656494;100.0 +25/10/2020 02:06:54;U875.TI2324_PV.F_CV;368.697143555;100.0 +25/10/2020 02:06:18;U875.TI2325_PV.F_CV;369.533721924;100.0 +25/10/2020 02:06:20;U875.TI2325_PV.F_CV;369.223968506;100.0 +25/10/2020 02:06:38;U875.TI2351_PV.F_CV;35.173896790;100.0 +25/10/2020 02:06:42;U875.TI2351_PV.F_CV;35.042972565;100.0 +25/10/2020 02:06:50;U875.TI2351_PV.F_CV;35.134471893;100.0 +25/10/2020 02:06:54;U875.TI2351_PV.F_CV;35.020717621;100.0 +25/10/2020 02:06:04;U875.TI2360_PV.F_CV;78.983230591;100.0 +25/10/2020 02:06:18;U875.TI2360_PV.F_CV;78.904396057;100.0 +25/10/2020 02:06:31;U875.TI2360_PV.F_CV;78.989273071;100.0 +25/10/2020 02:06:44;U875.TI2360_PV.F_CV;78.910728455;100.0 +25/10/2020 02:06:49;U875.TI2360_PV.F_CV;78.989303589;100.0 +25/10/2020 02:06:42;U875.TI2420_PV.F_CV;303.906890869;100.0 +25/10/2020 02:06:50;U875.TI2420_PV.F_CV;304.193115234;100.0 +25/10/2020 02:06:14;U875.TI2421_PV.F_CV;323.000061035;100.0 +25/10/2020 02:06:01;U875.TI2422_PV.F_CV;364.601135254;100.0 +25/10/2020 02:06:11;U875.TI2422_PV.F_CV;364.882354736;100.0 +25/10/2020 02:06:39;U875.TI2422_PV.F_CV;364.574279785;100.0 +25/10/2020 02:06:51;U875.TI2422_PV.F_CV;364.882751465;100.0 +25/10/2020 02:06:54;U875.TI2423_PV.F_CV;364.000213623;100.0 +25/10/2020 02:06:41;U875.TI2424_PV.F_CV;366.510742188;100.0 +25/10/2020 02:06:46;U875.TI2425_PV.F_CV;368.673797607;100.0 +25/10/2020 02:06:07;U875.TI2501_PV.F_CV;92.426223755;100.0 +25/10/2020 02:06:10;U875.TI2501_PV.F_CV;92.717041016;100.0 +25/10/2020 02:06:14;U875.TI2501_PV.F_CV;92.509597778;100.0 +25/10/2020 02:06:18;U875.TI2501_PV.F_CV;92.589347839;100.0 +25/10/2020 02:06:22;U875.TI2501_PV.F_CV;92.346466064;100.0 +25/10/2020 02:06:29;U875.TI2501_PV.F_CV;92.466506958;100.0 +25/10/2020 02:06:52;U875.TI2501_PV.F_CV;92.352432251;100.0 +25/10/2020 02:06:55;U875.TI2501_PV.F_CV;92.460365295;100.0 +25/10/2020 02:06:01;U875.TI2520_PV.F_CV;73.466049194;100.0 +25/10/2020 02:06:04;U875.TI2520_PV.F_CV;73.662635803;100.0 +25/10/2020 02:06:09;U875.TI2520_PV.F_CV;73.533409119;100.0 +25/10/2020 02:06:21;U875.TI2520_PV.F_CV;73.654785156;100.0 +25/10/2020 02:06:32;U875.TI2520_PV.F_CV;73.564010620;100.0 +25/10/2020 02:06:36;U875.TI2520_PV.F_CV;73.673889160;100.0 +25/10/2020 02:06:40;U875.TI2520_PV.F_CV;73.553710938;100.0 +25/10/2020 02:06:59;U875.TI2520_PV.F_CV;73.665519714;100.0 +25/10/2020 02:06:06;U875.TI322a_CoefA.F_CV;0.995800018;100.0 +25/10/2020 02:06:06;U875.TI322a_CoefB.F_CV;-1.333899975;100.0 +25/10/2020 02:06:37;U875.TI322a_PV.F_CV;365.542816162;100.0 +25/10/2020 02:06:06;U875.TI322b_CoefA.F_CV;0.994199991;100.0 +25/10/2020 02:06:06;U875.TI322b_CoefB.F_CV;0.811699986;100.0 +25/10/2020 02:06:42;U875.TI322b_PV.F_CV;369.082427979;100.0 +25/10/2020 02:06:06;U875.TI323A_CoefA.F_CV;0.995700002;100.0 +25/10/2020 02:06:06;U875.TI323A_CoefB.F_CV;-0.671899974;100.0 +25/10/2020 02:06:46;U875.TI323A_PV.F_CV;365.286865234;100.0 +25/10/2020 02:06:06;U875.TI323B_CoefA.F_CV;0.995800018;100.0 +25/10/2020 02:06:06;U875.TI323B_CoefB.F_CV;-0.801500022;100.0 +25/10/2020 02:06:29;U875.TI323B_PV.F_CV;365.654357910;100.0 +25/10/2020 02:06:06;U875.TI324a_CoefA.F_CV;0.995700002;100.0 +25/10/2020 02:06:06;U875.TI324a_CoefB.F_CV;-0.637499988;100.0 +25/10/2020 02:06:41;U875.TI324a_PV.F_CV;364.157531738;100.0 +25/10/2020 02:06:06;U875.TI324b_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI324b_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U875.TI324b_PV.F_CV;371.450103760;100.0 +25/10/2020 02:06:06;U875.TI325a_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI325a_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U875.TI325a_PV.F_CV;366.205657959;100.0 +25/10/2020 02:06:06;U875.TI325b_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI325b_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U875.TI325b_PV.F_CV;368.455993652;100.0 +25/10/2020 02:06:06;U875.TI326_CoefA.F_CV;1.008200049;100.0 +25/10/2020 02:06:06;U875.TI326_CoefB.F_CV;-3.669899940;100.0 +25/10/2020 02:06:25;U875.TI326_PV.F_CV;370.005279541;100.0 +25/10/2020 02:06:06;U875.TI327_CoefA.F_CV;0.985700011;100.0 +25/10/2020 02:06:06;U875.TI327_CoefB.F_CV;3.247499943;100.0 +25/10/2020 02:06:01;U875.TI327_PV.F_CV;368.603302002;100.0 +25/10/2020 02:06:06;U875.TI328_CoefA.F_CV;0.992600024;100.0 +25/10/2020 02:06:06;U875.TI328_CoefB.F_CV;1.328899980;100.0 +25/10/2020 02:06:35;U875.TI328_PV.F_CV;369.958526611;100.0 +25/10/2020 02:06:06;U875.TI329_CoefA.F_CV;1.001399994;100.0 +25/10/2020 02:06:06;U875.TI329_CoefB.F_CV;-1.377300024;100.0 +25/10/2020 02:06:53;U875.TI329_PV.F_CV;369.934051514;100.0 +25/10/2020 02:06:06;U875.TI330_CoefA.F_CV;1.009299994;100.0 +25/10/2020 02:06:06;U875.TI330_CoefB.F_CV;-2.731899977;100.0 +25/10/2020 02:06:43;U875.TI330_PV.F_CV;369.975402832;100.0 +25/10/2020 02:06:00;U875.TI333_PV.F_CV;21.273727417;100.0 +25/10/2020 02:06:03;U875.TI333_PV.F_CV;21.382297516;100.0 +25/10/2020 02:06:09;U875.TI333_PV.F_CV;21.382297516;100.0 +25/10/2020 02:06:10;U875.TI333_PV.F_CV;21.198299408;100.0 +25/10/2020 02:06:14;U875.TI333_PV.F_CV;21.380517960;100.0 +25/10/2020 02:06:17;U875.TI333_PV.F_CV;21.339313507;100.0 +25/10/2020 02:06:18;U875.TI333_PV.F_CV;21.178419113;100.0 +25/10/2020 02:06:19;U875.TI333_PV.F_CV;21.125696182;100.0 +25/10/2020 02:06:22;U875.TI333_PV.F_CV;21.196506500;100.0 +25/10/2020 02:06:23;U875.TI333_PV.F_CV;21.266086578;100.0 +25/10/2020 02:06:27;U875.TI333_PV.F_CV;21.377834320;100.0 +25/10/2020 02:06:30;U875.TI333_PV.F_CV;21.226066589;100.0 +25/10/2020 02:06:32;U875.TI333_PV.F_CV;21.276582718;100.0 +25/10/2020 02:06:35;U875.TI333_PV.F_CV;21.212598801;100.0 +25/10/2020 02:06:36;U875.TI333_PV.F_CV;21.244129181;100.0 +25/10/2020 02:06:37;U875.TI333_PV.F_CV;21.348922729;100.0 +25/10/2020 02:06:38;U875.TI333_PV.F_CV;21.383264542;100.0 +25/10/2020 02:06:40;U875.TI333_PV.F_CV;21.315338135;100.0 +25/10/2020 02:06:42;U875.TI333_PV.F_CV;21.375431061;100.0 +25/10/2020 02:06:45;U875.TI333_PV.F_CV;21.320106506;100.0 +25/10/2020 02:06:48;U875.TI333_PV.F_CV;21.122182846;100.0 +25/10/2020 02:06:53;U875.TI333_PV.F_CV;21.273239136;100.0 +25/10/2020 02:06:56;U875.TI333_PV.F_CV;21.031270981;100.0 +25/10/2020 02:06:58;U875.TI333_PV.F_CV;21.003356934;100.0 +25/10/2020 02:06:00;U875.TI335_PV.F_CV;59.011295319;100.0 +25/10/2020 02:06:03;U875.TI335_PV.F_CV;59.189403534;100.0 +25/10/2020 02:06:09;U875.TI335_PV.F_CV;59.102237701;100.0 +25/10/2020 02:06:13;U875.TI335_PV.F_CV;59.191432953;100.0 +25/10/2020 02:06:15;U875.TI335_PV.F_CV;59.112503052;100.0 +25/10/2020 02:06:21;U875.TI335_PV.F_CV;59.193141937;100.0 +25/10/2020 02:06:23;U875.TI335_PV.F_CV;59.112686157;100.0 +25/10/2020 02:06:27;U875.TI335_PV.F_CV;59.191856384;100.0 +25/10/2020 02:06:31;U875.TI335_PV.F_CV;59.065441132;100.0 +25/10/2020 02:06:52;U875.TI335_PV.F_CV;59.258117676;100.0 +25/10/2020 02:06:11;U875.TI336_PV.F_CV;104.418617249;100.0 +25/10/2020 02:06:14;U875.TI336_PV.F_CV;104.668441772;100.0 +25/10/2020 02:06:19;U875.TI336_PV.F_CV;104.427459717;100.0 +25/10/2020 02:06:33;U875.TI336_PV.F_CV;104.659729004;100.0 +25/10/2020 02:06:36;U875.TI336_PV.F_CV;104.430793762;100.0 +25/10/2020 02:06:57;U875.TI336_PV.F_CV;104.679382324;100.0 +25/10/2020 02:06:25;U875.TI337_PV.F_CV;19.477365494;100.0 +25/10/2020 02:06:00;U875.TI340_PV.F_CV;19.783222198;100.0 +25/10/2020 02:06:07;U875.TI340_PV.F_CV;19.627651215;100.0 +25/10/2020 02:06:34;U875.TI340_PV.F_CV;19.749011993;100.0 +25/10/2020 02:06:06;U875.TI350_PV.F_CV;23.459737778;100.0 +25/10/2020 02:06:12;U875.TI350_PV.F_CV;23.209060669;100.0 +25/10/2020 02:06:27;U875.TI350_PV.F_CV;23.449003220;100.0 +25/10/2020 02:06:35;U875.TI350_PV.F_CV;23.261819839;100.0 +25/10/2020 02:06:38;U875.TI350_PV.F_CV;23.375329971;100.0 +25/10/2020 02:06:40;U875.TI350_PV.F_CV;23.239822388;100.0 +25/10/2020 02:06:50;U875.TI350_PV.F_CV;23.434366226;100.0 +25/10/2020 02:06:58;U875.TI350_PV.F_CV;23.229087830;100.0 +25/10/2020 02:06:06;U875.TI352_PV.F_CV;35.465450287;100.0 +25/10/2020 02:06:16;U875.TI352_PV.F_CV;35.656902313;100.0 +25/10/2020 02:06:25;U875.TI352_PV.F_CV;35.552421570;100.0 +25/10/2020 02:06:38;U875.TI352_PV.F_CV;35.665889740;100.0 +25/10/2020 02:06:40;U875.TI352_PV.F_CV;35.578987122;100.0 +25/10/2020 02:06:46;U875.TI352_PV.F_CV;35.682399750;100.0 +25/10/2020 02:06:50;U875.TI352_PV.F_CV;35.410354614;100.0 +25/10/2020 02:06:58;U875.TI352_PV.F_CV;35.643169403;100.0 +25/10/2020 02:06:00;U875.TI353_PV.F_CV;5.410222530;100.0 +25/10/2020 02:06:07;U875.TI353_PV.F_CV;5.588117599;100.0 +25/10/2020 02:06:09;U875.TI353_PV.F_CV;5.440667152;100.0 +25/10/2020 02:06:12;U875.TI353_PV.F_CV;5.747743607;100.0 +25/10/2020 02:06:14;U875.TI353_PV.F_CV;5.573032379;100.0 +25/10/2020 02:06:21;U875.TI353_PV.F_CV;5.467354774;100.0 +25/10/2020 02:06:26;U875.TI353_PV.F_CV;5.660511017;100.0 +25/10/2020 02:06:28;U875.TI353_PV.F_CV;5.400617599;100.0 +25/10/2020 02:06:36;U875.TI353_PV.F_CV;5.657943726;100.0 +25/10/2020 02:06:40;U875.TI353_PV.F_CV;5.555612087;100.0 +25/10/2020 02:06:41;U875.TI353_PV.F_CV;5.383759499;100.0 +25/10/2020 02:06:49;U875.TI353_PV.F_CV;5.567277908;100.0 +25/10/2020 02:06:51;U875.TI353_PV.F_CV;5.462022305;100.0 +25/10/2020 02:06:54;U875.TI353_PV.F_CV;5.560239315;100.0 +25/10/2020 02:06:58;U875.TI353_PV.F_CV;5.483939648;100.0 +25/10/2020 02:06:02;U875.TI370_PV.F_CV;21.487503052;100.0 +25/10/2020 02:06:05;U875.TI370_PV.F_CV;21.412874222;100.0 +25/10/2020 02:06:07;U875.TI370_PV.F_CV;21.480411530;100.0 +25/10/2020 02:06:14;U875.TI370_PV.F_CV;21.402391434;100.0 +25/10/2020 02:06:15;U875.TI370_PV.F_CV;21.333551407;100.0 +25/10/2020 02:06:17;U875.TI370_PV.F_CV;21.376667023;100.0 +25/10/2020 02:06:21;U875.TI370_PV.F_CV;21.376667023;100.0 +25/10/2020 02:06:22;U875.TI370_PV.F_CV;21.198215485;100.0 +25/10/2020 02:06:23;U875.TI370_PV.F_CV;21.132183075;100.0 +25/10/2020 02:06:25;U875.TI370_PV.F_CV;21.218545914;100.0 +25/10/2020 02:06:26;U875.TI370_PV.F_CV;21.340539932;100.0 +25/10/2020 02:06:27;U875.TI370_PV.F_CV;21.380516052;100.0 +25/10/2020 02:06:34;U875.TI370_PV.F_CV;21.300912857;100.0 +25/10/2020 02:06:37;U875.TI370_PV.F_CV;21.478557587;100.0 +25/10/2020 02:06:42;U875.TI370_PV.F_CV;21.413341522;100.0 +25/10/2020 02:06:47;U875.TI370_PV.F_CV;21.483272552;100.0 +25/10/2020 02:06:49;U875.TI370_PV.F_CV;21.430971146;100.0 +25/10/2020 02:06:51;U875.TI370_PV.F_CV;21.475326538;100.0 +25/10/2020 02:06:52;U875.TI370_PV.F_CV;21.559146881;100.0 +25/10/2020 02:06:54;U875.TI370_PV.F_CV;21.448116302;100.0 +25/10/2020 02:06:55;U875.TI370_PV.F_CV;21.348533630;100.0 +25/10/2020 02:06:56;U875.TI370_PV.F_CV;21.315902710;100.0 +25/10/2020 02:06:57;U875.TI370_PV.F_CV;21.372444153;100.0 +25/10/2020 02:06:00;U875.TI371_PV.F_CV;18.053791046;100.0 +25/10/2020 02:06:01;U875.TI371_PV.F_CV;18.017627716;100.0 +25/10/2020 02:06:03;U875.TI371_PV.F_CV;18.085115433;100.0 +25/10/2020 02:06:06;U875.TI371_PV.F_CV;18.277999878;100.0 +25/10/2020 02:06:12;U875.TI371_PV.F_CV;18.203498840;100.0 +25/10/2020 02:06:16;U875.TI371_PV.F_CV;18.286617279;100.0 +25/10/2020 02:06:21;U875.TI371_PV.F_CV;18.213371277;100.0 +25/10/2020 02:06:27;U875.TI371_PV.F_CV;18.279079437;100.0 +25/10/2020 02:06:31;U875.TI371_PV.F_CV;18.184158325;100.0 +25/10/2020 02:06:32;U875.TI371_PV.F_CV;18.127576828;100.0 +25/10/2020 02:06:35;U875.TI371_PV.F_CV;18.274126053;100.0 +25/10/2020 02:06:42;U875.TI371_PV.F_CV;18.132858276;100.0 +25/10/2020 02:06:45;U875.TI371_PV.F_CV;18.017932892;100.0 +25/10/2020 02:06:47;U875.TI371_PV.F_CV;18.136390686;100.0 +25/10/2020 02:06:53;U875.TI371_PV.F_CV;18.283143997;100.0 +25/10/2020 02:06:55;U875.TI371_PV.F_CV;18.224405289;100.0 +25/10/2020 02:06:58;U875.TI371_PV.F_CV;18.284080505;100.0 +25/10/2020 02:06:06;U875.TI422a_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI422a_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U875.TI422a_PV.F_CV;366.164154053;100.0 +25/10/2020 02:06:06;U875.TI422b_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI422b_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U875.TI422b_PV.F_CV;371.202880859;100.0 +25/10/2020 02:06:06;U875.TI423A_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI423A_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U875.TI423A_PV.F_CV;367.101654053;100.0 +25/10/2020 02:06:06;U875.TI423B_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI423B_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U875.TI423B_PV.F_CV;365.658599854;100.0 +25/10/2020 02:06:06;U875.TI424a_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI424a_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U875.TI424a_PV.F_CV;367.258575439;100.0 +25/10/2020 02:06:06;U875.TI424b_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI424b_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U875.TI424b_PV.F_CV;370.307617188;100.0 +25/10/2020 02:06:06;U875.TI425a_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI425a_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U875.TI425a_PV.F_CV;365.534454346;100.0 +25/10/2020 02:06:06;U875.TI425b_CoefA.F_CV;1.000000000;100.0 +25/10/2020 02:06:06;U875.TI425b_CoefB.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U875.TI425b_PV.F_CV;368.206573486;100.0 +25/10/2020 02:06:06;U875.TI426_CoefA.F_CV;0.997799993;100.0 +25/10/2020 02:06:06;U875.TI426_CoefB.F_CV;-0.484499991;100.0 +25/10/2020 02:06:27;U875.TI426_PV.F_CV;370.033630371;100.0 +25/10/2020 02:06:06;U875.TI427_CoefA.F_CV;0.997200012;100.0 +25/10/2020 02:06:06;U875.TI427_CoefB.F_CV;-0.851400018;100.0 +25/10/2020 02:06:02;U875.TI427_PV.F_CV;368.434539795;100.0 +25/10/2020 02:06:06;U875.TI428_CoefA.F_CV;0.997900009;100.0 +25/10/2020 02:06:06;U875.TI428_CoefB.F_CV;-0.422500014;100.0 +25/10/2020 02:06:31;U875.TI428_PV.F_CV;369.998626709;100.0 +25/10/2020 02:06:06;U875.TI429_CoefA.F_CV;0.997500002;100.0 +25/10/2020 02:06:06;U875.TI429_CoefB.F_CV;0.339199990;100.0 +25/10/2020 02:06:07;U875.TI429_PV.F_CV;370.010253906;100.0 +25/10/2020 02:06:06;U875.TI430_CoefA.F_CV;0.995100021;100.0 +25/10/2020 02:06:06;U875.TI430_CoefB.F_CV;1.361700058;100.0 +25/10/2020 02:06:51;U875.TI430_PV.F_CV;368.214630127;100.0 +25/10/2020 02:06:10;U875.TI500_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U875.TI504_PV.F_CV;3.425816536;100.0 +25/10/2020 02:06:05;U875.TI504_PV.F_CV;3.758185625;100.0 +25/10/2020 02:06:07;U875.TI504_PV.F_CV;3.479396343;100.0 +25/10/2020 02:06:08;U875.TI504_PV.F_CV;3.426016808;100.0 +25/10/2020 02:06:09;U875.TI504_PV.F_CV;3.467565060;100.0 +25/10/2020 02:06:12;U875.TI504_PV.F_CV;3.419830322;100.0 +25/10/2020 02:06:21;U875.TI504_PV.F_CV;3.419830322;100.0 +25/10/2020 02:06:22;U875.TI504_PV.F_CV;3.668928385;100.0 +25/10/2020 02:06:23;U875.TI504_PV.F_CV;3.757050514;100.0 +25/10/2020 02:06:25;U875.TI504_PV.F_CV;3.785926342;100.0 +25/10/2020 02:06:28;U875.TI504_PV.F_CV;3.563344955;100.0 +25/10/2020 02:06:29;U875.TI504_PV.F_CV;3.453524828;100.0 +25/10/2020 02:06:30;U875.TI504_PV.F_CV;3.497538805;100.0 +25/10/2020 02:06:31;U875.TI504_PV.F_CV;3.700889587;100.0 +25/10/2020 02:06:32;U875.TI504_PV.F_CV;3.767523527;100.0 +25/10/2020 02:06:34;U875.TI504_PV.F_CV;3.463621855;100.0 +25/10/2020 02:06:37;U875.TI504_PV.F_CV;3.585058451;100.0 +25/10/2020 02:06:39;U875.TI504_PV.F_CV;3.764841080;100.0 +25/10/2020 02:06:42;U875.TI504_PV.F_CV;3.530975103;100.0 +25/10/2020 02:06:43;U875.TI504_PV.F_CV;3.570149660;100.0 +25/10/2020 02:06:44;U875.TI504_PV.F_CV;3.724682570;100.0 +25/10/2020 02:06:45;U875.TI504_PV.F_CV;3.775320053;100.0 +25/10/2020 02:06:46;U875.TI504_PV.F_CV;3.555752993;100.0 +25/10/2020 02:06:47;U875.TI504_PV.F_CV;3.451037407;100.0 +25/10/2020 02:06:48;U875.TI504_PV.F_CV;3.416724205;100.0 +25/10/2020 02:06:54;U875.TI504_PV.F_CV;3.497626066;100.0 +25/10/2020 02:06:55;U875.TI504_PV.F_CV;3.566453934;100.0 +25/10/2020 02:06:57;U875.TI504_PV.F_CV;3.596397877;100.0 +25/10/2020 02:06:09;U875.TI513_PV.F_CV;105.188987732;100.0 +25/10/2020 02:06:15;U875.TI513_PV.F_CV;104.882156372;100.0 +25/10/2020 02:06:05;U875.TI526_PV.F_CV;98.168739319;100.0 +25/10/2020 02:06:06;U875.TI530A_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:23;U875.TI531B_PV.F_CV;104.380027771;100.0 +25/10/2020 02:06:58;U875.TI531B_PV.F_CV;104.683502197;100.0 +25/10/2020 02:06:06;U875.TI532A_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:00;U875.U875.TI425A_PV.F_CV;365.539367676;100.0 +25/10/2020 02:06:05;U875.U875.TI425A_PV.F_CV;365.423309326;100.0 +25/10/2020 02:06:10;U875.U875.TI425A_PV.F_CV;365.477508545;100.0 +25/10/2020 02:06:15;U875.U875.TI425A_PV.F_CV;365.479888916;100.0 +25/10/2020 02:06:20;U875.U875.TI425A_PV.F_CV;365.473602295;100.0 +25/10/2020 02:06:25;U875.U875.TI425A_PV.F_CV;365.375335693;100.0 +25/10/2020 02:06:30;U875.U875.TI425A_PV.F_CV;365.550354004;100.0 +25/10/2020 02:06:35;U875.U875.TI425A_PV.F_CV;365.538177490;100.0 +25/10/2020 02:06:40;U875.U875.TI425A_PV.F_CV;365.578369141;100.0 +25/10/2020 02:06:45;U875.U875.TI425A_PV.F_CV;365.511962891;100.0 +25/10/2020 02:06:50;U875.U875.TI425A_PV.F_CV;365.505432129;100.0 +25/10/2020 02:06:55;U875.U875.TI425A_PV.F_CV;365.481506348;100.0 +25/10/2020 02:06:43;U875.WI101_PV.F_CV;12988.166015625;100.0 +25/10/2020 02:06:19;U875.WI103_PV.F_CV;429.441345215;100.0 +25/10/2020 02:06:15;U875.WI301_PV.F_CV;3843.283935547;100.0 +25/10/2020 02:06:42;U875.WI303_PV.F_CV;429.499633789;100.0 +25/10/2020 02:06:48;U878.AI01_PV.F_CV;1.464261413;100.0 +25/10/2020 02:06:48;U878.AI04_PV.F_CV;0.788449824;100.0 +25/10/2020 02:06:46;U878.FC04_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:55;U878.FC05_PV.F_CV;0.003228794;100.0 +25/10/2020 02:06:05;U878.FC06_PV.F_CV;1.626600027;100.0 +25/10/2020 02:06:05;U878.FC07_PV.F_CV;6.977600098;100.0 +25/10/2020 02:06:01;U878.FC08_PV.F_CV;-4.773697376;100.0 +25/10/2020 02:06:56;U878.FC09_PV.F_CV;-2.402699947;100.0 +25/10/2020 02:06:42;U878.FC09_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;U878.FC10_PV.F_CV;-0.004102886;100.0 +25/10/2020 02:06:01;U878.FC10_PV.F_CV;-0.019707680;100.0 +25/10/2020 02:06:02;U878.FC10_PV.F_CV;-0.039239109;100.0 +25/10/2020 02:06:03;U878.FC10_PV.F_CV;0.036740720;100.0 +25/10/2020 02:06:04;U878.FC10_PV.F_CV;-0.033485353;100.0 +25/10/2020 02:06:05;U878.FC10_PV.F_CV;-0.027656436;100.0 +25/10/2020 02:06:06;U878.FC10_PV.F_CV;0.034102917;100.0 +25/10/2020 02:06:07;U878.FC10_PV.F_CV;0.011716127;100.0 +25/10/2020 02:06:08;U878.FC10_PV.F_CV;0.066473961;100.0 +25/10/2020 02:06:09;U878.FC10_PV.F_CV;-0.036821604;100.0 +25/10/2020 02:06:10;U878.FC10_PV.F_CV;0.017274022;100.0 +25/10/2020 02:06:11;U878.FC10_PV.F_CV;0.038370430;100.0 +25/10/2020 02:06:12;U878.FC10_PV.F_CV;-0.003388226;100.0 +25/10/2020 02:06:13;U878.FC10_PV.F_CV;0.058228791;100.0 +25/10/2020 02:06:14;U878.FC10_PV.F_CV;0.020815253;100.0 +25/10/2020 02:06:15;U878.FC10_PV.F_CV;0.053019106;100.0 +25/10/2020 02:06:16;U878.FC10_PV.F_CV;0.023538232;100.0 +25/10/2020 02:06:17;U878.FC10_PV.F_CV;0.074022174;100.0 +25/10/2020 02:06:18;U878.FC10_PV.F_CV;0.058381438;100.0 +25/10/2020 02:06:19;U878.FC10_PV.F_CV;0.037893713;100.0 +25/10/2020 02:06:20;U878.FC10_PV.F_CV;0.012421668;100.0 +25/10/2020 02:06:21;U878.FC10_PV.F_CV;0.017363369;100.0 +25/10/2020 02:06:22;U878.FC10_PV.F_CV;0.064833224;100.0 +25/10/2020 02:06:23;U878.FC10_PV.F_CV;0.071284473;100.0 +25/10/2020 02:06:24;U878.FC10_PV.F_CV;0.035127580;100.0 +25/10/2020 02:06:25;U878.FC10_PV.F_CV;0.019301236;100.0 +25/10/2020 02:06:26;U878.FC10_PV.F_CV;0.014154196;100.0 +25/10/2020 02:06:27;U878.FC10_PV.F_CV;0.074418306;100.0 +25/10/2020 02:06:28;U878.FC10_PV.F_CV;0.059692144;100.0 +25/10/2020 02:06:29;U878.FC10_PV.F_CV;0.056109846;100.0 +25/10/2020 02:06:30;U878.FC10_PV.F_CV;0.040375531;100.0 +25/10/2020 02:06:31;U878.FC10_PV.F_CV;0.001892269;100.0 +25/10/2020 02:06:32;U878.FC10_PV.F_CV;-0.046002805;100.0 +25/10/2020 02:06:33;U878.FC10_PV.F_CV;-0.007405579;100.0 +25/10/2020 02:06:34;U878.FC10_PV.F_CV;0.015100658;100.0 +25/10/2020 02:06:35;U878.FC10_PV.F_CV;-0.006286502;100.0 +25/10/2020 02:06:36;U878.FC10_PV.F_CV;0.044421196;100.0 +25/10/2020 02:06:37;U878.FC10_PV.F_CV;0.049792469;100.0 +25/10/2020 02:06:38;U878.FC10_PV.F_CV;0.088705480;100.0 +25/10/2020 02:06:39;U878.FC10_PV.F_CV;0.033285737;100.0 +25/10/2020 02:06:40;U878.FC10_PV.F_CV;0.039819717;100.0 +25/10/2020 02:06:41;U878.FC10_PV.F_CV;0.055198014;100.0 +25/10/2020 02:06:42;U878.FC10_PV.F_CV;0.053682268;100.0 +25/10/2020 02:06:43;U878.FC10_PV.F_CV;0.055330515;100.0 +25/10/2020 02:06:44;U878.FC10_PV.F_CV;0.014950514;100.0 +25/10/2020 02:06:45;U878.FC10_PV.F_CV;0.020485401;100.0 +25/10/2020 02:06:46;U878.FC10_PV.F_CV;-0.010444880;100.0 +25/10/2020 02:06:47;U878.FC10_PV.F_CV;-0.001580477;100.0 +25/10/2020 02:06:48;U878.FC10_PV.F_CV;0.048669279;100.0 +25/10/2020 02:06:49;U878.FC10_PV.F_CV;0.090330124;100.0 +25/10/2020 02:06:50;U878.FC10_PV.F_CV;0.082990944;100.0 +25/10/2020 02:06:51;U878.FC10_PV.F_CV;0.008057952;100.0 +25/10/2020 02:06:52;U878.FC10_PV.F_CV;-0.011955500;100.0 +25/10/2020 02:06:53;U878.FC10_PV.F_CV;0.057415128;100.0 +25/10/2020 02:06:54;U878.FC10_PV.F_CV;0.007699490;100.0 +25/10/2020 02:06:55;U878.FC10_PV.F_CV;-0.029808104;100.0 +25/10/2020 02:06:56;U878.FC10_PV.F_CV;0.051832080;100.0 +25/10/2020 02:06:57;U878.FC10_PV.F_CV;-0.036042988;100.0 +25/10/2020 02:06:58;U878.FC10_PV.F_CV;0.005989611;100.0 +25/10/2020 02:06:59;U878.FC10_PV.F_CV;-0.066242993;100.0 +25/10/2020 02:06:01;U878.FC11_PV.F_CV;-0.406995088;100.0 +25/10/2020 02:06:17;U878.FC11_PV.F_CV;0.044551477;100.0 +25/10/2020 02:06:28;U878.FC11_PV.F_CV;-0.540262461;100.0 +25/10/2020 02:06:39;U878.FC11_PV.F_CV;0.776453018;100.0 +25/10/2020 02:06:41;U878.FC11_PV.F_CV;-0.115559027;100.0 +25/10/2020 02:06:46;U878.FC11_PV.F_CV;0.352379233;100.0 +25/10/2020 02:06:52;U878.FC11_PV.F_CV;-0.700277030;100.0 +25/10/2020 02:06:08;U878.FCY01_OP.F_CV;60.000003815;100.0 +25/10/2020 02:06:57;U878.FCY01_PV.F_CV;11.956881523;100.0 +25/10/2020 02:06:48;U878.FCY01_SP.F_CV;420.000000000;100.0 +25/10/2020 02:06:41;U878.FQ13_PV.F_CV;100597.554687500;100.0 +25/10/2020 02:06:08;U878.FQ15_PV.F_CV;166279.453125000;100.0 +25/10/2020 02:06:48;U878.LC03_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:48;U878.LC04_PV.F_CV;17.310298920;100.0 +25/10/2020 02:06:51;U878.LC05_PV.F_CV;22.194465637;100.0 +25/10/2020 02:06:00;U878.LC101_PV.F_CV;2.734891176;100.0 +25/10/2020 02:06:01;U878.LC101_PV.F_CV;2.733693123;100.0 +25/10/2020 02:06:02;U878.LC101_PV.F_CV;2.733140469;100.0 +25/10/2020 02:06:03;U878.LC101_PV.F_CV;2.735431433;100.0 +25/10/2020 02:06:04;U878.LC101_PV.F_CV;2.736060143;100.0 +25/10/2020 02:06:05;U878.LC101_PV.F_CV;2.734516382;100.0 +25/10/2020 02:06:06;U878.LC101_PV.F_CV;2.734130144;100.0 +25/10/2020 02:06:07;U878.LC101_PV.F_CV;2.733283758;100.0 +25/10/2020 02:06:08;U878.LC101_PV.F_CV;2.733804464;100.0 +25/10/2020 02:06:09;U878.LC101_PV.F_CV;2.728776932;100.0 +25/10/2020 02:06:10;U878.LC101_PV.F_CV;2.732497692;100.0 +25/10/2020 02:06:11;U878.LC101_PV.F_CV;2.729736805;100.0 +25/10/2020 02:06:12;U878.LC101_PV.F_CV;2.730168104;100.0 +25/10/2020 02:06:13;U878.LC101_PV.F_CV;2.729445457;100.0 +25/10/2020 02:06:14;U878.LC101_PV.F_CV;2.731196642;100.0 +25/10/2020 02:06:15;U878.LC101_PV.F_CV;2.726958275;100.0 +25/10/2020 02:06:16;U878.LC101_PV.F_CV;2.729491711;100.0 +25/10/2020 02:06:17;U878.LC101_PV.F_CV;2.731863976;100.0 +25/10/2020 02:06:18;U878.LC101_PV.F_CV;2.732291222;100.0 +25/10/2020 02:06:19;U878.LC101_PV.F_CV;2.724115133;100.0 +25/10/2020 02:06:20;U878.LC101_PV.F_CV;2.726447821;100.0 +25/10/2020 02:06:21;U878.LC101_PV.F_CV;2.729980230;100.0 +25/10/2020 02:06:22;U878.LC101_PV.F_CV;2.728143692;100.0 +25/10/2020 02:06:23;U878.LC101_PV.F_CV;2.727632284;100.0 +25/10/2020 02:06:24;U878.LC101_PV.F_CV;2.729162455;100.0 +25/10/2020 02:06:25;U878.LC101_PV.F_CV;2.728291988;100.0 +25/10/2020 02:06:26;U878.LC101_PV.F_CV;2.729992628;100.0 +25/10/2020 02:06:27;U878.LC101_PV.F_CV;2.729285955;100.0 +25/10/2020 02:06:28;U878.LC101_PV.F_CV;2.726604462;100.0 +25/10/2020 02:06:29;U878.LC101_PV.F_CV;2.734355688;100.0 +25/10/2020 02:06:30;U878.LC101_PV.F_CV;2.730577469;100.0 +25/10/2020 02:06:31;U878.LC101_PV.F_CV;2.731677532;100.0 +25/10/2020 02:06:32;U878.LC101_PV.F_CV;2.735368013;100.0 +25/10/2020 02:06:33;U878.LC101_PV.F_CV;2.734009504;100.0 +25/10/2020 02:06:34;U878.LC101_PV.F_CV;2.734332323;100.0 +25/10/2020 02:06:35;U878.LC101_PV.F_CV;2.731450081;100.0 +25/10/2020 02:06:36;U878.LC101_PV.F_CV;2.733103514;100.0 +25/10/2020 02:06:37;U878.LC101_PV.F_CV;2.732607365;100.0 +25/10/2020 02:06:38;U878.LC101_PV.F_CV;2.732486486;100.0 +25/10/2020 02:06:39;U878.LC101_PV.F_CV;2.729079247;100.0 +25/10/2020 02:06:40;U878.LC101_PV.F_CV;2.734990835;100.0 +25/10/2020 02:06:41;U878.LC101_PV.F_CV;2.734099865;100.0 +25/10/2020 02:06:42;U878.LC101_PV.F_CV;2.734445810;100.0 +25/10/2020 02:06:43;U878.LC101_PV.F_CV;2.731945276;100.0 +25/10/2020 02:06:44;U878.LC101_PV.F_CV;2.732405901;100.0 +25/10/2020 02:06:45;U878.LC101_PV.F_CV;2.731690645;100.0 +25/10/2020 02:06:46;U878.LC101_PV.F_CV;2.737046480;100.0 +25/10/2020 02:06:47;U878.LC101_PV.F_CV;2.731987476;100.0 +25/10/2020 02:06:48;U878.LC101_PV.F_CV;2.736981630;100.0 +25/10/2020 02:06:49;U878.LC101_PV.F_CV;2.732238054;100.0 +25/10/2020 02:06:50;U878.LC101_PV.F_CV;2.734647989;100.0 +25/10/2020 02:06:51;U878.LC101_PV.F_CV;2.731801510;100.0 +25/10/2020 02:06:52;U878.LC101_PV.F_CV;2.732840776;100.0 +25/10/2020 02:06:53;U878.LC101_PV.F_CV;2.734261274;100.0 +25/10/2020 02:06:54;U878.LC101_PV.F_CV;2.733748674;100.0 +25/10/2020 02:06:55;U878.LC101_PV.F_CV;2.733282804;100.0 +25/10/2020 02:06:56;U878.LC101_PV.F_CV;2.730946064;100.0 +25/10/2020 02:06:57;U878.LC101_PV.F_CV;2.731462240;100.0 +25/10/2020 02:06:58;U878.LC101_PV.F_CV;2.732431650;100.0 +25/10/2020 02:06:59;U878.LC101_PV.F_CV;2.730197191;100.0 +25/10/2020 02:06:37;U878.LC24_PV.F_CV;-0.624752343;100.0 +25/10/2020 02:06:06;U878.LC26_PV.F_CV;-0.636192203;100.0 +25/10/2020 02:06:33;U878.PC07_PV.F_CV;-0.038734898;100.0 +25/10/2020 02:06:24;U878.PC18_OP.F_CV;161.000000000;100.0 +25/10/2020 02:06:04;U878.PC18_PV.F_CV;148.739974976;100.0 +25/10/2020 02:06:37;U878.PC18_SP.F_CV;160.000000000;100.0 +25/10/2020 02:06:16;U878.PC35_OP.F_CV;160.000000000;100.0 +25/10/2020 02:06:13;U878.PC35_PV.F_CV;148.716888428;100.0 +25/10/2020 02:06:40;U878.PC35_SP.F_CV;151.078079224;100.0 +25/10/2020 02:06:48;U878.PC51_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:00;U878.PDI105_PV.F_CV;0.314529300;100.0 +25/10/2020 02:06:01;U878.PDI105_PV.F_CV;0.314742953;100.0 +25/10/2020 02:06:02;U878.PDI105_PV.F_CV;0.314674973;100.0 +25/10/2020 02:06:03;U878.PDI105_PV.F_CV;0.315676689;100.0 +25/10/2020 02:06:04;U878.PDI105_PV.F_CV;0.314918935;100.0 +25/10/2020 02:06:05;U878.PDI105_PV.F_CV;0.312804639;100.0 +25/10/2020 02:06:06;U878.PDI105_PV.F_CV;0.316321820;100.0 +25/10/2020 02:06:07;U878.PDI105_PV.F_CV;0.313040316;100.0 +25/10/2020 02:06:08;U878.PDI105_PV.F_CV;0.314287037;100.0 +25/10/2020 02:06:09;U878.PDI105_PV.F_CV;0.315847546;100.0 +25/10/2020 02:06:10;U878.PDI105_PV.F_CV;0.316108912;100.0 +25/10/2020 02:06:11;U878.PDI105_PV.F_CV;0.314932585;100.0 +25/10/2020 02:06:12;U878.PDI105_PV.F_CV;0.317699105;100.0 +25/10/2020 02:06:13;U878.PDI105_PV.F_CV;0.316923648;100.0 +25/10/2020 02:06:14;U878.PDI105_PV.F_CV;0.317901522;100.0 +25/10/2020 02:06:15;U878.PDI105_PV.F_CV;0.318607956;100.0 +25/10/2020 02:06:16;U878.PDI105_PV.F_CV;0.317873448;100.0 +25/10/2020 02:06:17;U878.PDI105_PV.F_CV;0.317662746;100.0 +25/10/2020 02:06:18;U878.PDI105_PV.F_CV;0.315601736;100.0 +25/10/2020 02:06:19;U878.PDI105_PV.F_CV;0.318060368;100.0 +25/10/2020 02:06:20;U878.PDI105_PV.F_CV;0.320126027;100.0 +25/10/2020 02:06:21;U878.PDI105_PV.F_CV;0.317048907;100.0 +25/10/2020 02:06:22;U878.PDI105_PV.F_CV;0.317430586;100.0 +25/10/2020 02:06:23;U878.PDI105_PV.F_CV;0.316525638;100.0 +25/10/2020 02:06:24;U878.PDI105_PV.F_CV;0.316069126;100.0 +25/10/2020 02:06:25;U878.PDI105_PV.F_CV;0.315309525;100.0 +25/10/2020 02:06:26;U878.PDI105_PV.F_CV;0.313396633;100.0 +25/10/2020 02:06:27;U878.PDI105_PV.F_CV;0.311983794;100.0 +25/10/2020 02:06:28;U878.PDI105_PV.F_CV;0.310890853;100.0 +25/10/2020 02:06:29;U878.PDI105_PV.F_CV;0.310282707;100.0 +25/10/2020 02:06:30;U878.PDI105_PV.F_CV;0.313663453;100.0 +25/10/2020 02:06:31;U878.PDI105_PV.F_CV;0.312721223;100.0 +25/10/2020 02:06:32;U878.PDI105_PV.F_CV;0.313364476;100.0 +25/10/2020 02:06:33;U878.PDI105_PV.F_CV;0.315993279;100.0 +25/10/2020 02:06:34;U878.PDI105_PV.F_CV;0.317846686;100.0 +25/10/2020 02:06:35;U878.PDI105_PV.F_CV;0.317374021;100.0 +25/10/2020 02:06:36;U878.PDI105_PV.F_CV;0.317811131;100.0 +25/10/2020 02:06:37;U878.PDI105_PV.F_CV;0.317090362;100.0 +25/10/2020 02:06:38;U878.PDI105_PV.F_CV;0.315484166;100.0 +25/10/2020 02:06:39;U878.PDI105_PV.F_CV;0.317327857;100.0 +25/10/2020 02:06:40;U878.PDI105_PV.F_CV;0.313215971;100.0 +25/10/2020 02:06:41;U878.PDI105_PV.F_CV;0.314784586;100.0 +25/10/2020 02:06:42;U878.PDI105_PV.F_CV;0.314858586;100.0 +25/10/2020 02:06:43;U878.PDI105_PV.F_CV;0.315546870;100.0 +25/10/2020 02:06:44;U878.PDI105_PV.F_CV;0.313810408;100.0 +25/10/2020 02:06:45;U878.PDI105_PV.F_CV;0.312929392;100.0 +25/10/2020 02:06:46;U878.PDI105_PV.F_CV;0.316330701;100.0 +25/10/2020 02:06:47;U878.PDI105_PV.F_CV;0.316195250;100.0 +25/10/2020 02:06:48;U878.PDI105_PV.F_CV;0.317302883;100.0 +25/10/2020 02:06:49;U878.PDI105_PV.F_CV;0.317665786;100.0 +25/10/2020 02:06:50;U878.PDI105_PV.F_CV;0.320004702;100.0 +25/10/2020 02:06:51;U878.PDI105_PV.F_CV;0.317271173;100.0 +25/10/2020 02:06:52;U878.PDI105_PV.F_CV;0.317465425;100.0 +25/10/2020 02:06:53;U878.PDI105_PV.F_CV;0.317689091;100.0 +25/10/2020 02:06:54;U878.PDI105_PV.F_CV;0.317024350;100.0 +25/10/2020 02:06:55;U878.PDI105_PV.F_CV;0.320146561;100.0 +25/10/2020 02:06:56;U878.PDI105_PV.F_CV;0.318525612;100.0 +25/10/2020 02:06:57;U878.PDI105_PV.F_CV;0.318324476;100.0 +25/10/2020 02:06:58;U878.PDI105_PV.F_CV;0.315360576;100.0 +25/10/2020 02:06:59;U878.PDI105_PV.F_CV;0.315499365;100.0 +25/10/2020 02:06:04;U878.PI03_PV.F_CV;148.718750000;100.0 +25/10/2020 02:06:07;U878.PI08_PV.F_CV;1.328125000;100.0 +25/10/2020 02:06:48;U878.PI15_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:14;U878.PI27_PV.F_CV;0.002500000;100.0 +25/10/2020 02:06:32;U878.PI31_PV.F_CV;0.038750000;100.0 +25/10/2020 02:06:33;U878.PI36_PV.F_CV;1.002500057;100.0 +25/10/2020 02:06:41;U878.SC01_PV.F_CV;-0.091173075;100.0 +25/10/2020 02:06:00;U878.SC02_PV.F_CV;497.796783447;100.0 +25/10/2020 02:06:01;U878.SC02_PV.F_CV;491.124816895;100.0 +25/10/2020 02:06:02;U878.SC02_PV.F_CV;144.730178833;100.0 +25/10/2020 02:06:03;U878.SC02_PV.F_CV;523.412780762;100.0 +25/10/2020 02:06:04;U878.SC02_PV.F_CV;820.520019531;100.0 +25/10/2020 02:06:05;U878.SC02_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:06;U878.SC02_PV.F_CV;461.901458740;100.0 +25/10/2020 02:06:07;U878.SC02_PV.F_CV;241.781158447;100.0 +25/10/2020 02:06:08;U878.SC02_PV.F_CV;79.124450684;100.0 +25/10/2020 02:06:09;U878.SC02_PV.F_CV;491.788818359;100.0 +25/10/2020 02:06:10;U878.SC02_PV.F_CV;814.320007324;100.0 +25/10/2020 02:06:11;U878.SC02_PV.F_CV;275.003448486;100.0 +25/10/2020 02:06:12;U878.SC02_PV.F_CV;97.724647522;100.0 +25/10/2020 02:06:13;U878.SC02_PV.F_CV;526.868835449;100.0 +25/10/2020 02:06:14;U878.SC02_PV.F_CV;164.545181274;100.0 +25/10/2020 02:06:15;U878.SC02_PV.F_CV;640.096008301;100.0 +25/10/2020 02:06:16;U878.SC02_PV.F_CV;206.288421631;100.0 +25/10/2020 02:06:17;U878.SC02_PV.F_CV;526.996765137;100.0 +25/10/2020 02:06:18;U878.SC02_PV.F_CV;524.036804199;100.0 +25/10/2020 02:06:19;U878.SC02_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:20;U878.SC02_PV.F_CV;457.826263428;100.0 +25/10/2020 02:06:21;U878.SC02_PV.F_CV;793.920043945;100.0 +25/10/2020 02:06:22;U878.SC02_PV.F_CV;244.246139526;100.0 +25/10/2020 02:06:23;U878.SC02_PV.F_CV;105.545608521;100.0 +25/10/2020 02:06:24;U878.SC02_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:25;U878.SC02_PV.F_CV;475.757415771;100.0 +25/10/2020 02:06:26;U878.SC02_PV.F_CV;630.816040039;100.0 +25/10/2020 02:06:27;U878.SC02_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:28;U878.SC02_PV.F_CV;656.336059570;100.0 +25/10/2020 02:06:29;U878.SC02_PV.F_CV;202.724853516;100.0 +25/10/2020 02:06:30;U878.SC02_PV.F_CV;75.069839478;100.0 +25/10/2020 02:06:31;U878.SC02_PV.F_CV;39.172004700;100.0 +25/10/2020 02:06:33;U878.SC02_PV.F_CV;57.003051758;100.0 +25/10/2020 02:06:34;U878.SC02_PV.F_CV;34.506919861;100.0 +25/10/2020 02:06:35;U878.SC02_PV.F_CV;8.067863464;100.0 +25/10/2020 02:06:36;U878.SC02_PV.F_CV;-27.240802765;100.0 +25/10/2020 02:06:37;U878.SC02_PV.F_CV;-31.987289429;100.0 +25/10/2020 02:06:38;U878.SC02_PV.F_CV;785.720031738;100.0 +25/10/2020 02:06:39;U878.SC02_PV.F_CV;442.920654297;100.0 +25/10/2020 02:06:40;U878.SC02_PV.F_CV;135.816864014;100.0 +25/10/2020 02:06:41;U878.SC02_PV.F_CV;395.837402344;100.0 +25/10/2020 02:06:42;U878.SC02_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:43;U878.SC02_PV.F_CV;650.136047363;100.0 +25/10/2020 02:06:44;U878.SC02_PV.F_CV;228.461212158;100.0 +25/10/2020 02:06:45;U878.SC02_PV.F_CV;75.720413208;100.0 +25/10/2020 02:06:46;U878.SC02_PV.F_CV;791.119995117;100.0 +25/10/2020 02:06:47;U878.SC02_PV.F_CV;453.698242188;100.0 +25/10/2020 02:06:48;U878.SC02_PV.F_CV;140.086395264;100.0 +25/10/2020 02:06:49;U878.SC02_PV.F_CV;77.990867615;100.0 +25/10/2020 02:06:50;U878.SC02_PV.F_CV;58.980690002;100.0 +25/10/2020 02:06:51;U878.SC02_PV.F_CV;18.730312347;100.0 +25/10/2020 02:06:52;U878.SC02_PV.F_CV;36.607627869;100.0 +25/10/2020 02:06:53;U878.SC02_PV.F_CV;821.119995117;100.0 +25/10/2020 02:06:54;U878.SC02_PV.F_CV;316.055328369;100.0 +25/10/2020 02:06:55;U878.SC02_PV.F_CV;132.295578003;100.0 +25/10/2020 02:06:56;U878.SC02_PV.F_CV;51.989337921;100.0 +25/10/2020 02:06:57;U878.SC02_PV.F_CV;823.920043945;100.0 +25/10/2020 02:06:58;U878.SC02_PV.F_CV;260.403869629;100.0 +25/10/2020 02:06:59;U878.SC02_PV.F_CV;91.101615906;100.0 +25/10/2020 02:06:01;U878.TC13_H_PV.F_CV;19.060514450;100.0 +25/10/2020 02:06:12;U878.TC13_H_PV.F_CV;18.719863892;100.0 +25/10/2020 02:06:13;U878.TC13_H_PV.F_CV;18.883628845;100.0 +25/10/2020 02:06:19;U878.TC13_H_PV.F_CV;18.734334946;100.0 +25/10/2020 02:06:26;U878.TC13_H_PV.F_CV;19.056554794;100.0 +25/10/2020 02:06:35;U878.TC13_H_PV.F_CV;18.749509811;100.0 +25/10/2020 02:06:37;U878.TC13_H_PV.F_CV;18.907012939;100.0 +25/10/2020 02:06:48;U878.TC13_H_PV.F_CV;18.748588562;100.0 +25/10/2020 02:06:51;U878.TC13_H_PV.F_CV;18.880235672;100.0 +25/10/2020 02:06:11;U878.TC13_T_PV.F_CV;18.760620117;100.0 +25/10/2020 02:06:14;U878.TC13_T_PV.F_CV;18.961868286;100.0 +25/10/2020 02:06:18;U878.TC13_T_PV.F_CV;18.804775238;100.0 +25/10/2020 02:06:24;U878.TC13_T_PV.F_CV;18.976852417;100.0 +25/10/2020 02:06:34;U878.TC13_T_PV.F_CV;18.796695709;100.0 +25/10/2020 02:06:38;U878.TC13_T_PV.F_CV;18.980497360;100.0 +25/10/2020 02:06:43;U878.TC13_T_PV.F_CV;18.826728821;100.0 +25/10/2020 02:06:46;U878.TC13_T_PV.F_CV;18.983760834;100.0 +25/10/2020 02:06:48;U878.TC13_T_PV.F_CV;18.748588562;100.0 +25/10/2020 02:06:52;U878.TC13_T_PV.F_CV;18.942323685;100.0 +25/10/2020 02:06:29;U878.TC20_PV.F_CV;19.371107101;100.0 +25/10/2020 02:06:01;U878.TC29_PV.F_CV;19.505496979;100.0 +25/10/2020 02:06:29;U878.TC29_PV.F_CV;19.782852173;100.0 +25/10/2020 02:06:31;U878.TC29_PV.F_CV;19.640102386;100.0 +25/10/2020 02:06:34;U878.TC29_PV.F_CV;19.779933929;100.0 +25/10/2020 02:06:36;U878.TC29_PV.F_CV;19.650274277;100.0 +25/10/2020 02:06:57;U878.TC29_PV.F_CV;19.526216507;100.0 +25/10/2020 02:06:25;U878.TC301_PV.F_CV;19.202873230;100.0 +25/10/2020 02:06:13;U878.TC302_PV.F_CV;21.400482178;100.0 +25/10/2020 02:06:18;U878.TC304_PV.F_CV;20.781732559;100.0 +25/10/2020 02:06:22;U878.TC305_PV.F_CV;19.784267426;100.0 +25/10/2020 02:06:43;U878.TC305_PV.F_CV;19.468790054;100.0 +25/10/2020 02:06:58;U878.TC305_PV.F_CV;19.803863525;100.0 +25/10/2020 02:06:16;U878.TC306_PV.F_CV;21.392753601;100.0 +25/10/2020 02:06:17;U878.TC321_PV.F_CV;17.901802063;100.0 +25/10/2020 02:06:27;U878.TC322_PV.F_CV;17.459133148;100.0 +25/10/2020 02:06:09;U878.TC324_PV.F_CV;999.899902344;100.0 +25/10/2020 02:06:12;U878.TC325_PV.F_CV;999.899902344;100.0 +25/10/2020 02:06:36;U878.TC326_PV.F_CV;16.915338516;100.0 +25/10/2020 02:06:48;U878.TC49_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:02;U878.TC50_PV.F_CV;21.758056641;100.0 +25/10/2020 02:06:07;U878.TC50_PV.F_CV;21.529659271;100.0 +25/10/2020 02:06:33;U878.TC50_PV.F_CV;21.378641129;100.0 +25/10/2020 02:06:36;U878.TC50_PV.F_CV;21.718879700;100.0 +25/10/2020 02:06:39;U878.TC50_PV.F_CV;21.545871735;100.0 +25/10/2020 02:06:55;U878.TC50_PV.F_CV;21.420885086;100.0 +25/10/2020 02:06:02;U878.TC51_PV.F_CV;15.443781853;100.0 +25/10/2020 02:06:17;U878.TC51_PV.F_CV;15.611206055;100.0 +25/10/2020 02:06:24;U878.TC51_PV.F_CV;15.432175636;100.0 +25/10/2020 02:06:27;U878.TC51_PV.F_CV;15.587388992;100.0 +25/10/2020 02:06:35;U878.TC51_PV.F_CV;15.415903091;100.0 +25/10/2020 02:06:45;U878.TC51_PV.F_CV;15.586538315;100.0 +25/10/2020 02:06:53;U878.TC51_PV.F_CV;15.422030449;100.0 +25/10/2020 02:06:56;U878.TC51_PV.F_CV;15.587032318;100.0 +25/10/2020 02:06:00;U878.TC53_PV.F_CV;20.287477493;100.0 +25/10/2020 02:06:04;U878.TC53_PV.F_CV;20.028377533;100.0 +25/10/2020 02:06:06;U878.TC53_PV.F_CV;20.180166245;100.0 +25/10/2020 02:06:17;U878.TC53_PV.F_CV;19.902618408;100.0 +25/10/2020 02:06:33;U878.TC53_PV.F_CV;20.147789001;100.0 +25/10/2020 02:06:35;U878.TC53_PV.F_CV;20.046823502;100.0 +25/10/2020 02:06:46;U878.TC53_PV.F_CV;20.237085342;100.0 +25/10/2020 02:06:52;U878.TC53_PV.F_CV;20.009456635;100.0 +25/10/2020 02:06:54;U878.TC53_PV.F_CV;20.250682831;100.0 +25/10/2020 02:06:56;U878.TC53_PV.F_CV;20.093008041;100.0 +25/10/2020 02:06:26;U878.TC54_PV.F_CV;18.937978745;100.0 +25/10/2020 02:06:37;U878.TC54_PV.F_CV;19.122722626;100.0 +25/10/2020 02:06:43;U878.TC54_PV.F_CV;18.932115555;100.0 +25/10/2020 02:06:06;U878.TC56_PV.F_CV;16.752500534;100.0 +25/10/2020 02:06:14;U878.TC56_PV.F_CV;16.959089279;100.0 +25/10/2020 02:06:28;U878.TC56_PV.F_CV;16.806533813;100.0 +25/10/2020 02:06:30;U878.TC56_PV.F_CV;16.973857880;100.0 +25/10/2020 02:06:41;U878.TC56_PV.F_CV;16.810737610;100.0 +25/10/2020 02:06:44;U878.TC56_PV.F_CV;16.986633301;100.0 +25/10/2020 02:06:51;U878.TC56_PV.F_CV;16.832677841;100.0 +25/10/2020 02:06:13;U878.TC62_PV.F_CV;16.208591461;100.0 +25/10/2020 02:06:20;U878.TC62_PV.F_CV;16.518297195;100.0 +25/10/2020 02:06:30;U878.TC62_PV.F_CV;16.165550232;100.0 +25/10/2020 02:06:52;U878.TC62_PV.F_CV;16.559736252;100.0 +25/10/2020 02:06:54;U878.TC62_PV.F_CV;16.374319077;100.0 +25/10/2020 02:06:57;U878.TC62_PV.F_CV;16.562351227;100.0 +25/10/2020 02:06:59;U878.TC62_PV.F_CV;16.327030182;100.0 +25/10/2020 02:06:12;U878.TC64_PV.F_CV;20.393367767;100.0 +25/10/2020 02:06:15;U878.TC64_PV.F_CV;20.241708755;100.0 +25/10/2020 02:06:36;U878.TC64_PV.F_CV;20.448562622;100.0 +25/10/2020 02:06:39;U878.TC64_PV.F_CV;20.247505188;100.0 +25/10/2020 02:06:41;U878.TC64_PV.F_CV;20.474029541;100.0 +25/10/2020 02:06:51;U878.TC64_PV.F_CV;20.102434158;100.0 +25/10/2020 02:06:57;U878.TC64_PV.F_CV;20.336059570;100.0 +25/10/2020 02:06:00;U878.TC67_PV.F_CV;20.847621918;100.0 +25/10/2020 02:06:08;U878.TC67_PV.F_CV;20.721029282;100.0 +25/10/2020 02:06:31;U878.TC67_PV.F_CV;20.836166382;100.0 +25/10/2020 02:06:44;U878.TC67_PV.F_CV;20.684587479;100.0 +25/10/2020 02:06:49;U878.TC67_PV.F_CV;20.890882492;100.0 +25/10/2020 02:06:53;U878.TC67_PV.F_CV;20.739006042;100.0 +25/10/2020 02:06:28;U878.TC71_PV.F_CV;16.821441650;100.0 +25/10/2020 02:06:30;U878.TC71_PV.F_CV;16.949872971;100.0 +25/10/2020 02:06:49;U878.TC71_PV.F_CV;16.814117432;100.0 +25/10/2020 02:06:51;U878.TC71_PV.F_CV;16.949087143;100.0 +25/10/2020 02:06:59;U878.TC71_PV.F_CV;16.822116852;100.0 +25/10/2020 02:06:02;U878.TC73_PV.F_CV;16.852418900;100.0 +25/10/2020 02:06:08;U878.TC73_PV.F_CV;16.978590012;100.0 +25/10/2020 02:06:12;U878.TC73_PV.F_CV;16.842964172;100.0 +25/10/2020 02:06:29;U878.TC73_PV.F_CV;16.983266830;100.0 +25/10/2020 02:06:31;U878.TC73_PV.F_CV;16.831756592;100.0 +25/10/2020 02:06:34;U878.TC73_PV.F_CV;16.979640961;100.0 +25/10/2020 02:06:39;U878.TC73_PV.F_CV;16.822004318;100.0 +25/10/2020 02:06:50;U878.TC73_PV.F_CV;16.978963852;100.0 +25/10/2020 02:06:53;U878.TC73_PV.F_CV;16.715753555;100.0 +25/10/2020 02:06:59;U878.TC73_PV.F_CV;16.897464752;100.0 +25/10/2020 02:06:08;U878.TC75_PV.F_CV;60.543098450;100.0 +25/10/2020 02:06:12;U878.TC75_PV.F_CV;60.683315277;100.0 +25/10/2020 02:06:19;U878.TC75_PV.F_CV;60.541938782;100.0 +25/10/2020 02:06:28;U878.TC75_PV.F_CV;60.983760834;100.0 +25/10/2020 02:06:32;U878.TC75_PV.F_CV;60.762729645;100.0 +25/10/2020 02:06:40;U878.TC75_PV.F_CV;60.946144104;100.0 +25/10/2020 02:06:43;U878.TC75_PV.F_CV;60.748439789;100.0 +25/10/2020 02:06:12;U878.TC83_PV.F_CV;19.126295090;100.0 +25/10/2020 02:06:17;U878.TC83_PV.F_CV;19.265890121;100.0 +25/10/2020 02:06:56;U878.TC83_PV.F_CV;19.084165573;100.0 +25/10/2020 02:06:59;U878.TC83_PV.F_CV;19.224319458;100.0 +25/10/2020 02:06:00;U878.TC92_PV.F_CV;17.447048187;100.0 +25/10/2020 02:06:02;U878.TC92_PV.F_CV;17.272958755;100.0 +25/10/2020 02:06:12;U878.TC92_PV.F_CV;17.140962601;100.0 +25/10/2020 02:06:15;U878.TC92_PV.F_CV;17.396585464;100.0 +25/10/2020 02:06:20;U878.TC92_PV.F_CV;17.137783051;100.0 +25/10/2020 02:06:23;U878.TC92_PV.F_CV;17.338415146;100.0 +25/10/2020 02:06:30;U878.TC92_PV.F_CV;17.205188751;100.0 +25/10/2020 02:06:35;U878.TC92_PV.F_CV;17.342159271;100.0 +25/10/2020 02:06:40;U878.TC92_PV.F_CV;17.120275497;100.0 +25/10/2020 02:06:41;U878.TC92_PV.F_CV;17.241106033;100.0 +25/10/2020 02:06:45;U878.TC92_PV.F_CV;17.116500854;100.0 +25/10/2020 02:06:48;U878.TC92_PV.F_CV;17.387384415;100.0 +25/10/2020 02:06:49;U878.TC92_PV.F_CV;17.194169998;100.0 +25/10/2020 02:06:55;U878.TC92_PV.F_CV;17.359849930;100.0 +25/10/2020 02:06:57;U878.TC92_PV.F_CV;17.079574585;100.0 +25/10/2020 02:06:33;U878.TC94_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:08;U878.TC97_PV.F_CV;18.517154694;100.0 +25/10/2020 02:06:10;U878.TC97_PV.F_CV;18.668289185;100.0 +25/10/2020 02:06:15;U878.TC97_PV.F_CV;18.541824341;100.0 +25/10/2020 02:06:18;U878.TC97_PV.F_CV;18.674629211;100.0 +25/10/2020 02:06:20;U878.TC97_PV.F_CV;18.549703598;100.0 +25/10/2020 02:06:28;U878.TC97_PV.F_CV;18.659152985;100.0 +25/10/2020 02:06:31;U878.TC97_PV.F_CV;18.525405884;100.0 +25/10/2020 02:06:33;U878.TC97_PV.F_CV;18.650299072;100.0 +25/10/2020 02:06:50;U878.TC97_PV.F_CV;18.517179489;100.0 +25/10/2020 02:06:51;U878.TC97_PV.F_CV;18.623710632;100.0 +25/10/2020 02:06:31;U878.TC98_PV.F_CV;19.600004196;100.0 +25/10/2020 02:06:38;U878.TI301_PV.F_CV;20.299999237;100.0 +25/10/2020 02:06:41;U878.TI301_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:54;U878.TI301_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:35;U878.TI302_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:33;U878.TI303_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:01;U878.TI304_PV.F_CV;17.807518005;100.0 +25/10/2020 02:06:03;U878.TI304_PV.F_CV;18.309217453;100.0 +25/10/2020 02:06:29;U878.TI304_PV.F_CV;17.807518005;100.0 +25/10/2020 02:06:32;U878.TI304_PV.F_CV;18.208879471;100.0 +25/10/2020 02:06:34;U878.TI304_PV.F_CV;17.907857895;100.0 +25/10/2020 02:06:40;U878.TI304_PV.F_CV;18.309217453;100.0 +25/10/2020 02:06:50;U878.TI304_PV.F_CV;17.907857895;100.0 +25/10/2020 02:06:53;U878.TI304_PV.F_CV;18.208879471;100.0 +25/10/2020 02:06:58;U878.TI304_PV.F_CV;17.907857895;100.0 +25/10/2020 02:06:19;U878.TI305_PV.F_CV;17.885391235;100.0 +25/10/2020 02:06:12;U878.TI306_PV.F_CV;19.685880661;100.0 +25/10/2020 02:06:53;U878.TI311_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:03;U878.TI312_PV.F_CV;21.600000381;100.0 +25/10/2020 02:06:47;U878.TI314_PV.F_CV;21.600000381;100.0 +25/10/2020 02:06:09;U878.TI315_PV.F_CV;21.899999619;100.0 +25/10/2020 02:06:06;U878.TI316_PV.F_CV;21.299999237;100.0 +25/10/2020 02:06:09;U878.TI316_PV.F_CV;21.600000381;100.0 +25/10/2020 02:06:12;U878.TI316_PV.F_CV;21.299999237;100.0 +25/10/2020 02:06:17;U878.TI316_PV.F_CV;21.600000381;100.0 +25/10/2020 02:06:19;U878.TI316_PV.F_CV;21.299999237;100.0 +25/10/2020 02:06:25;U878.TI316_PV.F_CV;21.600000381;100.0 +25/10/2020 02:06:43;U878.TI316_PV.F_CV;21.299999237;100.0 +25/10/2020 02:06:59;U878.TI321_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:02;U878.TI322_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:59;U878.TI323_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:05;U878.TI324_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:03;U878.TI325_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:02;U878.TI326_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:37;U878.TI331_PV.F_CV;18.000000000;100.0 +25/10/2020 02:06:41;U878.TI332_PV.F_CV;17.500000000;100.0 +25/10/2020 02:06:07;U878.TI334_PV.F_CV;18.200000763;100.0 +25/10/2020 02:06:31;U878.TI334_PV.F_CV;17.899999619;100.0 +25/10/2020 02:06:42;U878.TI334_PV.F_CV;18.200000763;100.0 +25/10/2020 02:06:41;U878.TI335_PV.F_CV;17.700000763;100.0 +25/10/2020 02:06:15;U878.TI336_PV.F_CV;17.000000000;100.0 +25/10/2020 02:06:00;U878.TI430_PV.F_CV;28.100423813;100.0 +25/10/2020 02:06:01;U878.TI430_PV.F_CV;28.167371750;100.0 +25/10/2020 02:06:02;U878.TI430_PV.F_CV;28.189308167;100.0 +25/10/2020 02:06:03;U878.TI430_PV.F_CV;28.129262924;100.0 +25/10/2020 02:06:04;U878.TI430_PV.F_CV;28.109588623;100.0 +25/10/2020 02:06:05;U878.TI430_PV.F_CV;28.103141785;100.0 +25/10/2020 02:06:06;U878.TI430_PV.F_CV;28.101028442;100.0 +25/10/2020 02:06:07;U878.TI430_PV.F_CV;28.100337982;100.0 +25/10/2020 02:06:08;U878.TI430_PV.F_CV;28.041072845;100.0 +25/10/2020 02:06:09;U878.TI430_PV.F_CV;28.013460159;100.0 +25/10/2020 02:06:10;U878.TI430_PV.F_CV;28.004411697;100.0 +25/10/2020 02:06:11;U878.TI430_PV.F_CV;28.001445770;100.0 +25/10/2020 02:06:12;U878.TI430_PV.F_CV;28.000473022;100.0 +25/10/2020 02:06:13;U878.TI430_PV.F_CV;28.000154495;100.0 +25/10/2020 02:06:14;U878.TI430_PV.F_CV;28.000051498;100.0 +25/10/2020 02:06:15;U878.TI430_PV.F_CV;28.000017166;100.0 +25/10/2020 02:06:16;U878.TI430_PV.F_CV;28.067237854;100.0 +25/10/2020 02:06:17;U878.TI430_PV.F_CV;28.089263916;100.0 +25/10/2020 02:06:18;U878.TI430_PV.F_CV;28.132482529;100.0 +25/10/2020 02:06:19;U878.TI430_PV.F_CV;28.177877426;100.0 +25/10/2020 02:06:20;U878.TI430_PV.F_CV;28.192752838;100.0 +25/10/2020 02:06:21;U878.TI430_PV.F_CV;28.161624908;100.0 +25/10/2020 02:06:22;U878.TI430_PV.F_CV;28.120193481;100.0 +25/10/2020 02:06:23;U878.TI430_PV.F_CV;28.106618881;100.0 +25/10/2020 02:06:24;U878.TI430_PV.F_CV;28.161209106;100.0 +25/10/2020 02:06:25;U878.TI430_PV.F_CV;28.187290192;100.0 +25/10/2020 02:06:26;U878.TI430_PV.F_CV;28.175834656;100.0 +25/10/2020 02:06:27;U878.TI430_PV.F_CV;28.124851227;100.0 +25/10/2020 02:06:28;U878.TI430_PV.F_CV;28.108142853;100.0 +25/10/2020 02:06:29;U878.TI430_PV.F_CV;28.102668762;100.0 +25/10/2020 02:06:30;U878.TI430_PV.F_CV;28.100873947;100.0 +25/10/2020 02:06:31;U878.TI430_PV.F_CV;28.100286484;100.0 +25/10/2020 02:06:32;U878.TI430_PV.F_CV;28.100095749;100.0 +25/10/2020 02:06:33;U878.TI430_PV.F_CV;28.100032806;100.0 +25/10/2020 02:06:34;U878.TI430_PV.F_CV;28.100011826;100.0 +25/10/2020 02:06:35;U878.TI430_PV.F_CV;28.100004196;100.0 +25/10/2020 02:06:36;U878.TI430_PV.F_CV;28.100004196;100.0 +25/10/2020 02:06:37;U878.TI430_PV.F_CV;28.100004196;100.0 +25/10/2020 02:06:38;U878.TI430_PV.F_CV;28.100004196;100.0 +25/10/2020 02:06:39;U878.TI430_PV.F_CV;28.100004196;100.0 +25/10/2020 02:06:40;U878.TI430_PV.F_CV;28.100004196;100.0 +25/10/2020 02:06:41;U878.TI430_PV.F_CV;28.100004196;100.0 +25/10/2020 02:06:42;U878.TI430_PV.F_CV;28.100004196;100.0 +25/10/2020 02:06:43;U878.TI430_PV.F_CV;28.100004196;100.0 +25/10/2020 02:06:44;U878.TI430_PV.F_CV;28.100004196;100.0 +25/10/2020 02:06:45;U878.TI430_PV.F_CV;28.100004196;100.0 +25/10/2020 02:06:46;U878.TI430_PV.F_CV;28.100004196;100.0 +25/10/2020 02:06:47;U878.TI430_PV.F_CV;28.100004196;100.0 +25/10/2020 02:06:48;U878.TI430_PV.F_CV;28.100004196;100.0 +25/10/2020 02:06:49;U878.TI430_PV.F_CV;28.100004196;100.0 +25/10/2020 02:06:50;U878.TI430_PV.F_CV;28.040962219;100.0 +25/10/2020 02:06:51;U878.TI430_PV.F_CV;28.013423920;100.0 +25/10/2020 02:06:52;U878.TI430_PV.F_CV;28.040397644;100.0 +25/10/2020 02:06:53;U878.TI430_PV.F_CV;28.080471039;100.0 +25/10/2020 02:06:54;U878.TI430_PV.F_CV;28.093601227;100.0 +25/10/2020 02:06:55;U878.TI430_PV.F_CV;28.097904205;100.0 +25/10/2020 02:06:56;U878.TI430_PV.F_CV;28.099313736;100.0 +25/10/2020 02:06:57;U878.TI430_PV.F_CV;28.099775314;100.0 +25/10/2020 02:06:58;U878.TI430_PV.F_CV;28.099927902;100.0 +25/10/2020 02:06:59;U878.TI430_PV.F_CV;28.099977493;100.0 +25/10/2020 02:06:00;U878.TI431_PV.F_CV;22.024385452;100.0 +25/10/2020 02:06:01;U878.TI431_PV.F_CV;22.075223923;100.0 +25/10/2020 02:06:02;U878.TI431_PV.F_CV;22.091880798;100.0 +25/10/2020 02:06:03;U878.TI431_PV.F_CV;22.097339630;100.0 +25/10/2020 02:06:04;U878.TI431_PV.F_CV;22.099128723;100.0 +25/10/2020 02:06:05;U878.TI431_PV.F_CV;22.099714279;100.0 +25/10/2020 02:06:06;U878.TI431_PV.F_CV;22.167139053;100.0 +25/10/2020 02:06:07;U878.TI431_PV.F_CV;22.189231873;100.0 +25/10/2020 02:06:08;U878.TI431_PV.F_CV;22.160470963;100.0 +25/10/2020 02:06:09;U878.TI431_PV.F_CV;22.119815826;100.0 +25/10/2020 02:06:10;U878.TI431_PV.F_CV;22.106492996;100.0 +25/10/2020 02:06:11;U878.TI431_PV.F_CV;22.102127075;100.0 +25/10/2020 02:06:12;U878.TI431_PV.F_CV;22.100698471;100.0 +25/10/2020 02:06:13;U878.TI431_PV.F_CV;22.120229721;100.0 +25/10/2020 02:06:14;U878.TI431_PV.F_CV;22.173862457;100.0 +25/10/2020 02:06:15;U878.TI431_PV.F_CV;22.191436768;100.0 +25/10/2020 02:06:16;U878.TI431_PV.F_CV;22.148393631;100.0 +25/10/2020 02:06:17;U878.TI431_PV.F_CV;22.115858078;100.0 +25/10/2020 02:06:18;U878.TI431_PV.F_CV;22.105197906;100.0 +25/10/2020 02:06:19;U878.TI431_PV.F_CV;22.101703644;100.0 +25/10/2020 02:06:20;U878.TI431_PV.F_CV;22.100559235;100.0 +25/10/2020 02:06:21;U878.TI431_PV.F_CV;22.100183487;100.0 +25/10/2020 02:06:22;U878.TI431_PV.F_CV;22.100061417;100.0 +25/10/2020 02:06:23;U878.TI431_PV.F_CV;22.100021362;100.0 +25/10/2020 02:06:24;U878.TI431_PV.F_CV;22.148807526;100.0 +25/10/2020 02:06:25;U878.TI431_PV.F_CV;22.183225632;100.0 +25/10/2020 02:06:26;U878.TI431_PV.F_CV;22.194503784;100.0 +25/10/2020 02:06:27;U878.TI431_PV.F_CV;22.130966187;100.0 +25/10/2020 02:06:28;U878.TI431_PV.F_CV;22.110147476;100.0 +25/10/2020 02:06:29;U878.TI431_PV.F_CV;22.103324890;100.0 +25/10/2020 02:06:30;U878.TI431_PV.F_CV;22.101089478;100.0 +25/10/2020 02:06:31;U878.TI431_PV.F_CV;22.100357056;100.0 +25/10/2020 02:06:32;U878.TI431_PV.F_CV;22.100118637;100.0 +25/10/2020 02:06:33;U878.TI431_PV.F_CV;22.100040436;100.0 +25/10/2020 02:06:34;U878.TI431_PV.F_CV;22.100013733;100.0 +25/10/2020 02:06:35;U878.TI431_PV.F_CV;22.100004196;100.0 +25/10/2020 02:06:36;U878.TI431_PV.F_CV;22.100004196;100.0 +25/10/2020 02:06:37;U878.TI431_PV.F_CV;22.148801804;100.0 +25/10/2020 02:06:38;U878.TI431_PV.F_CV;22.183225632;100.0 +25/10/2020 02:06:39;U878.TI431_PV.F_CV;22.194503784;100.0 +25/10/2020 02:06:40;U878.TI431_PV.F_CV;22.063735962;100.0 +25/10/2020 02:06:41;U878.TI431_PV.F_CV;22.020885468;100.0 +25/10/2020 02:06:42;U878.TI431_PV.F_CV;22.042844772;100.0 +25/10/2020 02:06:43;U878.TI431_PV.F_CV;22.081272125;100.0 +25/10/2020 02:06:44;U878.TI431_PV.F_CV;22.093862534;100.0 +25/10/2020 02:06:45;U878.TI431_PV.F_CV;22.097990036;100.0 +25/10/2020 02:06:46;U878.TI431_PV.F_CV;22.099342346;100.0 +25/10/2020 02:06:47;U878.TI431_PV.F_CV;22.099782944;100.0 +25/10/2020 02:06:48;U878.TI431_PV.F_CV;22.099929810;100.0 +25/10/2020 02:06:49;U878.TI431_PV.F_CV;22.099977493;100.0 +25/10/2020 02:06:50;U878.TI431_PV.F_CV;22.099992752;100.0 +25/10/2020 02:06:51;U878.TI431_PV.F_CV;22.099996567;100.0 +25/10/2020 02:06:52;U878.TI431_PV.F_CV;22.099996567;100.0 +25/10/2020 02:06:53;U878.TI431_PV.F_CV;22.099996567;100.0 +25/10/2020 02:06:54;U878.TI431_PV.F_CV;22.099996567;100.0 +25/10/2020 02:06:55;U878.TI431_PV.F_CV;22.099996567;100.0 +25/10/2020 02:06:56;U878.TI431_PV.F_CV;22.099996567;100.0 +25/10/2020 02:06:57;U878.TI431_PV.F_CV;22.099996567;100.0 +25/10/2020 02:06:58;U878.TI431_PV.F_CV;22.040958405;100.0 +25/10/2020 02:06:59;U878.TI431_PV.F_CV;22.013420105;100.0 +25/10/2020 02:06:00;U878.TI432_PV.F_CV;21.199436188;100.0 +25/10/2020 02:06:01;U878.TI432_PV.F_CV;21.132583618;100.0 +25/10/2020 02:06:02;U878.TI432_PV.F_CV;21.110677719;100.0 +25/10/2020 02:06:03;U878.TI432_PV.F_CV;21.103498459;100.0 +25/10/2020 02:06:04;U878.TI432_PV.F_CV;21.101146698;100.0 +25/10/2020 02:06:05;U878.TI432_PV.F_CV;21.100376129;100.0 +25/10/2020 02:06:06;U878.TI432_PV.F_CV;21.159164429;100.0 +25/10/2020 02:06:07;U878.TI432_PV.F_CV;21.186618805;100.0 +25/10/2020 02:06:08;U878.TI432_PV.F_CV;21.195615768;100.0 +25/10/2020 02:06:09;U878.TI432_PV.F_CV;21.131330490;100.0 +25/10/2020 02:06:10;U878.TI432_PV.F_CV;21.110265732;100.0 +25/10/2020 02:06:11;U878.TI432_PV.F_CV;21.103364944;100.0 +25/10/2020 02:06:12;U878.TI432_PV.F_CV;21.101102829;100.0 +25/10/2020 02:06:13;U878.TI432_PV.F_CV;21.100362778;100.0 +25/10/2020 02:06:14;U878.TI432_PV.F_CV;21.100118637;100.0 +25/10/2020 02:06:15;U878.TI432_PV.F_CV;21.100040436;100.0 +25/10/2020 02:06:16;U878.TI432_PV.F_CV;21.100013733;100.0 +25/10/2020 02:06:17;U878.TI432_PV.F_CV;21.100004196;100.0 +25/10/2020 02:06:18;U878.TI432_PV.F_CV;21.100004196;100.0 +25/10/2020 02:06:19;U878.TI432_PV.F_CV;21.100004196;100.0 +25/10/2020 02:06:20;U878.TI432_PV.F_CV;21.100004196;100.0 +25/10/2020 02:06:21;U878.TI432_PV.F_CV;21.100004196;100.0 +25/10/2020 02:06:22;U878.TI432_PV.F_CV;21.100004196;100.0 +25/10/2020 02:06:23;U878.TI432_PV.F_CV;21.100004196;100.0 +25/10/2020 02:06:24;U878.TI432_PV.F_CV;21.100004196;100.0 +25/10/2020 02:06:25;U878.TI432_PV.F_CV;21.100004196;100.0 +25/10/2020 02:06:26;U878.TI432_PV.F_CV;21.100004196;100.0 +25/10/2020 02:06:27;U878.TI432_PV.F_CV;21.197601318;100.0 +25/10/2020 02:06:28;U878.TI432_PV.F_CV;21.266445160;100.0 +25/10/2020 02:06:29;U878.TI432_PV.F_CV;21.289003372;100.0 +25/10/2020 02:06:30;U878.TI432_PV.F_CV;21.161931992;100.0 +25/10/2020 02:06:31;U878.TI432_PV.F_CV;21.120294571;100.0 +25/10/2020 02:06:32;U878.TI432_PV.F_CV;21.106649399;100.0 +25/10/2020 02:06:33;U878.TI432_PV.F_CV;21.102178574;100.0 +25/10/2020 02:06:34;U878.TI432_PV.F_CV;21.100713730;100.0 +25/10/2020 02:06:35;U878.TI432_PV.F_CV;21.100233078;100.0 +25/10/2020 02:06:36;U878.TI432_PV.F_CV;21.100076675;100.0 +25/10/2020 02:06:37;U878.TI432_PV.F_CV;21.120025635;100.0 +25/10/2020 02:06:38;U878.TI432_PV.F_CV;21.173795700;100.0 +25/10/2020 02:06:39;U878.TI432_PV.F_CV;21.191413879;100.0 +25/10/2020 02:06:40;U878.TI432_PV.F_CV;21.099586487;100.0 +25/10/2020 02:06:41;U878.TI432_PV.F_CV;21.032632828;100.0 +25/10/2020 02:06:42;U878.TI432_PV.F_CV;21.010692596;100.0 +25/10/2020 02:06:43;U878.TI432_PV.F_CV;21.137968063;100.0 +25/10/2020 02:06:44;U878.TI432_PV.F_CV;21.179674149;100.0 +25/10/2020 02:06:45;U878.TI432_PV.F_CV;21.193338394;100.0 +25/10/2020 02:06:46;U878.TI432_PV.F_CV;21.197818756;100.0 +25/10/2020 02:06:47;U878.TI432_PV.F_CV;21.199285507;100.0 +25/10/2020 02:06:48;U878.TI432_PV.F_CV;21.081686020;100.0 +25/10/2020 02:06:49;U878.TI432_PV.F_CV;21.026767731;100.0 +25/10/2020 02:06:50;U878.TI432_PV.F_CV;21.048772812;100.0 +25/10/2020 02:06:51;U878.TI432_PV.F_CV;21.150445938;100.0 +25/10/2020 02:06:52;U878.TI432_PV.F_CV;21.183761597;100.0 +25/10/2020 02:06:53;U878.TI432_PV.F_CV;21.145879745;100.0 +25/10/2020 02:06:54;U878.TI432_PV.F_CV;21.115034103;100.0 +25/10/2020 02:06:55;U878.TI432_PV.F_CV;21.104927063;100.0 +25/10/2020 02:06:56;U878.TI432_PV.F_CV;21.168846130;100.0 +25/10/2020 02:06:57;U878.TI432_PV.F_CV;21.189792633;100.0 +25/10/2020 02:06:58;U878.TI432_PV.F_CV;21.124654770;100.0 +25/10/2020 02:06:59;U878.TI432_PV.F_CV;21.040847778;100.0 +25/10/2020 02:06:00;U878.TI433_PV.F_CV;20.900026321;100.0 +25/10/2020 02:06:01;U878.TI433_PV.F_CV;20.900009155;100.0 +25/10/2020 02:06:02;U878.TI433_PV.F_CV;20.900003433;100.0 +25/10/2020 02:06:03;U878.TI433_PV.F_CV;20.900003433;100.0 +25/10/2020 02:06:04;U878.TI433_PV.F_CV;20.967233658;100.0 +25/10/2020 02:06:05;U878.TI433_PV.F_CV;20.989263535;100.0 +25/10/2020 02:06:06;U878.TI433_PV.F_CV;20.960481644;100.0 +25/10/2020 02:06:07;U878.TI433_PV.F_CV;20.919816971;100.0 +25/10/2020 02:06:08;U878.TI433_PV.F_CV;20.906494141;100.0 +25/10/2020 02:06:09;U878.TI433_PV.F_CV;20.902126312;100.0 +25/10/2020 02:06:10;U878.TI433_PV.F_CV;20.900697708;100.0 +25/10/2020 02:06:11;U878.TI433_PV.F_CV;20.920228958;100.0 +25/10/2020 02:06:12;U878.TI433_PV.F_CV;20.973861694;100.0 +25/10/2020 02:06:13;U878.TI433_PV.F_CV;20.991436005;100.0 +25/10/2020 02:06:14;U878.TI433_PV.F_CV;20.997194290;100.0 +25/10/2020 02:06:15;U878.TI433_PV.F_CV;20.999080658;100.0 +25/10/2020 02:06:16;U878.TI433_PV.F_CV;20.999698639;100.0 +25/10/2020 02:06:17;U878.TI433_PV.F_CV;20.999900818;100.0 +25/10/2020 02:06:18;U878.TI433_PV.F_CV;20.999965668;100.0 +25/10/2020 02:06:19;U878.TI433_PV.F_CV;20.979990005;100.0 +25/10/2020 02:06:20;U878.TI433_PV.F_CV;20.926210403;100.0 +25/10/2020 02:06:21;U878.TI433_PV.F_CV;20.908588409;100.0 +25/10/2020 02:06:22;U878.TI433_PV.F_CV;20.902814865;100.0 +25/10/2020 02:06:23;U878.TI433_PV.F_CV;20.900922775;100.0 +25/10/2020 02:06:24;U878.TI433_PV.F_CV;20.900300980;100.0 +25/10/2020 02:06:25;U878.TI433_PV.F_CV;20.900098801;100.0 +25/10/2020 02:06:26;U878.TI433_PV.F_CV;20.900033951;100.0 +25/10/2020 02:06:27;U878.TI433_PV.F_CV;20.900011063;100.0 +25/10/2020 02:06:28;U878.TI433_PV.F_CV;20.900003433;100.0 +25/10/2020 02:06:29;U878.TI433_PV.F_CV;20.900003433;100.0 +25/10/2020 02:06:30;U878.TI433_PV.F_CV;20.959041595;100.0 +25/10/2020 02:06:31;U878.TI433_PV.F_CV;20.986579895;100.0 +25/10/2020 02:06:32;U878.TI433_PV.F_CV;20.995601654;100.0 +25/10/2020 02:06:33;U878.TI433_PV.F_CV;21.065792084;100.0 +25/10/2020 02:06:34;U878.TI433_PV.F_CV;21.088790894;100.0 +25/10/2020 02:06:35;U878.TI433_PV.F_CV;21.047527313;100.0 +25/10/2020 02:06:36;U878.TI433_PV.F_CV;21.015573502;100.0 +25/10/2020 02:06:37;U878.TI433_PV.F_CV;21.005104065;100.0 +25/10/2020 02:06:38;U878.TI433_PV.F_CV;20.942632675;100.0 +25/10/2020 02:06:39;U878.TI433_PV.F_CV;20.913970947;100.0 +25/10/2020 02:06:40;U878.TI433_PV.F_CV;20.904577255;100.0 +25/10/2020 02:06:41;U878.TI433_PV.F_CV;20.901498795;100.0 +25/10/2020 02:06:42;U878.TI433_PV.F_CV;20.900491714;100.0 +25/10/2020 02:06:43;U878.TI433_PV.F_CV;20.900161743;100.0 +25/10/2020 02:06:44;U878.TI433_PV.F_CV;20.900051117;100.0 +25/10/2020 02:06:45;U878.TI433_PV.F_CV;20.900016785;100.0 +25/10/2020 02:06:46;U878.TI433_PV.F_CV;20.900005341;100.0 +25/10/2020 02:06:47;U878.TI433_PV.F_CV;20.900003433;100.0 +25/10/2020 02:06:48;U878.TI433_PV.F_CV;20.900003433;100.0 +25/10/2020 02:06:49;U878.TI433_PV.F_CV;20.900003433;100.0 +25/10/2020 02:06:50;U878.TI433_PV.F_CV;20.900003433;100.0 +25/10/2020 02:06:51;U878.TI433_PV.F_CV;20.967233658;100.0 +25/10/2020 02:06:52;U878.TI433_PV.F_CV;20.989263535;100.0 +25/10/2020 02:06:53;U878.TI433_PV.F_CV;20.960481644;100.0 +25/10/2020 02:06:54;U878.TI433_PV.F_CV;20.919816971;100.0 +25/10/2020 02:06:55;U878.TI433_PV.F_CV;20.906494141;100.0 +25/10/2020 02:06:56;U878.TI433_PV.F_CV;20.961168289;100.0 +25/10/2020 02:06:57;U878.TI433_PV.F_CV;20.987276077;100.0 +25/10/2020 02:06:58;U878.TI433_PV.F_CV;20.995830536;100.0 +25/10/2020 02:06:59;U878.TI433_PV.F_CV;20.998634338;100.0 +25/10/2020 02:06:00;U878.TI434_PV.F_CV;20.600004196;100.0 +25/10/2020 02:06:01;U878.TI434_PV.F_CV;20.620002747;100.0 +25/10/2020 02:06:02;U878.TI434_PV.F_CV;20.673788071;100.0 +25/10/2020 02:06:03;U878.TI434_PV.F_CV;20.691411972;100.0 +25/10/2020 02:06:04;U878.TI434_PV.F_CV;20.648386002;100.0 +25/10/2020 02:06:05;U878.TI434_PV.F_CV;20.615854263;100.0 +25/10/2020 02:06:06;U878.TI434_PV.F_CV;20.605195999;100.0 +25/10/2020 02:06:07;U878.TI434_PV.F_CV;20.668935776;100.0 +25/10/2020 02:06:08;U878.TI434_PV.F_CV;20.689821243;100.0 +25/10/2020 02:06:09;U878.TI434_PV.F_CV;20.660665512;100.0 +25/10/2020 02:06:10;U878.TI434_PV.F_CV;20.619878769;100.0 +25/10/2020 02:06:11;U878.TI434_PV.F_CV;20.606513977;100.0 +25/10/2020 02:06:12;U878.TI434_PV.F_CV;20.602134705;100.0 +25/10/2020 02:06:13;U878.TI434_PV.F_CV;20.600698471;100.0 +25/10/2020 02:06:14;U878.TI434_PV.F_CV;20.600229263;100.0 +25/10/2020 02:06:15;U878.TI434_PV.F_CV;20.600076675;100.0 +25/10/2020 02:06:16;U878.TI434_PV.F_CV;20.600027084;100.0 +25/10/2020 02:06:17;U878.TI434_PV.F_CV;20.600009918;100.0 +25/10/2020 02:06:18;U878.TI434_PV.F_CV;20.600004196;100.0 +25/10/2020 02:06:19;U878.TI434_PV.F_CV;20.600004196;100.0 +25/10/2020 02:06:20;U878.TI434_PV.F_CV;20.659042358;100.0 +25/10/2020 02:06:21;U878.TI434_PV.F_CV;20.686580658;100.0 +25/10/2020 02:06:22;U878.TI434_PV.F_CV;20.695602417;100.0 +25/10/2020 02:06:23;U878.TI434_PV.F_CV;20.698558807;100.0 +25/10/2020 02:06:24;U878.TI434_PV.F_CV;20.699527740;100.0 +25/10/2020 02:06:25;U878.TI434_PV.F_CV;20.699846268;100.0 +25/10/2020 02:06:26;U878.TI434_PV.F_CV;20.699949265;100.0 +25/10/2020 02:06:27;U878.TI434_PV.F_CV;20.699983597;100.0 +25/10/2020 02:06:28;U878.TI434_PV.F_CV;20.632762909;100.0 +25/10/2020 02:06:29;U878.TI434_PV.F_CV;20.610736847;100.0 +25/10/2020 02:06:30;U878.TI434_PV.F_CV;20.603519440;100.0 +25/10/2020 02:06:31;U878.TI434_PV.F_CV;20.601154327;100.0 +25/10/2020 02:06:32;U878.TI434_PV.F_CV;20.600378036;100.0 +25/10/2020 02:06:33;U878.TI434_PV.F_CV;20.600124359;100.0 +25/10/2020 02:06:34;U878.TI434_PV.F_CV;20.600042343;100.0 +25/10/2020 02:06:35;U878.TI434_PV.F_CV;20.600013733;100.0 +25/10/2020 02:06:36;U878.TI434_PV.F_CV;20.600004196;100.0 +25/10/2020 02:06:37;U878.TI434_PV.F_CV;20.600004196;100.0 +25/10/2020 02:06:38;U878.TI434_PV.F_CV;20.600004196;100.0 +25/10/2020 02:06:39;U878.TI434_PV.F_CV;20.600004196;100.0 +25/10/2020 02:06:40;U878.TI434_PV.F_CV;20.600004196;100.0 +25/10/2020 02:06:41;U878.TI434_PV.F_CV;20.734464645;100.0 +25/10/2020 02:06:42;U878.TI434_PV.F_CV;20.778524399;100.0 +25/10/2020 02:06:43;U878.TI434_PV.F_CV;20.720962524;100.0 +25/10/2020 02:06:44;U878.TI434_PV.F_CV;20.639636993;100.0 +25/10/2020 02:06:45;U878.TI434_PV.F_CV;20.612989426;100.0 +25/10/2020 02:06:46;U878.TI434_PV.F_CV;20.604255676;100.0 +25/10/2020 02:06:47;U878.TI434_PV.F_CV;20.601394653;100.0 +25/10/2020 02:06:48;U878.TI434_PV.F_CV;20.600456238;100.0 +25/10/2020 02:06:49;U878.TI434_PV.F_CV;20.600149155;100.0 +25/10/2020 02:06:50;U878.TI434_PV.F_CV;20.600049973;100.0 +25/10/2020 02:06:51;U878.TI434_PV.F_CV;20.648817062;100.0 +25/10/2020 02:06:52;U878.TI434_PV.F_CV;20.683229446;100.0 +25/10/2020 02:06:53;U878.TI434_PV.F_CV;20.694503784;100.0 +25/10/2020 02:06:54;U878.TI434_PV.F_CV;20.630966187;100.0 +25/10/2020 02:06:55;U878.TI434_PV.F_CV;20.610147476;100.0 +25/10/2020 02:06:56;U878.TI434_PV.F_CV;20.567325592;100.0 +25/10/2020 02:06:57;U878.TI434_PV.F_CV;20.522060394;100.0 +25/10/2020 02:06:58;U878.TI434_PV.F_CV;20.507228851;100.0 +25/10/2020 02:06:59;U878.TI434_PV.F_CV;20.561408997;100.0 +25/10/2020 02:06:48;U878.TI45_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:48;U878.TI46_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:03;U878.TI52_PV.F_CV;20.600000381;100.0 +25/10/2020 02:06:06;U878.TI52_PV.F_CV;20.299999237;100.0 +25/10/2020 02:06:08;U878.TI52_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:11;U878.TI52_PV.F_CV;20.299999237;100.0 +25/10/2020 02:06:16;U878.TI52_PV.F_CV;20.600000381;100.0 +25/10/2020 02:06:19;U878.TI52_PV.F_CV;20.299999237;100.0 +25/10/2020 02:06:50;U878.TI52_PV.F_CV;20.100000381;100.0 +25/10/2020 02:06:55;U878.TI52_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:58;U878.TI52_PV.F_CV;20.299999237;100.0 +25/10/2020 02:06:00;U878.TI55_PV.F_CV;12.500000000;100.0 +25/10/2020 02:06:08;U878.TI55_PV.F_CV;12.300000191;100.0 +25/10/2020 02:06:23;U878.TI55_PV.F_CV;12.500000000;100.0 +25/10/2020 02:06:29;U878.TI55_PV.F_CV;12.199999809;100.0 +25/10/2020 02:06:36;U878.TI55_PV.F_CV;12.399999619;100.0 +25/10/2020 02:06:15;U878.TI66_PV.F_CV;12.500000000;100.0 +25/10/2020 02:06:17;U878.TI66_PV.F_CV;12.899999619;100.0 +25/10/2020 02:06:20;U878.TI66_PV.F_CV;12.600000381;100.0 +25/10/2020 02:06:41;U878.TI66_PV.F_CV;13.000000000;100.0 +25/10/2020 02:06:44;U878.TI66_PV.F_CV;12.500000000;100.0 +25/10/2020 02:06:49;U878.TI66_PV.F_CV;12.899999619;100.0 +25/10/2020 02:06:00;U878.TI68_PV.F_CV;20.299999237;100.0 +25/10/2020 02:06:05;U878.TI68_PV.F_CV;19.899999619;100.0 +25/10/2020 02:06:10;U878.TI68_PV.F_CV;20.100000381;100.0 +25/10/2020 02:06:15;U878.TI68_PV.F_CV;19.899999619;100.0 +25/10/2020 02:06:20;U878.TI68_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:23;U878.TI68_PV.F_CV;19.899999619;100.0 +25/10/2020 02:06:26;U878.TI68_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:31;U878.TI68_PV.F_CV;20.000000000;100.0 +25/10/2020 02:06:33;U878.TI68_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:36;U878.TI68_PV.F_CV;20.000000000;100.0 +25/10/2020 02:06:39;U878.TI68_PV.F_CV;20.299999237;100.0 +25/10/2020 02:06:44;U878.TI68_PV.F_CV;20.000000000;100.0 +25/10/2020 02:06:47;U878.TI68_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:49;U878.TI68_PV.F_CV;19.899999619;100.0 +25/10/2020 02:06:52;U878.TI68_PV.F_CV;20.100000381;100.0 +25/10/2020 02:06:55;U878.TI68_PV.F_CV;20.000000000;100.0 +25/10/2020 02:06:57;U878.TI68_PV.F_CV;20.100000381;100.0 +25/10/2020 02:06:09;U878.TI74_PV.F_CV;17.750968933;100.0 +25/10/2020 02:06:14;U878.TI74_PV.F_CV;17.878297806;100.0 +25/10/2020 02:06:25;U878.TI74_PV.F_CV;17.725736618;100.0 +25/10/2020 02:06:30;U878.TI74_PV.F_CV;17.878622055;100.0 +25/10/2020 02:06:43;U878.TI74_PV.F_CV;17.749408722;100.0 +25/10/2020 02:06:49;U878.TI74_PV.F_CV;17.886316299;100.0 +25/10/2020 02:06:53;U878.TI74_PV.F_CV;17.752273560;100.0 +25/10/2020 02:06:00;U878.TI76_PV.F_CV;10.600000381;100.0 +25/10/2020 02:06:03;U878.TI76_PV.F_CV;10.699999809;100.0 +25/10/2020 02:06:07;U878.TI76_PV.F_CV;10.699999809;100.0 +25/10/2020 02:06:08;U878.TI76_PV.F_CV;10.600000381;100.0 +25/10/2020 02:06:14;U878.TI76_PV.F_CV;10.600000381;100.0 +25/10/2020 02:06:15;U878.TI76_PV.F_CV;10.699999809;100.0 +25/10/2020 02:06:21;U878.TI76_PV.F_CV;10.500000000;100.0 +25/10/2020 02:06:23;U878.TI76_PV.F_CV;10.600000381;100.0 +25/10/2020 02:06:26;U878.TI76_PV.F_CV;10.699999809;100.0 +25/10/2020 02:06:30;U878.TI76_PV.F_CV;10.699999809;100.0 +25/10/2020 02:06:31;U878.TI76_PV.F_CV;10.600000381;100.0 +25/10/2020 02:06:34;U878.TI76_PV.F_CV;10.500000000;100.0 +25/10/2020 02:06:38;U878.TI76_PV.F_CV;10.500000000;100.0 +25/10/2020 02:06:39;U878.TI76_PV.F_CV;10.600000381;100.0 +25/10/2020 02:06:43;U878.TI76_PV.F_CV;10.600000381;100.0 +25/10/2020 02:06:44;U878.TI76_PV.F_CV;10.699999809;100.0 +25/10/2020 02:06:50;U878.TI76_PV.F_CV;10.500000000;100.0 +25/10/2020 02:06:56;U878.TI76_PV.F_CV;10.500000000;100.0 +25/10/2020 02:06:57;U878.TI76_PV.F_CV;10.600000381;100.0 +25/10/2020 02:06:00;U878.TI82_PV.F_CV;10.699999809;100.0 +25/10/2020 02:06:04;U878.TI82_PV.F_CV;10.699999809;100.0 +25/10/2020 02:06:05;U878.TI82_PV.F_CV;10.800000191;100.0 +25/10/2020 02:06:12;U878.TI82_PV.F_CV;10.800000191;100.0 +25/10/2020 02:06:13;U878.TI82_PV.F_CV;10.699999809;100.0 +25/10/2020 02:06:16;U878.TI82_PV.F_CV;10.800000191;100.0 +25/10/2020 02:06:20;U878.TI82_PV.F_CV;10.800000191;100.0 +25/10/2020 02:06:21;U878.TI82_PV.F_CV;10.600000381;100.0 +25/10/2020 02:06:24;U878.TI82_PV.F_CV;10.800000191;100.0 +25/10/2020 02:06:28;U878.TI82_PV.F_CV;10.800000191;100.0 +25/10/2020 02:06:29;U878.TI82_PV.F_CV;10.899999619;100.0 +25/10/2020 02:06:31;U878.TI82_PV.F_CV;10.800000191;100.0 +25/10/2020 02:06:36;U878.TI82_PV.F_CV;10.800000191;100.0 +25/10/2020 02:06:37;U878.TI82_PV.F_CV;10.899999619;100.0 +25/10/2020 02:06:41;U878.TI82_PV.F_CV;10.899999619;100.0 +25/10/2020 02:06:42;U878.TI82_PV.F_CV;10.800000191;100.0 +25/10/2020 02:06:46;U878.TI82_PV.F_CV;10.800000191;100.0 +25/10/2020 02:06:47;U878.TI82_PV.F_CV;10.699999809;100.0 +25/10/2020 02:06:50;U878.TI82_PV.F_CV;10.800000191;100.0 +25/10/2020 02:06:53;U878.TI82_PV.F_CV;10.699999809;100.0 +25/10/2020 02:06:55;U878.TI82_PV.F_CV;10.800000191;100.0 +25/10/2020 02:06:58;U878.TI82_PV.F_CV;10.899999619;100.0 +25/10/2020 02:06:15;U878.WI01_PV.F_CV;4742.765136719;100.0 +25/10/2020 02:06:53;U878.WI01_PV.F_CV;4742.694335938;100.0 +25/10/2020 02:06:32;U878.WI02_PV.F_CV;88.599998474;100.0 +25/10/2020 02:06:03;U878.WI03_PV.F_CV;7.400000095;100.0 +25/10/2020 02:06:21;U878.WI03_PV.F_CV;7.500000000;100.0 +25/10/2020 02:06:28;U878.WI03_PV.F_CV;7.400000095;100.0 +25/10/2020 02:06:31;U878.WI03_PV.F_CV;7.500000000;100.0 +25/10/2020 02:06:37;U878.WI03_PV.F_CV;7.400000095;100.0 +25/10/2020 02:06:00;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:01;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:02;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:03;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:04;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:05;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:06;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:07;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:08;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:09;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:10;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:11;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:12;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:13;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:14;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:15;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:16;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:17;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:18;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:19;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:20;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:21;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:22;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:23;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:24;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:25;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:26;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:27;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:28;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:29;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:30;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:31;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:32;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:33;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:34;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:35;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:36;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:37;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:38;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:39;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:40;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:41;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:42;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:43;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:44;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:45;U878.WI04_PV.F_CV;-0.332767993;100.0 +25/10/2020 02:06:46;U878.WI04_PV.F_CV;-0.310737431;100.0 +25/10/2020 02:06:47;U878.WI04_PV.F_CV;-0.352318436;100.0 +25/10/2020 02:06:48;U878.WI04_PV.F_CV;-0.384375721;100.0 +25/10/2020 02:06:49;U878.WI04_PV.F_CV;-0.394880265;100.0 +25/10/2020 02:06:50;U878.WI04_PV.F_CV;-0.398322344;100.0 +25/10/2020 02:06:51;U878.WI04_PV.F_CV;-0.399450272;100.0 +25/10/2020 02:06:52;U878.WI04_PV.F_CV;-0.399819851;100.0 +25/10/2020 02:06:53;U878.WI04_PV.F_CV;-0.399940968;100.0 +25/10/2020 02:06:54;U878.WI04_PV.F_CV;-0.399980664;100.0 +25/10/2020 02:06:55;U878.WI04_PV.F_CV;-0.399993658;100.0 +25/10/2020 02:06:56;U878.WI04_PV.F_CV;-0.399997920;100.0 +25/10/2020 02:06:57;U878.WI04_PV.F_CV;-0.399999321;100.0 +25/10/2020 02:06:58;U878.WI04_PV.F_CV;-0.399999797;100.0 +25/10/2020 02:06:59;U878.WI04_PV.F_CV;-0.399999946;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_LAST_DATE_A_R2.F_CV;44128.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_LAST_DATE_B_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_LAST_DATE_B_R2.F_CV;44128.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_LAST_DATE_C_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_LAST_DATE_C_R2.F_CV;44128.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_LAST_DATE_D_R1.F_CV;44124.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_LAST_DATE_D_R2.F_CV;44124.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_LAST_DATE_E_R1.F_CV;44129.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_LAST_DATE_E_R2.F_CV;44129.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_LAST_DATE_F_R1.F_CV;44127.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_LAST_DATE_F_R2.F_CV;44127.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_LAST_TIME_A_R1.F_CV;0.290833324;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_LAST_TIME_A_R2.F_CV;0.182152778;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_LAST_TIME_B_R1.F_CV;0.204108804;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_LAST_TIME_B_R2.F_CV;0.225983784;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_LAST_TIME_C_R1.F_CV;0.247499987;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_LAST_TIME_C_R2.F_CV;0.269687504;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_LAST_TIME_D_R1.F_CV;0.448067129;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_LAST_TIME_D_R2.F_CV;0.375717610;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_LAST_TIME_E_R1.F_CV;0.041689817;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_LAST_TIME_E_R2.F_CV;0.020590279;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_LAST_TIME_F_R1.F_CV;0.248356476;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_LAST_TIME_F_R2.F_CV;0.184629634;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_METHOD_USED_A_R1.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_METHOD_USED_A_R2.F_CV;2.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_METHOD_USED_B_R1.F_CV;3.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_METHOD_USED_B_R2.F_CV;4.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_METHOD_USED_C_R1.F_CV;5.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_METHOD_USED_C_R2.F_CV;6.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_METHOD_USED_D_R1.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_METHOD_USED_D_R2.F_CV;2.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_METHOD_USED_E_R1.F_CV;3.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_METHOD_USED_E_R2.F_CV;4.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_METHOD_USED_F_R1.F_CV;5.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_METHOD_USED_F_R2.F_CV;6.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_10_A_R1.F_CV;0.044000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_10_A_R2.F_CV;0.010000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_10_B_R1.F_CV;0.013000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_10_B_R2.F_CV;0.008000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_10_C_R1.F_CV;0.006000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_10_C_R2.F_CV;0.006000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_10_D_R1.F_CV;0.020000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_10_D_R2.F_CV;0.133000001;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_10_E_R1.F_CV;0.002000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_10_E_R2.F_CV;0.002000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_10_F_R1.F_CV;0.004000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_10_F_R2.F_CV;0.093000002;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_11_A_R1.F_CV;94.663002014;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_11_A_R2.F_CV;93.930999756;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_11_B_R1.F_CV;95.197998047;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_11_B_R2.F_CV;94.111999512;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_11_C_R1.F_CV;94.984001160;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_11_C_R2.F_CV;94.984001160;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_11_D_R1.F_CV;95.787002563;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_11_D_R2.F_CV;96.427001953;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_11_E_R1.F_CV;93.471000671;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_11_E_R2.F_CV;91.829002380;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_11_F_R1.F_CV;94.225997925;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_11_F_R2.F_CV;94.019996643;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_12_A_R1.F_CV;2.062999964;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_12_A_R2.F_CV;0.904999971;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_12_B_R1.F_CV;0.546000004;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_12_B_R2.F_CV;0.893000007;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_12_C_R1.F_CV;0.351000011;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_12_C_R2.F_CV;0.351000011;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_12_D_R1.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_12_D_R2.F_CV;0.658999979;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_12_E_R1.F_CV;0.020000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_12_E_R2.F_CV;0.024000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_12_F_R1.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_12_F_R2.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_1_A_R1.F_CV;0.999000013;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_1_A_R2.F_CV;0.990000010;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_1_B_R1.F_CV;0.591000021;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_1_B_R2.F_CV;0.949000001;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_1_C_R1.F_CV;0.430999994;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_1_C_R2.F_CV;0.430999994;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_1_D_R1.F_CV;0.486000001;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_1_D_R2.F_CV;0.368000001;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_1_E_R1.F_CV;0.008000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_1_E_R2.F_CV;0.008000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_1_F_R1.F_CV;0.006000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_1_F_R2.F_CV;0.008000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_2_A_R1.F_CV;0.048999999;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_2_A_R2.F_CV;0.059999999;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_2_B_R1.F_CV;0.046000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_2_B_R2.F_CV;0.103000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_2_C_R1.F_CV;0.055000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_2_C_R2.F_CV;0.055000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_2_D_R1.F_CV;0.035999998;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_2_D_R2.F_CV;0.035999998;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_2_E_R1.F_CV;0.022000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_2_E_R2.F_CV;0.025000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_2_F_R1.F_CV;0.015000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_2_F_R2.F_CV;0.020000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_3_A_R1.F_CV;0.187000006;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_3_A_R2.F_CV;0.317999989;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_3_B_R1.F_CV;0.239999995;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_3_B_R2.F_CV;0.391000003;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_3_C_R1.F_CV;0.230000004;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_3_C_R2.F_CV;0.230000004;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_3_D_R1.F_CV;0.231000006;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_3_D_R2.F_CV;0.181999996;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_3_E_R1.F_CV;0.397000015;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_3_E_R2.F_CV;0.463999987;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_3_F_R1.F_CV;0.282999992;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_3_F_R2.F_CV;0.344000012;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_4_A_R1.F_CV;0.316000015;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_4_A_R2.F_CV;0.542999983;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_4_B_R1.F_CV;0.455000013;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_4_B_R2.F_CV;0.563000023;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_4_C_R1.F_CV;0.411000013;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_4_C_R2.F_CV;0.411000013;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_4_D_R1.F_CV;0.405999988;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_4_D_R2.F_CV;0.277000010;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_4_E_R1.F_CV;1.646999955;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_4_E_R2.F_CV;1.799000025;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_4_F_R1.F_CV;1.223999977;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_4_F_R2.F_CV;1.379999995;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_5_A_R1.F_CV;0.207000002;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_5_A_R2.F_CV;0.356999993;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_5_B_R1.F_CV;0.275999993;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_5_B_R2.F_CV;0.421000004;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_5_C_R1.F_CV;0.259000003;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_5_C_R2.F_CV;0.259000003;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_5_D_R1.F_CV;0.222000003;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_5_D_R2.F_CV;0.175999999;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_5_E_R1.F_CV;0.425000012;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_5_E_R2.F_CV;0.486999989;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_5_F_R1.F_CV;0.298999995;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_5_F_R2.F_CV;0.365999997;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_6_A_R1.F_CV;0.321000010;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_6_A_R2.F_CV;0.559000015;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_6_B_R1.F_CV;0.465000004;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_6_B_R2.F_CV;0.588999987;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_6_C_R1.F_CV;0.421000004;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_6_C_R2.F_CV;0.421000004;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_6_D_R1.F_CV;0.395999998;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_6_D_R2.F_CV;0.282000005;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_6_E_R1.F_CV;1.398000002;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_6_E_R2.F_CV;1.707999945;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_6_F_R1.F_CV;1.029999971;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_6_F_R2.F_CV;1.240000010;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_7_A_R1.F_CV;0.148000002;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_7_A_R2.F_CV;0.264999986;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_7_B_R1.F_CV;0.202000007;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_7_B_R2.F_CV;0.296999991;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_7_C_R1.F_CV;0.186000004;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_7_C_R2.F_CV;0.186000004;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_7_D_R1.F_CV;0.125000000;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_7_D_R2.F_CV;0.098999999;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_7_E_R1.F_CV;0.195999995;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_7_E_R2.F_CV;0.246999994;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_7_F_R1.F_CV;0.163000003;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_7_F_R2.F_CV;0.193000004;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_8_A_R1.F_CV;0.896000028;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_8_A_R2.F_CV;1.343999982;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_8_B_R1.F_CV;1.042000055;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_8_B_R2.F_CV;1.338000059;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_8_C_R1.F_CV;1.050999999;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_8_C_R2.F_CV;1.050999999;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_8_D_R1.F_CV;0.825999975;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_8_D_R2.F_CV;0.602999985;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_8_E_R1.F_CV;1.335000038;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_8_E_R2.F_CV;1.924000025;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_8_F_R1.F_CV;1.269000053;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_8_F_R2.F_CV;1.391000032;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_9_A_R1.F_CV;0.370999992;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_9_A_R2.F_CV;0.175999999;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_9_B_R1.F_CV;0.250999987;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_9_B_R2.F_CV;0.177000001;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_9_C_R1.F_CV;0.266000003;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_9_C_R2.F_CV;0.266000003;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_9_D_R1.F_CV;0.268000007;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_9_D_R2.F_CV;0.363999993;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_9_E_R1.F_CV;0.101000004;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_9_E_R2.F_CV;0.177000001;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_9_F_R1.F_CV;0.194999993;100.0 +25/10/2020 02:06:00;U879.BILAN_GC_RAW_9_F_R2.F_CV;0.141000003;100.0 +25/10/2020 02:06:00;U879.BILAN_LAST_DATE_A_R1.F_CV;44123.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_LAST_DATE_A_R2.F_CV;44123.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_LAST_DATE_B_R1.F_CV;44123.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_LAST_DATE_B_R2.F_CV;44123.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_LAST_DATE_C_R1.F_CV;44123.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_LAST_DATE_C_R2.F_CV;44123.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_LAST_DATE_D_R1.F_CV;44123.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_LAST_DATE_D_R2.F_CV;44123.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_LAST_DATE_E_R1.F_CV;44127.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_LAST_DATE_E_R2.F_CV;44127.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_LAST_DATE_F_R1.F_CV;44127.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_LAST_DATE_F_R2.F_CV;44127.000000000;100.0 +25/10/2020 02:06:00;U879.BILAN_LAST_TIME_A_R1.F_CV;0.128356487;100.0 +25/10/2020 02:06:00;U879.BILAN_LAST_TIME_A_R2.F_CV;0.127766207;100.0 +25/10/2020 02:06:00;U879.BILAN_LAST_TIME_B_R1.F_CV;0.128356487;100.0 +25/10/2020 02:06:00;U879.BILAN_LAST_TIME_B_R2.F_CV;0.127766207;100.0 +25/10/2020 02:06:00;U879.BILAN_LAST_TIME_C_R1.F_CV;0.128090292;100.0 +25/10/2020 02:06:00;U879.BILAN_LAST_TIME_C_R2.F_CV;0.128217593;100.0 +25/10/2020 02:06:00;U879.BILAN_LAST_TIME_D_R1.F_CV;0.124502324;100.0 +25/10/2020 02:06:00;U879.BILAN_LAST_TIME_D_R2.F_CV;0.124606490;100.0 +25/10/2020 02:06:00;U879.BILAN_LAST_TIME_E_R1.F_CV;0.124791674;100.0 +25/10/2020 02:06:00;U879.BILAN_LAST_TIME_E_R2.F_CV;0.124270834;100.0 +25/10/2020 02:06:00;U879.BILAN_LAST_TIME_F_R1.F_CV;0.124375008;100.0 +25/10/2020 02:06:00;U879.BILAN_LAST_TIME_F_R2.F_CV;0.124479175;100.0 +25/10/2020 02:06:00;U879.BILAN_RUN_TIME_A_R1.F_CV;0.833495378;100.0 +25/10/2020 02:06:00;U879.BILAN_RUN_TIME_A_R2.F_CV;0.833495378;100.0 +25/10/2020 02:06:00;U879.BILAN_RUN_TIME_B_R1.F_CV;0.833495378;100.0 +25/10/2020 02:06:00;U879.BILAN_RUN_TIME_B_R2.F_CV;0.833495378;100.0 +25/10/2020 02:06:00;U879.BILAN_RUN_TIME_C_R1.F_CV;0.833495378;100.0 +25/10/2020 02:06:00;U879.BILAN_RUN_TIME_C_R2.F_CV;0.833495378;100.0 +25/10/2020 02:06:00;U879.BILAN_RUN_TIME_D_R1.F_CV;0.833495378;100.0 +25/10/2020 02:06:00;U879.BILAN_RUN_TIME_D_R2.F_CV;0.833483815;100.0 +25/10/2020 02:06:00;U879.BILAN_RUN_TIME_E_R1.F_CV;0.708483815;100.0 +25/10/2020 02:06:00;U879.BILAN_RUN_TIME_E_R2.F_CV;0.708483815;100.0 +25/10/2020 02:06:00;U879.BILAN_RUN_TIME_F_R1.F_CV;0.708483815;100.0 +25/10/2020 02:06:00;U879.BILAN_RUN_TIME_F_R2.F_CV;0.708472252;100.0 +25/10/2020 02:06:03;U879.FC120A_PV.F_CV;45.487136841;100.0 +25/10/2020 02:06:17;U879.FC120A_PV.F_CV;45.179821014;100.0 +25/10/2020 02:06:25;U879.FC120A_PV.F_CV;45.294097900;100.0 +25/10/2020 02:06:29;U879.FC120A_PV.F_CV;45.183998108;100.0 +25/10/2020 02:06:34;U879.FC120A_PV.F_CV;45.711830139;100.0 +25/10/2020 02:06:57;U879.FC120A_PV.F_CV;45.268249512;100.0 +25/10/2020 02:06:59;U879.FC120A_PV.F_CV;45.378227234;100.0 +25/10/2020 02:06:23;U879.FC120A_SP.F_CV;45.299999237;100.0 +25/10/2020 02:06:05;U879.FC120B_PV.F_CV;44.671669006;100.0 +25/10/2020 02:06:18;U879.FC120B_PV.F_CV;44.776050568;100.0 +25/10/2020 02:06:20;U879.FC120B_PV.F_CV;44.922721863;100.0 +25/10/2020 02:06:36;U879.FC120B_PV.F_CV;44.646533966;100.0 +25/10/2020 02:06:40;U879.FC120B_PV.F_CV;44.882892609;100.0 +25/10/2020 02:06:56;U879.FC120B_PV.F_CV;44.570274353;100.0 +25/10/2020 02:06:23;U879.FC120B_SP.F_CV;44.700000763;100.0 +25/10/2020 02:06:00;U879.FC120C_PV.F_CV;22.335453033;100.0 +25/10/2020 02:06:01;U879.FC120C_PV.F_CV;22.804985046;100.0 +25/10/2020 02:06:07;U879.FC120C_PV.F_CV;22.033153534;100.0 +25/10/2020 02:06:11;U879.FC120C_PV.F_CV;22.033153534;100.0 +25/10/2020 02:06:12;U879.FC120C_PV.F_CV;22.482505798;100.0 +25/10/2020 02:06:15;U879.FC120C_PV.F_CV;23.071662903;100.0 +25/10/2020 02:06:19;U879.FC120C_PV.F_CV;22.375793457;100.0 +25/10/2020 02:06:21;U879.FC120C_PV.F_CV;22.232112885;100.0 +25/10/2020 02:06:25;U879.FC120C_PV.F_CV;22.505619049;100.0 +25/10/2020 02:06:28;U879.FC120C_PV.F_CV;23.397239685;100.0 +25/10/2020 02:06:32;U879.FC120C_PV.F_CV;23.129291534;100.0 +25/10/2020 02:06:36;U879.FC120C_PV.F_CV;22.610988617;100.0 +25/10/2020 02:06:39;U879.FC120C_PV.F_CV;23.505794525;100.0 +25/10/2020 02:06:40;U879.FC120C_PV.F_CV;23.072868347;100.0 +25/10/2020 02:06:43;U879.FC120C_PV.F_CV;22.367931366;100.0 +25/10/2020 02:06:46;U879.FC120C_PV.F_CV;22.121049881;100.0 +25/10/2020 02:06:49;U879.FC120C_PV.F_CV;22.227920532;100.0 +25/10/2020 02:06:51;U879.FC120C_PV.F_CV;22.113655090;100.0 +25/10/2020 02:06:53;U879.FC120C_PV.F_CV;22.305423737;100.0 +25/10/2020 02:06:59;U879.FC120C_PV.F_CV;22.305423737;100.0 +25/10/2020 02:06:23;U879.FC120C_SP.F_CV;22.540000916;100.0 +25/10/2020 02:06:05;U879.FC120D_PV.F_CV;-0.127069533;100.0 +25/10/2020 02:06:12;U879.FC120D_PV.F_CV;-0.415539801;100.0 +25/10/2020 02:06:24;U879.FC120D_PV.F_CV;0.011870608;100.0 +25/10/2020 02:06:37;U879.FC120D_PV.F_CV;-0.289939642;100.0 +25/10/2020 02:06:43;U879.FC120D_PV.F_CV;-0.168580651;100.0 +25/10/2020 02:06:49;U879.FC120D_PV.F_CV;0.267248422;100.0 +25/10/2020 02:06:57;U879.FC120D_PV.F_CV;0.019244678;100.0 +25/10/2020 02:06:58;U879.FC120D_PV.F_CV;0.194178641;100.0 +25/10/2020 02:06:23;U879.FC120D_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U879.FC120E_PV.F_CV;36.376647949;100.0 +25/10/2020 02:06:19;U879.FC120E_PV.F_CV;36.610118866;100.0 +25/10/2020 02:06:35;U879.FC120E_PV.F_CV;36.111640930;100.0 +25/10/2020 02:06:45;U879.FC120E_PV.F_CV;36.596374512;100.0 +25/10/2020 02:06:56;U879.FC120E_PV.F_CV;36.387744904;100.0 +25/10/2020 02:06:59;U879.FC120E_PV.F_CV;36.268089294;100.0 +25/10/2020 02:06:23;U879.FC120E_SP.F_CV;36.400001526;100.0 +25/10/2020 02:06:29;U879.FC120F_PV.F_CV;-0.428676903;100.0 +25/10/2020 02:06:45;U879.FC120F_PV.F_CV;-0.544655204;100.0 +25/10/2020 02:06:23;U879.FC120F_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U879.FC130A_PV.F_CV;0.089500003;100.0 +25/10/2020 02:06:23;U879.FC130A_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U879.FC130B_PV.F_CV;0.140738994;100.0 +25/10/2020 02:06:23;U879.FC130B_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U879.FC130C_PV.F_CV;0.016500000;100.0 +25/10/2020 02:06:23;U879.FC130C_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U879.FC130D_PV.F_CV;-0.058600001;100.0 +25/10/2020 02:06:23;U879.FC130D_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U879.FC130E_PV.F_CV;-2.894900084;100.0 +25/10/2020 02:06:23;U879.FC130E_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U879.FC130F_PV.F_CV;-0.168300003;100.0 +25/10/2020 02:06:23;U879.FC130F_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U879.FC131A_PV.F_CV;78.491950989;100.0 +25/10/2020 02:06:23;U879.FC131A_SP.F_CV;78.500000000;100.0 +25/10/2020 02:06:23;U879.FC131B_PV.F_CV;69.017684937;100.0 +25/10/2020 02:06:23;U879.FC131B_SP.F_CV;69.000000000;100.0 +25/10/2020 02:06:23;U879.FC131C_PV.F_CV;36.496143341;100.0 +25/10/2020 02:06:23;U879.FC131C_SP.F_CV;36.500000000;100.0 +25/10/2020 02:06:23;U879.FC131D_PV.F_CV;99.999778748;100.0 +25/10/2020 02:06:23;U879.FC131D_SP.F_CV;100.000000000;100.0 +25/10/2020 02:06:23;U879.FC131E_PV.F_CV;54.001838684;100.0 +25/10/2020 02:06:23;U879.FC131E_SP.F_CV;54.000000000;100.0 +25/10/2020 02:06:49;U879.FC131F_PV.F_CV;100.012924194;100.0 +25/10/2020 02:06:23;U879.FC131F_SP.F_CV;100.000000000;100.0 +25/10/2020 02:06:23;U879.FC140A_PV.F_CV;4.999615669;100.0 +25/10/2020 02:06:23;U879.FC140A_SP.F_CV;5.000000000;100.0 +25/10/2020 02:06:23;U879.FC140B_PV.F_CV;4.997304916;100.0 +25/10/2020 02:06:23;U879.FC140B_SP.F_CV;5.000000000;100.0 +25/10/2020 02:06:28;U879.FC140C_PV.F_CV;4.999603271;100.0 +25/10/2020 02:06:00;U879.FC140C_SP.F_CV;5.000000000;100.0 +25/10/2020 02:06:23;U879.FC140D_PV.F_CV;5.001110554;100.0 +25/10/2020 02:06:23;U879.FC140D_SP.F_CV;5.000000000;100.0 +25/10/2020 02:06:23;U879.FC140E_PV.F_CV;4.998015404;100.0 +25/10/2020 02:06:23;U879.FC140E_SP.F_CV;5.000000000;100.0 +25/10/2020 02:06:23;U879.FC140F_PV.F_CV;4.998974800;100.0 +25/10/2020 02:06:00;U879.FC140F_SP.F_CV;5.000000000;100.0 +25/10/2020 02:06:03;U879.FC170_PV.F_CV;0.043043975;100.0 +25/10/2020 02:06:06;U879.FC170_PV.F_CV;0.012261996;100.0 +25/10/2020 02:06:10;U879.FC170_PV.F_CV;0.057220899;100.0 +25/10/2020 02:06:14;U879.FC170_PV.F_CV;0.040208850;100.0 +25/10/2020 02:06:16;U879.FC170_PV.F_CV;0.055949371;100.0 +25/10/2020 02:06:18;U879.FC170_PV.F_CV;0.043136884;100.0 +25/10/2020 02:06:20;U879.FC170_PV.F_CV;0.058132384;100.0 +25/10/2020 02:06:22;U879.FC170_PV.F_CV;0.043607365;100.0 +25/10/2020 02:06:29;U879.FC170_PV.F_CV;0.058548018;100.0 +25/10/2020 02:06:30;U879.FC170_PV.F_CV;0.077323362;100.0 +25/10/2020 02:06:37;U879.FC170_PV.F_CV;0.043917265;100.0 +25/10/2020 02:06:45;U879.FC170_PV.F_CV;0.033289082;100.0 +25/10/2020 02:06:50;U879.FC170_PV.F_CV;0.051216241;100.0 +25/10/2020 02:06:23;U879.FC170_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U879.FC220A_PV.F_CV;45.269504547;100.0 +25/10/2020 02:06:02;U879.FC220A_PV.F_CV;45.692962646;100.0 +25/10/2020 02:06:03;U879.FC220A_PV.F_CV;45.904693604;100.0 +25/10/2020 02:06:05;U879.FC220A_PV.F_CV;45.381843567;100.0 +25/10/2020 02:06:06;U879.FC220A_PV.F_CV;45.201358795;100.0 +25/10/2020 02:06:12;U879.FC220A_PV.F_CV;45.360870361;100.0 +25/10/2020 02:06:16;U879.FC220A_PV.F_CV;45.705539703;100.0 +25/10/2020 02:06:17;U879.FC220A_PV.F_CV;45.964088440;100.0 +25/10/2020 02:06:19;U879.FC220A_PV.F_CV;45.395042419;100.0 +25/10/2020 02:06:21;U879.FC220A_PV.F_CV;45.144149780;100.0 +25/10/2020 02:06:28;U879.FC220A_PV.F_CV;45.248214722;100.0 +25/10/2020 02:06:33;U879.FC220A_PV.F_CV;45.932277679;100.0 +25/10/2020 02:06:37;U879.FC220A_PV.F_CV;45.203624725;100.0 +25/10/2020 02:06:45;U879.FC220A_PV.F_CV;45.362201691;100.0 +25/10/2020 02:06:48;U879.FC220A_PV.F_CV;45.833152771;100.0 +25/10/2020 02:06:53;U879.FC220A_PV.F_CV;44.944847107;100.0 +25/10/2020 02:06:57;U879.FC220A_PV.F_CV;45.726875305;100.0 +25/10/2020 02:06:23;U879.FC220A_SP.F_CV;45.299999237;100.0 +25/10/2020 02:06:02;U879.FC220B_PV.F_CV;44.861282349;100.0 +25/10/2020 02:06:09;U879.FC220B_PV.F_CV;44.619667053;100.0 +25/10/2020 02:06:12;U879.FC220B_PV.F_CV;44.749618530;100.0 +25/10/2020 02:06:18;U879.FC220B_PV.F_CV;44.358287811;100.0 +25/10/2020 02:06:21;U879.FC220B_PV.F_CV;44.030281067;100.0 +25/10/2020 02:06:26;U879.FC220B_PV.F_CV;44.511390686;100.0 +25/10/2020 02:06:30;U879.FC220B_PV.F_CV;45.340595245;100.0 +25/10/2020 02:06:32;U879.FC220B_PV.F_CV;46.020538330;100.0 +25/10/2020 02:06:33;U879.FC220B_PV.F_CV;46.279586792;100.0 +25/10/2020 02:06:34;U879.FC220B_PV.F_CV;50.095596313;100.0 +25/10/2020 02:06:35;U879.FC220B_PV.F_CV;52.003601074;100.0 +25/10/2020 02:06:38;U879.FC220B_PV.F_CV;49.545803070;100.0 +25/10/2020 02:06:40;U879.FC220B_PV.F_CV;47.904415131;100.0 +25/10/2020 02:06:44;U879.FC220B_PV.F_CV;46.587837219;100.0 +25/10/2020 02:06:48;U879.FC220B_PV.F_CV;45.909294128;100.0 +25/10/2020 02:06:23;U879.FC220B_SP.F_CV;44.700000763;100.0 +25/10/2020 02:06:00;U879.FC220C_PV.F_CV;46.030925751;100.0 +25/10/2020 02:06:01;U879.FC220C_PV.F_CV;44.158473969;100.0 +25/10/2020 02:06:02;U879.FC220C_PV.F_CV;45.421661377;100.0 +25/10/2020 02:06:03;U879.FC220C_PV.F_CV;46.053256989;100.0 +25/10/2020 02:06:05;U879.FC220C_PV.F_CV;45.702880859;100.0 +25/10/2020 02:06:10;U879.FC220C_PV.F_CV;45.141906738;100.0 +25/10/2020 02:06:11;U879.FC220C_PV.F_CV;44.888694763;100.0 +25/10/2020 02:06:12;U879.FC220C_PV.F_CV;46.561363220;100.0 +25/10/2020 02:06:13;U879.FC220C_PV.F_CV;47.397697449;100.0 +25/10/2020 02:06:15;U879.FC220C_PV.F_CV;44.292251587;100.0 +25/10/2020 02:06:16;U879.FC220C_PV.F_CV;47.066726685;100.0 +25/10/2020 02:06:17;U879.FC220C_PV.F_CV;48.453964233;100.0 +25/10/2020 02:06:18;U879.FC220C_PV.F_CV;47.659637451;100.0 +25/10/2020 02:06:19;U879.FC220C_PV.F_CV;47.262474060;100.0 +25/10/2020 02:06:20;U879.FC220C_PV.F_CV;44.118850708;100.0 +25/10/2020 02:06:21;U879.FC220C_PV.F_CV;42.547042847;100.0 +25/10/2020 02:06:23;U879.FC220C_PV.F_CV;48.014415741;100.0 +25/10/2020 02:06:24;U879.FC220C_PV.F_CV;44.607830048;100.0 +25/10/2020 02:06:26;U879.FC220C_PV.F_CV;45.888854980;100.0 +25/10/2020 02:06:28;U879.FC220C_PV.F_CV;44.780246735;100.0 +25/10/2020 02:06:30;U879.FC220C_PV.F_CV;44.041511536;100.0 +25/10/2020 02:06:31;U879.FC220C_PV.F_CV;44.322334290;100.0 +25/10/2020 02:06:33;U879.FC220C_PV.F_CV;44.205780029;100.0 +25/10/2020 02:06:35;U879.FC220C_PV.F_CV;44.625473022;100.0 +25/10/2020 02:06:37;U879.FC220C_PV.F_CV;47.271240234;100.0 +25/10/2020 02:06:38;U879.FC220C_PV.F_CV;43.908699036;100.0 +25/10/2020 02:06:39;U879.FC220C_PV.F_CV;42.227432251;100.0 +25/10/2020 02:06:40;U879.FC220C_PV.F_CV;44.324611664;100.0 +25/10/2020 02:06:41;U879.FC220C_PV.F_CV;45.373199463;100.0 +25/10/2020 02:06:42;U879.FC220C_PV.F_CV;45.806545258;100.0 +25/10/2020 02:06:43;U879.FC220C_PV.F_CV;46.023216248;100.0 +25/10/2020 02:06:44;U879.FC220C_PV.F_CV;44.574695587;100.0 +25/10/2020 02:06:45;U879.FC220C_PV.F_CV;43.850433350;100.0 +25/10/2020 02:06:46;U879.FC220C_PV.F_CV;45.832069397;100.0 +25/10/2020 02:06:48;U879.FC220C_PV.F_CV;44.084938049;100.0 +25/10/2020 02:06:50;U879.FC220C_PV.F_CV;41.235351563;100.0 +25/10/2020 02:06:51;U879.FC220C_PV.F_CV;40.495040894;100.0 +25/10/2020 02:06:53;U879.FC220C_PV.F_CV;45.542304993;100.0 +25/10/2020 02:06:54;U879.FC220C_PV.F_CV;46.966674805;100.0 +25/10/2020 02:06:55;U879.FC220C_PV.F_CV;47.678859711;100.0 +25/10/2020 02:06:56;U879.FC220C_PV.F_CV;43.357089996;100.0 +25/10/2020 02:06:57;U879.FC220C_PV.F_CV;41.196205139;100.0 +25/10/2020 02:06:58;U879.FC220C_PV.F_CV;43.943546295;100.0 +25/10/2020 02:06:59;U879.FC220C_PV.F_CV;45.317214966;100.0 +25/10/2020 02:06:23;U879.FC220C_SP.F_CV;45.080001831;100.0 +25/10/2020 02:06:04;U879.FC220D_PV.F_CV;-0.359417617;100.0 +25/10/2020 02:06:14;U879.FC220D_PV.F_CV;-0.615620315;100.0 +25/10/2020 02:06:22;U879.FC220D_PV.F_CV;-0.505740881;100.0 +25/10/2020 02:06:37;U879.FC220D_PV.F_CV;-0.747242332;100.0 +25/10/2020 02:06:46;U879.FC220D_PV.F_CV;-0.639846385;100.0 +25/10/2020 02:06:23;U879.FC220D_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U879.FC220E_PV.F_CV;48.632789612;100.0 +25/10/2020 02:06:21;U879.FC220E_PV.F_CV;48.498481750;100.0 +25/10/2020 02:06:43;U879.FC220E_PV.F_CV;48.819396973;100.0 +25/10/2020 02:06:47;U879.FC220E_PV.F_CV;48.563987732;100.0 +25/10/2020 02:06:53;U879.FC220E_PV.F_CV;48.711639404;100.0 +25/10/2020 02:06:58;U879.FC220E_PV.F_CV;48.606910706;100.0 +25/10/2020 02:06:23;U879.FC220E_SP.F_CV;48.599998474;100.0 +25/10/2020 02:06:21;U879.FC220F_PV.F_CV;-0.466465861;100.0 +25/10/2020 02:06:43;U879.FC220F_PV.F_CV;-0.573005736;100.0 +25/10/2020 02:06:23;U879.FC220F_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U879.FC230A_PV.F_CV;0.046839029;100.0 +25/10/2020 02:06:23;U879.FC230A_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U879.FC230B_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U879.FC230B_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U879.FC230C_PV.F_CV;1.100000024;100.0 +25/10/2020 02:06:23;U879.FC230C_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U879.FC230D_PV.F_CV;0.056901742;100.0 +25/10/2020 02:06:23;U879.FC230D_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U879.FC230E_PV.F_CV;0.024067603;100.0 +25/10/2020 02:06:23;U879.FC230E_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U879.FC230F_PV.F_CV;1.227200031;100.0 +25/10/2020 02:06:23;U879.FC230F_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U879.FC231A_PV.F_CV;74.513420105;100.0 +25/10/2020 02:06:23;U879.FC231A_SP.F_CV;74.500000000;100.0 +25/10/2020 02:06:00;U879.FC231B_PV.F_CV;44.990829468;100.0 +25/10/2020 02:06:23;U879.FC231B_SP.F_CV;45.000000000;100.0 +25/10/2020 02:06:23;U879.FC231C_PV.F_CV;69.984252930;100.0 +25/10/2020 02:06:23;U879.FC231C_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.FC231D_PV.F_CV;100.019996643;100.0 +25/10/2020 02:06:23;U879.FC231D_SP.F_CV;100.000000000;100.0 +25/10/2020 02:06:47;U879.FC231E_PV.F_CV;73.963470459;100.0 +25/10/2020 02:06:23;U879.FC231E_SP.F_CV;74.000000000;100.0 +25/10/2020 02:06:23;U879.FC231F_PV.F_CV;99.999954224;100.0 +25/10/2020 02:06:23;U879.FC231F_SP.F_CV;100.000000000;100.0 +25/10/2020 02:06:23;U879.FC240A_PV.F_CV;5.001585007;100.0 +25/10/2020 02:06:23;U879.FC240A_SP.F_CV;5.000000000;100.0 +25/10/2020 02:06:23;U879.FC240B_PV.F_CV;4.999989033;100.0 +25/10/2020 02:06:23;U879.FC240B_SP.F_CV;5.000000000;100.0 +25/10/2020 02:06:23;U879.FC240C_PV.F_CV;4.999104500;100.0 +25/10/2020 02:06:00;U879.FC240C_SP.F_CV;5.000000000;100.0 +25/10/2020 02:06:23;U879.FC240D_PV.F_CV;5.000417709;100.0 +25/10/2020 02:06:23;U879.FC240D_SP.F_CV;5.000000000;100.0 +25/10/2020 02:06:23;U879.FC240E_PV.F_CV;5.004904270;100.0 +25/10/2020 02:06:23;U879.FC240E_SP.F_CV;5.000000000;100.0 +25/10/2020 02:06:23;U879.FC240F_PV.F_CV;4.995034218;100.0 +25/10/2020 02:06:23;U879.FC240F_SP.F_CV;5.000000000;100.0 +25/10/2020 02:06:01;U879.FC270_PV.F_CV;1.323450565;100.0 +25/10/2020 02:06:04;U879.FC270_PV.F_CV;1.355689645;100.0 +25/10/2020 02:06:10;U879.FC270_PV.F_CV;1.332030416;100.0 +25/10/2020 02:06:14;U879.FC270_PV.F_CV;1.356668949;100.0 +25/10/2020 02:06:16;U879.FC270_PV.F_CV;1.318424702;100.0 +25/10/2020 02:06:18;U879.FC270_PV.F_CV;1.360293627;100.0 +25/10/2020 02:06:22;U879.FC270_PV.F_CV;1.296678305;100.0 +25/10/2020 02:06:24;U879.FC270_PV.F_CV;1.368665099;100.0 +25/10/2020 02:06:28;U879.FC270_PV.F_CV;1.297716141;100.0 +25/10/2020 02:06:35;U879.FC270_PV.F_CV;1.343620658;100.0 +25/10/2020 02:06:36;U879.FC270_PV.F_CV;1.357056975;100.0 +25/10/2020 02:06:38;U879.FC270_PV.F_CV;1.299903512;100.0 +25/10/2020 02:06:42;U879.FC270_PV.F_CV;1.314993858;100.0 +25/10/2020 02:06:45;U879.FC270_PV.F_CV;1.302324891;100.0 +25/10/2020 02:06:49;U879.FC270_PV.F_CV;1.313315749;100.0 +25/10/2020 02:06:50;U879.FC270_PV.F_CV;1.332061291;100.0 +25/10/2020 02:06:53;U879.FC270_PV.F_CV;1.318816662;100.0 +25/10/2020 02:06:58;U879.FC270_PV.F_CV;1.341461897;100.0 +25/10/2020 02:06:23;U879.FC270_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U879.FI144A_PV.F_CV;73.792495728;100.0 +25/10/2020 02:06:03;U879.FI144A_PV.F_CV;72.738075256;100.0 +25/10/2020 02:06:05;U879.FI144A_PV.F_CV;72.367095947;100.0 +25/10/2020 02:06:06;U879.FI144A_PV.F_CV;84.279884338;100.0 +25/10/2020 02:06:07;U879.FI144A_PV.F_CV;68.198310852;100.0 +25/10/2020 02:06:10;U879.FI144A_PV.F_CV;70.857948303;100.0 +25/10/2020 02:06:12;U879.FI144A_PV.F_CV;71.531486511;100.0 +25/10/2020 02:06:16;U879.FI144A_PV.F_CV;71.849212646;100.0 +25/10/2020 02:06:20;U879.FI144A_PV.F_CV;77.959259033;100.0 +25/10/2020 02:06:21;U879.FI144A_PV.F_CV;83.908668518;100.0 +25/10/2020 02:06:23;U879.FI144A_PV.F_CV;77.331802368;100.0 +25/10/2020 02:06:24;U879.FI144A_PV.F_CV;75.577972412;100.0 +25/10/2020 02:06:25;U879.FI144A_PV.F_CV;86.420471191;100.0 +25/10/2020 02:06:26;U879.FI144A_PV.F_CV;81.490600586;100.0 +25/10/2020 02:06:27;U879.FI144A_PV.F_CV;66.338783264;100.0 +25/10/2020 02:06:28;U879.FI144A_PV.F_CV;68.249290466;100.0 +25/10/2020 02:06:29;U879.FI144A_PV.F_CV;69.522964478;100.0 +25/10/2020 02:06:30;U879.FI144A_PV.F_CV;82.383796692;100.0 +25/10/2020 02:06:31;U879.FI144A_PV.F_CV;78.945968628;100.0 +25/10/2020 02:06:33;U879.FI144A_PV.F_CV;75.028503418;100.0 +25/10/2020 02:06:34;U879.FI144A_PV.F_CV;86.054161072;100.0 +25/10/2020 02:06:35;U879.FI144A_PV.F_CV;81.392875671;100.0 +25/10/2020 02:06:36;U879.FI144A_PV.F_CV;90.297073364;100.0 +25/10/2020 02:06:37;U879.FI144A_PV.F_CV;84.221488953;100.0 +25/10/2020 02:06:38;U879.FI144A_PV.F_CV;80.024612427;100.0 +25/10/2020 02:06:39;U879.FI144A_PV.F_CV;89.384895325;100.0 +25/10/2020 02:06:40;U879.FI144A_PV.F_CV;83.613365173;100.0 +25/10/2020 02:06:41;U879.FI144A_PV.F_CV;79.765678406;100.0 +25/10/2020 02:06:43;U879.FI144A_PV.F_CV;67.482658386;100.0 +25/10/2020 02:06:44;U879.FI144A_PV.F_CV;68.865394592;100.0 +25/10/2020 02:06:46;U879.FI144A_PV.F_CV;78.653717041;100.0 +25/10/2020 02:06:48;U879.FI144A_PV.F_CV;74.996269226;100.0 +25/10/2020 02:06:50;U879.FI144A_PV.F_CV;73.224250793;100.0 +25/10/2020 02:06:51;U879.FI144A_PV.F_CV;72.839607239;100.0 +25/10/2020 02:06:52;U879.FI144A_PV.F_CV;84.594894409;100.0 +25/10/2020 02:06:53;U879.FI144A_PV.F_CV;80.420036316;100.0 +25/10/2020 02:06:54;U879.FI144A_PV.F_CV;77.636795044;100.0 +25/10/2020 02:06:55;U879.FI144A_PV.F_CV;75.634819031;100.0 +25/10/2020 02:06:57;U879.FI144A_PV.F_CV;73.654533386;100.0 +25/10/2020 02:06:58;U879.FI144A_PV.F_CV;61.114742279;100.0 +25/10/2020 02:06:59;U879.FI144A_PV.F_CV;64.766601563;100.0 +25/10/2020 02:06:06;U879.FI144B_PV.F_CV;72.070404053;100.0 +25/10/2020 02:06:13;U879.FI144B_PV.F_CV;72.070404053;100.0 +25/10/2020 02:06:15;U879.FI144B_PV.F_CV;84.035995483;100.0 +25/10/2020 02:06:17;U879.FI144B_PV.F_CV;77.388389587;100.0 +25/10/2020 02:06:18;U879.FI144B_PV.F_CV;75.469215393;100.0 +25/10/2020 02:06:19;U879.FI144B_PV.F_CV;86.347969055;100.0 +25/10/2020 02:06:20;U879.FI144B_PV.F_CV;81.588752747;100.0 +25/10/2020 02:06:21;U879.FI144B_PV.F_CV;78.415939331;100.0 +25/10/2020 02:06:23;U879.FI144B_PV.F_CV;62.878868103;100.0 +25/10/2020 02:06:24;U879.FI144B_PV.F_CV;65.796195984;100.0 +25/10/2020 02:06:26;U879.FI144B_PV.F_CV;69.281814575;100.0 +25/10/2020 02:06:29;U879.FI144B_PV.F_CV;71.244087219;100.0 +25/10/2020 02:06:34;U879.FI144B_PV.F_CV;71.932571411;100.0 +25/10/2020 02:06:36;U879.FI144B_PV.F_CV;83.874328613;100.0 +25/10/2020 02:06:37;U879.FI144B_PV.F_CV;79.939659119;100.0 +25/10/2020 02:06:38;U879.FI144B_PV.F_CV;77.316543579;100.0 +25/10/2020 02:06:39;U879.FI144B_PV.F_CV;63.556079865;100.0 +25/10/2020 02:06:40;U879.FI144B_PV.F_CV;66.394157410;100.0 +25/10/2020 02:06:41;U879.FI144B_PV.F_CV;68.286209106;100.0 +25/10/2020 02:06:44;U879.FI144B_PV.F_CV;70.851440430;100.0 +25/10/2020 02:06:45;U879.FI144B_PV.F_CV;83.269447327;100.0 +25/10/2020 02:06:46;U879.FI144B_PV.F_CV;79.536399841;100.0 +25/10/2020 02:06:48;U879.FI144B_PV.F_CV;87.253807068;100.0 +25/10/2020 02:06:49;U879.FI144B_PV.F_CV;82.192642212;100.0 +25/10/2020 02:06:50;U879.FI144B_PV.F_CV;90.830253601;100.0 +25/10/2020 02:06:51;U879.FI144B_PV.F_CV;84.576942444;100.0 +25/10/2020 02:06:53;U879.FI144B_PV.F_CV;77.628814697;100.0 +25/10/2020 02:06:54;U879.FI144B_PV.F_CV;63.617778778;100.0 +25/10/2020 02:06:55;U879.FI144B_PV.F_CV;66.435287476;100.0 +25/10/2020 02:06:56;U879.FI144B_PV.F_CV;68.313629150;100.0 +25/10/2020 02:06:57;U879.FI144B_PV.F_CV;69.565856934;100.0 +25/10/2020 02:06:58;U879.FI144B_PV.F_CV;82.412391663;100.0 +25/10/2020 02:06:59;U879.FI144B_PV.F_CV;78.965034485;100.0 +25/10/2020 02:06:00;U879.FI144C_PV.F_CV;43.009494781;100.0 +25/10/2020 02:06:01;U879.FI144C_PV.F_CV;41.046035767;100.0 +25/10/2020 02:06:02;U879.FI144C_PV.F_CV;39.812969208;100.0 +25/10/2020 02:06:03;U879.FI144C_PV.F_CV;51.439872742;100.0 +25/10/2020 02:06:04;U879.FI144C_PV.F_CV;46.742195129;100.0 +25/10/2020 02:06:05;U879.FI144C_PV.F_CV;55.983444214;100.0 +25/10/2020 02:06:07;U879.FI144C_PV.F_CV;58.078716278;100.0 +25/10/2020 02:06:08;U879.FI144C_PV.F_CV;51.168090820;100.0 +25/10/2020 02:06:09;U879.FI144C_PV.F_CV;46.561004639;100.0 +25/10/2020 02:06:10;U879.FI144C_PV.F_CV;55.862651825;100.0 +25/10/2020 02:06:11;U879.FI144C_PV.F_CV;49.690711975;100.0 +25/10/2020 02:06:12;U879.FI144C_PV.F_CV;45.576084137;100.0 +25/10/2020 02:06:13;U879.FI144C_PV.F_CV;42.833000183;100.0 +25/10/2020 02:06:15;U879.FI144C_PV.F_CV;39.785129547;100.0 +25/10/2020 02:06:17;U879.FI144C_PV.F_CV;38.379917145;100.0 +25/10/2020 02:06:18;U879.FI144C_PV.F_CV;50.484500885;100.0 +25/10/2020 02:06:19;U879.FI144C_PV.F_CV;46.105278015;100.0 +25/10/2020 02:06:20;U879.FI144C_PV.F_CV;43.185794830;100.0 +25/10/2020 02:06:21;U879.FI144C_PV.F_CV;41.163566589;100.0 +25/10/2020 02:06:23;U879.FI144C_PV.F_CV;51.492103577;100.0 +25/10/2020 02:06:24;U879.FI144C_PV.F_CV;46.777011871;100.0 +25/10/2020 02:06:26;U879.FI144C_PV.F_CV;41.462116241;100.0 +25/10/2020 02:06:28;U879.FI144C_PV.F_CV;51.624790192;100.0 +25/10/2020 02:06:30;U879.FI144C_PV.F_CV;43.692592621;100.0 +25/10/2020 02:06:31;U879.FI144C_PV.F_CV;41.501434326;100.0 +25/10/2020 02:06:33;U879.FI144C_PV.F_CV;39.193321228;100.0 +25/10/2020 02:06:35;U879.FI144C_PV.F_CV;38.167491913;100.0 +25/10/2020 02:06:36;U879.FI144C_PV.F_CV;50.342884064;100.0 +25/10/2020 02:06:37;U879.FI144C_PV.F_CV;33.561923981;100.0 +25/10/2020 02:06:39;U879.FI144C_PV.F_CV;35.614048004;100.0 +25/10/2020 02:06:41;U879.FI144C_PV.F_CV;36.576705933;100.0 +25/10/2020 02:06:42;U879.FI144C_PV.F_CV;24.384471893;100.0 +25/10/2020 02:06:43;U879.FI144C_PV.F_CV;28.705259323;100.0 +25/10/2020 02:06:44;U879.FI144C_PV.F_CV;31.585783005;100.0 +25/10/2020 02:06:46;U879.FI144C_PV.F_CV;34.735763550;100.0 +25/10/2020 02:06:49;U879.FI144C_PV.F_CV;36.573184967;100.0 +25/10/2020 02:06:51;U879.FI144C_PV.F_CV;36.927082062;100.0 +25/10/2020 02:06:53;U879.FI144C_PV.F_CV;49.609218597;100.0 +25/10/2020 02:06:54;U879.FI144C_PV.F_CV;45.521755219;100.0 +25/10/2020 02:06:55;U879.FI144C_PV.F_CV;42.796783447;100.0 +25/10/2020 02:06:56;U879.FI144C_PV.F_CV;53.353168488;100.0 +25/10/2020 02:06:57;U879.FI144C_PV.F_CV;48.017723083;100.0 +25/10/2020 02:06:58;U879.FI144C_PV.F_CV;44.460762024;100.0 +25/10/2020 02:06:59;U879.FI144C_PV.F_CV;42.089450836;100.0 +25/10/2020 02:06:01;U879.FI144D_PV.F_CV;110.123771667;100.0 +25/10/2020 02:06:04;U879.FI144D_PV.F_CV;108.150100708;100.0 +25/10/2020 02:06:05;U879.FI144D_PV.F_CV;120.146942139;100.0 +25/10/2020 02:06:07;U879.FI144D_PV.F_CV;113.945518494;100.0 +25/10/2020 02:06:08;U879.FI144D_PV.F_CV;124.010551453;100.0 +25/10/2020 02:06:10;U879.FI144D_PV.F_CV;114.490798950;100.0 +25/10/2020 02:06:11;U879.FI144D_PV.F_CV;124.374076843;100.0 +25/10/2020 02:06:12;U879.FI144D_PV.F_CV;119.244178772;100.0 +25/10/2020 02:06:13;U879.FI144D_PV.F_CV;127.542991638;100.0 +25/10/2020 02:06:15;U879.FI144D_PV.F_CV;116.060775757;100.0 +25/10/2020 02:06:16;U879.FI144D_PV.F_CV;125.420722961;100.0 +25/10/2020 02:06:18;U879.FI144D_PV.F_CV;116.289421082;100.0 +25/10/2020 02:06:19;U879.FI144D_PV.F_CV;125.573158264;100.0 +25/10/2020 02:06:20;U879.FI144D_PV.F_CV;118.871688843;100.0 +25/10/2020 02:06:21;U879.FI144D_PV.F_CV;115.575920105;100.0 +25/10/2020 02:06:24;U879.FI144D_PV.F_CV;109.765548706;100.0 +25/10/2020 02:06:28;U879.FI144D_PV.F_CV;108.357429504;100.0 +25/10/2020 02:06:30;U879.FI144D_PV.F_CV;108.705734253;100.0 +25/10/2020 02:06:32;U879.FI144D_PV.F_CV;119.798034668;100.0 +25/10/2020 02:06:33;U879.FI144D_PV.F_CV;116.193481445;100.0 +25/10/2020 02:06:34;U879.FI144D_PV.F_CV;113.790443420;100.0 +25/10/2020 02:06:36;U879.FI144D_PV.F_CV;110.339157104;100.0 +25/10/2020 02:06:40;U879.FI144D_PV.F_CV;108.470741272;100.0 +25/10/2020 02:06:42;U879.FI144D_PV.F_CV;120.474845886;100.0 +25/10/2020 02:06:43;U879.FI144D_PV.F_CV;115.472816467;100.0 +25/10/2020 02:06:44;U879.FI144D_PV.F_CV;113.310005188;100.0 +25/10/2020 02:06:45;U879.FI144D_PV.F_CV;111.868125916;100.0 +25/10/2020 02:06:46;U879.FI144D_PV.F_CV;122.625625610;100.0 +25/10/2020 02:06:48;U879.FI144D_PV.F_CV;113.875282288;100.0 +25/10/2020 02:06:49;U879.FI144D_PV.F_CV;123.963729858;100.0 +25/10/2020 02:06:50;U879.FI144D_PV.F_CV;118.970611572;100.0 +25/10/2020 02:06:51;U879.FI144D_PV.F_CV;127.360618591;100.0 +25/10/2020 02:06:52;U879.FI144D_PV.F_CV;121.235206604;100.0 +25/10/2020 02:06:53;U879.FI144D_PV.F_CV;128.870346069;100.0 +25/10/2020 02:06:54;U879.FI144D_PV.F_CV;121.069816589;100.0 +25/10/2020 02:06:55;U879.FI144D_PV.F_CV;117.041336060;100.0 +25/10/2020 02:06:56;U879.FI144D_PV.F_CV;126.074432373;100.0 +25/10/2020 02:06:57;U879.FI144D_PV.F_CV;120.377746582;100.0 +25/10/2020 02:06:58;U879.FI144D_PV.F_CV;115.408081055;100.0 +25/10/2020 02:06:59;U879.FI144D_PV.F_CV;113.266845703;100.0 +25/10/2020 02:06:00;U879.FI144E_PV.F_CV;66.499923706;100.0 +25/10/2020 02:06:01;U879.FI144E_PV.F_CV;68.356719971;100.0 +25/10/2020 02:06:03;U879.FI144E_PV.F_CV;70.419822693;100.0 +25/10/2020 02:06:05;U879.FI144E_PV.F_CV;71.336761475;100.0 +25/10/2020 02:06:07;U879.FI144E_PV.F_CV;59.634910583;100.0 +25/10/2020 02:06:08;U879.FI144E_PV.F_CV;63.780044556;100.0 +25/10/2020 02:06:09;U879.FI144E_PV.F_CV;66.543464661;100.0 +25/10/2020 02:06:10;U879.FI144E_PV.F_CV;56.374031067;100.0 +25/10/2020 02:06:11;U879.FI144E_PV.F_CV;61.606124878;100.0 +25/10/2020 02:06:13;U879.FI144E_PV.F_CV;59.411750793;100.0 +25/10/2020 02:06:14;U879.FI144E_PV.F_CV;63.484786987;100.0 +25/10/2020 02:06:15;U879.FI144E_PV.F_CV;66.346626282;100.0 +25/10/2020 02:06:16;U879.FI144E_PV.F_CV;56.242805481;100.0 +25/10/2020 02:06:18;U879.FI144E_PV.F_CV;65.035865784;100.0 +25/10/2020 02:06:19;U879.FI144E_PV.F_CV;67.380683899;100.0 +25/10/2020 02:06:20;U879.FI144E_PV.F_CV;56.932174683;100.0 +25/10/2020 02:06:22;U879.FI144E_PV.F_CV;65.244598389;100.0 +25/10/2020 02:06:23;U879.FI144E_PV.F_CV;67.519836426;100.0 +25/10/2020 02:06:24;U879.FI144E_PV.F_CV;69.036659241;100.0 +25/10/2020 02:06:26;U879.FI144E_PV.F_CV;70.722023010;100.0 +25/10/2020 02:06:30;U879.FI144E_PV.F_CV;56.168132782;100.0 +25/10/2020 02:06:32;U879.FI144E_PV.F_CV;65.002677917;100.0 +25/10/2020 02:06:33;U879.FI144E_PV.F_CV;55.346836090;100.0 +25/10/2020 02:06:34;U879.FI144E_PV.F_CV;60.921329498;100.0 +25/10/2020 02:06:36;U879.FI144E_PV.F_CV;46.949192047;100.0 +25/10/2020 02:06:38;U879.FI144E_PV.F_CV;48.893650055;100.0 +25/10/2020 02:06:40;U879.FI144E_PV.F_CV;49.757854462;100.0 +25/10/2020 02:06:42;U879.FI144E_PV.F_CV;62.153663635;100.0 +25/10/2020 02:06:43;U879.FI144E_PV.F_CV;53.447494507;100.0 +25/10/2020 02:06:44;U879.FI144E_PV.F_CV;59.508613586;100.0 +25/10/2020 02:06:45;U879.FI144E_PV.F_CV;63.695846558;100.0 +25/10/2020 02:06:46;U879.FI144E_PV.F_CV;54.475616455;100.0 +25/10/2020 02:06:48;U879.FI144E_PV.F_CV;64.250450134;100.0 +25/10/2020 02:06:49;U879.FI144E_PV.F_CV;66.857070923;100.0 +25/10/2020 02:06:50;U879.FI144E_PV.F_CV;56.583099365;100.0 +25/10/2020 02:06:51;U879.FI144E_PV.F_CV;61.599018097;100.0 +25/10/2020 02:06:52;U879.FI144E_PV.F_CV;65.089447021;100.0 +25/10/2020 02:06:53;U879.FI144E_PV.F_CV;67.416404724;100.0 +25/10/2020 02:06:54;U879.FI144E_PV.F_CV;56.955989838;100.0 +25/10/2020 02:06:55;U879.FI144E_PV.F_CV;61.994098663;100.0 +25/10/2020 02:06:56;U879.FI144E_PV.F_CV;65.352836609;100.0 +25/10/2020 02:06:57;U879.FI144E_PV.F_CV;55.580276489;100.0 +25/10/2020 02:06:58;U879.FI144E_PV.F_CV;61.076953888;100.0 +25/10/2020 02:06:59;U879.FI144E_PV.F_CV;64.594924927;100.0 +25/10/2020 02:06:00;U879.FI144F_PV.F_CV;105.972770691;100.0 +25/10/2020 02:06:01;U879.FI144F_PV.F_CV;106.683670044;100.0 +25/10/2020 02:06:02;U879.FI144F_PV.F_CV;95.145889282;100.0 +25/10/2020 02:06:03;U879.FI144F_PV.F_CV;99.465751648;100.0 +25/10/2020 02:06:04;U879.FI144F_PV.F_CV;102.345657349;100.0 +25/10/2020 02:06:05;U879.FI144F_PV.F_CV;92.253875732;100.0 +25/10/2020 02:06:06;U879.FI144F_PV.F_CV;97.537742615;100.0 +25/10/2020 02:06:07;U879.FI144F_PV.F_CV;100.767349243;100.0 +25/10/2020 02:06:08;U879.FI144F_PV.F_CV;103.213386536;100.0 +25/10/2020 02:06:09;U879.FI144F_PV.F_CV;92.832359314;100.0 +25/10/2020 02:06:10;U879.FI144F_PV.F_CV;97.923393250;100.0 +25/10/2020 02:06:11;U879.FI144F_PV.F_CV;101.317420959;100.0 +25/10/2020 02:06:13;U879.FI144F_PV.F_CV;105.088554382;100.0 +25/10/2020 02:06:15;U879.FI144F_PV.F_CV;106.764617920;100.0 +25/10/2020 02:06:21;U879.FI144F_PV.F_CV;107.949172974;100.0 +25/10/2020 02:06:26;U879.FI144F_PV.F_CV;107.949172974;100.0 +25/10/2020 02:06:28;U879.FI144F_PV.F_CV;96.026725769;100.0 +25/10/2020 02:06:29;U879.FI144F_PV.F_CV;100.052970886;100.0 +25/10/2020 02:06:30;U879.FI144F_PV.F_CV;102.737136841;100.0 +25/10/2020 02:06:31;U879.FI144F_PV.F_CV;104.526580811;100.0 +25/10/2020 02:06:33;U879.FI144F_PV.F_CV;98.214073181;100.0 +25/10/2020 02:06:34;U879.FI144F_PV.F_CV;101.511207581;100.0 +25/10/2020 02:06:35;U879.FI144F_PV.F_CV;91.697578430;100.0 +25/10/2020 02:06:36;U879.FI144F_PV.F_CV;97.166877747;100.0 +25/10/2020 02:06:38;U879.FI144F_PV.F_CV;103.243873596;100.0 +25/10/2020 02:06:39;U879.FI144F_PV.F_CV;92.852684021;100.0 +25/10/2020 02:06:40;U879.FI144F_PV.F_CV;97.936943054;100.0 +25/10/2020 02:06:41;U879.FI144F_PV.F_CV;101.326454163;100.0 +25/10/2020 02:06:43;U879.FI144F_PV.F_CV;104.897262573;100.0 +25/10/2020 02:06:44;U879.FI144F_PV.F_CV;105.966667175;100.0 +25/10/2020 02:06:45;U879.FI144F_PV.F_CV;94.667884827;100.0 +25/10/2020 02:06:46;U879.FI144F_PV.F_CV;99.147079468;100.0 +25/10/2020 02:06:48;U879.FI144F_PV.F_CV;92.112243652;100.0 +25/10/2020 02:06:50;U879.FI144F_PV.F_CV;100.997367859;100.0 +25/10/2020 02:06:51;U879.FI144F_PV.F_CV;91.062049866;100.0 +25/10/2020 02:06:52;U879.FI144F_PV.F_CV;96.743186951;100.0 +25/10/2020 02:06:53;U879.FI144F_PV.F_CV;100.530616760;100.0 +25/10/2020 02:06:54;U879.FI144F_PV.F_CV;103.055564880;100.0 +25/10/2020 02:06:55;U879.FI144F_PV.F_CV;92.727149963;100.0 +25/10/2020 02:06:56;U879.FI144F_PV.F_CV;97.853256226;100.0 +25/10/2020 02:06:57;U879.FI144F_PV.F_CV;101.270660400;100.0 +25/10/2020 02:06:58;U879.FI144F_PV.F_CV;103.548927307;100.0 +25/10/2020 02:06:59;U879.FI144F_PV.F_CV;105.067771912;100.0 +25/10/2020 02:06:02;U879.FI192_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:03;U879.FI192_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:04;U879.FI192_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:07;U879.FI192_PV.F_CV;69.949996948;100.0 +25/10/2020 02:06:12;U879.FI192_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:16;U879.FI192_PV.F_CV;69.942855835;100.0 +25/10/2020 02:06:47;U879.FI192_PV.F_CV;70.071426392;100.0 +25/10/2020 02:06:54;U879.FI192_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:55;U879.FI192_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:57;U879.FI192_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:58;U879.FI192_PV.F_CV;70.050003052;100.0 +25/10/2020 02:06:00;U879.FI193_PV.F_CV;100.400001526;100.0 +25/10/2020 02:06:01;U879.FI193_PV.F_CV;100.199996948;100.0 +25/10/2020 02:06:02;U879.FI193_PV.F_CV;100.099998474;100.0 +25/10/2020 02:06:05;U879.FI193_PV.F_CV;100.250000000;100.0 +25/10/2020 02:06:07;U879.FI193_PV.F_CV;100.300003052;100.0 +25/10/2020 02:06:08;U879.FI193_PV.F_CV;100.199996948;100.0 +25/10/2020 02:06:10;U879.FI193_PV.F_CV;100.350006104;100.0 +25/10/2020 02:06:12;U879.FI193_PV.F_CV;100.000000000;100.0 +25/10/2020 02:06:13;U879.FI193_PV.F_CV;100.400001526;100.0 +25/10/2020 02:06:14;U879.FI193_PV.F_CV;100.099998474;100.0 +25/10/2020 02:06:15;U879.FI193_PV.F_CV;100.300003052;100.0 +25/10/2020 02:06:16;U879.FI193_PV.F_CV;100.400001526;100.0 +25/10/2020 02:06:17;U879.FI193_PV.F_CV;100.199996948;100.0 +25/10/2020 02:06:18;U879.FI193_PV.F_CV;100.400001526;100.0 +25/10/2020 02:06:21;U879.FI193_PV.F_CV;100.233329773;100.0 +25/10/2020 02:06:23;U879.FI193_PV.F_CV;100.000000000;100.0 +25/10/2020 02:06:25;U879.FI193_PV.F_CV;100.300003052;100.0 +25/10/2020 02:06:26;U879.FI193_PV.F_CV;100.400001526;100.0 +25/10/2020 02:06:27;U879.FI193_PV.F_CV;100.199996948;100.0 +25/10/2020 02:06:29;U879.FI193_PV.F_CV;100.400001526;100.0 +25/10/2020 02:06:33;U879.FI193_PV.F_CV;100.000000000;100.0 +25/10/2020 02:06:34;U879.FI193_PV.F_CV;100.199996948;100.0 +25/10/2020 02:06:35;U879.FI193_PV.F_CV;100.149993896;100.0 +25/10/2020 02:06:39;U879.FI193_PV.F_CV;100.266670227;100.0 +25/10/2020 02:06:42;U879.FI193_PV.F_CV;100.099998474;100.0 +25/10/2020 02:06:43;U879.FI193_PV.F_CV;99.900001526;100.0 +25/10/2020 02:06:44;U879.FI193_PV.F_CV;100.199996948;100.0 +25/10/2020 02:06:45;U879.FI193_PV.F_CV;100.099998474;100.0 +25/10/2020 02:06:50;U879.FI193_PV.F_CV;100.400001526;100.0 +25/10/2020 02:06:51;U879.FI193_PV.F_CV;100.199996948;100.0 +25/10/2020 02:06:52;U879.FI193_PV.F_CV;100.149993896;100.0 +25/10/2020 02:06:56;U879.FI193_PV.F_CV;100.300003052;100.0 +25/10/2020 02:06:57;U879.FI193_PV.F_CV;100.099998474;100.0 +25/10/2020 02:06:58;U879.FI193_PV.F_CV;100.199996948;100.0 +25/10/2020 02:06:59;U879.FI193_PV.F_CV;100.400001526;100.0 +25/10/2020 02:06:01;U879.FI244A_PV.F_CV;60.342086792;100.0 +25/10/2020 02:06:02;U879.FI244A_PV.F_CV;76.263214111;100.0 +25/10/2020 02:06:04;U879.FI244A_PV.F_CV;73.787338257;100.0 +25/10/2020 02:06:08;U879.FI244A_PV.F_CV;72.409477234;100.0 +25/10/2020 02:06:10;U879.FI244A_PV.F_CV;72.074569702;100.0 +25/10/2020 02:06:12;U879.FI244A_PV.F_CV;80.080017090;100.0 +25/10/2020 02:06:13;U879.FI244A_PV.F_CV;77.410118103;100.0 +25/10/2020 02:06:14;U879.FI244A_PV.F_CV;63.618465424;100.0 +25/10/2020 02:06:15;U879.FI244A_PV.F_CV;66.435745239;100.0 +25/10/2020 02:06:16;U879.FI244A_PV.F_CV;68.313934326;100.0 +25/10/2020 02:06:18;U879.FI244A_PV.F_CV;70.303153992;100.0 +25/10/2020 02:06:19;U879.FI244A_PV.F_CV;82.903923035;100.0 +25/10/2020 02:06:21;U879.FI244A_PV.F_CV;76.885246277;100.0 +25/10/2020 02:06:22;U879.FI244A_PV.F_CV;87.145500183;100.0 +25/10/2020 02:06:23;U879.FI244A_PV.F_CV;82.120437622;100.0 +25/10/2020 02:06:24;U879.FI244A_PV.F_CV;90.782112122;100.0 +25/10/2020 02:06:25;U879.FI244A_PV.F_CV;84.544845581;100.0 +25/10/2020 02:06:26;U879.FI244A_PV.F_CV;80.386665344;100.0 +25/10/2020 02:06:27;U879.FI244A_PV.F_CV;89.479782104;100.0 +25/10/2020 02:06:28;U879.FI244A_PV.F_CV;83.676628113;100.0 +25/10/2020 02:06:29;U879.FI244A_PV.F_CV;67.796134949;100.0 +25/10/2020 02:06:31;U879.FI244A_PV.F_CV;58.158958435;100.0 +25/10/2020 02:06:33;U879.FI244A_PV.F_CV;73.895301819;100.0 +25/10/2020 02:06:35;U879.FI244A_PV.F_CV;72.783760071;100.0 +25/10/2020 02:06:37;U879.FI244A_PV.F_CV;84.399116516;100.0 +25/10/2020 02:06:38;U879.FI244A_PV.F_CV;80.289512634;100.0 +25/10/2020 02:06:39;U879.FI244A_PV.F_CV;77.549781799;100.0 +25/10/2020 02:06:40;U879.FI244A_PV.F_CV;87.588523865;100.0 +25/10/2020 02:06:41;U879.FI244A_PV.F_CV;82.415786743;100.0 +25/10/2020 02:06:43;U879.FI244A_PV.F_CV;76.668296814;100.0 +25/10/2020 02:06:44;U879.FI244A_PV.F_CV;75.135635376;100.0 +25/10/2020 02:06:46;U879.FI244A_PV.F_CV;65.278381348;100.0 +25/10/2020 02:06:48;U879.FI244A_PV.F_CV;69.051673889;100.0 +25/10/2020 02:06:51;U879.FI244A_PV.F_CV;71.175895691;100.0 +25/10/2020 02:06:53;U879.FI244A_PV.F_CV;71.575141907;100.0 +25/10/2020 02:06:54;U879.FI244A_PV.F_CV;83.751914978;100.0 +25/10/2020 02:06:55;U879.FI244A_PV.F_CV;79.858047485;100.0 +25/10/2020 02:06:56;U879.FI244A_PV.F_CV;89.273857117;100.0 +25/10/2020 02:06:58;U879.FI244A_PV.F_CV;79.618675232;100.0 +25/10/2020 02:06:59;U879.FI244A_PV.F_CV;77.102554321;100.0 +25/10/2020 02:06:00;U879.FI244B_PV.F_CV;39.875877380;100.0 +25/10/2020 02:06:01;U879.FI244B_PV.F_CV;50.607357025;100.0 +25/10/2020 02:06:02;U879.FI244B_PV.F_CV;45.749958038;100.0 +25/10/2020 02:06:03;U879.FI244B_PV.F_CV;42.511692047;100.0 +25/10/2020 02:06:04;U879.FI244B_PV.F_CV;52.291324615;100.0 +25/10/2020 02:06:05;U879.FI244B_PV.F_CV;46.872600555;100.0 +25/10/2020 02:06:07;U879.FI244B_PV.F_CV;52.863517761;100.0 +25/10/2020 02:06:08;U879.FI244B_PV.F_CV;47.180820465;100.0 +25/10/2020 02:06:09;U879.FI244B_PV.F_CV;43.465599060;100.0 +25/10/2020 02:06:10;U879.FI244B_PV.F_CV;40.988784790;100.0 +25/10/2020 02:06:12;U879.FI244B_PV.F_CV;38.236766815;100.0 +25/10/2020 02:06:13;U879.FI244B_PV.F_CV;49.514614105;100.0 +25/10/2020 02:06:14;U879.FI244B_PV.F_CV;44.948219299;100.0 +25/10/2020 02:06:15;U879.FI244B_PV.F_CV;41.977199554;100.0 +25/10/2020 02:06:16;U879.FI244B_PV.F_CV;39.996517181;100.0 +25/10/2020 02:06:17;U879.FI244B_PV.F_CV;50.687782288;100.0 +25/10/2020 02:06:18;U879.FI244B_PV.F_CV;45.803573608;100.0 +25/10/2020 02:06:19;U879.FI244B_PV.F_CV;54.485912323;100.0 +25/10/2020 02:06:21;U879.FI244B_PV.F_CV;56.247211456;100.0 +25/10/2020 02:06:23;U879.FI244B_PV.F_CV;44.945049286;100.0 +25/10/2020 02:06:24;U879.FI244B_PV.F_CV;53.986804962;100.0 +25/10/2020 02:06:26;U879.FI244B_PV.F_CV;56.025386810;100.0 +25/10/2020 02:06:28;U879.FI244B_PV.F_CV;44.870876312;100.0 +25/10/2020 02:06:29;U879.FI244B_PV.F_CV;53.937355042;100.0 +25/10/2020 02:06:30;U879.FI244B_PV.F_CV;47.969955444;100.0 +25/10/2020 02:06:31;U879.FI244B_PV.F_CV;56.003410339;100.0 +25/10/2020 02:06:33;U879.FI244B_PV.F_CV;44.861106873;100.0 +25/10/2020 02:06:34;U879.FI244B_PV.F_CV;53.930843353;100.0 +25/10/2020 02:06:35;U879.FI244B_PV.F_CV;47.965614319;100.0 +25/10/2020 02:06:37;U879.FI244B_PV.F_CV;49.296566010;100.0 +25/10/2020 02:06:39;U879.FI244B_PV.F_CV;53.940834045;100.0 +25/10/2020 02:06:40;U879.FI244B_PV.F_CV;47.972274780;100.0 +25/10/2020 02:06:41;U879.FI244B_PV.F_CV;55.931713104;100.0 +25/10/2020 02:06:43;U879.FI244B_PV.F_CV;44.878070831;100.0 +25/10/2020 02:06:44;U879.FI244B_PV.F_CV;53.942153931;100.0 +25/10/2020 02:06:45;U879.FI244B_PV.F_CV;47.899913788;100.0 +25/10/2020 02:06:46;U879.FI244B_PV.F_CV;43.944995880;100.0 +25/10/2020 02:06:48;U879.FI244B_PV.F_CV;47.558452606;100.0 +25/10/2020 02:06:49;U879.FI244B_PV.F_CV;43.717353821;100.0 +25/10/2020 02:06:50;U879.FI244B_PV.F_CV;53.095096588;100.0 +25/10/2020 02:06:51;U879.FI244B_PV.F_CV;47.408451080;100.0 +25/10/2020 02:06:53;U879.FI244B_PV.F_CV;49.097766876;100.0 +25/10/2020 02:06:54;U879.FI244B_PV.F_CV;44.743564606;100.0 +25/10/2020 02:06:55;U879.FI244B_PV.F_CV;53.779239655;100.0 +25/10/2020 02:06:56;U879.FI244B_PV.F_CV;47.864543915;100.0 +25/10/2020 02:06:57;U879.FI244B_PV.F_CV;55.933132172;100.0 +25/10/2020 02:06:58;U879.FI244B_PV.F_CV;49.300472260;100.0 +25/10/2020 02:06:59;U879.FI244B_PV.F_CV;56.817176819;100.0 +25/10/2020 02:06:00;U879.FI244C_PV.F_CV;79.258766174;100.0 +25/10/2020 02:06:01;U879.FI244C_PV.F_CV;88.874336243;100.0 +25/10/2020 02:06:02;U879.FI244C_PV.F_CV;83.272994995;100.0 +25/10/2020 02:06:03;U879.FI244C_PV.F_CV;79.392280579;100.0 +25/10/2020 02:06:04;U879.FI244C_PV.F_CV;76.951622009;100.0 +25/10/2020 02:06:05;U879.FI244C_PV.F_CV;63.312801361;100.0 +25/10/2020 02:06:07;U879.FI244C_PV.F_CV;56.166366577;100.0 +25/10/2020 02:06:08;U879.FI244C_PV.F_CV;61.467681885;100.0 +25/10/2020 02:06:09;U879.FI244C_PV.F_CV;52.990173340;100.0 +25/10/2020 02:06:10;U879.FI244C_PV.F_CV;59.350219727;100.0 +25/10/2020 02:06:11;U879.FI244C_PV.F_CV;51.578533173;100.0 +25/10/2020 02:06:12;U879.FI244C_PV.F_CV;58.262641907;100.0 +25/10/2020 02:06:13;U879.FI244C_PV.F_CV;62.865200043;100.0 +25/10/2020 02:06:15;U879.FI244C_PV.F_CV;59.971340179;100.0 +25/10/2020 02:06:16;U879.FI244C_PV.F_CV;64.004333496;100.0 +25/10/2020 02:06:17;U879.FI244C_PV.F_CV;66.692993164;100.0 +25/10/2020 02:06:19;U879.FI244C_PV.F_CV;69.582740784;100.0 +25/10/2020 02:06:22;U879.FI244C_PV.F_CV;71.271835327;100.0 +25/10/2020 02:06:27;U879.FI244C_PV.F_CV;71.894638062;100.0 +25/10/2020 02:06:31;U879.FI244C_PV.F_CV;83.903511047;100.0 +25/10/2020 02:06:33;U879.FI244C_PV.F_CV;77.329513550;100.0 +25/10/2020 02:06:35;U879.FI244C_PV.F_CV;74.407737732;100.0 +25/10/2020 02:06:39;U879.FI244C_PV.F_CV;88.059371948;100.0 +25/10/2020 02:06:40;U879.FI244C_PV.F_CV;82.729682922;100.0 +25/10/2020 02:06:41;U879.FI244C_PV.F_CV;79.176559448;100.0 +25/10/2020 02:06:43;U879.FI244C_PV.F_CV;83.138801575;100.0 +25/10/2020 02:06:44;U879.FI244C_PV.F_CV;79.449302673;100.0 +25/10/2020 02:06:45;U879.FI244C_PV.F_CV;76.989639282;100.0 +25/10/2020 02:06:46;U879.FI244C_PV.F_CV;87.361579895;100.0 +25/10/2020 02:06:48;U879.FI244C_PV.F_CV;78.768775940;100.0 +25/10/2020 02:06:49;U879.FI244C_PV.F_CV;76.535957336;100.0 +25/10/2020 02:06:50;U879.FI244C_PV.F_CV;87.059127808;100.0 +25/10/2020 02:06:51;U879.FI244C_PV.F_CV;82.062858582;100.0 +25/10/2020 02:06:53;U879.FI244C_PV.F_CV;76.364959717;100.0 +25/10/2020 02:06:55;U879.FI244C_PV.F_CV;73.979042053;100.0 +25/10/2020 02:06:56;U879.FI244C_PV.F_CV;85.354515076;100.0 +25/10/2020 02:06:57;U879.FI244C_PV.F_CV;80.926445007;100.0 +25/10/2020 02:06:58;U879.FI244C_PV.F_CV;77.974403381;100.0 +25/10/2020 02:06:59;U879.FI244C_PV.F_CV;87.871604919;100.0 +25/10/2020 02:06:23;U879.FI244D_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U879.FI244E_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U879.FI244F_PV.F_CV;99.789009094;100.0 +25/10/2020 02:06:01;U879.FI244F_PV.F_CV;102.561164856;100.0 +25/10/2020 02:06:02;U879.FI244F_PV.F_CV;104.409263611;100.0 +25/10/2020 02:06:04;U879.FI244F_PV.F_CV;106.462715149;100.0 +25/10/2020 02:06:06;U879.FI244F_PV.F_CV;107.375358582;100.0 +25/10/2020 02:06:13;U879.FI244F_PV.F_CV;108.024154663;100.0 +25/10/2020 02:06:15;U879.FI244F_PV.F_CV;120.081047058;100.0 +25/10/2020 02:06:16;U879.FI244F_PV.F_CV;103.784500122;100.0 +25/10/2020 02:06:18;U879.FI244F_PV.F_CV;114.192848206;100.0 +25/10/2020 02:06:19;U879.FI244F_PV.F_CV;112.163719177;100.0 +25/10/2020 02:06:20;U879.FI244F_PV.F_CV;98.799247742;100.0 +25/10/2020 02:06:21;U879.FI244F_PV.F_CV;101.901321411;100.0 +25/10/2020 02:06:22;U879.FI244F_PV.F_CV;103.969367981;100.0 +25/10/2020 02:06:23;U879.FI244F_PV.F_CV;105.348068237;100.0 +25/10/2020 02:06:24;U879.FI244F_PV.F_CV;105.974235535;100.0 +25/10/2020 02:06:25;U879.FI244F_PV.F_CV;94.672927856;100.0 +25/10/2020 02:06:26;U879.FI244F_PV.F_CV;99.150444031;100.0 +25/10/2020 02:06:28;U879.FI244F_PV.F_CV;104.125457764;100.0 +25/10/2020 02:06:30;U879.FI244F_PV.F_CV;98.328758240;100.0 +25/10/2020 02:06:32;U879.FI244F_PV.F_CV;103.760261536;100.0 +25/10/2020 02:06:34;U879.FI244F_PV.F_CV;105.978950500;100.0 +25/10/2020 02:06:36;U879.FI244F_PV.F_CV;107.160346985;100.0 +25/10/2020 02:06:38;U879.FI244F_PV.F_CV;99.677604675;100.0 +25/10/2020 02:06:39;U879.FI244F_PV.F_CV;102.486892700;100.0 +25/10/2020 02:06:40;U879.FI244F_PV.F_CV;104.359748840;100.0 +25/10/2020 02:06:42;U879.FI244F_PV.F_CV;98.139923096;100.0 +25/10/2020 02:06:43;U879.FI244F_PV.F_CV;101.461769104;100.0 +25/10/2020 02:06:44;U879.FI244F_PV.F_CV;103.676338196;100.0 +25/10/2020 02:06:46;U879.FI244F_PV.F_CV;106.136970520;100.0 +25/10/2020 02:06:48;U879.FI244F_PV.F_CV;99.222770691;100.0 +25/10/2020 02:06:50;U879.FI244F_PV.F_CV;112.165412903;100.0 +25/10/2020 02:06:51;U879.FI244F_PV.F_CV;110.519126892;100.0 +25/10/2020 02:06:54;U879.FI244F_PV.F_CV;108.820625305;100.0 +25/10/2020 02:06:59;U879.FI244F_PV.F_CV;107.906677246;100.0 +25/10/2020 02:06:31;U879.FQ144A_PV.F_CV;1396.896118164;100.0 +25/10/2020 02:06:40;U879.FQ144B_PV.F_CV;1350.315551758;100.0 +25/10/2020 02:06:49;U879.FQ144C_PV.F_CV;744.715576172;100.0 +25/10/2020 02:06:28;U879.FQ144D_PV.F_CV;13732.713867188;100.0 +25/10/2020 02:06:01;U879.FQ144E_PV.F_CV;1363.406372070;100.0 +25/10/2020 02:06:56;U879.FQ144E_PV.F_CV;1364.307006836;100.0 +25/10/2020 02:06:21;U879.FQ144F_PV.F_CV;3401.566162109;100.0 +25/10/2020 02:06:11;U879.FQ244A_PV.F_CV;1381.161499023;100.0 +25/10/2020 02:06:52;U879.FQ244B_PV.F_CV;899.221008301;100.0 +25/10/2020 02:06:49;U879.FQ244C_PV.F_CV;1371.106811523;100.0 +25/10/2020 02:06:23;U879.FQ244D_PV.F_CV;9411.424804688;100.0 +25/10/2020 02:06:45;U879.FQ244E_PV.F_CV;1813.518310547;100.0 +25/10/2020 02:06:28;U879.FQ244F_PV.F_CV;3685.714599609;100.0 +25/10/2020 02:06:05;U879.LC140A_OP.F_CV;92.165458679;100.0 +25/10/2020 02:06:07;U879.LC140A_PV.F_CV;25.036478043;100.0 +25/10/2020 02:06:08;U879.LC140A_PV.F_CV;25.109436035;100.0 +25/10/2020 02:06:26;U879.LC140A_PV.F_CV;25.040531158;100.0 +25/10/2020 02:06:28;U879.LC140A_PV.F_CV;25.121595383;100.0 +25/10/2020 02:06:41;U879.LC140A_PV.F_CV;25.000000000;100.0 +25/10/2020 02:06:43;U879.LC140A_PV.F_CV;25.081064224;100.0 +25/10/2020 02:06:57;U879.LC140A_PV.F_CV;24.995946884;100.0 +25/10/2020 02:06:59;U879.LC140A_PV.F_CV;25.093223572;100.0 +25/10/2020 02:06:23;U879.LC140A_SP.F_CV;25.000000000;100.0 +25/10/2020 02:06:00;U879.LC140B_OP.F_CV;88.723854065;100.0 +25/10/2020 02:06:01;U879.LC140B_OP.F_CV;88.813026428;100.0 +25/10/2020 02:06:02;U879.LC140B_OP.F_CV;88.727905273;100.0 +25/10/2020 02:06:05;U879.LC140B_OP.F_CV;88.861549377;100.0 +25/10/2020 02:06:09;U879.LC140B_OP.F_CV;88.744186401;100.0 +25/10/2020 02:06:10;U879.LC140B_OP.F_CV;88.841468811;100.0 +25/10/2020 02:06:13;U879.LC140B_OP.F_CV;88.780670166;100.0 +25/10/2020 02:06:15;U879.LC140B_OP.F_CV;88.833435059;100.0 +25/10/2020 02:06:18;U879.LC140B_OP.F_CV;88.756561279;100.0 +25/10/2020 02:06:19;U879.LC140B_OP.F_CV;88.882232666;100.0 +25/10/2020 02:06:23;U879.LC140B_OP.F_CV;88.882232666;100.0 +25/10/2020 02:06:24;U879.LC140B_OP.F_CV;88.647491455;100.0 +25/10/2020 02:06:28;U879.LC140B_OP.F_CV;88.898666382;100.0 +25/10/2020 02:06:29;U879.LC140B_OP.F_CV;88.760894775;100.0 +25/10/2020 02:06:37;U879.LC140B_OP.F_CV;88.890731812;100.0 +25/10/2020 02:06:39;U879.LC140B_OP.F_CV;88.834106445;100.0 +25/10/2020 02:06:40;U879.LC140B_OP.F_CV;88.935523987;100.0 +25/10/2020 02:06:41;U879.LC140B_OP.F_CV;88.724800110;100.0 +25/10/2020 02:06:43;U879.LC140B_OP.F_CV;88.850486755;100.0 +25/10/2020 02:06:44;U879.LC140B_OP.F_CV;88.773490906;100.0 +25/10/2020 02:06:46;U879.LC140B_OP.F_CV;88.919517517;100.0 +25/10/2020 02:06:48;U879.LC140B_OP.F_CV;88.761543274;100.0 +25/10/2020 02:06:54;U879.LC140B_OP.F_CV;89.114723206;100.0 +25/10/2020 02:06:55;U879.LC140B_OP.F_CV;88.794662476;100.0 +25/10/2020 02:06:56;U879.LC140B_OP.F_CV;88.673034668;100.0 +25/10/2020 02:06:58;U879.LC140B_OP.F_CV;88.603904724;100.0 +25/10/2020 02:06:00;U879.LC140B_PV.F_CV;29.944877625;100.0 +25/10/2020 02:06:01;U879.LC140B_PV.F_CV;30.034046173;100.0 +25/10/2020 02:06:02;U879.LC140B_PV.F_CV;29.948930740;100.0 +25/10/2020 02:06:05;U879.LC140B_PV.F_CV;30.082685471;100.0 +25/10/2020 02:06:09;U879.LC140B_PV.F_CV;29.965143204;100.0 +25/10/2020 02:06:10;U879.LC140B_PV.F_CV;30.062417984;100.0 +25/10/2020 02:06:13;U879.LC140B_PV.F_CV;30.001621246;100.0 +25/10/2020 02:06:15;U879.LC140B_PV.F_CV;30.054311752;100.0 +25/10/2020 02:06:18;U879.LC140B_PV.F_CV;29.977302551;100.0 +25/10/2020 02:06:19;U879.LC140B_PV.F_CV;30.102951050;100.0 +25/10/2020 02:06:23;U879.LC140B_PV.F_CV;30.102951050;100.0 +25/10/2020 02:06:24;U879.LC140B_PV.F_CV;29.867866516;100.0 +25/10/2020 02:06:28;U879.LC140B_PV.F_CV;30.119163513;100.0 +25/10/2020 02:06:29;U879.LC140B_PV.F_CV;29.981355667;100.0 +25/10/2020 02:06:37;U879.LC140B_PV.F_CV;30.111057281;100.0 +25/10/2020 02:06:39;U879.LC140B_PV.F_CV;30.054311752;100.0 +25/10/2020 02:06:40;U879.LC140B_PV.F_CV;30.155641556;100.0 +25/10/2020 02:06:41;U879.LC140B_PV.F_CV;29.944877625;100.0 +25/10/2020 02:06:43;U879.LC140B_PV.F_CV;30.070526123;100.0 +25/10/2020 02:06:44;U879.LC140B_PV.F_CV;29.993515015;100.0 +25/10/2020 02:06:46;U879.LC140B_PV.F_CV;30.139429092;100.0 +25/10/2020 02:06:48;U879.LC140B_PV.F_CV;29.981355667;100.0 +25/10/2020 02:06:54;U879.LC140B_PV.F_CV;30.333982468;100.0 +25/10/2020 02:06:55;U879.LC140B_PV.F_CV;30.013780594;100.0 +25/10/2020 02:06:56;U879.LC140B_PV.F_CV;29.892185211;100.0 +25/10/2020 02:06:58;U879.LC140B_PV.F_CV;29.823282242;100.0 +25/10/2020 02:06:23;U879.LC140B_SP.F_CV;30.000000000;100.0 +25/10/2020 02:06:04;U879.LC140C_OP.F_CV;90.529716492;100.0 +25/10/2020 02:06:18;U879.LC140C_PV.F_CV;24.991893768;100.0 +25/10/2020 02:06:23;U879.LC140C_SP.F_CV;25.000000000;100.0 +25/10/2020 02:06:23;U879.LC140D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U879.LC140D_PV.F_CV;19.279953003;100.0 +25/10/2020 02:06:23;U879.LC140D_SP.F_CV;25.000000000;100.0 +25/10/2020 02:06:02;U879.LC140E_OP.F_CV;88.918403625;100.0 +25/10/2020 02:06:12;U879.LC140E_OP.F_CV;88.981063843;100.0 +25/10/2020 02:06:22;U879.LC140E_OP.F_CV;88.905235291;100.0 +25/10/2020 02:06:02;U879.LC140E_PV.F_CV;30.102951050;100.0 +25/10/2020 02:06:11;U879.LC140E_PV.F_CV;30.167800903;100.0 +25/10/2020 02:06:13;U879.LC140E_PV.F_CV;30.248865128;100.0 +25/10/2020 02:06:22;U879.LC140E_PV.F_CV;30.029993057;100.0 +25/10/2020 02:06:50;U879.LC140E_PV.F_CV;30.171854019;100.0 +25/10/2020 02:06:55;U879.LC140E_PV.F_CV;30.090791702;100.0 +25/10/2020 02:06:57;U879.LC140E_PV.F_CV;30.143482208;100.0 +25/10/2020 02:06:59;U879.LC140E_PV.F_CV;30.066473007;100.0 +25/10/2020 02:06:23;U879.LC140E_SP.F_CV;30.000000000;100.0 +25/10/2020 02:06:05;U879.LC140F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U879.LC140F_PV.F_CV;24.509565353;100.0 +25/10/2020 02:06:28;U879.LC140F_PV.F_CV;24.574417114;100.0 +25/10/2020 02:06:40;U879.LC140F_PV.F_CV;24.521724701;100.0 +25/10/2020 02:06:58;U879.LC140F_PV.F_CV;24.578470230;100.0 +25/10/2020 02:06:23;U879.LC140F_SP.F_CV;25.000000000;100.0 +25/10/2020 02:06:08;U879.LC240A_OP.F_CV;88.314262390;100.0 +25/10/2020 02:06:50;U879.LC240A_OP.F_CV;88.508872986;100.0 +25/10/2020 02:06:54;U879.LC240A_OP.F_CV;88.426307678;100.0 +25/10/2020 02:06:59;U879.LC240A_OP.F_CV;88.509872437;100.0 +25/10/2020 02:06:00;U879.LC240A_PV.F_CV;29.798961639;100.0 +25/10/2020 02:06:04;U879.LC240A_PV.F_CV;29.920557022;100.0 +25/10/2020 02:06:07;U879.LC240A_PV.F_CV;29.859760284;100.0 +25/10/2020 02:06:15;U879.LC240A_PV.F_CV;30.013780594;100.0 +25/10/2020 02:06:17;U879.LC240A_PV.F_CV;29.875972748;100.0 +25/10/2020 02:06:23;U879.LC240A_PV.F_CV;30.009727478;100.0 +25/10/2020 02:06:24;U879.LC240A_PV.F_CV;29.936769485;100.0 +25/10/2020 02:06:28;U879.LC240A_PV.F_CV;30.054311752;100.0 +25/10/2020 02:06:29;U879.LC240A_PV.F_CV;29.997568130;100.0 +25/10/2020 02:06:35;U879.LC240A_PV.F_CV;30.135375977;100.0 +25/10/2020 02:06:36;U879.LC240A_PV.F_CV;30.050258636;100.0 +25/10/2020 02:06:40;U879.LC240A_PV.F_CV;29.993515015;100.0 +25/10/2020 02:06:44;U879.LC240A_PV.F_CV;30.054311752;100.0 +25/10/2020 02:06:48;U879.LC240A_PV.F_CV;29.948930740;100.0 +25/10/2020 02:06:50;U879.LC240A_PV.F_CV;30.216440201;100.0 +25/10/2020 02:06:55;U879.LC240A_PV.F_CV;29.981355667;100.0 +25/10/2020 02:06:59;U879.LC240A_PV.F_CV;30.204280853;100.0 +25/10/2020 02:06:23;U879.LC240A_SP.F_CV;30.000000000;100.0 +25/10/2020 02:06:02;U879.LC240B_OP.F_CV;89.471084595;100.0 +25/10/2020 02:06:05;U879.LC240B_OP.F_CV;89.324150085;100.0 +25/10/2020 02:06:07;U879.LC240B_OP.F_CV;89.720779419;100.0 +25/10/2020 02:06:09;U879.LC240B_OP.F_CV;89.615043640;100.0 +25/10/2020 02:06:10;U879.LC240B_OP.F_CV;89.720245361;100.0 +25/10/2020 02:06:12;U879.LC240B_OP.F_CV;89.379371643;100.0 +25/10/2020 02:06:13;U879.LC240B_OP.F_CV;89.484382629;100.0 +25/10/2020 02:06:18;U879.LC240B_OP.F_CV;89.563827515;100.0 +25/10/2020 02:06:19;U879.LC240B_OP.F_CV;89.717643738;100.0 +25/10/2020 02:06:21;U879.LC240B_OP.F_CV;89.506607056;100.0 +25/10/2020 02:06:23;U879.LC240B_OP.F_CV;89.733169556;100.0 +25/10/2020 02:06:24;U879.LC240B_OP.F_CV;89.578956604;100.0 +25/10/2020 02:06:29;U879.LC240B_OP.F_CV;89.821235657;100.0 +25/10/2020 02:06:31;U879.LC240B_OP.F_CV;89.545356750;100.0 +25/10/2020 02:06:33;U879.LC240B_OP.F_CV;89.901763916;100.0 +25/10/2020 02:06:34;U879.LC240B_OP.F_CV;89.496284485;100.0 +25/10/2020 02:06:36;U879.LC240B_OP.F_CV;89.771530151;100.0 +25/10/2020 02:06:38;U879.LC240B_OP.F_CV;89.633460999;100.0 +25/10/2020 02:06:39;U879.LC240B_OP.F_CV;89.746795654;100.0 +25/10/2020 02:06:40;U879.LC240B_OP.F_CV;89.479057312;100.0 +25/10/2020 02:06:42;U879.LC240B_OP.F_CV;89.734054565;100.0 +25/10/2020 02:06:43;U879.LC240B_OP.F_CV;90.021812439;100.0 +25/10/2020 02:06:45;U879.LC240B_OP.F_CV;90.176094055;100.0 +25/10/2020 02:06:46;U879.LC240B_OP.F_CV;89.730300903;100.0 +25/10/2020 02:06:48;U879.LC240B_OP.F_CV;89.916854858;100.0 +25/10/2020 02:06:51;U879.LC240B_OP.F_CV;89.754684448;100.0 +25/10/2020 02:06:55;U879.LC240B_OP.F_CV;90.014137268;100.0 +25/10/2020 02:06:56;U879.LC240B_OP.F_CV;89.827720642;100.0 +25/10/2020 02:06:58;U879.LC240B_OP.F_CV;89.989906311;100.0 +25/10/2020 02:06:02;U879.LC240B_PV.F_CV;29.790855408;100.0 +25/10/2020 02:06:05;U879.LC240B_PV.F_CV;29.717899323;100.0 +25/10/2020 02:06:07;U879.LC240B_PV.F_CV;29.916503906;100.0 +25/10/2020 02:06:09;U879.LC240B_PV.F_CV;29.863813400;100.0 +25/10/2020 02:06:10;U879.LC240B_PV.F_CV;29.916503906;100.0 +25/10/2020 02:06:12;U879.LC240B_PV.F_CV;29.746271133;100.0 +25/10/2020 02:06:19;U879.LC240B_PV.F_CV;29.916503906;100.0 +25/10/2020 02:06:21;U879.LC240B_PV.F_CV;29.811120987;100.0 +25/10/2020 02:06:23;U879.LC240B_PV.F_CV;29.924610138;100.0 +25/10/2020 02:06:24;U879.LC240B_PV.F_CV;29.847600937;100.0 +25/10/2020 02:06:29;U879.LC240B_PV.F_CV;29.969196320;100.0 +25/10/2020 02:06:31;U879.LC240B_PV.F_CV;29.831388474;100.0 +25/10/2020 02:06:33;U879.LC240B_PV.F_CV;30.009727478;100.0 +25/10/2020 02:06:34;U879.LC240B_PV.F_CV;29.807067871;100.0 +25/10/2020 02:06:35;U879.LC240B_PV.F_CV;29.900291443;100.0 +25/10/2020 02:06:40;U879.LC240B_PV.F_CV;29.798961639;100.0 +25/10/2020 02:06:42;U879.LC240B_PV.F_CV;29.926637650;100.0 +25/10/2020 02:06:43;U879.LC240B_PV.F_CV;30.070526123;100.0 +25/10/2020 02:06:45;U879.LC240B_PV.F_CV;30.147535324;100.0 +25/10/2020 02:06:46;U879.LC240B_PV.F_CV;29.924610138;100.0 +25/10/2020 02:06:48;U879.LC240B_PV.F_CV;30.017833710;100.0 +25/10/2020 02:06:51;U879.LC240B_PV.F_CV;29.936769485;100.0 +25/10/2020 02:06:55;U879.LC240B_PV.F_CV;30.066473007;100.0 +25/10/2020 02:06:56;U879.LC240B_PV.F_CV;29.973249435;100.0 +25/10/2020 02:06:23;U879.LC240B_SP.F_CV;30.000000000;100.0 +25/10/2020 02:06:04;U879.LC240C_OP.F_CV;88.754493713;100.0 +25/10/2020 02:06:33;U879.LC240C_OP.F_CV;88.806129456;100.0 +25/10/2020 02:06:06;U879.LC240C_PV.F_CV;24.937175751;100.0 +25/10/2020 02:06:36;U879.LC240C_PV.F_CV;25.040531158;100.0 +25/10/2020 02:06:51;U879.LC240C_PV.F_CV;24.987840652;100.0 +25/10/2020 02:06:23;U879.LC240C_SP.F_CV;25.000000000;100.0 +25/10/2020 02:06:13;U879.LC240D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U879.LC240D_PV.F_CV;22.450551987;100.0 +25/10/2020 02:06:23;U879.LC240D_SP.F_CV;25.000000000;100.0 +25/10/2020 02:06:08;U879.LC240E_OP.F_CV;96.728775024;100.0 +25/10/2020 02:06:11;U879.LC240E_OP.F_CV;96.631118774;100.0 +25/10/2020 02:06:14;U879.LC240E_OP.F_CV;96.697174072;100.0 +25/10/2020 02:06:15;U879.LC240E_OP.F_CV;96.873725891;100.0 +25/10/2020 02:06:19;U879.LC240E_OP.F_CV;96.748222351;100.0 +25/10/2020 02:06:20;U879.LC240E_OP.F_CV;96.627067566;100.0 +25/10/2020 02:06:23;U879.LC240E_OP.F_CV;96.765167236;100.0 +25/10/2020 02:06:24;U879.LC240E_OP.F_CV;96.897682190;100.0 +25/10/2020 02:06:33;U879.LC240E_OP.F_CV;96.787628174;100.0 +25/10/2020 02:06:36;U879.LC240E_OP.F_CV;96.618858337;100.0 +25/10/2020 02:06:39;U879.LC240E_OP.F_CV;96.766723633;100.0 +25/10/2020 02:06:40;U879.LC240E_OP.F_CV;96.896049500;100.0 +25/10/2020 02:06:43;U879.LC240E_OP.F_CV;96.823921204;100.0 +25/10/2020 02:06:45;U879.LC240E_OP.F_CV;96.883445740;100.0 +25/10/2020 02:06:51;U879.LC240E_OP.F_CV;96.727607727;100.0 +25/10/2020 02:06:54;U879.LC240E_OP.F_CV;96.795928955;100.0 +25/10/2020 02:06:56;U879.LC240E_OP.F_CV;96.936889648;100.0 +25/10/2020 02:06:08;U879.LC240E_PV.F_CV;30.167800903;100.0 +25/10/2020 02:06:09;U879.LC240E_PV.F_CV;30.248865128;100.0 +25/10/2020 02:06:11;U879.LC240E_PV.F_CV;29.965143204;100.0 +25/10/2020 02:06:14;U879.LC240E_PV.F_CV;30.098897934;100.0 +25/10/2020 02:06:15;U879.LC240E_PV.F_CV;30.447471619;100.0 +25/10/2020 02:06:19;U879.LC240E_PV.F_CV;30.175907135;100.0 +25/10/2020 02:06:20;U879.LC240E_PV.F_CV;29.932716370;100.0 +25/10/2020 02:06:22;U879.LC240E_PV.F_CV;30.029993057;100.0 +25/10/2020 02:06:24;U879.LC240E_PV.F_CV;30.467737198;100.0 +25/10/2020 02:06:34;U879.LC240E_PV.F_CV;30.135375977;100.0 +25/10/2020 02:06:36;U879.LC240E_PV.F_CV;29.859760284;100.0 +25/10/2020 02:06:39;U879.LC240E_PV.F_CV;30.155641556;100.0 +25/10/2020 02:06:40;U879.LC240E_PV.F_CV;30.410991669;100.0 +25/10/2020 02:06:42;U879.LC240E_PV.F_CV;30.354248047;100.0 +25/10/2020 02:06:43;U879.LC240E_PV.F_CV;30.248865128;100.0 +25/10/2020 02:06:45;U879.LC240E_PV.F_CV;30.358301163;100.0 +25/10/2020 02:06:50;U879.LC240E_PV.F_CV;30.115110397;100.0 +25/10/2020 02:06:51;U879.LC240E_PV.F_CV;30.021886826;100.0 +25/10/2020 02:06:54;U879.LC240E_PV.F_CV;30.155641556;100.0 +25/10/2020 02:06:55;U879.LC240E_PV.F_CV;30.086738586;100.0 +25/10/2020 02:06:56;U879.LC240E_PV.F_CV;30.431257248;100.0 +25/10/2020 02:06:57;U879.LC240E_PV.F_CV;30.508268356;100.0 +25/10/2020 02:06:07;U879.LC240E_SP.F_CV;30.000000000;100.0 +25/10/2020 02:06:09;U879.LC240F_OP.F_CV;67.122856140;100.0 +25/10/2020 02:06:04;U879.LC240F_PV.F_CV;28.489786148;100.0 +25/10/2020 02:06:06;U879.LC240F_PV.F_CV;28.396562576;100.0 +25/10/2020 02:06:12;U879.LC240F_PV.F_CV;28.341846466;100.0 +25/10/2020 02:06:15;U879.LC240F_PV.F_CV;28.453308105;100.0 +25/10/2020 02:06:17;U879.LC240F_PV.F_CV;28.392509460;100.0 +25/10/2020 02:06:23;U879.LC240F_PV.F_CV;28.477626801;100.0 +25/10/2020 02:06:30;U879.LC240F_PV.F_CV;28.303339005;100.0 +25/10/2020 02:06:39;U879.LC240F_PV.F_CV;28.465467453;100.0 +25/10/2020 02:06:42;U879.LC240F_PV.F_CV;28.307392120;100.0 +25/10/2020 02:06:50;U879.LC240F_PV.F_CV;28.384403229;100.0 +25/10/2020 02:06:51;U879.LC240F_PV.F_CV;28.287126541;100.0 +25/10/2020 02:06:57;U879.LC240F_PV.F_CV;28.396562576;100.0 +25/10/2020 02:06:42;U879.LC240F_SP.F_CV;25.000000000;100.0 +25/10/2020 02:06:25;U879.LI120A_PV.F_CV;81.744483948;100.0 +25/10/2020 02:06:26;U879.LI120A_PV.F_CV;81.813392639;100.0 +25/10/2020 02:06:34;U879.LI120A_PV.F_CV;81.756645203;100.0 +25/10/2020 02:06:35;U879.LI120A_PV.F_CV;81.845817566;100.0 +25/10/2020 02:06:40;U879.LI120A_PV.F_CV;81.789070129;100.0 +25/10/2020 02:06:59;U879.LI120A_PV.F_CV;81.853919983;100.0 +25/10/2020 02:06:39;U879.LI120B_PV.F_CV;50.316146851;100.0 +25/10/2020 02:06:55;U879.LI120B_PV.F_CV;50.259403229;100.0 +25/10/2020 02:06:56;U879.LI120B_PV.F_CV;50.312095642;100.0 +25/10/2020 02:06:07;U879.LI120C_PV.F_CV;61.142185211;100.0 +25/10/2020 02:06:20;U879.LI120C_PV.F_CV;61.215141296;100.0 +25/10/2020 02:06:24;U879.LI120C_PV.F_CV;61.154346466;100.0 +25/10/2020 02:06:35;U879.LI120C_PV.F_CV;61.211090088;100.0 +25/10/2020 02:06:42;U879.LI120C_PV.F_CV;61.138134003;100.0 +25/10/2020 02:06:46;U879.LI120C_PV.F_CV;61.239459991;100.0 +25/10/2020 02:06:51;U879.LI120C_PV.F_CV;61.180690765;100.0 +25/10/2020 02:06:24;U879.LI120D_PV.F_CV;-0.064135581;100.0 +25/10/2020 02:06:19;U879.LI120E_PV.F_CV;31.764753342;100.0 +25/10/2020 02:06:20;U879.LI120E_PV.F_CV;31.691797256;100.0 +25/10/2020 02:06:26;U879.LI120E_PV.F_CV;31.752593994;100.0 +25/10/2020 02:06:39;U879.LI120E_PV.F_CV;31.699901581;100.0 +25/10/2020 02:06:02;U879.LI120F_PV.F_CV;28.505998611;100.0 +25/10/2020 02:06:33;U879.LI120F_PV.F_CV;28.566795349;100.0 +25/10/2020 02:06:36;U879.LI120F_PV.F_CV;28.501945496;100.0 +25/10/2020 02:06:52;U879.LI120F_PV.F_CV;28.570850372;100.0 +25/10/2020 02:06:54;U879.LI120F_PV.F_CV;28.518157959;100.0 +25/10/2020 02:06:06;U879.LI191_PV.F_CV;56.590465546;100.0 +25/10/2020 02:06:17;U879.LI191_PV.F_CV;56.517509460;100.0 +25/10/2020 02:06:19;U879.LI191_PV.F_CV;56.574253082;100.0 +25/10/2020 02:06:52;U879.LI191_PV.F_CV;56.501296997;100.0 +25/10/2020 02:06:43;U879.PC100A_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U879.PC100A_PV.F_CV;160.205902100;100.0 +25/10/2020 02:06:23;U879.PC100A_SP.F_CV;160.000000000;100.0 +25/10/2020 02:06:23;U879.PC100B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U879.PC100B_PV.F_CV;160.100524902;100.0 +25/10/2020 02:06:23;U879.PC100B_SP.F_CV;160.000000000;100.0 +25/10/2020 02:06:23;U879.PC100C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U879.PC100C_PV.F_CV;160.004821777;100.0 +25/10/2020 02:06:00;U879.PC100C_SP.F_CV;160.000000000;100.0 +25/10/2020 02:06:23;U879.PC100D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U879.PC100D_PV.F_CV;160.024353027;100.0 +25/10/2020 02:06:23;U879.PC100D_SP.F_CV;160.000000000;100.0 +25/10/2020 02:06:16;U879.PC100E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U879.PC100E_PV.F_CV;159.581710815;100.0 +25/10/2020 02:06:30;U879.PC100E_PV.F_CV;159.841110229;100.0 +25/10/2020 02:06:36;U879.PC100E_PV.F_CV;160.100524902;100.0 +25/10/2020 02:06:46;U879.PC100E_SP.F_CV;160.000000000;100.0 +25/10/2020 02:06:23;U879.PC100F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U879.PC100F_PV.F_CV;159.956924438;100.0 +25/10/2020 02:06:10;U879.PC100F_PV.F_CV;159.855300903;100.0 +25/10/2020 02:06:16;U879.PC100F_PV.F_CV;159.955627441;100.0 +25/10/2020 02:06:26;U879.PC100F_PV.F_CV;159.855300903;100.0 +25/10/2020 02:06:35;U879.PC100F_PV.F_CV;159.962707520;100.0 +25/10/2020 02:06:43;U879.PC100F_PV.F_CV;159.833007813;100.0 +25/10/2020 02:06:49;U879.PC100F_PV.F_CV;159.947662354;100.0 +25/10/2020 02:06:23;U879.PC100F_SP.F_CV;160.000000000;100.0 +25/10/2020 02:06:23;U879.PC200A_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U879.PC200A_PV.F_CV;160.416671753;100.0 +25/10/2020 02:06:01;U879.PC200A_PV.F_CV;160.165374756;100.0 +25/10/2020 02:06:13;U879.PC200A_PV.F_CV;160.416671753;100.0 +25/10/2020 02:06:15;U879.PC200A_PV.F_CV;160.246429443;100.0 +25/10/2020 02:06:56;U879.PC200A_PV.F_CV;160.535552979;100.0 +25/10/2020 02:06:59;U879.PC200A_PV.F_CV;160.692276001;100.0 +25/10/2020 02:06:23;U879.PC200A_SP.F_CV;160.000000000;100.0 +25/10/2020 02:06:00;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U879.PC200B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U879.PC200B_PV.F_CV;99.577545166;100.0 +25/10/2020 02:06:23;U879.PC200B_SP.F_CV;100.000000000;100.0 +25/10/2020 02:06:00;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U879.PC200C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U879.PC200C_PV.F_CV;160.919265747;100.0 +25/10/2020 02:06:39;U879.PC200C_PV.F_CV;160.793609619;100.0 +25/10/2020 02:06:23;U879.PC200C_SP.F_CV;161.000000000;100.0 +25/10/2020 02:06:00;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U879.PC200D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U879.PC200D_PV.F_CV;160.084274292;100.0 +25/10/2020 02:06:47;U879.PC200D_SP.F_CV;160.000000000;100.0 +25/10/2020 02:06:00;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U879.PC200E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U879.PC200E_PV.F_CV;160.165374756;100.0 +25/10/2020 02:06:28;U879.PC200E_PV.F_CV;160.027557373;100.0 +25/10/2020 02:06:46;U879.PC200E_SP.F_CV;160.000000000;100.0 +25/10/2020 02:06:00;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U879.PC200F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U879.PC200F_PV.F_CV;159.958648682;100.0 +25/10/2020 02:06:19;U879.PC200F_SP.F_CV;160.000000000;100.0 +25/10/2020 02:06:02;U879.PI101A_PV.F_CV;160.428802490;100.0 +25/10/2020 02:06:41;U879.PI101A_PV.F_CV;160.783447266;100.0 +25/10/2020 02:06:44;U879.PI101A_PV.F_CV;160.357864380;100.0 +25/10/2020 02:06:48;U879.PI101A_PV.F_CV;160.489593506;100.0 +25/10/2020 02:06:53;U879.PI101A_PV.F_CV;160.337600708;100.0 +25/10/2020 02:06:57;U879.PI101A_PV.F_CV;160.509857178;100.0 +25/10/2020 02:06:18;U879.PI101B_PV.F_CV;161.330917358;100.0 +25/10/2020 02:06:22;U879.PI101B_PV.F_CV;161.482910156;100.0 +25/10/2020 02:06:56;U879.PI101B_PV.F_CV;161.351181030;100.0 +25/10/2020 02:06:01;U879.PI101C_PV.F_CV;160.394378662;100.0 +25/10/2020 02:06:08;U879.PI101C_PV.F_CV;160.586898804;100.0 +25/10/2020 02:06:09;U879.PI101C_PV.F_CV;160.404510498;100.0 +25/10/2020 02:06:12;U879.PI101C_PV.F_CV;160.657836914;100.0 +25/10/2020 02:06:15;U879.PI101C_PV.F_CV;160.404510498;100.0 +25/10/2020 02:06:17;U879.PI101C_PV.F_CV;160.688232422;100.0 +25/10/2020 02:06:18;U879.PI101C_PV.F_CV;160.384246826;100.0 +25/10/2020 02:06:19;U879.PI101C_PV.F_CV;160.667968750;100.0 +25/10/2020 02:06:21;U879.PI101C_PV.F_CV;160.394378662;100.0 +25/10/2020 02:06:25;U879.PI101C_PV.F_CV;160.566635132;100.0 +25/10/2020 02:06:27;U879.PI101C_PV.F_CV;160.353836060;100.0 +25/10/2020 02:06:35;U879.PI101C_PV.F_CV;160.637557983;100.0 +25/10/2020 02:06:36;U879.PI101C_PV.F_CV;160.424774170;100.0 +25/10/2020 02:06:40;U879.PI101C_PV.F_CV;160.667968750;100.0 +25/10/2020 02:06:51;U879.PI101C_PV.F_CV;160.343704224;100.0 +25/10/2020 02:06:07;U879.PI101D_PV.F_CV;139.165863037;100.0 +25/10/2020 02:06:06;U879.PI101E_PV.F_CV;160.497070313;100.0 +25/10/2020 02:06:07;U879.PI101E_PV.F_CV;160.790924072;100.0 +25/10/2020 02:06:10;U879.PI101E_PV.F_CV;160.963180542;100.0 +25/10/2020 02:06:14;U879.PI101E_PV.F_CV;160.345077515;100.0 +25/10/2020 02:06:16;U879.PI101E_PV.F_CV;160.537597656;100.0 +25/10/2020 02:06:18;U879.PI101E_PV.F_CV;160.223480225;100.0 +25/10/2020 02:06:19;U879.PI101E_PV.F_CV;160.456527710;100.0 +25/10/2020 02:06:22;U879.PI101E_PV.F_CV;160.314666748;100.0 +25/10/2020 02:06:23;U879.PI101E_PV.F_CV;160.547729492;100.0 +25/10/2020 02:06:31;U879.PI101E_PV.F_CV;160.968261719;100.0 +25/10/2020 02:06:32;U879.PI101E_PV.F_CV;161.317840576;100.0 +25/10/2020 02:06:38;U879.PI101E_PV.F_CV;160.831451416;100.0 +25/10/2020 02:06:40;U879.PI101E_PV.F_CV;160.993576050;100.0 +25/10/2020 02:06:42;U879.PI101E_PV.F_CV;160.557861328;100.0 +25/10/2020 02:06:43;U879.PI101E_PV.F_CV;160.821319580;100.0 +25/10/2020 02:06:45;U879.PI101E_PV.F_CV;160.689590454;100.0 +25/10/2020 02:06:54;U879.PI101E_PV.F_CV;160.973312378;100.0 +25/10/2020 02:06:59;U879.PI101E_PV.F_CV;160.730117798;100.0 +25/10/2020 02:06:06;U879.PI101F_PV.F_CV;152.774398804;100.0 +25/10/2020 02:06:08;U879.PI101F_PV.F_CV;152.581878662;100.0 +25/10/2020 02:06:10;U879.PI101F_PV.F_CV;152.855468750;100.0 +25/10/2020 02:06:13;U879.PI101F_PV.F_CV;152.571746826;100.0 +25/10/2020 02:06:15;U879.PI101F_PV.F_CV;152.835205078;100.0 +25/10/2020 02:06:19;U879.PI101F_PV.F_CV;152.592010498;100.0 +25/10/2020 02:06:22;U879.PI101F_PV.F_CV;152.956787109;100.0 +25/10/2020 02:06:23;U879.PI101F_PV.F_CV;152.581878662;100.0 +25/10/2020 02:06:43;U879.PI101F_PV.F_CV;152.825057983;100.0 +25/10/2020 02:06:44;U879.PI101F_PV.F_CV;152.612274170;100.0 +25/10/2020 02:06:46;U879.PI101F_PV.F_CV;152.875732422;100.0 +25/10/2020 02:06:48;U879.PI101F_PV.F_CV;152.541336060;100.0 +25/10/2020 02:06:50;U879.PI101F_PV.F_CV;152.885864258;100.0 +25/10/2020 02:06:51;U879.PI101F_PV.F_CV;152.592010498;100.0 +25/10/2020 02:06:00;U879.PI110_PV.F_CV;5.237629890;100.0 +25/10/2020 02:06:01;U879.PI110_PV.F_CV;5.238035202;100.0 +25/10/2020 02:06:02;U879.PI110_PV.F_CV;5.238035202;100.0 +25/10/2020 02:06:03;U879.PI110_PV.F_CV;5.238035202;100.0 +25/10/2020 02:06:04;U879.PI110_PV.F_CV;5.238035202;100.0 +25/10/2020 02:06:05;U879.PI110_PV.F_CV;5.238035202;100.0 +25/10/2020 02:06:06;U879.PI110_PV.F_CV;5.238035202;100.0 +25/10/2020 02:06:07;U879.PI110_PV.F_CV;5.238035202;100.0 +25/10/2020 02:06:08;U879.PI110_PV.F_CV;5.238035202;100.0 +25/10/2020 02:06:09;U879.PI110_PV.F_CV;5.238035202;100.0 +25/10/2020 02:06:10;U879.PI110_PV.F_CV;5.238035202;100.0 +25/10/2020 02:06:11;U879.PI110_PV.F_CV;5.238440514;100.0 +25/10/2020 02:06:12;U879.PI110_PV.F_CV;5.238440514;100.0 +25/10/2020 02:06:13;U879.PI110_PV.F_CV;5.238440514;100.0 +25/10/2020 02:06:14;U879.PI110_PV.F_CV;5.238440514;100.0 +25/10/2020 02:06:15;U879.PI110_PV.F_CV;5.238440514;100.0 +25/10/2020 02:06:16;U879.PI110_PV.F_CV;5.238440514;100.0 +25/10/2020 02:06:17;U879.PI110_PV.F_CV;5.238440514;100.0 +25/10/2020 02:06:18;U879.PI110_PV.F_CV;5.238440514;100.0 +25/10/2020 02:06:19;U879.PI110_PV.F_CV;5.238440514;100.0 +25/10/2020 02:06:20;U879.PI110_PV.F_CV;5.238440514;100.0 +25/10/2020 02:06:21;U879.PI110_PV.F_CV;5.238440514;100.0 +25/10/2020 02:06:22;U879.PI110_PV.F_CV;5.238440514;100.0 +25/10/2020 02:06:23;U879.PI110_PV.F_CV;5.238845825;100.0 +25/10/2020 02:06:24;U879.PI110_PV.F_CV;5.238845825;100.0 +25/10/2020 02:06:25;U879.PI110_PV.F_CV;5.238845825;100.0 +25/10/2020 02:06:26;U879.PI110_PV.F_CV;5.238845825;100.0 +25/10/2020 02:06:27;U879.PI110_PV.F_CV;5.238845825;100.0 +25/10/2020 02:06:28;U879.PI110_PV.F_CV;5.238845825;100.0 +25/10/2020 02:06:29;U879.PI110_PV.F_CV;5.238845825;100.0 +25/10/2020 02:06:30;U879.PI110_PV.F_CV;5.239251137;100.0 +25/10/2020 02:06:31;U879.PI110_PV.F_CV;5.239251137;100.0 +25/10/2020 02:06:32;U879.PI110_PV.F_CV;5.239251137;100.0 +25/10/2020 02:06:33;U879.PI110_PV.F_CV;5.239251137;100.0 +25/10/2020 02:06:34;U879.PI110_PV.F_CV;5.239251137;100.0 +25/10/2020 02:06:35;U879.PI110_PV.F_CV;5.239251137;100.0 +25/10/2020 02:06:36;U879.PI110_PV.F_CV;5.239251137;100.0 +25/10/2020 02:06:37;U879.PI110_PV.F_CV;5.239251137;100.0 +25/10/2020 02:06:38;U879.PI110_PV.F_CV;5.239251137;100.0 +25/10/2020 02:06:39;U879.PI110_PV.F_CV;5.239251137;100.0 +25/10/2020 02:06:40;U879.PI110_PV.F_CV;5.239251137;100.0 +25/10/2020 02:06:41;U879.PI110_PV.F_CV;5.239251137;100.0 +25/10/2020 02:06:42;U879.PI110_PV.F_CV;5.239656448;100.0 +25/10/2020 02:06:43;U879.PI110_PV.F_CV;5.239656448;100.0 +25/10/2020 02:06:44;U879.PI110_PV.F_CV;5.239656448;100.0 +25/10/2020 02:06:45;U879.PI110_PV.F_CV;5.239656448;100.0 +25/10/2020 02:06:46;U879.PI110_PV.F_CV;5.239656448;100.0 +25/10/2020 02:06:47;U879.PI110_PV.F_CV;5.239656448;100.0 +25/10/2020 02:06:48;U879.PI110_PV.F_CV;5.239656448;100.0 +25/10/2020 02:06:49;U879.PI110_PV.F_CV;5.239656448;100.0 +25/10/2020 02:06:50;U879.PI110_PV.F_CV;5.240061760;100.0 +25/10/2020 02:06:51;U879.PI110_PV.F_CV;5.240061760;100.0 +25/10/2020 02:06:52;U879.PI110_PV.F_CV;5.240061760;100.0 +25/10/2020 02:06:53;U879.PI110_PV.F_CV;5.239656448;100.0 +25/10/2020 02:06:54;U879.PI110_PV.F_CV;5.239656448;100.0 +25/10/2020 02:06:55;U879.PI110_PV.F_CV;5.240061760;100.0 +25/10/2020 02:06:56;U879.PI110_PV.F_CV;5.240061760;100.0 +25/10/2020 02:06:57;U879.PI110_PV.F_CV;5.240061760;100.0 +25/10/2020 02:06:58;U879.PI110_PV.F_CV;5.240061760;100.0 +25/10/2020 02:06:59;U879.PI110_PV.F_CV;5.240061760;100.0 +25/10/2020 02:06:02;U879.PI141A_PV.F_CV;0.791990936;100.0 +25/10/2020 02:06:07;U879.PI141A_PV.F_CV;0.773346305;100.0 +25/10/2020 02:06:10;U879.PI141A_PV.F_CV;0.787127137;100.0 +25/10/2020 02:06:21;U879.PI141A_PV.F_CV;0.792801559;100.0 +25/10/2020 02:06:27;U879.PI141A_PV.F_CV;0.774967551;100.0 +25/10/2020 02:06:28;U879.PI141A_PV.F_CV;0.783073902;100.0 +25/10/2020 02:06:33;U879.PI141A_PV.F_CV;0.789153695;100.0 +25/10/2020 02:06:41;U879.PI141A_PV.F_CV;0.774156928;100.0 +25/10/2020 02:06:45;U879.PI141A_PV.F_CV;0.787937760;100.0 +25/10/2020 02:06:57;U879.PI141A_PV.F_CV;0.779831409;100.0 +25/10/2020 02:06:02;U879.PI141B_PV.F_CV;1.118271708;100.0 +25/10/2020 02:06:21;U879.PI141B_PV.F_CV;1.113002539;100.0 +25/10/2020 02:06:23;U879.PI141B_PV.F_CV;1.094357967;100.0 +25/10/2020 02:06:24;U879.PI141B_PV.F_CV;1.108949423;100.0 +25/10/2020 02:06:33;U879.PI141B_PV.F_CV;1.119892955;100.0 +25/10/2020 02:06:38;U879.PI141B_PV.F_CV;1.106922865;100.0 +25/10/2020 02:06:39;U879.PI141B_PV.F_CV;1.096789837;100.0 +25/10/2020 02:06:41;U879.PI141B_PV.F_CV;1.114218593;100.0 +25/10/2020 02:06:49;U879.PI141B_PV.F_CV;1.119487643;100.0 +25/10/2020 02:06:52;U879.PI141B_PV.F_CV;1.112867475;100.0 +25/10/2020 02:06:54;U879.PI141B_PV.F_CV;1.099627137;100.0 +25/10/2020 02:06:57;U879.PI141B_PV.F_CV;1.116650462;100.0 +25/10/2020 02:06:07;U879.PI141C_PV.F_CV;0.957765877;100.0 +25/10/2020 02:06:12;U879.PI141C_PV.F_CV;0.941553175;100.0 +25/10/2020 02:06:24;U879.PI141C_PV.F_CV;0.958171189;100.0 +25/10/2020 02:06:33;U879.PI141C_PV.F_CV;0.946416974;100.0 +25/10/2020 02:06:40;U879.PI141C_PV.F_CV;0.927772403;100.0 +25/10/2020 02:06:53;U879.PI141C_PV.F_CV;0.957765877;100.0 +25/10/2020 02:06:43;U879.PI141D_PV.F_CV;1.076524019;100.0 +25/10/2020 02:06:04;U879.PI141E_PV.F_CV;1.156776905;100.0 +25/10/2020 02:06:09;U879.PI141E_PV.F_CV;1.130836606;100.0 +25/10/2020 02:06:10;U879.PI141E_PV.F_CV;1.115434527;100.0 +25/10/2020 02:06:12;U879.PI141E_PV.F_CV;1.131849885;100.0 +25/10/2020 02:06:13;U879.PI141E_PV.F_CV;1.148670554;100.0 +25/10/2020 02:06:22;U879.PI141E_PV.F_CV;1.162856698;100.0 +25/10/2020 02:06:32;U879.PI141E_PV.F_CV;1.123946190;100.0 +25/10/2020 02:06:36;U879.PI141E_PV.F_CV;1.084630370;100.0 +25/10/2020 02:06:38;U879.PI141E_PV.F_CV;1.117055774;100.0 +25/10/2020 02:06:45;U879.PI141E_PV.F_CV;1.141780138;100.0 +25/10/2020 02:06:48;U879.PI141E_PV.F_CV;1.148265243;100.0 +25/10/2020 02:06:55;U879.PI141E_PV.F_CV;1.126783371;100.0 +25/10/2020 02:06:57;U879.PI141E_PV.F_CV;1.102464318;100.0 +25/10/2020 02:06:58;U879.PI141E_PV.F_CV;1.110165358;100.0 +25/10/2020 02:06:59;U879.PI141E_PV.F_CV;1.131647229;100.0 +25/10/2020 02:06:31;U879.PI141F_PV.F_CV;0.959792495;100.0 +25/10/2020 02:06:54;U879.PI141F_PV.F_CV;0.965061605;100.0 +25/10/2020 02:06:23;U879.PI144A_PV.F_CV;0.996169746;100.0 +25/10/2020 02:06:48;U879.PI144B_PV.F_CV;1.001438856;100.0 +25/10/2020 02:06:27;U879.PI144C_PV.F_CV;0.998703003;100.0 +25/10/2020 02:06:23;U879.PI144D_PV.F_CV;0.999006987;100.0 +25/10/2020 02:06:23;U879.PI144E_PV.F_CV;1.000020266;100.0 +25/10/2020 02:06:48;U879.PI144F_PV.F_CV;0.998601675;100.0 +25/10/2020 02:06:00;U879.PI201A_PV.F_CV;160.723114014;100.0 +25/10/2020 02:06:02;U879.PI201A_PV.F_CV;160.348190308;100.0 +25/10/2020 02:06:04;U879.PI201A_PV.F_CV;160.520446777;100.0 +25/10/2020 02:06:06;U879.PI201A_PV.F_CV;160.105010986;100.0 +25/10/2020 02:06:07;U879.PI201A_PV.F_CV;160.348190308;100.0 +25/10/2020 02:06:14;U879.PI201A_PV.F_CV;160.794036865;100.0 +25/10/2020 02:06:18;U879.PI201A_PV.F_CV;160.398864746;100.0 +25/10/2020 02:06:19;U879.PI201A_PV.F_CV;160.601516724;100.0 +25/10/2020 02:06:21;U879.PI201A_PV.F_CV;160.378585815;100.0 +25/10/2020 02:06:25;U879.PI201A_PV.F_CV;160.540725708;100.0 +25/10/2020 02:06:26;U879.PI201A_PV.F_CV;160.358322144;100.0 +25/10/2020 02:06:29;U879.PI201A_PV.F_CV;160.733245850;100.0 +25/10/2020 02:06:33;U879.PI201A_PV.F_CV;160.500183105;100.0 +25/10/2020 02:06:44;U879.PI201A_PV.F_CV;160.743377686;100.0 +25/10/2020 02:06:48;U879.PI201A_PV.F_CV;160.601516724;100.0 +25/10/2020 02:06:52;U879.PI201A_PV.F_CV;160.794036865;100.0 +25/10/2020 02:06:53;U879.PI201A_PV.F_CV;160.642044067;100.0 +25/10/2020 02:06:54;U879.PI201A_PV.F_CV;160.794036865;100.0 +25/10/2020 02:06:56;U879.PI201A_PV.F_CV;160.601516724;100.0 +25/10/2020 02:06:57;U879.PI201A_PV.F_CV;160.773773193;100.0 +25/10/2020 02:06:00;U879.PI201B_PV.F_CV;99.394050598;100.0 +25/10/2020 02:06:01;U879.PI201B_PV.F_CV;99.181259155;100.0 +25/10/2020 02:06:05;U879.PI201B_PV.F_CV;99.454849243;100.0 +25/10/2020 02:06:07;U879.PI201B_PV.F_CV;99.272453308;100.0 +25/10/2020 02:06:08;U879.PI201B_PV.F_CV;99.414314270;100.0 +25/10/2020 02:06:21;U879.PI201B_PV.F_CV;99.130592346;100.0 +25/10/2020 02:06:29;U879.PI201B_PV.F_CV;99.343383789;100.0 +25/10/2020 02:06:34;U879.PI201B_PV.F_CV;99.201522827;100.0 +25/10/2020 02:06:41;U879.PI201B_PV.F_CV;99.333251953;100.0 +25/10/2020 02:06:43;U879.PI201B_PV.F_CV;99.181259155;100.0 +25/10/2020 02:06:48;U879.PI201B_PV.F_CV;99.434577942;100.0 +25/10/2020 02:06:56;U879.PI201B_PV.F_CV;99.100196838;100.0 +25/10/2020 02:06:02;U879.PI201C_PV.F_CV;160.556503296;100.0 +25/10/2020 02:06:03;U879.PI201C_PV.F_CV;160.860488892;100.0 +25/10/2020 02:06:06;U879.PI201C_PV.F_CV;161.032745361;100.0 +25/10/2020 02:06:46;U879.PI201C_PV.F_CV;160.546371460;100.0 +25/10/2020 02:06:48;U879.PI201C_PV.F_CV;160.819961548;100.0 +25/10/2020 02:06:58;U879.PI201C_PV.F_CV;160.515975952;100.0 +25/10/2020 02:06:02;U879.PI201D_PV.F_CV;146.153106689;100.0 +25/10/2020 02:06:03;U879.PI201D_PV.F_CV;146.467224121;100.0 +25/10/2020 02:06:04;U879.PI201D_PV.F_CV;146.284835815;100.0 +25/10/2020 02:06:06;U879.PI201D_PV.F_CV;146.431762695;100.0 +25/10/2020 02:06:09;U879.PI201D_PV.F_CV;146.173370361;100.0 +25/10/2020 02:06:12;U879.PI201D_PV.F_CV;146.446960449;100.0 +25/10/2020 02:06:19;U879.PI201D_PV.F_CV;146.264572144;100.0 +25/10/2020 02:06:21;U879.PI201D_PV.F_CV;146.487487793;100.0 +25/10/2020 02:06:23;U879.PI201D_PV.F_CV;146.193634033;100.0 +25/10/2020 02:06:24;U879.PI201D_PV.F_CV;146.436828613;100.0 +25/10/2020 02:06:26;U879.PI201D_PV.F_CV;146.294967651;100.0 +25/10/2020 02:06:28;U879.PI201D_PV.F_CV;146.487487793;100.0 +25/10/2020 02:06:31;U879.PI201D_PV.F_CV;146.173370361;100.0 +25/10/2020 02:06:36;U879.PI201D_PV.F_CV;146.416564941;100.0 +25/10/2020 02:06:41;U879.PI201D_PV.F_CV;146.254425049;100.0 +25/10/2020 02:06:42;U879.PI201D_PV.F_CV;146.406433105;100.0 +25/10/2020 02:06:46;U879.PI201D_PV.F_CV;146.163238525;100.0 +25/10/2020 02:06:48;U879.PI201D_PV.F_CV;146.406433105;100.0 +25/10/2020 02:06:50;U879.PI201D_PV.F_CV;146.254425049;100.0 +25/10/2020 02:06:51;U879.PI201D_PV.F_CV;146.406433105;100.0 +25/10/2020 02:06:00;U879.PI201E_PV.F_CV;159.384887695;100.0 +25/10/2020 02:06:09;U879.PI201E_PV.F_CV;159.557144165;100.0 +25/10/2020 02:06:11;U879.PI201E_PV.F_CV;159.425415039;100.0 +25/10/2020 02:06:19;U879.PI201E_PV.F_CV;159.901672363;100.0 +25/10/2020 02:06:20;U879.PI201E_PV.F_CV;159.445693970;100.0 +25/10/2020 02:06:31;U879.PI201E_PV.F_CV;159.319030762;100.0 +25/10/2020 02:06:34;U879.PI201E_PV.F_CV;159.780075073;100.0 +25/10/2020 02:06:36;U879.PI201E_PV.F_CV;159.395019531;100.0 +25/10/2020 02:06:42;U879.PI201E_PV.F_CV;159.790206909;100.0 +25/10/2020 02:06:44;U879.PI201E_PV.F_CV;159.334228516;100.0 +25/10/2020 02:06:52;U879.PI201E_PV.F_CV;159.607818604;100.0 +25/10/2020 02:06:53;U879.PI201E_PV.F_CV;159.810470581;100.0 +25/10/2020 02:06:55;U879.PI201E_PV.F_CV;159.334228516;100.0 +25/10/2020 02:06:15;U879.PI201F_PV.F_CV;132.209014893;100.0 +25/10/2020 02:06:16;U879.PI201F_PV.F_CV;132.036743164;100.0 +25/10/2020 02:06:23;U879.PI201F_PV.F_CV;132.290069580;100.0 +25/10/2020 02:06:24;U879.PI201F_PV.F_CV;131.986083984;100.0 +25/10/2020 02:06:32;U879.PI201F_PV.F_CV;132.290069580;100.0 +25/10/2020 02:06:33;U879.PI201F_PV.F_CV;131.894882202;100.0 +25/10/2020 02:06:34;U879.PI201F_PV.F_CV;132.026611328;100.0 +25/10/2020 02:06:39;U879.PI201F_PV.F_CV;131.894882202;100.0 +25/10/2020 02:06:40;U879.PI201F_PV.F_CV;132.026611328;100.0 +25/10/2020 02:06:45;U879.PI201F_PV.F_CV;131.864486694;100.0 +25/10/2020 02:06:54;U879.PI201F_PV.F_CV;132.036743164;100.0 +25/10/2020 02:06:57;U879.PI201F_PV.F_CV;131.884750366;100.0 +25/10/2020 02:06:00;U879.PI241A_PV.F_CV;0.890483141;100.0 +25/10/2020 02:06:02;U879.PI241A_PV.F_CV;0.922097921;100.0 +25/10/2020 02:06:06;U879.PI241A_PV.F_CV;0.916828811;100.0 +25/10/2020 02:06:10;U879.PI241A_PV.F_CV;0.927772403;100.0 +25/10/2020 02:06:13;U879.PI241A_PV.F_CV;0.906290531;100.0 +25/10/2020 02:06:14;U879.PI241A_PV.F_CV;0.888456523;100.0 +25/10/2020 02:06:21;U879.PI241A_PV.F_CV;0.928988338;100.0 +25/10/2020 02:06:27;U879.PI241A_PV.F_CV;0.913586259;100.0 +25/10/2020 02:06:29;U879.PI241A_PV.F_CV;0.898994803;100.0 +25/10/2020 02:06:30;U879.PI241A_PV.F_CV;0.880755484;100.0 +25/10/2020 02:06:34;U879.PI241A_PV.F_CV;0.918044746;100.0 +25/10/2020 02:06:39;U879.PI241A_PV.F_CV;0.938310623;100.0 +25/10/2020 02:06:42;U879.PI241A_PV.F_CV;0.925137818;100.0 +25/10/2020 02:06:46;U879.PI241A_PV.F_CV;0.885619342;100.0 +25/10/2020 02:06:48;U879.PI241A_PV.F_CV;0.916018188;100.0 +25/10/2020 02:06:55;U879.PI241A_PV.F_CV;0.926556408;100.0 +25/10/2020 02:06:58;U879.PI241A_PV.F_CV;0.904669285;100.0 +25/10/2020 02:06:59;U879.PI241A_PV.F_CV;0.887645900;100.0 +25/10/2020 02:06:01;U879.PI241B_PV.F_CV;0.951280832;100.0 +25/10/2020 02:06:02;U879.PI241B_PV.F_CV;0.956955254;100.0 +25/10/2020 02:06:09;U879.PI241B_PV.F_CV;0.947227597;100.0 +25/10/2020 02:06:15;U879.PI241B_PV.F_CV;0.953307390;100.0 +25/10/2020 02:06:16;U879.PI241B_PV.F_CV;0.961008430;100.0 +25/10/2020 02:06:06;U879.PI241C_PV.F_CV;1.104693651;100.0 +25/10/2020 02:06:07;U879.PI241C_PV.F_CV;1.099627137;100.0 +25/10/2020 02:06:09;U879.PI241C_PV.F_CV;1.111786604;100.0 +25/10/2020 02:06:19;U879.PI241C_PV.F_CV;1.117866397;100.0 +25/10/2020 02:06:24;U879.PI241C_PV.F_CV;1.110165358;100.0 +25/10/2020 02:06:45;U879.PI241C_PV.F_CV;1.124351501;100.0 +25/10/2020 02:06:14;U879.PI241D_PV.F_CV;0.538059354;100.0 +25/10/2020 02:06:08;U879.PI241E_PV.F_CV;0.610813856;100.0 +25/10/2020 02:06:09;U879.PI241E_PV.F_CV;0.600275636;100.0 +25/10/2020 02:06:14;U879.PI241E_PV.F_CV;0.679717898;100.0 +25/10/2020 02:06:15;U879.PI241E_PV.F_CV;0.667558372;100.0 +25/10/2020 02:06:16;U879.PI241E_PV.F_CV;0.637970150;100.0 +25/10/2020 02:06:19;U879.PI241E_PV.F_CV;0.592979908;100.0 +25/10/2020 02:06:20;U879.PI241E_PV.F_CV;0.634322286;100.0 +25/10/2020 02:06:23;U879.PI241E_PV.F_CV;0.675664723;100.0 +25/10/2020 02:06:27;U879.PI241E_PV.F_CV;0.633511662;100.0 +25/10/2020 02:06:30;U879.PI241E_PV.F_CV;0.612435162;100.0 +25/10/2020 02:06:34;U879.PI241E_PV.F_CV;0.599464953;100.0 +25/10/2020 02:06:38;U879.PI241E_PV.F_CV;0.676475346;100.0 +25/10/2020 02:06:40;U879.PI241E_PV.F_CV;0.658236086;100.0 +25/10/2020 02:06:43;U879.PI241E_PV.F_CV;0.608787298;100.0 +25/10/2020 02:06:44;U879.PI241E_PV.F_CV;0.622973382;100.0 +25/10/2020 02:06:46;U879.PI241E_PV.F_CV;0.616893649;100.0 +25/10/2020 02:06:51;U879.PI241E_PV.F_CV;0.634727597;100.0 +25/10/2020 02:06:54;U879.PI241E_PV.F_CV;0.659857333;100.0 +25/10/2020 02:06:55;U879.PI241E_PV.F_CV;0.675664723;100.0 +25/10/2020 02:06:04;U879.PI241F_PV.F_CV;1.265402079;100.0 +25/10/2020 02:06:16;U879.PI241F_PV.F_CV;1.270671248;100.0 +25/10/2020 02:06:19;U879.PI241F_PV.F_CV;1.264996767;100.0 +25/10/2020 02:06:56;U879.PI241F_PV.F_CV;1.271076560;100.0 +25/10/2020 02:06:58;U879.PI241F_PV.F_CV;1.265402079;100.0 +25/10/2020 02:06:23;U879.PI244A_PV.F_CV;0.996929705;100.0 +25/10/2020 02:06:23;U879.PI244B_PV.F_CV;1.004732132;100.0 +25/10/2020 02:06:23;U879.PI244C_PV.F_CV;1.000881553;100.0 +25/10/2020 02:06:48;U879.PI244D_PV.F_CV;0.996423066;100.0 +25/10/2020 02:06:17;U879.PI244E_PV.F_CV;1.000273585;100.0 +25/10/2020 02:06:16;U879.PI244F_PV.F_CV;0.994548500;100.0 +25/10/2020 02:06:00;U879.TC101A_OP.F_CV;15.183291435;100.0 +25/10/2020 02:06:02;U879.TC101A_OP.F_CV;14.642672539;100.0 +25/10/2020 02:06:04;U879.TC101A_OP.F_CV;15.580428123;100.0 +25/10/2020 02:06:05;U879.TC101A_OP.F_CV;15.182284355;100.0 +25/10/2020 02:06:07;U879.TC101A_OP.F_CV;15.722559929;100.0 +25/10/2020 02:06:08;U879.TC101A_OP.F_CV;14.784227371;100.0 +25/10/2020 02:06:10;U879.TC101A_OP.F_CV;15.182150841;100.0 +25/10/2020 02:06:11;U879.TC101A_OP.F_CV;15.722425461;100.0 +25/10/2020 02:06:13;U879.TC101A_OP.F_CV;15.324530602;100.0 +25/10/2020 02:06:14;U879.TC101A_OP.F_CV;14.784285545;100.0 +25/10/2020 02:06:18;U879.TC101A_OP.F_CV;15.253494263;100.0 +25/10/2020 02:06:19;U879.TC101A_OP.F_CV;15.722675323;100.0 +25/10/2020 02:06:20;U879.TC101A_OP.F_CV;14.784342766;100.0 +25/10/2020 02:06:23;U879.TC101A_OP.F_CV;16.120166779;100.0 +25/10/2020 02:06:25;U879.TC101A_OP.F_CV;14.243561745;100.0 +25/10/2020 02:06:26;U879.TC101A_OP.F_CV;15.579402924;100.0 +25/10/2020 02:06:28;U879.TC101A_OP.F_CV;15.721697807;100.0 +25/10/2020 02:06:29;U879.TC101A_OP.F_CV;14.783365250;100.0 +25/10/2020 02:06:31;U879.TC101A_OP.F_CV;14.640995979;100.0 +25/10/2020 02:06:32;U879.TC101A_OP.F_CV;16.119188309;100.0 +25/10/2020 02:06:34;U879.TC101A_OP.F_CV;14.782876015;100.0 +25/10/2020 02:06:35;U879.TC101A_OP.F_CV;15.721237183;100.0 +25/10/2020 02:06:37;U879.TC101A_OP.F_CV;14.782903671;100.0 +25/10/2020 02:06:38;U879.TC101A_OP.F_CV;15.180827141;100.0 +25/10/2020 02:06:40;U879.TC101A_OP.F_CV;15.721101761;100.0 +25/10/2020 02:06:41;U879.TC101A_OP.F_CV;14.242477417;100.0 +25/10/2020 02:06:43;U879.TC101A_OP.F_CV;15.038024902;100.0 +25/10/2020 02:06:44;U879.TC101A_OP.F_CV;15.577799797;100.0 +25/10/2020 02:06:46;U879.TC101A_OP.F_CV;15.179656982;100.0 +25/10/2020 02:06:47;U879.TC101A_OP.F_CV;14.639201164;100.0 +25/10/2020 02:06:49;U879.TC101A_OP.F_CV;16.117393494;100.0 +25/10/2020 02:06:50;U879.TC101A_OP.F_CV;15.321519852;100.0 +25/10/2020 02:06:52;U879.TC101A_OP.F_CV;14.240981102;100.0 +25/10/2020 02:06:53;U879.TC101A_OP.F_CV;15.576822281;100.0 +25/10/2020 02:06:55;U879.TC101A_OP.F_CV;15.719117165;100.0 +25/10/2020 02:06:56;U879.TC101A_OP.F_CV;14.240491867;100.0 +25/10/2020 02:06:58;U879.TC101A_OP.F_CV;15.036038399;100.0 +25/10/2020 02:06:55;U879.TC101A_PV.F_CV;396.045684814;100.0 +25/10/2020 02:06:23;U879.TC101A_SP.F_CV;396.000000000;100.0 +25/10/2020 02:06:00;U879.TC101B_OP.F_CV;15.110121727;100.0 +25/10/2020 02:06:01;U879.TC101B_OP.F_CV;14.022515297;100.0 +25/10/2020 02:06:02;U879.TC101B_OP.F_CV;15.367789268;100.0 +25/10/2020 02:06:04;U879.TC101B_OP.F_CV;14.966942787;100.0 +25/10/2020 02:06:05;U879.TC101B_OP.F_CV;14.422751427;100.0 +25/10/2020 02:06:07;U879.TC101B_OP.F_CV;14.823273659;100.0 +25/10/2020 02:06:09;U879.TC101B_OP.F_CV;15.094865799;100.0 +25/10/2020 02:06:10;U879.TC101B_OP.F_CV;15.366799355;100.0 +25/10/2020 02:06:11;U879.TC101B_OP.F_CV;15.509724617;100.0 +25/10/2020 02:06:13;U879.TC101B_OP.F_CV;14.565783501;100.0 +25/10/2020 02:06:14;U879.TC101B_OP.F_CV;14.422134399;100.0 +25/10/2020 02:06:18;U879.TC101B_OP.F_CV;14.894176483;100.0 +25/10/2020 02:06:19;U879.TC101B_OP.F_CV;15.366541862;100.0 +25/10/2020 02:06:20;U879.TC101B_OP.F_CV;14.965695381;100.0 +25/10/2020 02:06:22;U879.TC101B_OP.F_CV;14.869915962;100.0 +25/10/2020 02:06:24;U879.TC101B_OP.F_CV;15.003201485;100.0 +25/10/2020 02:06:26;U879.TC101B_OP.F_CV;15.365550995;100.0 +25/10/2020 02:06:28;U879.TC101B_OP.F_CV;15.508477211;100.0 +25/10/2020 02:06:29;U879.TC101B_OP.F_CV;14.020328522;100.0 +25/10/2020 02:06:31;U879.TC101B_OP.F_CV;15.365602493;100.0 +25/10/2020 02:06:32;U879.TC101B_OP.F_CV;14.964755058;100.0 +25/10/2020 02:06:34;U879.TC101B_OP.F_CV;14.420564651;100.0 +25/10/2020 02:06:35;U879.TC101B_OP.F_CV;15.909068108;100.0 +25/10/2020 02:06:37;U879.TC101B_OP.F_CV;14.020055771;100.0 +25/10/2020 02:06:38;U879.TC101B_OP.F_CV;14.821120262;100.0 +25/10/2020 02:06:40;U879.TC101B_OP.F_CV;15.908761978;100.0 +25/10/2020 02:06:41;U879.TC101B_OP.F_CV;14.019748688;100.0 +25/10/2020 02:06:43;U879.TC101B_OP.F_CV;15.365022659;100.0 +25/10/2020 02:06:44;U879.TC101B_OP.F_CV;14.964175224;100.0 +25/10/2020 02:06:47;U879.TC101B_OP.F_CV;15.507983208;100.0 +25/10/2020 02:06:49;U879.TC101B_OP.F_CV;14.564040184;100.0 +25/10/2020 02:06:50;U879.TC101B_OP.F_CV;14.964601517;100.0 +25/10/2020 02:06:55;U879.TC101B_OP.F_CV;14.964601517;100.0 +25/10/2020 02:06:56;U879.TC101B_OP.F_CV;14.420460701;100.0 +25/10/2020 02:06:58;U879.TC101B_OP.F_CV;15.365192413;100.0 +25/10/2020 02:06:59;U879.TC101B_OP.F_CV;14.420137405;100.0 +25/10/2020 02:06:01;U879.TC101B_PV.F_CV;398.045379639;100.0 +25/10/2020 02:06:23;U879.TC101B_SP.F_CV;398.000000000;100.0 +25/10/2020 02:06:00;U879.TC101C_OP.F_CV;15.223234177;100.0 +25/10/2020 02:06:01;U879.TC101C_OP.F_CV;14.952638626;100.0 +25/10/2020 02:06:02;U879.TC101C_OP.F_CV;15.893627167;100.0 +25/10/2020 02:06:04;U879.TC101C_OP.F_CV;15.495134354;100.0 +25/10/2020 02:06:05;U879.TC101C_OP.F_CV;14.412202835;100.0 +25/10/2020 02:06:07;U879.TC101C_OP.F_CV;15.210140228;100.0 +25/10/2020 02:06:11;U879.TC101C_OP.F_CV;16.293151855;100.0 +25/10/2020 02:06:13;U879.TC101C_OP.F_CV;15.495611191;100.0 +25/10/2020 02:06:14;U879.TC101C_OP.F_CV;14.954421043;100.0 +25/10/2020 02:06:17;U879.TC101C_OP.F_CV;16.294300079;100.0 +25/10/2020 02:06:19;U879.TC101C_OP.F_CV;15.496758461;100.0 +25/10/2020 02:06:20;U879.TC101C_OP.F_CV;14.955569267;100.0 +25/10/2020 02:06:23;U879.TC101C_OP.F_CV;15.753705978;100.0 +25/10/2020 02:06:26;U879.TC101C_OP.F_CV;14.670114517;100.0 +25/10/2020 02:06:28;U879.TC101C_OP.F_CV;15.610641479;100.0 +25/10/2020 02:06:29;U879.TC101C_OP.F_CV;15.753071785;100.0 +25/10/2020 02:06:31;U879.TC101C_OP.F_CV;15.354223251;100.0 +25/10/2020 02:06:32;U879.TC101C_OP.F_CV;14.812678337;100.0 +25/10/2020 02:06:34;U879.TC101C_OP.F_CV;15.753310204;100.0 +25/10/2020 02:06:35;U879.TC101C_OP.F_CV;15.354461670;100.0 +25/10/2020 02:06:37;U879.TC101C_OP.F_CV;15.896402359;100.0 +25/10/2020 02:06:38;U879.TC101C_OP.F_CV;14.956165314;100.0 +25/10/2020 02:06:40;U879.TC101C_OP.F_CV;15.355410576;100.0 +25/10/2020 02:06:41;U879.TC101C_OP.F_CV;14.813866615;100.0 +25/10/2020 02:06:43;U879.TC101C_OP.F_CV;16.296241760;100.0 +25/10/2020 02:06:44;U879.TC101C_OP.F_CV;14.956956863;100.0 +25/10/2020 02:06:46;U879.TC101C_OP.F_CV;15.356203079;100.0 +25/10/2020 02:06:47;U879.TC101C_OP.F_CV;14.814658165;100.0 +25/10/2020 02:06:49;U879.TC101C_OP.F_CV;15.755290031;100.0 +25/10/2020 02:06:50;U879.TC101C_OP.F_CV;14.814698219;100.0 +25/10/2020 02:06:52;U879.TC101C_OP.F_CV;14.719260216;100.0 +25/10/2020 02:06:54;U879.TC101C_OP.F_CV;14.870861053;100.0 +25/10/2020 02:06:57;U879.TC101C_OP.F_CV;15.340351105;100.0 +25/10/2020 02:06:58;U879.TC101C_OP.F_CV;15.611038208;100.0 +25/10/2020 02:06:59;U879.TC101C_OP.F_CV;14.669836998;100.0 +25/10/2020 02:06:32;U879.TC101C_PV.F_CV;397.994445801;100.0 +25/10/2020 02:06:23;U879.TC101C_SP.F_CV;398.000000000;100.0 +25/10/2020 02:06:00;U879.TC101D_OP.F_CV;14.364040375;100.0 +25/10/2020 02:06:01;U879.TC101D_OP.F_CV;14.093300819;100.0 +25/10/2020 02:06:02;U879.TC101D_OP.F_CV;15.033602715;100.0 +25/10/2020 02:06:04;U879.TC101D_OP.F_CV;14.093184471;100.0 +25/10/2020 02:06:05;U879.TC101D_OP.F_CV;15.033487320;100.0 +25/10/2020 02:06:07;U879.TC101D_OP.F_CV;14.634665489;100.0 +25/10/2020 02:06:08;U879.TC101D_OP.F_CV;13.551589012;100.0 +25/10/2020 02:06:10;U879.TC101D_OP.F_CV;15.432073593;100.0 +25/10/2020 02:06:11;U879.TC101D_OP.F_CV;14.634310722;100.0 +25/10/2020 02:06:13;U879.TC101D_OP.F_CV;14.092832565;100.0 +25/10/2020 02:06:14;U879.TC101D_OP.F_CV;14.491538048;100.0 +25/10/2020 02:06:17;U879.TC101D_OP.F_CV;13.949466705;100.0 +25/10/2020 02:06:19;U879.TC101D_OP.F_CV;14.889412880;100.0 +25/10/2020 02:06:20;U879.TC101D_OP.F_CV;15.031832695;100.0 +25/10/2020 02:06:23;U879.TC101D_OP.F_CV;14.091532707;100.0 +25/10/2020 02:06:26;U879.TC101D_OP.F_CV;14.633014679;100.0 +25/10/2020 02:06:30;U879.TC101D_OP.F_CV;14.718523026;100.0 +25/10/2020 02:06:32;U879.TC101D_OP.F_CV;14.889063835;100.0 +25/10/2020 02:06:34;U879.TC101D_OP.F_CV;14.489886284;100.0 +25/10/2020 02:06:35;U879.TC101D_OP.F_CV;15.031247139;100.0 +25/10/2020 02:06:38;U879.TC101D_OP.F_CV;14.090948105;100.0 +25/10/2020 02:06:40;U879.TC101D_OP.F_CV;14.489651680;100.0 +25/10/2020 02:06:44;U879.TC101D_OP.F_CV;15.030541420;100.0 +25/10/2020 02:06:46;U879.TC101D_OP.F_CV;14.090122223;100.0 +25/10/2020 02:06:47;U879.TC101D_OP.F_CV;15.030424118;100.0 +25/10/2020 02:06:49;U879.TC101D_OP.F_CV;14.090005875;100.0 +25/10/2020 02:06:50;U879.TC101D_OP.F_CV;15.030308723;100.0 +25/10/2020 02:06:52;U879.TC101D_OP.F_CV;14.631486893;100.0 +25/10/2020 02:06:54;U879.TC101D_OP.F_CV;14.090066910;100.0 +25/10/2020 02:06:55;U879.TC101D_OP.F_CV;13.548528671;100.0 +25/10/2020 02:06:56;U879.TC101D_OP.F_CV;14.887416840;100.0 +25/10/2020 02:06:58;U879.TC101D_OP.F_CV;14.488239288;100.0 +25/10/2020 02:06:23;U879.TC101D_PV.F_CV;350.016387939;100.0 +25/10/2020 02:06:23;U879.TC101D_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:13;U879.TC101E_OP.F_CV;10.467663765;100.0 +25/10/2020 02:06:14;U879.TC101E_OP.F_CV;11.003204346;100.0 +25/10/2020 02:06:16;U879.TC101E_OP.F_CV;10.061078072;100.0 +25/10/2020 02:06:17;U879.TC101E_OP.F_CV;10.460227013;100.0 +25/10/2020 02:06:20;U879.TC101E_OP.F_CV;11.001828194;100.0 +25/10/2020 02:06:22;U879.TC101E_OP.F_CV;10.059702873;100.0 +25/10/2020 02:06:23;U879.TC101E_OP.F_CV;10.458850861;100.0 +25/10/2020 02:06:27;U879.TC101E_OP.F_CV;10.729003906;100.0 +25/10/2020 02:06:28;U879.TC101E_OP.F_CV;11.000020981;100.0 +25/10/2020 02:06:29;U879.TC101E_OP.F_CV;10.057894707;100.0 +25/10/2020 02:06:31;U879.TC101E_OP.F_CV;9.962156296;100.0 +25/10/2020 02:06:33;U879.TC101E_OP.F_CV;10.384792328;100.0 +25/10/2020 02:06:34;U879.TC101E_OP.F_CV;10.855296135;100.0 +25/10/2020 02:06:35;U879.TC101E_OP.F_CV;10.455388069;100.0 +25/10/2020 02:06:41;U879.TC101E_OP.F_CV;10.455388069;100.0 +25/10/2020 02:06:43;U879.TC101E_OP.F_CV;10.995690346;100.0 +25/10/2020 02:06:44;U879.TC101E_OP.F_CV;10.053565025;100.0 +25/10/2020 02:06:46;U879.TC101E_OP.F_CV;10.452713013;100.0 +25/10/2020 02:06:48;U879.TC101E_OP.F_CV;10.723299026;100.0 +25/10/2020 02:06:49;U879.TC101E_OP.F_CV;10.994316101;100.0 +25/10/2020 02:06:50;U879.TC101E_OP.F_CV;10.594657898;100.0 +25/10/2020 02:06:52;U879.TC101E_OP.F_CV;10.499060631;100.0 +25/10/2020 02:06:58;U879.TC101E_OP.F_CV;10.499060631;100.0 +25/10/2020 02:06:59;U879.TC101E_OP.F_CV;10.991997719;100.0 +25/10/2020 02:06:58;U879.TC101E_PV.F_CV;315.033874512;100.0 +25/10/2020 02:06:23;U879.TC101E_SP.F_CV;315.000000000;100.0 +25/10/2020 02:06:04;U879.TC101F_OP.F_CV;14.941187859;100.0 +25/10/2020 02:06:05;U879.TC101F_OP.F_CV;15.484133720;100.0 +25/10/2020 02:06:07;U879.TC101F_OP.F_CV;14.545280457;100.0 +25/10/2020 02:06:08;U879.TC101F_OP.F_CV;14.944115639;100.0 +25/10/2020 02:06:10;U879.TC101F_OP.F_CV;14.403854370;100.0 +25/10/2020 02:06:11;U879.TC101F_OP.F_CV;15.342596054;100.0 +25/10/2020 02:06:13;U879.TC101F_OP.F_CV;14.944725037;100.0 +25/10/2020 02:06:17;U879.TC101F_OP.F_CV;15.486707687;100.0 +25/10/2020 02:06:19;U879.TC101F_OP.F_CV;15.088870049;100.0 +25/10/2020 02:06:20;U879.TC101F_OP.F_CV;14.548529625;100.0 +25/10/2020 02:06:22;U879.TC101F_OP.F_CV;14.947365761;100.0 +25/10/2020 02:06:32;U879.TC101F_OP.F_CV;14.947365761;100.0 +25/10/2020 02:06:34;U879.TC101F_OP.F_CV;15.490955353;100.0 +25/10/2020 02:06:35;U879.TC101F_OP.F_CV;15.093118668;100.0 +25/10/2020 02:06:38;U879.TC101F_OP.F_CV;15.492631912;100.0 +25/10/2020 02:06:40;U879.TC101F_OP.F_CV;14.553777695;100.0 +25/10/2020 02:06:41;U879.TC101F_OP.F_CV;14.952611923;100.0 +25/10/2020 02:06:45;U879.TC101F_OP.F_CV;15.223925591;100.0 +25/10/2020 02:06:46;U879.TC101F_OP.F_CV;15.494595528;100.0 +25/10/2020 02:06:47;U879.TC101F_OP.F_CV;14.555740356;100.0 +25/10/2020 02:06:50;U879.TC101F_OP.F_CV;14.954896927;100.0 +25/10/2020 02:06:56;U879.TC101F_OP.F_CV;14.954896927;100.0 +25/10/2020 02:06:58;U879.TC101F_OP.F_CV;15.497523308;100.0 +25/10/2020 02:06:59;U879.TC101F_OP.F_CV;14.558669090;100.0 +25/10/2020 02:06:42;U879.TC101F_PV.F_CV;349.860107422;100.0 +25/10/2020 02:06:24;U879.TC101F_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:00;U879.TC102A_OP.F_CV;9.430234909;100.0 +25/10/2020 02:06:01;U879.TC102A_OP.F_CV;9.829248428;100.0 +25/10/2020 02:06:03;U879.TC102A_OP.F_CV;10.100244522;100.0 +25/10/2020 02:06:04;U879.TC102A_OP.F_CV;10.371060371;100.0 +25/10/2020 02:06:05;U879.TC102A_OP.F_CV;9.972761154;100.0 +25/10/2020 02:06:07;U879.TC102A_OP.F_CV;9.431843758;100.0 +25/10/2020 02:06:08;U879.TC102A_OP.F_CV;9.830857277;100.0 +25/10/2020 02:06:11;U879.TC102A_OP.F_CV;10.372669220;100.0 +25/10/2020 02:06:13;U879.TC102A_OP.F_CV;9.432917595;100.0 +25/10/2020 02:06:14;U879.TC102A_OP.F_CV;9.831931114;100.0 +25/10/2020 02:06:28;U879.TC102A_OP.F_CV;9.831931114;100.0 +25/10/2020 02:06:29;U879.TC102A_OP.F_CV;10.375176430;100.0 +25/10/2020 02:06:31;U879.TC102A_OP.F_CV;9.435425758;100.0 +25/10/2020 02:06:32;U879.TC102A_OP.F_CV;9.834439278;100.0 +25/10/2020 02:06:49;U879.TC102A_OP.F_CV;9.834439278;100.0 +25/10/2020 02:06:50;U879.TC102A_OP.F_CV;10.378044128;100.0 +25/10/2020 02:06:52;U879.TC102A_OP.F_CV;9.438291550;100.0 +25/10/2020 02:06:53;U879.TC102A_OP.F_CV;9.837306023;100.0 +25/10/2020 02:06:56;U879.TC102A_OP.F_CV;9.296356201;100.0 +25/10/2020 02:06:58;U879.TC102A_OP.F_CV;10.236214638;100.0 +25/10/2020 02:06:59;U879.TC102A_OP.F_CV;9.837666512;100.0 +25/10/2020 02:06:49;U879.TC102A_PV.F_CV;395.850097656;100.0 +25/10/2020 02:06:11;U879.TC102A_SP.F_CV;396.000000000;100.0 +25/10/2020 02:06:04;U879.TC102B_OP.F_CV;10.223215103;100.0 +25/10/2020 02:06:05;U879.TC102B_OP.F_CV;9.684892654;100.0 +25/10/2020 02:06:07;U879.TC102B_OP.F_CV;10.625638008;100.0 +25/10/2020 02:06:08;U879.TC102B_OP.F_CV;10.226902008;100.0 +25/10/2020 02:06:10;U879.TC102B_OP.F_CV;9.685470581;100.0 +25/10/2020 02:06:11;U879.TC102B_OP.F_CV;10.626216888;100.0 +25/10/2020 02:06:13;U879.TC102B_OP.F_CV;10.227479935;100.0 +25/10/2020 02:06:16;U879.TC102B_OP.F_CV;10.132838249;100.0 +25/10/2020 02:06:20;U879.TC102B_OP.F_CV;9.543529510;100.0 +25/10/2020 02:06:23;U879.TC102B_OP.F_CV;10.084826469;100.0 +25/10/2020 02:06:26;U879.TC102B_OP.F_CV;11.025170326;100.0 +25/10/2020 02:06:28;U879.TC102B_OP.F_CV;9.685644150;100.0 +25/10/2020 02:06:29;U879.TC102B_OP.F_CV;9.542903900;100.0 +25/10/2020 02:06:31;U879.TC102B_OP.F_CV;10.483293533;100.0 +25/10/2020 02:06:32;U879.TC102B_OP.F_CV;10.084200859;100.0 +25/10/2020 02:06:38;U879.TC102B_OP.F_CV;10.084200859;100.0 +25/10/2020 02:06:40;U879.TC102B_OP.F_CV;9.542233467;100.0 +25/10/2020 02:06:41;U879.TC102B_OP.F_CV;9.940879822;100.0 +25/10/2020 02:06:43;U879.TC102B_OP.F_CV;10.482221603;100.0 +25/10/2020 02:06:44;U879.TC102B_OP.F_CV;9.541385651;100.0 +25/10/2020 02:06:46;U879.TC102B_OP.F_CV;9.940031052;100.0 +25/10/2020 02:06:00;U879.TC102B_PV.F_CV;397.989166260;100.0 +25/10/2020 02:06:23;U879.TC102B_SP.F_CV;398.000000000;100.0 +25/10/2020 02:06:02;U879.TC102C_OP.F_CV;10.309209824;100.0 +25/10/2020 02:06:04;U879.TC102C_OP.F_CV;10.451908112;100.0 +25/10/2020 02:06:05;U879.TC102C_OP.F_CV;9.510423660;100.0 +25/10/2020 02:06:07;U879.TC102C_OP.F_CV;10.452178955;100.0 +25/10/2020 02:06:08;U879.TC102C_OP.F_CV;9.510694504;100.0 +25/10/2020 02:06:10;U879.TC102C_OP.F_CV;9.910126686;100.0 +25/10/2020 02:06:12;U879.TC102C_OP.F_CV;9.638828278;100.0 +25/10/2020 02:06:13;U879.TC102C_OP.F_CV;9.367572784;100.0 +25/10/2020 02:06:14;U879.TC102C_OP.F_CV;10.309223175;100.0 +25/10/2020 02:06:16;U879.TC102C_OP.F_CV;10.404326439;100.0 +25/10/2020 02:06:18;U879.TC102C_OP.F_CV;9.981136322;100.0 +25/10/2020 02:06:19;U879.TC102C_OP.F_CV;9.510394096;100.0 +25/10/2020 02:06:20;U879.TC102C_OP.F_CV;10.452149391;100.0 +25/10/2020 02:06:24;U879.TC102C_OP.F_CV;10.271736145;100.0 +25/10/2020 02:06:26;U879.TC102C_OP.F_CV;9.910367966;100.0 +25/10/2020 02:06:43;U879.TC102C_OP.F_CV;9.910367966;100.0 +25/10/2020 02:06:44;U879.TC102C_OP.F_CV;9.367384911;100.0 +25/10/2020 02:06:46;U879.TC102C_OP.F_CV;10.309035301;100.0 +25/10/2020 02:06:47;U879.TC102C_OP.F_CV;9.909410477;100.0 +25/10/2020 02:06:51;U879.TC102C_OP.F_CV;9.728473663;100.0 +25/10/2020 02:06:53;U879.TC102C_OP.F_CV;9.366770744;100.0 +25/10/2020 02:06:55;U879.TC102C_OP.F_CV;10.308421135;100.0 +25/10/2020 02:06:56;U879.TC102C_OP.F_CV;9.908796310;100.0 +25/10/2020 02:06:42;U879.TC102C_PV.F_CV;398.099365234;100.0 +25/10/2020 02:06:23;U879.TC102C_SP.F_CV;398.000000000;100.0 +25/10/2020 02:06:01;U879.TC102D_OP.F_CV;9.765560150;100.0 +25/10/2020 02:06:02;U879.TC102D_OP.F_CV;10.307295799;100.0 +25/10/2020 02:06:04;U879.TC102D_OP.F_CV;9.369559288;100.0 +25/10/2020 02:06:05;U879.TC102D_OP.F_CV;10.308012009;100.0 +25/10/2020 02:06:07;U879.TC102D_OP.F_CV;9.370276451;100.0 +25/10/2020 02:06:08;U879.TC102D_OP.F_CV;9.768436432;100.0 +25/10/2020 02:06:35;U879.TC102D_OP.F_CV;9.768436432;100.0 +25/10/2020 02:06:38;U879.TC102D_OP.F_CV;8.833979607;100.0 +25/10/2020 02:06:40;U879.TC102D_OP.F_CV;10.710601807;100.0 +25/10/2020 02:06:41;U879.TC102D_OP.F_CV;9.374778748;100.0 +25/10/2020 02:06:43;U879.TC102D_OP.F_CV;10.313232422;100.0 +25/10/2020 02:06:44;U879.TC102D_OP.F_CV;9.375494957;100.0 +25/10/2020 02:06:46;U879.TC102D_OP.F_CV;9.773655891;100.0 +25/10/2020 02:06:50;U879.TC102D_OP.F_CV;10.314489365;100.0 +25/10/2020 02:06:52;U879.TC102D_OP.F_CV;9.376753807;100.0 +25/10/2020 02:06:53;U879.TC102D_OP.F_CV;9.774913788;100.0 +25/10/2020 02:06:55;U879.TC102D_OP.F_CV;10.315387726;100.0 +25/10/2020 02:06:56;U879.TC102D_OP.F_CV;9.917943954;100.0 +25/10/2020 02:06:58;U879.TC102D_OP.F_CV;9.378187180;100.0 +25/10/2020 02:06:59;U879.TC102D_OP.F_CV;10.316640854;100.0 +25/10/2020 02:06:23;U879.TC102D_PV.F_CV;349.949432373;100.0 +25/10/2020 02:06:23;U879.TC102D_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:01;U879.TC102E_OP.F_CV;5.203742981;100.0 +25/10/2020 02:06:02;U879.TC102E_OP.F_CV;5.602970600;100.0 +25/10/2020 02:06:05;U879.TC102E_OP.F_CV;5.061372280;100.0 +25/10/2020 02:06:07;U879.TC102E_OP.F_CV;5.460136414;100.0 +25/10/2020 02:06:08;U879.TC102E_OP.F_CV;6.001595497;100.0 +25/10/2020 02:06:10;U879.TC102E_OP.F_CV;5.060876846;100.0 +25/10/2020 02:06:14;U879.TC102E_OP.F_CV;6.542704105;100.0 +25/10/2020 02:06:16;U879.TC102E_OP.F_CV;4.119411469;100.0 +25/10/2020 02:06:17;U879.TC102E_OP.F_CV;6.399759293;100.0 +25/10/2020 02:06:19;U879.TC102E_OP.F_CV;5.601629734;100.0 +25/10/2020 02:06:20;U879.TC102E_OP.F_CV;4.518071175;100.0 +25/10/2020 02:06:23;U879.TC102E_OP.F_CV;6.541714191;100.0 +25/10/2020 02:06:26;U879.TC102E_OP.F_CV;5.744368553;100.0 +25/10/2020 02:06:28;U879.TC102E_OP.F_CV;4.661166668;100.0 +25/10/2020 02:06:29;U879.TC102E_OP.F_CV;6.000828266;100.0 +25/10/2020 02:06:32;U879.TC102E_OP.F_CV;5.601925373;100.0 +25/10/2020 02:06:34;U879.TC102E_OP.F_CV;4.518366814;100.0 +25/10/2020 02:06:35;U879.TC102E_OP.F_CV;5.857817173;100.0 +25/10/2020 02:06:37;U879.TC102E_OP.F_CV;6.000121117;100.0 +25/10/2020 02:06:38;U879.TC102E_OP.F_CV;5.059402943;100.0 +25/10/2020 02:06:40;U879.TC102E_OP.F_CV;4.916278362;100.0 +25/10/2020 02:06:41;U879.TC102E_OP.F_CV;5.856681347;100.0 +25/10/2020 02:06:43;U879.TC102E_OP.F_CV;5.998985291;100.0 +25/10/2020 02:06:44;U879.TC102E_OP.F_CV;5.058267117;100.0 +25/10/2020 02:06:46;U879.TC102E_OP.F_CV;5.457031250;100.0 +25/10/2020 02:06:51;U879.TC102E_OP.F_CV;5.323093414;100.0 +25/10/2020 02:06:54;U879.TC102E_OP.F_CV;4.985358238;100.0 +25/10/2020 02:06:55;U879.TC102E_OP.F_CV;4.913796425;100.0 +25/10/2020 02:06:56;U879.TC102E_OP.F_CV;5.312310696;100.0 +25/10/2020 02:06:58;U879.TC102E_OP.F_CV;5.853558064;100.0 +25/10/2020 02:06:59;U879.TC102E_OP.F_CV;5.995862961;100.0 +25/10/2020 02:06:27;U879.TC102E_PV.F_CV;314.929809570;100.0 +25/10/2020 02:06:15;U879.TC102E_SP.F_CV;315.000000000;100.0 +25/10/2020 02:06:00;U879.TC102F_OP.F_CV;10.755717278;100.0 +25/10/2020 02:06:01;U879.TC102F_OP.F_CV;9.416774750;100.0 +25/10/2020 02:06:03;U879.TC102F_OP.F_CV;9.816002846;100.0 +25/10/2020 02:06:22;U879.TC102F_OP.F_CV;9.816002846;100.0 +25/10/2020 02:06:23;U879.TC102F_OP.F_CV;10.361619949;100.0 +25/10/2020 02:06:25;U879.TC102F_OP.F_CV;9.421724319;100.0 +25/10/2020 02:06:26;U879.TC102F_OP.F_CV;9.820951462;100.0 +25/10/2020 02:06:36;U879.TC102F_OP.F_CV;9.690004349;100.0 +25/10/2020 02:06:39;U879.TC102F_OP.F_CV;9.353406906;100.0 +25/10/2020 02:06:40;U879.TC102F_OP.F_CV;9.282149315;100.0 +25/10/2020 02:06:41;U879.TC102F_OP.F_CV;10.222870827;100.0 +25/10/2020 02:06:43;U879.TC102F_OP.F_CV;10.365707397;100.0 +25/10/2020 02:06:44;U879.TC102F_OP.F_CV;9.425812721;100.0 +25/10/2020 02:06:46;U879.TC102F_OP.F_CV;9.825040817;100.0 +25/10/2020 02:06:53;U879.TC102F_OP.F_CV;9.825040817;100.0 +25/10/2020 02:06:55;U879.TC102F_OP.F_CV;10.368361473;100.0 +25/10/2020 02:06:56;U879.TC102F_OP.F_CV;9.428464890;100.0 +25/10/2020 02:06:58;U879.TC102F_OP.F_CV;9.827693939;100.0 +25/10/2020 02:06:28;U879.TC102F_PV.F_CV;349.919677734;100.0 +25/10/2020 02:06:23;U879.TC102F_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:02;U879.TC103A_OP.F_CV;14.403063774;100.0 +25/10/2020 02:06:04;U879.TC103A_OP.F_CV;14.801960945;100.0 +25/10/2020 02:06:05;U879.TC103A_OP.F_CV;15.885587692;100.0 +25/10/2020 02:06:07;U879.TC103A_OP.F_CV;14.004065514;100.0 +25/10/2020 02:06:08;U879.TC103A_OP.F_CV;15.343969345;100.0 +25/10/2020 02:06:10;U879.TC103A_OP.F_CV;14.945127487;100.0 +25/10/2020 02:06:11;U879.TC103A_OP.F_CV;15.487367630;100.0 +25/10/2020 02:06:13;U879.TC103A_OP.F_CV;14.546636581;100.0 +25/10/2020 02:06:14;U879.TC103A_OP.F_CV;15.488139153;100.0 +25/10/2020 02:06:17;U879.TC103A_OP.F_CV;15.887600899;100.0 +25/10/2020 02:06:19;U879.TC103A_OP.F_CV;14.006078720;100.0 +25/10/2020 02:06:20;U879.TC103A_OP.F_CV;15.345980644;100.0 +25/10/2020 02:06:23;U879.TC103A_OP.F_CV;14.947346687;100.0 +25/10/2020 02:06:25;U879.TC103A_OP.F_CV;15.489586830;100.0 +25/10/2020 02:06:26;U879.TC103A_OP.F_CV;14.548855782;100.0 +25/10/2020 02:06:28;U879.TC103A_OP.F_CV;14.948325157;100.0 +25/10/2020 02:06:34;U879.TC103A_OP.F_CV;14.948325157;100.0 +25/10/2020 02:06:35;U879.TC103A_OP.F_CV;15.491392136;100.0 +25/10/2020 02:06:37;U879.TC103A_OP.F_CV;15.092695236;100.0 +25/10/2020 02:06:39;U879.TC103A_OP.F_CV;14.822524071;100.0 +25/10/2020 02:06:40;U879.TC103A_OP.F_CV;14.551789284;100.0 +25/10/2020 02:06:41;U879.TC103A_OP.F_CV;14.951256752;100.0 +25/10/2020 02:06:44;U879.TC103A_OP.F_CV;15.493704796;100.0 +25/10/2020 02:06:46;U879.TC103A_OP.F_CV;14.552973747;100.0 +25/10/2020 02:06:47;U879.TC103A_OP.F_CV;14.952442169;100.0 +25/10/2020 02:06:50;U879.TC103A_OP.F_CV;15.494888306;100.0 +25/10/2020 02:06:52;U879.TC103A_OP.F_CV;14.554157257;100.0 +25/10/2020 02:06:53;U879.TC103A_OP.F_CV;14.953626633;100.0 +25/10/2020 02:06:57;U879.TC103A_OP.F_CV;15.225160599;100.0 +25/10/2020 02:06:58;U879.TC103A_OP.F_CV;15.496279716;100.0 +25/10/2020 02:06:59;U879.TC103A_OP.F_CV;14.555548668;100.0 +25/10/2020 02:06:37;U879.TC103A_PV.F_CV;395.942138672;100.0 +25/10/2020 02:06:23;U879.TC103A_SP.F_CV;396.000000000;100.0 +25/10/2020 02:06:00;U879.TC103B_OP.F_CV;10.813586235;100.0 +25/10/2020 02:06:24;U879.TC103B_OP.F_CV;10.941083908;100.0 +25/10/2020 02:06:26;U879.TC103B_OP.F_CV;11.207403183;100.0 +25/10/2020 02:06:28;U879.TC103B_OP.F_CV;10.806507111;100.0 +25/10/2020 02:06:30;U879.TC103B_OP.F_CV;11.078008652;100.0 +25/10/2020 02:06:31;U879.TC103B_OP.F_CV;11.349863052;100.0 +25/10/2020 02:06:32;U879.TC103B_OP.F_CV;10.949110985;100.0 +25/10/2020 02:06:34;U879.TC103B_OP.F_CV;10.405052185;100.0 +25/10/2020 02:06:35;U879.TC103B_OP.F_CV;10.805455208;100.0 +25/10/2020 02:06:46;U879.TC103B_OP.F_CV;10.805455208;100.0 +25/10/2020 02:06:47;U879.TC103B_OP.F_CV;11.346688271;100.0 +25/10/2020 02:06:49;U879.TC103B_OP.F_CV;10.945936203;100.0 +25/10/2020 02:06:50;U879.TC103B_OP.F_CV;10.401877403;100.0 +25/10/2020 02:06:53;U879.TC103B_OP.F_CV;10.945591927;100.0 +25/10/2020 02:06:55;U879.TC103B_OP.F_CV;10.401533127;100.0 +25/10/2020 02:06:56;U879.TC103B_OP.F_CV;10.801936150;100.0 +25/10/2020 02:06:36;U879.TC103B_PV.F_CV;398.098937988;100.0 +25/10/2020 02:06:23;U879.TC103B_SP.F_CV;398.000000000;100.0 +25/10/2020 02:06:07;U879.TC103C_OP.F_CV;14.476694107;100.0 +25/10/2020 02:06:08;U879.TC103C_OP.F_CV;15.559816360;100.0 +25/10/2020 02:06:10;U879.TC103C_OP.F_CV;13.677783012;100.0 +25/10/2020 02:06:11;U879.TC103C_OP.F_CV;15.560214043;100.0 +25/10/2020 02:06:13;U879.TC103C_OP.F_CV;13.678180695;100.0 +25/10/2020 02:06:14;U879.TC103C_OP.F_CV;14.476547241;100.0 +25/10/2020 02:06:32;U879.TC103C_OP.F_CV;14.476547241;100.0 +25/10/2020 02:06:34;U879.TC103C_OP.F_CV;13.932178497;100.0 +25/10/2020 02:06:35;U879.TC103C_OP.F_CV;14.873462677;100.0 +25/10/2020 02:06:37;U879.TC103C_OP.F_CV;14.473830223;100.0 +25/10/2020 02:06:50;U879.TC103C_OP.F_CV;14.473830223;100.0 +25/10/2020 02:06:53;U879.TC103C_OP.F_CV;15.556165695;100.0 +25/10/2020 02:06:55;U879.TC103C_OP.F_CV;14.758197784;100.0 +25/10/2020 02:06:56;U879.TC103C_OP.F_CV;13.674687386;100.0 +25/10/2020 02:06:58;U879.TC103C_OP.F_CV;13.930729866;100.0 +25/10/2020 02:06:59;U879.TC103C_OP.F_CV;14.872014046;100.0 +25/10/2020 02:06:05;U879.TC103C_PV.F_CV;397.898956299;100.0 +25/10/2020 02:06:23;U879.TC103C_SP.F_CV;398.000000000;100.0 +25/10/2020 02:06:01;U879.TC103D_OP.F_CV;9.508575439;100.0 +25/10/2020 02:06:02;U879.TC103D_OP.F_CV;9.908051491;100.0 +25/10/2020 02:06:04;U879.TC103D_OP.F_CV;10.450261116;100.0 +25/10/2020 02:06:05;U879.TC103D_OP.F_CV;9.509896278;100.0 +25/10/2020 02:06:07;U879.TC103D_OP.F_CV;10.451260567;100.0 +25/10/2020 02:06:08;U879.TC103D_OP.F_CV;10.052783012;100.0 +25/10/2020 02:06:10;U879.TC103D_OP.F_CV;9.511572838;100.0 +25/10/2020 02:06:11;U879.TC103D_OP.F_CV;9.911047935;100.0 +25/10/2020 02:06:13;U879.TC103D_OP.F_CV;10.453257561;100.0 +25/10/2020 02:06:14;U879.TC103D_OP.F_CV;10.054780960;100.0 +25/10/2020 02:06:16;U879.TC103D_OP.F_CV;9.513570786;100.0 +25/10/2020 02:06:17;U879.TC103D_OP.F_CV;9.913046837;100.0 +25/10/2020 02:06:19;U879.TC103D_OP.F_CV;10.455256462;100.0 +25/10/2020 02:06:20;U879.TC103D_OP.F_CV;9.514890671;100.0 +25/10/2020 02:06:23;U879.TC103D_OP.F_CV;9.914689064;100.0 +25/10/2020 02:06:26;U879.TC103D_OP.F_CV;9.516533852;100.0 +25/10/2020 02:06:28;U879.TC103D_OP.F_CV;9.916009903;100.0 +25/10/2020 02:06:34;U879.TC103D_OP.F_CV;9.916009903;100.0 +25/10/2020 02:06:35;U879.TC103D_OP.F_CV;10.459505081;100.0 +25/10/2020 02:06:39;U879.TC103D_OP.F_CV;9.990322113;100.0 +25/10/2020 02:06:40;U879.TC103D_OP.F_CV;9.520139694;100.0 +25/10/2020 02:06:41;U879.TC103D_OP.F_CV;9.919614792;100.0 +25/10/2020 02:06:43;U879.TC103D_OP.F_CV;10.461824417;100.0 +25/10/2020 02:06:44;U879.TC103D_OP.F_CV;9.521460533;100.0 +25/10/2020 02:06:46;U879.TC103D_OP.F_CV;9.920935631;100.0 +25/10/2020 02:06:48;U879.TC103D_OP.F_CV;10.192362785;100.0 +25/10/2020 02:06:49;U879.TC103D_OP.F_CV;10.463467598;100.0 +25/10/2020 02:06:50;U879.TC103D_OP.F_CV;9.523102760;100.0 +25/10/2020 02:06:52;U879.TC103D_OP.F_CV;9.922578812;100.0 +25/10/2020 02:06:49;U879.TC103D_PV.F_CV;349.910095215;100.0 +25/10/2020 02:06:07;U879.TC103D_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:01;U879.TC103E_OP.F_CV;11.376819611;100.0 +25/10/2020 02:06:02;U879.TC103E_OP.F_CV;11.119971275;100.0 +25/10/2020 02:06:04;U879.TC103E_OP.F_CV;10.177500725;100.0 +25/10/2020 02:06:05;U879.TC103E_OP.F_CV;9.491497993;100.0 +25/10/2020 02:06:07;U879.TC103E_OP.F_CV;10.291137695;100.0 +25/10/2020 02:06:09;U879.TC103E_OP.F_CV;10.833530426;100.0 +25/10/2020 02:06:10;U879.TC103E_OP.F_CV;11.376408577;100.0 +25/10/2020 02:06:11;U879.TC103E_OP.F_CV;10.576512337;100.0 +25/10/2020 02:06:15;U879.TC103E_OP.F_CV;10.033964157;100.0 +25/10/2020 02:06:16;U879.TC103E_OP.F_CV;9.490958214;100.0 +25/10/2020 02:06:17;U879.TC103E_OP.F_CV;10.290597916;100.0 +25/10/2020 02:06:20;U879.TC103E_OP.F_CV;11.375868797;100.0 +25/10/2020 02:06:22;U879.TC103E_OP.F_CV;9.489731789;100.0 +25/10/2020 02:06:23;U879.TC103E_OP.F_CV;11.375612259;100.0 +25/10/2020 02:06:26;U879.TC103E_OP.F_CV;10.575945854;100.0 +25/10/2020 02:06:28;U879.TC103E_OP.F_CV;9.489933968;100.0 +25/10/2020 02:06:29;U879.TC103E_OP.F_CV;10.289573669;100.0 +25/10/2020 02:06:32;U879.TC103E_OP.F_CV;9.489192963;100.0 +25/10/2020 02:06:34;U879.TC103E_OP.F_CV;11.375074387;100.0 +25/10/2020 02:06:35;U879.TC103E_OP.F_CV;9.488937378;100.0 +25/10/2020 02:06:37;U879.TC103E_OP.F_CV;10.288576126;100.0 +25/10/2020 02:06:47;U879.TC103E_OP.F_CV;10.288576126;100.0 +25/10/2020 02:06:49;U879.TC103E_OP.F_CV;11.370934486;100.0 +25/10/2020 02:06:50;U879.TC103E_OP.F_CV;10.571038246;100.0 +25/10/2020 02:06:53;U879.TC103E_OP.F_CV;11.370907784;100.0 +25/10/2020 02:06:55;U879.TC103E_OP.F_CV;9.484771729;100.0 +25/10/2020 02:06:56;U879.TC103E_OP.F_CV;11.370653152;100.0 +25/10/2020 02:06:58;U879.TC103E_OP.F_CV;9.484516144;100.0 +25/10/2020 02:06:59;U879.TC103E_OP.F_CV;10.284154892;100.0 +25/10/2020 02:06:02;U879.TC103E_PV.F_CV;314.835876465;100.0 +25/10/2020 02:06:10;U879.TC103E_PV.F_CV;315.235900879;100.0 +25/10/2020 02:06:21;U879.TC103E_PV.F_CV;314.885864258;100.0 +25/10/2020 02:06:23;U879.TC103E_SP.F_CV;315.000000000;100.0 +25/10/2020 02:06:00;U879.TC103F_OP.F_CV;10.306048393;100.0 +25/10/2020 02:06:01;U879.TC103F_OP.F_CV;9.907037735;100.0 +25/10/2020 02:06:03;U879.TC103F_OP.F_CV;9.365255356;100.0 +25/10/2020 02:06:04;U879.TC103F_OP.F_CV;9.764410973;100.0 +25/10/2020 02:06:05;U879.TC103F_OP.F_CV;9.222126961;100.0 +25/10/2020 02:06:07;U879.TC103F_OP.F_CV;10.163210869;100.0 +25/10/2020 02:06:08;U879.TC103F_OP.F_CV;9.763736725;100.0 +25/10/2020 02:06:10;U879.TC103F_OP.F_CV;10.305664063;100.0 +25/10/2020 02:06:11;U879.TC103F_OP.F_CV;9.364620209;100.0 +25/10/2020 02:06:13;U879.TC103F_OP.F_CV;10.305809021;100.0 +25/10/2020 02:06:14;U879.TC103F_OP.F_CV;9.364765167;100.0 +25/10/2020 02:06:16;U879.TC103F_OP.F_CV;10.847987175;100.0 +25/10/2020 02:06:17;U879.TC103F_OP.F_CV;8.966005325;100.0 +25/10/2020 02:06:19;U879.TC103F_OP.F_CV;10.306454659;100.0 +25/10/2020 02:06:20;U879.TC103F_OP.F_CV;9.907444954;100.0 +25/10/2020 02:06:23;U879.TC103F_OP.F_CV;10.449978828;100.0 +25/10/2020 02:06:25;U879.TC103F_OP.F_CV;8.967259407;100.0 +25/10/2020 02:06:26;U879.TC103F_OP.F_CV;9.765676498;100.0 +25/10/2020 02:06:28;U879.TC103F_OP.F_CV;10.307603836;100.0 +25/10/2020 02:06:29;U879.TC103F_OP.F_CV;9.908593178;100.0 +25/10/2020 02:06:31;U879.TC103F_OP.F_CV;9.813508987;100.0 +25/10/2020 02:06:33;U879.TC103F_OP.F_CV;10.036930084;100.0 +25/10/2020 02:06:34;U879.TC103F_OP.F_CV;10.307893753;100.0 +25/10/2020 02:06:35;U879.TC103F_OP.F_CV;9.366849899;100.0 +25/10/2020 02:06:38;U879.TC103F_OP.F_CV;10.052156448;100.0 +25/10/2020 02:06:41;U879.TC103F_OP.F_CV;8.969305038;100.0 +25/10/2020 02:06:43;U879.TC103F_OP.F_CV;10.851788521;100.0 +25/10/2020 02:06:44;U879.TC103F_OP.F_CV;9.511838913;100.0 +25/10/2020 02:06:46;U879.TC103F_OP.F_CV;9.911352158;100.0 +25/10/2020 02:06:47;U879.TC103F_OP.F_CV;10.453636169;100.0 +25/10/2020 02:06:50;U879.TC103F_OP.F_CV;9.912461281;100.0 +25/10/2020 02:06:52;U879.TC103F_OP.F_CV;9.817377090;100.0 +25/10/2020 02:06:56;U879.TC103F_OP.F_CV;10.853689194;100.0 +25/10/2020 02:06:58;U879.TC103F_OP.F_CV;9.513739586;100.0 +25/10/2020 02:06:59;U879.TC103F_OP.F_CV;9.913251877;100.0 +25/10/2020 02:06:45;U879.TC103F_PV.F_CV;349.929748535;100.0 +25/10/2020 02:06:23;U879.TC103F_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:00;U879.TC104A_OP.F_CV;15.141127586;100.0 +25/10/2020 02:06:01;U879.TC104A_OP.F_CV;15.540542603;100.0 +25/10/2020 02:06:05;U879.TC104A_OP.F_CV;15.000545502;100.0 +25/10/2020 02:06:07;U879.TC104A_OP.F_CV;15.941560745;100.0 +25/10/2020 02:06:08;U879.TC104A_OP.F_CV;15.001352310;100.0 +25/10/2020 02:06:10;U879.TC104A_OP.F_CV;15.400624275;100.0 +25/10/2020 02:06:12;U879.TC104A_OP.F_CV;15.671834946;100.0 +25/10/2020 02:06:13;U879.TC104A_OP.F_CV;15.942818642;100.0 +25/10/2020 02:06:14;U879.TC104A_OP.F_CV;15.544352531;100.0 +25/10/2020 02:06:16;U879.TC104A_OP.F_CV;15.449759483;100.0 +25/10/2020 02:06:26;U879.TC104A_OP.F_CV;15.449759483;100.0 +25/10/2020 02:06:28;U879.TC104A_OP.F_CV;15.945781708;100.0 +25/10/2020 02:06:29;U879.TC104A_OP.F_CV;15.005573273;100.0 +25/10/2020 02:06:31;U879.TC104A_OP.F_CV;15.404846191;100.0 +25/10/2020 02:06:37;U879.TC104A_OP.F_CV;15.404846191;100.0 +25/10/2020 02:06:38;U879.TC104A_OP.F_CV;15.947714806;100.0 +25/10/2020 02:06:40;U879.TC104A_OP.F_CV;15.007504463;100.0 +25/10/2020 02:06:41;U879.TC104A_OP.F_CV;15.406778336;100.0 +25/10/2020 02:06:44;U879.TC104A_OP.F_CV;15.948971748;100.0 +25/10/2020 02:06:46;U879.TC104A_OP.F_CV;14.467019081;100.0 +25/10/2020 02:06:47;U879.TC104A_OP.F_CV;15.806727409;100.0 +25/10/2020 02:06:49;U879.TC104A_OP.F_CV;15.407903671;100.0 +25/10/2020 02:06:53;U879.TC104A_OP.F_CV;15.950323105;100.0 +25/10/2020 02:06:55;U879.TC104A_OP.F_CV;15.010112762;100.0 +25/10/2020 02:06:56;U879.TC104A_OP.F_CV;15.409386635;100.0 +25/10/2020 02:06:17;U879.TC104A_PV.F_CV;385.936920166;100.0 +25/10/2020 02:06:23;U879.TC104A_SP.F_CV;386.000000000;100.0 +25/10/2020 02:06:00;U879.TC104B_OP.F_CV;15.590045929;100.0 +25/10/2020 02:06:11;U879.TC104B_OP.F_CV;15.590045929;100.0 +25/10/2020 02:06:13;U879.TC104B_OP.F_CV;15.053770065;100.0 +25/10/2020 02:06:14;U879.TC104B_OP.F_CV;15.994812965;100.0 +25/10/2020 02:06:17;U879.TC104B_OP.F_CV;15.055236816;100.0 +25/10/2020 02:06:19;U879.TC104B_OP.F_CV;15.454535484;100.0 +25/10/2020 02:06:20;U879.TC104B_OP.F_CV;15.996530533;100.0 +25/10/2020 02:06:23;U879.TC104B_OP.F_CV;15.199899673;100.0 +25/10/2020 02:06:26;U879.TC104B_OP.F_CV;15.457217216;100.0 +25/10/2020 02:06:28;U879.TC104B_OP.F_CV;15.999212265;100.0 +25/10/2020 02:06:29;U879.TC104B_OP.F_CV;15.600770950;100.0 +25/10/2020 02:06:33;U879.TC104B_OP.F_CV;15.331418991;100.0 +25/10/2020 02:06:34;U879.TC104B_OP.F_CV;15.060850143;100.0 +25/10/2020 02:06:35;U879.TC104B_OP.F_CV;16.001892090;100.0 +25/10/2020 02:06:37;U879.TC104B_OP.F_CV;16.145338058;100.0 +25/10/2020 02:06:38;U879.TC104B_OP.F_CV;15.205261230;100.0 +25/10/2020 02:06:40;U879.TC104B_OP.F_CV;15.605022430;100.0 +25/10/2020 02:06:51;U879.TC104B_OP.F_CV;15.742577553;100.0 +25/10/2020 02:06:54;U879.TC104B_OP.F_CV;16.080905914;100.0 +25/10/2020 02:06:55;U879.TC104B_OP.F_CV;16.152629852;100.0 +25/10/2020 02:06:56;U879.TC104B_OP.F_CV;15.212551117;100.0 +25/10/2020 02:06:58;U879.TC104B_OP.F_CV;15.612313271;100.0 +25/10/2020 02:06:59;U879.TC104B_OP.F_CV;16.154808044;100.0 +25/10/2020 02:06:02;U879.TC104B_PV.F_CV;387.829833984;100.0 +25/10/2020 02:06:23;U879.TC104B_SP.F_CV;388.000000000;100.0 +25/10/2020 02:06:00;U879.TC104C_OP.F_CV;15.551321983;100.0 +25/10/2020 02:06:01;U879.TC104C_OP.F_CV;15.822749138;100.0 +25/10/2020 02:06:02;U879.TC104C_OP.F_CV;14.879854202;100.0 +25/10/2020 02:06:04;U879.TC104C_OP.F_CV;15.279669762;100.0 +25/10/2020 02:06:05;U879.TC104C_OP.F_CV;15.822524071;100.0 +25/10/2020 02:06:07;U879.TC104C_OP.F_CV;14.879631042;100.0 +25/10/2020 02:06:08;U879.TC104C_OP.F_CV;15.822494507;100.0 +25/10/2020 02:06:10;U879.TC104C_OP.F_CV;14.879600525;100.0 +25/10/2020 02:06:11;U879.TC104C_OP.F_CV;15.822463036;100.0 +25/10/2020 02:06:13;U879.TC104C_OP.F_CV;15.422617912;100.0 +25/10/2020 02:06:14;U879.TC104C_OP.F_CV;14.879733086;100.0 +25/10/2020 02:06:17;U879.TC104C_OP.F_CV;15.422752380;100.0 +25/10/2020 02:06:19;U879.TC104C_OP.F_CV;14.879867554;100.0 +25/10/2020 02:06:20;U879.TC104C_OP.F_CV;15.279682159;100.0 +25/10/2020 02:06:22;U879.TC104C_OP.F_CV;15.375021935;100.0 +25/10/2020 02:06:24;U879.TC104C_OP.F_CV;15.241785049;100.0 +25/10/2020 02:06:26;U879.TC104C_OP.F_CV;14.879971504;100.0 +25/10/2020 02:06:28;U879.TC104C_OP.F_CV;15.279787064;100.0 +25/10/2020 02:06:29;U879.TC104C_OP.F_CV;15.822641373;100.0 +25/10/2020 02:06:31;U879.TC104C_OP.F_CV;14.879747391;100.0 +25/10/2020 02:06:32;U879.TC104C_OP.F_CV;15.279562950;100.0 +25/10/2020 02:06:34;U879.TC104C_OP.F_CV;15.822416306;100.0 +25/10/2020 02:06:35;U879.TC104C_OP.F_CV;14.879522324;100.0 +25/10/2020 02:06:37;U879.TC104C_OP.F_CV;15.279337883;100.0 +25/10/2020 02:06:41;U879.TC104C_OP.F_CV;15.821805000;100.0 +25/10/2020 02:06:43;U879.TC104C_OP.F_CV;14.878911972;100.0 +25/10/2020 02:06:44;U879.TC104C_OP.F_CV;15.821774483;100.0 +25/10/2020 02:06:46;U879.TC104C_OP.F_CV;15.421929359;100.0 +25/10/2020 02:06:47;U879.TC104C_OP.F_CV;15.965432167;100.0 +25/10/2020 02:06:49;U879.TC104C_OP.F_CV;15.565730095;100.0 +25/10/2020 02:06:50;U879.TC104C_OP.F_CV;15.022912025;100.0 +25/10/2020 02:06:54;U879.TC104C_OP.F_CV;15.495458603;100.0 +25/10/2020 02:06:55;U879.TC104C_OP.F_CV;15.967321396;100.0 +25/10/2020 02:06:56;U879.TC104C_OP.F_CV;15.024281502;100.0 +25/10/2020 02:06:58;U879.TC104C_OP.F_CV;15.968006134;100.0 +25/10/2020 02:06:59;U879.TC104C_OP.F_CV;14.481918335;100.0 +25/10/2020 02:06:28;U879.TC104C_PV.F_CV;388.054168701;100.0 +25/10/2020 02:06:29;U879.TC104C_SP.F_CV;388.000000000;100.0 +25/10/2020 02:06:05;U879.TC104D_OP.F_CV;15.358096123;100.0 +25/10/2020 02:06:07;U879.TC104D_OP.F_CV;15.901663780;100.0 +25/10/2020 02:06:08;U879.TC104D_OP.F_CV;15.501842499;100.0 +25/10/2020 02:06:12;U879.TC104D_OP.F_CV;15.231180191;100.0 +25/10/2020 02:06:13;U879.TC104D_OP.F_CV;14.959712982;100.0 +25/10/2020 02:06:14;U879.TC104D_OP.F_CV;15.903318405;100.0 +25/10/2020 02:06:16;U879.TC104D_OP.F_CV;15.503498077;100.0 +25/10/2020 02:06:17;U879.TC104D_OP.F_CV;14.960563660;100.0 +25/10/2020 02:06:19;U879.TC104D_OP.F_CV;15.360832214;100.0 +25/10/2020 02:06:20;U879.TC104D_OP.F_CV;15.904215813;100.0 +25/10/2020 02:06:24;U879.TC104D_OP.F_CV;15.723700523;100.0 +25/10/2020 02:06:26;U879.TC104D_OP.F_CV;15.361774445;100.0 +25/10/2020 02:06:30;U879.TC104D_OP.F_CV;15.543008804;100.0 +25/10/2020 02:06:32;U879.TC104D_OP.F_CV;15.905295372;100.0 +25/10/2020 02:06:34;U879.TC104D_OP.F_CV;15.505474091;100.0 +25/10/2020 02:06:35;U879.TC104D_OP.F_CV;14.962538719;100.0 +25/10/2020 02:06:38;U879.TC104D_OP.F_CV;15.362854004;100.0 +25/10/2020 02:06:42;U879.TC104D_OP.F_CV;15.634637833;100.0 +25/10/2020 02:06:43;U879.TC104D_OP.F_CV;15.906329155;100.0 +25/10/2020 02:06:44;U879.TC104D_OP.F_CV;14.963171005;100.0 +25/10/2020 02:06:46;U879.TC104D_OP.F_CV;15.363439560;100.0 +25/10/2020 02:06:47;U879.TC104D_OP.F_CV;15.906823158;100.0 +25/10/2020 02:06:49;U879.TC104D_OP.F_CV;14.963664055;100.0 +25/10/2020 02:06:50;U879.TC104D_OP.F_CV;15.363932610;100.0 +25/10/2020 02:06:52;U879.TC104D_OP.F_CV;15.907316208;100.0 +25/10/2020 02:06:53;U879.TC104D_OP.F_CV;14.964159012;100.0 +25/10/2020 02:06:55;U879.TC104D_OP.F_CV;15.364427567;100.0 +25/10/2020 02:06:59;U879.TC104D_OP.F_CV;15.907902718;100.0 +25/10/2020 02:06:02;U879.TC104D_PV.F_CV;349.931671143;100.0 +25/10/2020 02:06:24;U879.TC104D_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:01;U879.TC104E_OP.F_CV;10.546744347;100.0 +25/10/2020 02:06:05;U879.TC104E_OP.F_CV;11.089542389;100.0 +25/10/2020 02:06:07;U879.TC104E_OP.F_CV;9.604600906;100.0 +25/10/2020 02:06:08;U879.TC104E_OP.F_CV;10.403848648;100.0 +25/10/2020 02:06:10;U879.TC104E_OP.F_CV;10.946263313;100.0 +25/10/2020 02:06:11;U879.TC104E_OP.F_CV;10.546480179;100.0 +25/10/2020 02:06:13;U879.TC104E_OP.F_CV;11.089252472;100.0 +25/10/2020 02:06:14;U879.TC104E_OP.F_CV;10.147068977;100.0 +25/10/2020 02:06:16;U879.TC104E_OP.F_CV;11.089635849;100.0 +25/10/2020 02:06:17;U879.TC104E_OP.F_CV;10.690211296;100.0 +25/10/2020 02:06:19;U879.TC104E_OP.F_CV;10.147823334;100.0 +25/10/2020 02:06:20;U879.TC104E_OP.F_CV;10.004874229;100.0 +25/10/2020 02:06:22;U879.TC104E_OP.F_CV;10.947084427;100.0 +25/10/2020 02:06:23;U879.TC104E_OP.F_CV;11.090059280;100.0 +25/10/2020 02:06:26;U879.TC104E_OP.F_CV;10.004926682;100.0 +25/10/2020 02:06:28;U879.TC104E_OP.F_CV;10.947136879;100.0 +25/10/2020 02:06:29;U879.TC104E_OP.F_CV;10.547355652;100.0 +25/10/2020 02:06:32;U879.TC104E_OP.F_CV;10.803288460;100.0 +25/10/2020 02:06:34;U879.TC104E_OP.F_CV;10.403363228;100.0 +25/10/2020 02:06:38;U879.TC104E_OP.F_CV;9.859865189;100.0 +25/10/2020 02:06:40;U879.TC104E_OP.F_CV;11.343973160;100.0 +25/10/2020 02:06:41;U879.TC104E_OP.F_CV;10.001851082;100.0 +25/10/2020 02:06:43;U879.TC104E_OP.F_CV;9.858835220;100.0 +25/10/2020 02:06:47;U879.TC104E_OP.F_CV;11.341542244;100.0 +25/10/2020 02:06:49;U879.TC104E_OP.F_CV;10.542179108;100.0 +25/10/2020 02:06:53;U879.TC104E_OP.F_CV;10.542179108;100.0 +25/10/2020 02:06:55;U879.TC104E_OP.F_CV;9.457006454;100.0 +25/10/2020 02:06:56;U879.TC104E_OP.F_CV;10.255682945;100.0 +25/10/2020 02:06:58;U879.TC104E_OP.F_CV;10.797451973;100.0 +25/10/2020 02:06:59;U879.TC104E_OP.F_CV;9.855058670;100.0 +25/10/2020 02:06:05;U879.TC104E_PV.F_CV;304.996154785;100.0 +25/10/2020 02:06:23;U879.TC104E_SP.F_CV;305.000000000;100.0 +25/10/2020 02:06:00;U879.TC104F_OP.F_CV;14.855844498;100.0 +25/10/2020 02:06:01;U879.TC104F_OP.F_CV;16.344150543;100.0 +25/10/2020 02:06:03;U879.TC104F_OP.F_CV;14.999108315;100.0 +25/10/2020 02:06:04;U879.TC104F_OP.F_CV;14.855622292;100.0 +25/10/2020 02:06:05;U879.TC104F_OP.F_CV;16.343929291;100.0 +25/10/2020 02:06:07;U879.TC104F_OP.F_CV;14.454823494;100.0 +25/10/2020 02:06:08;U879.TC104F_OP.F_CV;15.799862862;100.0 +25/10/2020 02:06:10;U879.TC104F_OP.F_CV;15.942950249;100.0 +25/10/2020 02:06:11;U879.TC104F_OP.F_CV;15.542583466;100.0 +25/10/2020 02:06:13;U879.TC104F_OP.F_CV;14.998950005;100.0 +25/10/2020 02:06:14;U879.TC104F_OP.F_CV;15.943444252;100.0 +25/10/2020 02:06:16;U879.TC104F_OP.F_CV;14.455096245;100.0 +25/10/2020 02:06:17;U879.TC104F_OP.F_CV;15.800133705;100.0 +25/10/2020 02:06:19;U879.TC104F_OP.F_CV;15.399302483;100.0 +25/10/2020 02:06:20;U879.TC104F_OP.F_CV;15.943147659;100.0 +25/10/2020 02:06:22;U879.TC104F_OP.F_CV;15.542781830;100.0 +25/10/2020 02:06:24;U879.TC104F_OP.F_CV;14.999217033;100.0 +25/10/2020 02:06:25;U879.TC104F_OP.F_CV;14.455368042;100.0 +25/10/2020 02:06:26;U879.TC104F_OP.F_CV;15.800406456;100.0 +25/10/2020 02:06:28;U879.TC104F_OP.F_CV;15.943492889;100.0 +25/10/2020 02:06:29;U879.TC104F_OP.F_CV;14.999208450;100.0 +25/10/2020 02:06:33;U879.TC104F_OP.F_CV;15.471666336;100.0 +25/10/2020 02:06:34;U879.TC104F_OP.F_CV;15.943913460;100.0 +25/10/2020 02:06:35;U879.TC104F_OP.F_CV;15.543546677;100.0 +25/10/2020 02:06:38;U879.TC104F_OP.F_CV;15.000197411;100.0 +25/10/2020 02:06:40;U879.TC104F_OP.F_CV;14.856709480;100.0 +25/10/2020 02:06:44;U879.TC104F_OP.F_CV;16.344152451;100.0 +25/10/2020 02:06:46;U879.TC104F_OP.F_CV;15.543029785;100.0 +25/10/2020 02:06:47;U879.TC104F_OP.F_CV;14.999395370;100.0 +25/10/2020 02:06:50;U879.TC104F_OP.F_CV;15.543523788;100.0 +25/10/2020 02:06:52;U879.TC104F_OP.F_CV;15.448151588;100.0 +25/10/2020 02:06:54;U879.TC104F_OP.F_CV;15.672386169;100.0 +25/10/2020 02:06:55;U879.TC104F_OP.F_CV;15.944308281;100.0 +25/10/2020 02:06:56;U879.TC104F_OP.F_CV;15.000023842;100.0 +25/10/2020 02:06:58;U879.TC104F_OP.F_CV;15.400600433;100.0 +25/10/2020 02:06:59;U879.TC104F_OP.F_CV;15.944444656;100.0 +25/10/2020 02:06:39;U879.TC104F_PV.F_CV;350.120880127;100.0 +25/10/2020 02:06:23;U879.TC104F_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:02;U879.TC105A_OP.F_CV;11.566900253;100.0 +25/10/2020 02:06:03;U879.TC105A_OP.F_CV;10.046366692;100.0 +25/10/2020 02:06:04;U879.TC105A_OP.F_CV;12.685927391;100.0 +25/10/2020 02:06:06;U879.TC105A_OP.F_CV;11.565901756;100.0 +25/10/2020 02:06:07;U879.TC105A_OP.F_CV;10.045367241;100.0 +25/10/2020 02:06:09;U879.TC105A_OP.F_CV;12.684927940;100.0 +25/10/2020 02:06:10;U879.TC105A_OP.F_CV;11.564902306;100.0 +25/10/2020 02:06:27;U879.TC105A_OP.F_CV;11.564902306;100.0 +25/10/2020 02:06:28;U879.TC105A_OP.F_CV;13.085436821;100.0 +25/10/2020 02:06:31;U879.TC105A_OP.F_CV;10.445876122;100.0 +25/10/2020 02:06:32;U879.TC105A_OP.F_CV;11.565901756;100.0 +25/10/2020 02:06:34;U879.TC105A_OP.F_CV;13.086436272;100.0 +25/10/2020 02:06:35;U879.TC105A_OP.F_CV;10.446874619;100.0 +25/10/2020 02:06:37;U879.TC105A_OP.F_CV;11.566900253;100.0 +25/10/2020 02:06:42;U879.TC105A_OP.F_CV;11.566900253;100.0 +25/10/2020 02:06:43;U879.TC105A_OP.F_CV;14.607825279;100.0 +25/10/2020 02:06:44;U879.TC105A_OP.F_CV;9.328957558;100.0 +25/10/2020 02:06:45;U879.TC105A_OP.F_CV;11.568902016;100.0 +25/10/2020 02:06:49;U879.TC105A_OP.F_CV;11.568902016;100.0 +25/10/2020 02:06:50;U879.TC105A_OP.F_CV;14.609826088;100.0 +25/10/2020 02:06:52;U879.TC105A_OP.F_CV;10.851492882;100.0 +25/10/2020 02:06:53;U879.TC105A_OP.F_CV;11.972412109;100.0 +25/10/2020 02:06:55;U879.TC105A_OP.F_CV;10.452877045;100.0 +25/10/2020 02:06:56;U879.TC105A_OP.F_CV;11.572902679;100.0 +25/10/2020 02:06:59;U879.TC105A_OP.F_CV;13.093437195;100.0 +25/10/2020 02:06:00;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:02;U879.TC105A_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:03;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:04;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:05;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:06;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:07;U879.TC105A_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:08;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:09;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:10;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:11;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:12;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:13;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:14;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:15;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:16;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:17;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:18;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:19;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:20;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:21;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:22;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:24;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:25;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:26;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:27;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:28;U879.TC105A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:29;U879.TC105A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:30;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:31;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:32;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:33;U879.TC105A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:34;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:35;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:36;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:37;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:38;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:39;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:40;U879.TC105A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:41;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:42;U879.TC105A_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:43;U879.TC105A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:44;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:45;U879.TC105A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:46;U879.TC105A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:47;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:48;U879.TC105A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:49;U879.TC105A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:50;U879.TC105A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:51;U879.TC105A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:52;U879.TC105A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:53;U879.TC105A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:54;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:55;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:56;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:57;U879.TC105A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:58;U879.TC105A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:59;U879.TC105A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:23;U879.TC105A_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:36;U879.TC105B_OP.F_CV;11.684763908;100.0 +25/10/2020 02:06:42;U879.TC105B_OP.F_CV;11.684763908;100.0 +25/10/2020 02:06:43;U879.TC105B_OP.F_CV;10.164230347;100.0 +25/10/2020 02:06:44;U879.TC105B_OP.F_CV;12.803791046;100.0 +25/10/2020 02:06:45;U879.TC105B_OP.F_CV;11.683765411;100.0 +25/10/2020 02:06:52;U879.TC105B_OP.F_CV;11.683765411;100.0 +25/10/2020 02:06:53;U879.TC105B_OP.F_CV;10.163230896;100.0 +25/10/2020 02:06:55;U879.TC105B_OP.F_CV;11.281255722;100.0 +25/10/2020 02:06:58;U879.TC105B_OP.F_CV;12.800790787;100.0 +25/10/2020 02:06:59;U879.TC105B_OP.F_CV;11.680765152;100.0 +25/10/2020 02:06:00;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:02;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:03;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:04;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:05;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:06;U879.TC105B_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:07;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:08;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:09;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:10;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:11;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:12;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:13;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:14;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:15;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:16;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:17;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:18;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:19;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:20;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:21;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:22;U879.TC105B_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:23;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:24;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:25;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:26;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:27;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:28;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:29;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:30;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:31;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:32;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:33;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:34;U879.TC105B_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:35;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:36;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:37;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:38;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:39;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:40;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:41;U879.TC105B_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:42;U879.TC105B_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:43;U879.TC105B_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:44;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:45;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:46;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:47;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:48;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:49;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:50;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:51;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:52;U879.TC105B_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:53;U879.TC105B_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:54;U879.TC105B_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:55;U879.TC105B_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:56;U879.TC105B_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:57;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:58;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:59;U879.TC105B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC105B_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:14;U879.TC105C_OP.F_CV;12.952219009;100.0 +25/10/2020 02:06:15;U879.TC105C_OP.F_CV;9.911293983;100.0 +25/10/2020 02:06:17;U879.TC105C_OP.F_CV;15.190161705;100.0 +25/10/2020 02:06:19;U879.TC105C_OP.F_CV;9.909293175;100.0 +25/10/2020 02:06:22;U879.TC105C_OP.F_CV;12.147236824;100.0 +25/10/2020 02:06:23;U879.TC105C_OP.F_CV;15.186161995;100.0 +25/10/2020 02:06:27;U879.TC105C_OP.F_CV;15.186161995;100.0 +25/10/2020 02:06:28;U879.TC105C_OP.F_CV;12.944215775;100.0 +25/10/2020 02:06:33;U879.TC105C_OP.F_CV;12.944215775;100.0 +25/10/2020 02:06:34;U879.TC105C_OP.F_CV;9.903291702;100.0 +25/10/2020 02:06:35;U879.TC105C_OP.F_CV;15.182160378;100.0 +25/10/2020 02:06:37;U879.TC105C_OP.F_CV;12.942214966;100.0 +25/10/2020 02:06:38;U879.TC105C_OP.F_CV;9.901290894;100.0 +25/10/2020 02:06:40;U879.TC105C_OP.F_CV;15.180159569;100.0 +25/10/2020 02:06:41;U879.TC105C_OP.F_CV;9.899290085;100.0 +25/10/2020 02:06:43;U879.TC105C_OP.F_CV;15.178158760;100.0 +25/10/2020 02:06:44;U879.TC105C_OP.F_CV;12.938213348;100.0 +25/10/2020 02:06:46;U879.TC105C_OP.F_CV;9.897289276;100.0 +25/10/2020 02:06:47;U879.TC105C_OP.F_CV;15.176157951;100.0 +25/10/2020 02:06:49;U879.TC105C_OP.F_CV;12.936213493;100.0 +25/10/2020 02:06:50;U879.TC105C_OP.F_CV;9.895288467;100.0 +25/10/2020 02:06:51;U879.TC105C_OP.F_CV;15.174157143;100.0 +25/10/2020 02:06:53;U879.TC105C_OP.F_CV;12.934212685;100.0 +25/10/2020 02:06:57;U879.TC105C_OP.F_CV;12.934212685;100.0 +25/10/2020 02:06:58;U879.TC105C_OP.F_CV;14.454747200;100.0 +25/10/2020 02:06:59;U879.TC105C_OP.F_CV;11.815186501;100.0 +25/10/2020 02:06:00;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:02;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:03;U879.TC105C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:04;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:05;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:06;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:07;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:08;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:09;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:10;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:11;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:12;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:13;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:14;U879.TC105C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:15;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:16;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:17;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:18;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:19;U879.TC105C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:20;U879.TC105C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:21;U879.TC105C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:22;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:24;U879.TC105C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:25;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:26;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:27;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:28;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:29;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:30;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:31;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:32;U879.TC105C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:33;U879.TC105C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:34;U879.TC105C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:35;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:36;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:37;U879.TC105C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:38;U879.TC105C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:39;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:40;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:41;U879.TC105C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:42;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:43;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:44;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:45;U879.TC105C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:46;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:47;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:48;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:49;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:50;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:51;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:52;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:53;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:54;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:55;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:56;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:57;U879.TC105C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:58;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:59;U879.TC105C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:08;U879.TC105C_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC105D_OP.F_CV;11.681689262;100.0 +25/10/2020 02:06:01;U879.TC105D_OP.F_CV;16.960557938;100.0 +25/10/2020 02:06:03;U879.TC105D_OP.F_CV;14.720613480;100.0 +25/10/2020 02:06:06;U879.TC105D_OP.F_CV;13.200078964;100.0 +25/10/2020 02:06:07;U879.TC105D_OP.F_CV;15.839639664;100.0 +25/10/2020 02:06:09;U879.TC105D_OP.F_CV;14.719614029;100.0 +25/10/2020 02:06:10;U879.TC105D_OP.F_CV;13.199079514;100.0 +25/10/2020 02:06:12;U879.TC105D_OP.F_CV;15.838640213;100.0 +25/10/2020 02:06:13;U879.TC105D_OP.F_CV;14.718614578;100.0 +25/10/2020 02:06:35;U879.TC105D_OP.F_CV;14.718614578;100.0 +25/10/2020 02:06:36;U879.TC105D_OP.F_CV;16.239149094;100.0 +25/10/2020 02:06:38;U879.TC105D_OP.F_CV;15.120122910;100.0 +25/10/2020 02:06:40;U879.TC105D_OP.F_CV;14.720613480;100.0 +25/10/2020 02:06:48;U879.TC105D_OP.F_CV;14.720613480;100.0 +25/10/2020 02:06:49;U879.TC105D_OP.F_CV;16.241147995;100.0 +25/10/2020 02:06:50;U879.TC105D_OP.F_CV;13.601586342;100.0 +25/10/2020 02:06:52;U879.TC105D_OP.F_CV;16.242147446;100.0 +25/10/2020 02:06:53;U879.TC105D_OP.F_CV;13.602586746;100.0 +25/10/2020 02:06:55;U879.TC105D_OP.F_CV;17.763538361;100.0 +25/10/2020 02:06:56;U879.TC105D_OP.F_CV;14.005202293;100.0 +25/10/2020 02:06:58;U879.TC105D_OP.F_CV;15.126122475;100.0 +25/10/2020 02:06:00;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:02;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:03;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:04;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:05;U879.TC105D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:06;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:07;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:08;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:09;U879.TC105D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:10;U879.TC105D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:11;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:12;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:13;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:14;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:15;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:16;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:17;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:18;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:19;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:20;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:21;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:22;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:24;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:25;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:26;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:27;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:28;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:29;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:30;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:31;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:32;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:33;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:34;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:35;U879.TC105D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:36;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:37;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:38;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:39;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:40;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:41;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:42;U879.TC105D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:43;U879.TC105D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:44;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:45;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:46;U879.TC105D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:47;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:48;U879.TC105D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:49;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:50;U879.TC105D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:51;U879.TC105D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:52;U879.TC105D_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:53;U879.TC105D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:54;U879.TC105D_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:55;U879.TC105D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:56;U879.TC105D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:57;U879.TC105D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:58;U879.TC105D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:59;U879.TC105D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:23;U879.TC105D_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC105E_OP.F_CV;13.044683456;100.0 +25/10/2020 02:06:01;U879.TC105E_OP.F_CV;12.328167915;100.0 +25/10/2020 02:06:03;U879.TC105E_OP.F_CV;9.691607475;100.0 +25/10/2020 02:06:04;U879.TC105E_OP.F_CV;10.814633369;100.0 +25/10/2020 02:06:07;U879.TC105E_OP.F_CV;12.341168404;100.0 +25/10/2020 02:06:09;U879.TC105E_OP.F_CV;9.704607964;100.0 +25/10/2020 02:06:10;U879.TC105E_OP.F_CV;12.348168373;100.0 +25/10/2020 02:06:12;U879.TC105E_OP.F_CV;11.232142448;100.0 +25/10/2020 02:06:13;U879.TC105E_OP.F_CV;9.715607643;100.0 +25/10/2020 02:06:15;U879.TC105E_OP.F_CV;7.797563076;100.0 +25/10/2020 02:06:16;U879.TC105E_OP.F_CV;13.079683304;100.0 +25/10/2020 02:06:18;U879.TC105E_OP.F_CV;12.363167763;100.0 +25/10/2020 02:06:19;U879.TC105E_OP.F_CV;6.685536861;100.0 +25/10/2020 02:06:21;U879.TC105E_OP.F_CV;10.046613693;100.0 +25/10/2020 02:06:25;U879.TC105E_OP.F_CV;13.090682983;100.0 +25/10/2020 02:06:28;U879.TC105E_OP.F_CV;9.737607002;100.0 +25/10/2020 02:06:30;U879.TC105E_OP.F_CV;10.860631943;100.0 +25/10/2020 02:06:34;U879.TC105E_OP.F_CV;10.066614151;100.0 +25/10/2020 02:06:38;U879.TC105E_OP.F_CV;8.548151970;100.0 +25/10/2020 02:06:39;U879.TC105E_OP.F_CV;14.229655266;100.0 +25/10/2020 02:06:40;U879.TC105E_OP.F_CV;7.831562996;100.0 +25/10/2020 02:06:42;U879.TC105E_OP.F_CV;10.072614670;100.0 +25/10/2020 02:06:44;U879.TC105E_OP.F_CV;8.553152084;100.0 +25/10/2020 02:06:46;U879.TC105E_OP.F_CV;8.152662277;100.0 +25/10/2020 02:06:47;U879.TC105E_OP.F_CV;10.792097092;100.0 +25/10/2020 02:06:49;U879.TC105E_OP.F_CV;11.192585945;100.0 +25/10/2020 02:06:50;U879.TC105E_OP.F_CV;10.073615074;100.0 +25/10/2020 02:06:52;U879.TC105E_OP.F_CV;8.554152489;100.0 +25/10/2020 02:06:53;U879.TC105E_OP.F_CV;9.674124718;100.0 +25/10/2020 02:06:55;U879.TC105E_OP.F_CV;10.878633499;100.0 +25/10/2020 02:06:58;U879.TC105E_OP.F_CV;6.320101738;100.0 +25/10/2020 02:06:59;U879.TC105E_OP.F_CV;11.200588226;100.0 +25/10/2020 02:06:00;U879.TC105E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:01;U879.TC105E_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:02;U879.TC105E_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:03;U879.TC105E_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:04;U879.TC105E_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:05;U879.TC105E_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:06;U879.TC105E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:07;U879.TC105E_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:08;U879.TC105E_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:09;U879.TC105E_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:10;U879.TC105E_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:11;U879.TC105E_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:12;U879.TC105E_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:13;U879.TC105E_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:14;U879.TC105E_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:15;U879.TC105E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:16;U879.TC105E_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:17;U879.TC105E_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:18;U879.TC105E_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:19;U879.TC105E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:20;U879.TC105E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:21;U879.TC105E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:22;U879.TC105E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:23;U879.TC105E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:24;U879.TC105E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:25;U879.TC105E_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:26;U879.TC105E_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:27;U879.TC105E_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:28;U879.TC105E_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:29;U879.TC105E_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:30;U879.TC105E_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:31;U879.TC105E_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:32;U879.TC105E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:33;U879.TC105E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:34;U879.TC105E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:35;U879.TC105E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:36;U879.TC105E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:37;U879.TC105E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:38;U879.TC105E_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:39;U879.TC105E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:40;U879.TC105E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:41;U879.TC105E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:42;U879.TC105E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:43;U879.TC105E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:44;U879.TC105E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:45;U879.TC105E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:46;U879.TC105E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:47;U879.TC105E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:48;U879.TC105E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:49;U879.TC105E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:50;U879.TC105E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:51;U879.TC105E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:52;U879.TC105E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:53;U879.TC105E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:54;U879.TC105E_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:55;U879.TC105E_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:56;U879.TC105E_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:57;U879.TC105E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:58;U879.TC105E_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:59;U879.TC105E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:32;U879.TC105E_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:00;U879.TC105F_OP.F_CV;11.416658401;100.0 +25/10/2020 02:06:01;U879.TC105F_OP.F_CV;12.940048218;100.0 +25/10/2020 02:06:03;U879.TC105F_OP.F_CV;10.303738594;100.0 +25/10/2020 02:06:04;U879.TC105F_OP.F_CV;11.426658630;100.0 +25/10/2020 02:06:06;U879.TC105F_OP.F_CV;12.950048447;100.0 +25/10/2020 02:06:07;U879.TC105F_OP.F_CV;10.313739777;100.0 +25/10/2020 02:06:09;U879.TC105F_OP.F_CV;12.957048416;100.0 +25/10/2020 02:06:10;U879.TC105F_OP.F_CV;11.841129303;100.0 +25/10/2020 02:06:13;U879.TC105F_OP.F_CV;8.808059692;100.0 +25/10/2020 02:06:15;U879.TC105F_OP.F_CV;12.570789337;100.0 +25/10/2020 02:06:16;U879.TC105F_OP.F_CV;11.453658104;100.0 +25/10/2020 02:06:18;U879.TC105F_OP.F_CV;12.977047920;100.0 +25/10/2020 02:06:20;U879.TC105F_OP.F_CV;8.820059776;100.0 +25/10/2020 02:06:21;U879.TC105F_OP.F_CV;12.582790375;100.0 +25/10/2020 02:06:22;U879.TC105F_OP.F_CV;9.944977760;100.0 +25/10/2020 02:06:24;U879.TC105F_OP.F_CV;12.587788582;100.0 +25/10/2020 02:06:25;U879.TC105F_OP.F_CV;12.991046906;100.0 +25/10/2020 02:06:27;U879.TC105F_OP.F_CV;10.354738235;100.0 +25/10/2020 02:06:28;U879.TC105F_OP.F_CV;12.998046875;100.0 +25/10/2020 02:06:30;U879.TC105F_OP.F_CV;11.882127762;100.0 +25/10/2020 02:06:32;U879.TC105F_OP.F_CV;10.365736961;100.0 +25/10/2020 02:06:34;U879.TC105F_OP.F_CV;12.610788345;100.0 +25/10/2020 02:06:36;U879.TC105F_OP.F_CV;9.972974777;100.0 +25/10/2020 02:06:38;U879.TC105F_OP.F_CV;11.095107079;100.0 +25/10/2020 02:06:40;U879.TC105F_OP.F_CV;9.979974747;100.0 +25/10/2020 02:06:43;U879.TC105F_OP.F_CV;11.102107048;100.0 +25/10/2020 02:06:47;U879.TC105F_OP.F_CV;9.587717056;100.0 +25/10/2020 02:06:49;U879.TC105F_OP.F_CV;12.229025841;100.0 +25/10/2020 02:06:50;U879.TC105F_OP.F_CV;9.590717316;100.0 +25/10/2020 02:06:52;U879.TC105F_OP.F_CV;12.233025551;100.0 +25/10/2020 02:06:55;U879.TC105F_OP.F_CV;9.596716881;100.0 +25/10/2020 02:06:58;U879.TC105F_OP.F_CV;10.717636108;100.0 +25/10/2020 02:06:00;U879.TC105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:01;U879.TC105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:02;U879.TC105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:03;U879.TC105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:04;U879.TC105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:05;U879.TC105F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:06;U879.TC105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:07;U879.TC105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:08;U879.TC105F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:09;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:10;U879.TC105F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:11;U879.TC105F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:12;U879.TC105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:13;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:14;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:15;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:16;U879.TC105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:17;U879.TC105F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:18;U879.TC105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:19;U879.TC105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:20;U879.TC105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:21;U879.TC105F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:22;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:23;U879.TC105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:24;U879.TC105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:25;U879.TC105F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:26;U879.TC105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:27;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:28;U879.TC105F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:29;U879.TC105F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:30;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:31;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:32;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:33;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:34;U879.TC105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:35;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:36;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:37;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:38;U879.TC105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:39;U879.TC105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:40;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:41;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:42;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:43;U879.TC105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:44;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:45;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:46;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:47;U879.TC105F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:48;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:49;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:50;U879.TC105F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:51;U879.TC105F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:52;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:53;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:54;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:55;U879.TC105F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:56;U879.TC105F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:57;U879.TC105F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:58;U879.TC105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:59;U879.TC105F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:28;U879.TC105F_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC106A_OP.F_CV;3.900955915;100.0 +25/10/2020 02:06:01;U879.TC106A_OP.F_CV;7.661435604;100.0 +25/10/2020 02:06:02;U879.TC106A_OP.F_CV;6.542409420;100.0 +25/10/2020 02:06:05;U879.TC106A_OP.F_CV;5.023875237;100.0 +25/10/2020 02:06:07;U879.TC106A_OP.F_CV;9.184825897;100.0 +25/10/2020 02:06:08;U879.TC106A_OP.F_CV;5.426491737;100.0 +25/10/2020 02:06:10;U879.TC106A_OP.F_CV;8.067800522;100.0 +25/10/2020 02:06:11;U879.TC106A_OP.F_CV;6.949881554;100.0 +25/10/2020 02:06:13;U879.TC106A_OP.F_CV;5.431491375;100.0 +25/10/2020 02:06:14;U879.TC106A_OP.F_CV;6.552410603;100.0 +25/10/2020 02:06:17;U879.TC106A_OP.F_CV;5.435492516;100.0 +25/10/2020 02:06:19;U879.TC106A_OP.F_CV;8.076801300;100.0 +25/10/2020 02:06:20;U879.TC106A_OP.F_CV;5.438492775;100.0 +25/10/2020 02:06:23;U879.TC106A_OP.F_CV;4.322360039;100.0 +25/10/2020 02:06:25;U879.TC106A_OP.F_CV;8.083801270;100.0 +25/10/2020 02:06:26;U879.TC106A_OP.F_CV;5.445492268;100.0 +25/10/2020 02:06:28;U879.TC106A_OP.F_CV;8.086801529;100.0 +25/10/2020 02:06:29;U879.TC106A_OP.F_CV;6.968882084;100.0 +25/10/2020 02:06:31;U879.TC106A_OP.F_CV;5.450492859;100.0 +25/10/2020 02:06:32;U879.TC106A_OP.F_CV;9.612481117;100.0 +25/10/2020 02:06:34;U879.TC106A_OP.F_CV;5.854749680;100.0 +25/10/2020 02:06:35;U879.TC106A_OP.F_CV;6.976881504;100.0 +25/10/2020 02:06:38;U879.TC106A_OP.F_CV;5.460491657;100.0 +25/10/2020 02:06:40;U879.TC106A_OP.F_CV;6.581410885;100.0 +25/10/2020 02:06:42;U879.TC106A_OP.F_CV;8.103445053;100.0 +25/10/2020 02:06:43;U879.TC106A_OP.F_CV;9.624479294;100.0 +25/10/2020 02:06:44;U879.TC106A_OP.F_CV;4.346359253;100.0 +25/10/2020 02:06:46;U879.TC106A_OP.F_CV;6.587409973;100.0 +25/10/2020 02:06:48;U879.TC106A_OP.F_CV;8.109445572;100.0 +25/10/2020 02:06:49;U879.TC106A_OP.F_CV;9.630479813;100.0 +25/10/2020 02:06:50;U879.TC106A_OP.F_CV;5.872748375;100.0 +25/10/2020 02:06:52;U879.TC106A_OP.F_CV;8.515560150;100.0 +25/10/2020 02:06:53;U879.TC106A_OP.F_CV;4.357357979;100.0 +25/10/2020 02:06:55;U879.TC106A_OP.F_CV;6.598409176;100.0 +25/10/2020 02:06:56;U879.TC106A_OP.F_CV;8.119798660;100.0 +25/10/2020 02:06:58;U879.TC106A_OP.F_CV;5.481489658;100.0 +25/10/2020 02:06:59;U879.TC106A_OP.F_CV;6.602408886;100.0 +25/10/2020 02:06:06;U879.TC106A_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:08;U879.TC106A_PV.F_CV;69.933334351;100.0 +25/10/2020 02:06:28;U879.TC106A_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:29;U879.TC106A_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:42;U879.TC106A_PV.F_CV;69.949996948;100.0 +25/10/2020 02:06:45;U879.TC106A_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:58;U879.TC106A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:44;U879.TC106A_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC106B_OP.F_CV;6.705572128;100.0 +25/10/2020 02:06:01;U879.TC106B_OP.F_CV;1.421703339;100.0 +25/10/2020 02:06:02;U879.TC106B_OP.F_CV;3.656647444;100.0 +25/10/2020 02:06:04;U879.TC106B_OP.F_CV;2.131257772;100.0 +25/10/2020 02:06:05;U879.TC106B_OP.F_CV;4.765566349;100.0 +25/10/2020 02:06:07;U879.TC106B_OP.F_CV;3.640647173;100.0 +25/10/2020 02:06:08;U879.TC106B_OP.F_CV;5.156182289;100.0 +25/10/2020 02:06:10;U879.TC106B_OP.F_CV;5.552546024;100.0 +25/10/2020 02:06:11;U879.TC106B_OP.F_CV;5.950307369;100.0 +25/10/2020 02:06:13;U879.TC106B_OP.F_CV;3.307495117;100.0 +25/10/2020 02:06:14;U879.TC106B_OP.F_CV;4.424627304;100.0 +25/10/2020 02:06:17;U879.TC106B_OP.F_CV;5.537546158;100.0 +25/10/2020 02:06:19;U879.TC106B_OP.F_CV;5.935307026;100.0 +25/10/2020 02:06:20;U879.TC106B_OP.F_CV;3.292494774;100.0 +25/10/2020 02:06:23;U879.TC106B_OP.F_CV;3.689255476;100.0 +25/10/2020 02:06:26;U879.TC106B_OP.F_CV;6.325564384;100.0 +25/10/2020 02:06:28;U879.TC106B_OP.F_CV;5.204645157;100.0 +25/10/2020 02:06:34;U879.TC106B_OP.F_CV;5.204645157;100.0 +25/10/2020 02:06:35;U879.TC106B_OP.F_CV;6.720180511;100.0 +25/10/2020 02:06:37;U879.TC106B_OP.F_CV;5.600154877;100.0 +25/10/2020 02:06:43;U879.TC106B_OP.F_CV;7.120689392;100.0 +25/10/2020 02:06:44;U879.TC106B_OP.F_CV;6.001664162;100.0 +25/10/2020 02:06:47;U879.TC106B_OP.F_CV;4.483129501;100.0 +25/10/2020 02:06:49;U879.TC106B_OP.F_CV;7.123690128;100.0 +25/10/2020 02:06:50;U879.TC106B_OP.F_CV;7.525053978;100.0 +25/10/2020 02:06:53;U879.TC106B_OP.F_CV;4.888745785;100.0 +25/10/2020 02:06:55;U879.TC106B_OP.F_CV;9.050733566;100.0 +25/10/2020 02:06:56;U879.TC106B_OP.F_CV;6.813682556;100.0 +25/10/2020 02:06:59;U879.TC106B_OP.F_CV;3.778612852;100.0 +25/10/2020 02:06:00;U879.TC106B_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:54;U879.TC106B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:58;U879.TC106B_PV.F_CV;69.833335876;100.0 +25/10/2020 02:06:16;U879.TC106B_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:02;U879.TC106C_OP.F_CV;3.720730305;100.0 +25/10/2020 02:06:04;U879.TC106C_OP.F_CV;7.884573936;100.0 +25/10/2020 02:06:05;U879.TC106C_OP.F_CV;5.649629593;100.0 +25/10/2020 02:06:07;U879.TC106C_OP.F_CV;4.134094715;100.0 +25/10/2020 02:06:08;U879.TC106C_OP.F_CV;6.778654575;100.0 +25/10/2020 02:06:10;U879.TC106C_OP.F_CV;5.663629532;100.0 +25/10/2020 02:06:12;U879.TC106C_OP.F_CV;4.910861969;100.0 +25/10/2020 02:06:13;U879.TC106C_OP.F_CV;4.153094769;100.0 +25/10/2020 02:06:14;U879.TC106C_OP.F_CV;6.797655106;100.0 +25/10/2020 02:06:17;U879.TC106C_OP.F_CV;7.208019257;100.0 +25/10/2020 02:06:19;U879.TC106C_OP.F_CV;4.573710442;100.0 +25/10/2020 02:06:20;U879.TC106C_OP.F_CV;5.698628902;100.0 +25/10/2020 02:06:23;U879.TC106C_OP.F_CV;4.188094616;100.0 +25/10/2020 02:06:26;U879.TC106C_OP.F_CV;4.598710060;100.0 +25/10/2020 02:06:28;U879.TC106C_OP.F_CV;5.723628998;100.0 +25/10/2020 02:06:30;U879.TC106C_OP.F_CV;4.970861435;100.0 +25/10/2020 02:06:31;U879.TC106C_OP.F_CV;4.213094234;100.0 +25/10/2020 02:06:32;U879.TC106C_OP.F_CV;5.337120056;100.0 +25/10/2020 02:06:36;U879.TC106C_OP.F_CV;6.107387543;100.0 +25/10/2020 02:06:37;U879.TC106C_OP.F_CV;6.869655132;100.0 +25/10/2020 02:06:38;U879.TC106C_OP.F_CV;4.234094620;100.0 +25/10/2020 02:06:40;U879.TC106C_OP.F_CV;5.358120441;100.0 +25/10/2020 02:06:44;U879.TC106C_OP.F_CV;6.890655518;100.0 +25/10/2020 02:06:46;U879.TC106C_OP.F_CV;4.255095005;100.0 +25/10/2020 02:06:47;U879.TC106C_OP.F_CV;3.858730793;100.0 +25/10/2020 02:06:49;U879.TC106C_OP.F_CV;4.981649399;100.0 +25/10/2020 02:06:50;U879.TC106C_OP.F_CV;6.505038738;100.0 +25/10/2020 02:06:53;U879.TC106C_OP.F_CV;3.872730732;100.0 +25/10/2020 02:06:55;U879.TC106C_OP.F_CV;3.474969625;100.0 +25/10/2020 02:06:56;U879.TC106C_OP.F_CV;6.117781639;100.0 +25/10/2020 02:06:58;U879.TC106C_OP.F_CV;6.521039486;100.0 +25/10/2020 02:06:59;U879.TC106C_OP.F_CV;3.884730816;100.0 +25/10/2020 02:06:03;U879.TC106C_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:46;U879.TC106C_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:03;U879.TC106C_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:02;U879.TC106D_OP.F_CV;7.941585541;100.0 +25/10/2020 02:06:04;U879.TC106D_OP.F_CV;8.344842911;100.0 +25/10/2020 02:06:05;U879.TC106D_OP.F_CV;5.708533764;100.0 +25/10/2020 02:06:07;U879.TC106D_OP.F_CV;6.831453323;100.0 +25/10/2020 02:06:13;U879.TC106D_OP.F_CV;6.831453323;100.0 +25/10/2020 02:06:14;U879.TC106D_OP.F_CV;5.325774193;100.0 +25/10/2020 02:06:16;U879.TC106D_OP.F_CV;7.968586922;100.0 +25/10/2020 02:06:17;U879.TC106D_OP.F_CV;5.330774307;100.0 +25/10/2020 02:06:19;U879.TC106D_OP.F_CV;7.973587036;100.0 +25/10/2020 02:06:20;U879.TC106D_OP.F_CV;5.335774899;100.0 +25/10/2020 02:06:23;U879.TC106D_OP.F_CV;8.381844521;100.0 +25/10/2020 02:06:27;U879.TC106D_OP.F_CV;6.310349941;100.0 +25/10/2020 02:06:28;U879.TC106D_OP.F_CV;4.231855869;100.0 +25/10/2020 02:06:29;U879.TC106D_OP.F_CV;6.473906517;100.0 +25/10/2020 02:06:32;U879.TC106D_OP.F_CV;7.998586178;100.0 +25/10/2020 02:06:34;U879.TC106D_OP.F_CV;6.881454468;100.0 +25/10/2020 02:06:38;U879.TC106D_OP.F_CV;6.881454468;100.0 +25/10/2020 02:06:40;U879.TC106D_OP.F_CV;5.372775078;100.0 +25/10/2020 02:06:41;U879.TC106D_OP.F_CV;8.015587807;100.0 +25/10/2020 02:06:43;U879.TC106D_OP.F_CV;6.898455620;100.0 +25/10/2020 02:06:44;U879.TC106D_OP.F_CV;5.380775452;100.0 +25/10/2020 02:06:46;U879.TC106D_OP.F_CV;8.023588181;100.0 +25/10/2020 02:06:47;U879.TC106D_OP.F_CV;6.906455994;100.0 +25/10/2020 02:06:51;U879.TC106D_OP.F_CV;7.674151421;100.0 +25/10/2020 02:06:52;U879.TC106D_OP.F_CV;8.435846329;100.0 +25/10/2020 02:06:53;U879.TC106D_OP.F_CV;4.278857708;100.0 +25/10/2020 02:06:55;U879.TC106D_OP.F_CV;8.041588783;100.0 +25/10/2020 02:06:56;U879.TC106D_OP.F_CV;5.403776646;100.0 +25/10/2020 02:06:58;U879.TC106D_OP.F_CV;8.046588898;100.0 +25/10/2020 02:06:59;U879.TC106D_OP.F_CV;6.929456711;100.0 +25/10/2020 02:06:02;U879.TC106D_PV.F_CV;69.649993896;100.0 +25/10/2020 02:06:07;U879.TC106D_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:16;U879.TC106D_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:17;U879.TC106D_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:22;U879.TC106D_PV.F_CV;69.649993896;100.0 +25/10/2020 02:06:27;U879.TC106D_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:47;U879.TC106D_PV.F_CV;69.666664124;100.0 +25/10/2020 02:06:53;U879.TC106D_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:58;U879.TC106D_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:23;U879.TC106D_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U879.TC106E_OP.F_CV;6.840424538;100.0 +25/10/2020 02:06:02;U879.TC106E_OP.F_CV;2.681581259;100.0 +25/10/2020 02:06:04;U879.TC106E_OP.F_CV;4.921525955;100.0 +25/10/2020 02:06:05;U879.TC106E_OP.F_CV;6.442060947;100.0 +25/10/2020 02:06:07;U879.TC106E_OP.F_CV;6.843425274;100.0 +25/10/2020 02:06:08;U879.TC106E_OP.F_CV;4.205116749;100.0 +25/10/2020 02:06:10;U879.TC106E_OP.F_CV;5.326035500;100.0 +25/10/2020 02:06:11;U879.TC106E_OP.F_CV;3.806500673;100.0 +25/10/2020 02:06:13;U879.TC106E_OP.F_CV;6.447061539;100.0 +25/10/2020 02:06:14;U879.TC106E_OP.F_CV;6.848425865;100.0 +25/10/2020 02:06:16;U879.TC106E_OP.F_CV;5.730506420;100.0 +25/10/2020 02:06:20;U879.TC106E_OP.F_CV;5.730506420;100.0 +25/10/2020 02:06:22;U879.TC106E_OP.F_CV;7.259186268;100.0 +25/10/2020 02:06:23;U879.TC106E_OP.F_CV;4.621374130;100.0 +25/10/2020 02:06:26;U879.TC106E_OP.F_CV;7.266186237;100.0 +25/10/2020 02:06:28;U879.TC106E_OP.F_CV;6.149054050;100.0 +25/10/2020 02:06:30;U879.TC106E_OP.F_CV;5.513408661;100.0 +25/10/2020 02:06:32;U879.TC106E_OP.F_CV;4.236117363;100.0 +25/10/2020 02:06:34;U879.TC106E_OP.F_CV;6.877426147;100.0 +25/10/2020 02:06:35;U879.TC106E_OP.F_CV;5.759507179;100.0 +25/10/2020 02:06:37;U879.TC106E_OP.F_CV;4.241117477;100.0 +25/10/2020 02:06:38;U879.TC106E_OP.F_CV;6.882425785;100.0 +25/10/2020 02:06:40;U879.TC106E_OP.F_CV;5.764507294;100.0 +25/10/2020 02:06:41;U879.TC106E_OP.F_CV;7.287186623;100.0 +25/10/2020 02:06:43;U879.TC106E_OP.F_CV;4.649374962;100.0 +25/10/2020 02:06:44;U879.TC106E_OP.F_CV;5.771507263;100.0 +25/10/2020 02:06:46;U879.TC106E_OP.F_CV;7.294187069;100.0 +25/10/2020 02:06:47;U879.TC106E_OP.F_CV;1.615450382;100.0 +25/10/2020 02:06:49;U879.TC106E_OP.F_CV;6.496061802;100.0 +25/10/2020 02:06:50;U879.TC106E_OP.F_CV;6.897426605;100.0 +25/10/2020 02:06:53;U879.TC106E_OP.F_CV;2.740582943;100.0 +25/10/2020 02:06:55;U879.TC106E_OP.F_CV;6.501062393;100.0 +25/10/2020 02:06:56;U879.TC106E_OP.F_CV;6.902426720;100.0 +25/10/2020 02:06:58;U879.TC106E_OP.F_CV;5.784507751;100.0 +25/10/2020 02:06:59;U879.TC106E_OP.F_CV;2.745583057;100.0 +25/10/2020 02:06:00;U879.TC106E_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:02;U879.TC106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:05;U879.TC106E_PV.F_CV;69.850006104;100.0 +25/10/2020 02:06:11;U879.TC106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:13;U879.TC106E_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:52;U879.TC106E_PV.F_CV;69.949996948;100.0 +25/10/2020 02:06:56;U879.TC106E_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:58;U879.TC106E_PV.F_CV;69.933334351;100.0 +25/10/2020 02:06:23;U879.TC106E_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U879.TC106F_OP.F_CV;2.448520899;100.0 +25/10/2020 02:06:02;U879.TC106F_OP.F_CV;5.088081360;100.0 +25/10/2020 02:06:04;U879.TC106F_OP.F_CV;3.968055725;100.0 +25/10/2020 02:06:08;U879.TC106F_OP.F_CV;2.447520733;100.0 +25/10/2020 02:06:10;U879.TC106F_OP.F_CV;3.566546440;100.0 +25/10/2020 02:06:11;U879.TC106F_OP.F_CV;5.086081505;100.0 +25/10/2020 02:06:13;U879.TC106F_OP.F_CV;2.445520878;100.0 +25/10/2020 02:06:14;U879.TC106F_OP.F_CV;5.085081100;100.0 +25/10/2020 02:06:16;U879.TC106F_OP.F_CV;2.444520473;100.0 +25/10/2020 02:06:17;U879.TC106F_OP.F_CV;5.084080696;100.0 +25/10/2020 02:06:19;U879.TC106F_OP.F_CV;3.964055061;100.0 +25/10/2020 02:06:23;U879.TC106F_OP.F_CV;2.443520308;100.0 +25/10/2020 02:06:25;U879.TC106F_OP.F_CV;3.562546015;100.0 +25/10/2020 02:06:26;U879.TC106F_OP.F_CV;5.082080364;100.0 +25/10/2020 02:06:28;U879.TC106F_OP.F_CV;2.441520214;100.0 +25/10/2020 02:06:29;U879.TC106F_OP.F_CV;5.081080437;100.0 +25/10/2020 02:06:32;U879.TC106F_OP.F_CV;2.440520048;100.0 +25/10/2020 02:06:34;U879.TC106F_OP.F_CV;5.080080509;100.0 +25/10/2020 02:06:35;U879.TC106F_OP.F_CV;3.960054874;100.0 +25/10/2020 02:06:40;U879.TC106F_OP.F_CV;7.000979424;100.0 +25/10/2020 02:06:41;U879.TC106F_OP.F_CV;1.722110271;100.0 +25/10/2020 02:06:43;U879.TC106F_OP.F_CV;3.962054729;100.0 +25/10/2020 02:06:50;U879.TC106F_OP.F_CV;7.002978802;100.0 +25/10/2020 02:06:53;U879.TC106F_OP.F_CV;1.726109862;100.0 +25/10/2020 02:06:55;U879.TC106F_OP.F_CV;3.966054201;100.0 +25/10/2020 02:06:59;U879.TC106F_OP.F_CV;7.006978512;100.0 +25/10/2020 02:06:04;U879.TC106F_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:05;U879.TC106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:19;U879.TC106F_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:20;U879.TC106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:37;U879.TC106F_PV.F_CV;69.866668701;100.0 +25/10/2020 02:06:40;U879.TC106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:49;U879.TC106F_PV.F_CV;69.866668701;100.0 +25/10/2020 02:06:53;U879.TC106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:55;U879.TC106F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:56;U879.TC106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:58;U879.TC106F_PV.F_CV;69.866668701;100.0 +25/10/2020 02:06:11;U879.TC106F_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:48;U879.TC107A_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U879.TC107A_PV.F_CV;25.850000381;100.0 +25/10/2020 02:06:15;U879.TC107A_PV.F_CV;25.700000763;100.0 +25/10/2020 02:06:31;U879.TC107A_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:32;U879.TC107A_PV.F_CV;25.700000763;100.0 +25/10/2020 02:06:04;U879.TC107A_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC107B_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U879.TC107B_PV.F_CV;26.333332062;100.0 +25/10/2020 02:06:36;U879.TC107B_PV.F_CV;26.500000000;100.0 +25/10/2020 02:06:38;U879.TC107B_PV.F_CV;26.366666794;100.0 +25/10/2020 02:06:48;U879.TC107B_PV.F_CV;26.500000000;100.0 +25/10/2020 02:06:49;U879.TC107B_PV.F_CV;26.299999237;100.0 +25/10/2020 02:06:53;U879.TC107B_PV.F_CV;26.500000000;100.0 +25/10/2020 02:06:57;U879.TC107B_PV.F_CV;26.349998474;100.0 +25/10/2020 02:06:59;U879.TC107B_PV.F_CV;26.500000000;100.0 +25/10/2020 02:06:24;U879.TC107B_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:55;U879.TC107C_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U879.TC107C_PV.F_CV;26.299999237;100.0 +25/10/2020 02:06:03;U879.TC107C_PV.F_CV;26.500000000;100.0 +25/10/2020 02:06:06;U879.TC107C_PV.F_CV;26.349998474;100.0 +25/10/2020 02:06:12;U879.TC107C_PV.F_CV;26.475000381;100.0 +25/10/2020 02:06:19;U879.TC107C_PV.F_CV;26.299999237;100.0 +25/10/2020 02:06:40;U879.TC107C_PV.F_CV;26.433332443;100.0 +25/10/2020 02:06:50;U879.TC107C_PV.F_CV;26.299999237;100.0 +25/10/2020 02:06:52;U879.TC107C_PV.F_CV;26.450000763;100.0 +25/10/2020 02:06:55;U879.TC107C_PV.F_CV;26.299999237;100.0 +25/10/2020 02:06:40;U879.TC107C_SP.F_CV;68.725433350;100.0 +25/10/2020 02:06:23;U879.TC107D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U879.TC107D_PV.F_CV;26.700000763;100.0 +25/10/2020 02:06:16;U879.TC107D_PV.F_CV;26.899999619;100.0 +25/10/2020 02:06:18;U879.TC107D_PV.F_CV;26.766666412;100.0 +25/10/2020 02:06:22;U879.TC107D_PV.F_CV;26.899999619;100.0 +25/10/2020 02:06:28;U879.TC107D_PV.F_CV;26.700000763;100.0 +25/10/2020 02:06:30;U879.TC107D_PV.F_CV;26.899999619;100.0 +25/10/2020 02:06:32;U879.TC107D_PV.F_CV;26.766666412;100.0 +25/10/2020 02:06:34;U879.TC107D_PV.F_CV;26.899999619;100.0 +25/10/2020 02:06:57;U879.TC107D_PV.F_CV;26.700000763;100.0 +25/10/2020 02:06:23;U879.TC107D_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:58;U879.TC107E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U879.TC107E_PV.F_CV;26.379999161;100.0 +25/10/2020 02:06:08;U879.TC107E_PV.F_CV;26.242856979;100.0 +25/10/2020 02:06:17;U879.TC107E_PV.F_CV;26.399999619;100.0 +25/10/2020 02:06:25;U879.TC107E_PV.F_CV;26.200000763;100.0 +25/10/2020 02:06:27;U879.TC107E_PV.F_CV;26.333333969;100.0 +25/10/2020 02:06:34;U879.TC107E_PV.F_CV;26.200000763;100.0 +25/10/2020 02:06:23;U879.TC107E_SP.F_CV;63.000000000;100.0 +25/10/2020 02:06:28;U879.TC107F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U879.TC107F_PV.F_CV;27.049999237;100.0 +25/10/2020 02:06:38;U879.TC107F_PV.F_CV;26.899999619;100.0 +25/10/2020 02:06:23;U879.TC107F_SP.F_CV;28.620834351;100.0 +25/10/2020 02:06:00;U879.TC120A_OP.F_CV;3.638771057;100.0 +25/10/2020 02:06:01;U879.TC120A_OP.F_CV;2.118236303;100.0 +25/10/2020 02:06:02;U879.TC120A_OP.F_CV;1.716872096;100.0 +25/10/2020 02:06:04;U879.TC120A_OP.F_CV;4.355180740;100.0 +25/10/2020 02:06:05;U879.TC120A_OP.F_CV;1.713872194;100.0 +25/10/2020 02:06:07;U879.TC120A_OP.F_CV;4.352180958;100.0 +25/10/2020 02:06:08;U879.TC120A_OP.F_CV;1.710872293;100.0 +25/10/2020 02:06:10;U879.TC120A_OP.F_CV;2.828791142;100.0 +25/10/2020 02:06:12;U879.TC120A_OP.F_CV;4.346253395;100.0 +25/10/2020 02:06:13;U879.TC120A_OP.F_CV;5.865715981;100.0 +25/10/2020 02:06:14;U879.TC120A_OP.F_CV;2.105236530;100.0 +25/10/2020 02:06:17;U879.TC120A_OP.F_CV;4.743797302;100.0 +25/10/2020 02:06:19;U879.TC120A_OP.F_CV;3.623771667;100.0 +25/10/2020 02:06:20;U879.TC120A_OP.F_CV;0.582847118;100.0 +25/10/2020 02:06:23;U879.TC120A_OP.F_CV;2.101236820;100.0 +25/10/2020 02:06:25;U879.TC120A_OP.F_CV;4.740797043;100.0 +25/10/2020 02:06:26;U879.TC120A_OP.F_CV;2.100236416;100.0 +25/10/2020 02:06:28;U879.TC120A_OP.F_CV;3.219262123;100.0 +25/10/2020 02:06:30;U879.TC120A_OP.F_CV;2.457567215;100.0 +25/10/2020 02:06:31;U879.TC120A_OP.F_CV;1.696872354;100.0 +25/10/2020 02:06:32;U879.TC120A_OP.F_CV;5.855715752;100.0 +25/10/2020 02:06:34;U879.TC120A_OP.F_CV;3.615771055;100.0 +25/10/2020 02:06:37;U879.TC120A_OP.F_CV;2.095236540;100.0 +25/10/2020 02:06:38;U879.TC120A_OP.F_CV;3.214262247;100.0 +25/10/2020 02:06:40;U879.TC120A_OP.F_CV;1.692872405;100.0 +25/10/2020 02:06:41;U879.TC120A_OP.F_CV;4.331181526;100.0 +25/10/2020 02:06:43;U879.TC120A_OP.F_CV;3.210262775;100.0 +25/10/2020 02:06:44;U879.TC120A_OP.F_CV;1.688872933;100.0 +25/10/2020 02:06:46;U879.TC120A_OP.F_CV;1.286112070;100.0 +25/10/2020 02:06:47;U879.TC120A_OP.F_CV;5.444314003;100.0 +25/10/2020 02:06:49;U879.TC120A_OP.F_CV;1.682872772;100.0 +25/10/2020 02:06:50;U879.TC120A_OP.F_CV;4.321181297;100.0 +25/10/2020 02:06:52;U879.TC120A_OP.F_CV;4.720797062;100.0 +25/10/2020 02:06:53;U879.TC120A_OP.F_CV;0.559846878;100.0 +25/10/2020 02:06:55;U879.TC120A_OP.F_CV;2.797791481;100.0 +25/10/2020 02:06:56;U879.TC120A_OP.F_CV;4.316180706;100.0 +25/10/2020 02:06:58;U879.TC120A_OP.F_CV;3.195262432;100.0 +25/10/2020 02:06:25;U879.TC120A_PV.F_CV;70.050003052;100.0 +25/10/2020 02:06:30;U879.TC120A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:32;U879.TC120A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:39;U879.TC120A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:50;U879.TC120A_PV.F_CV;70.050003052;100.0 +25/10/2020 02:06:53;U879.TC120A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:55;U879.TC120A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:57;U879.TC120A_PV.F_CV;70.149993896;100.0 +25/10/2020 02:06:23;U879.TC120A_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC120B_OP.F_CV;5.417396545;100.0 +25/10/2020 02:06:01;U879.TC120B_OP.F_CV;3.899007082;100.0 +25/10/2020 02:06:02;U879.TC120B_OP.F_CV;3.499391079;100.0 +25/10/2020 02:06:04;U879.TC120B_OP.F_CV;7.660341740;100.0 +25/10/2020 02:06:05;U879.TC120B_OP.F_CV;3.902007341;100.0 +25/10/2020 02:06:07;U879.TC120B_OP.F_CV;5.022926331;100.0 +25/10/2020 02:06:08;U879.TC120B_OP.F_CV;3.503391743;100.0 +25/10/2020 02:06:10;U879.TC120B_OP.F_CV;6.143952370;100.0 +25/10/2020 02:06:11;U879.TC120B_OP.F_CV;5.024926662;100.0 +25/10/2020 02:06:13;U879.TC120B_OP.F_CV;3.505392075;100.0 +25/10/2020 02:06:14;U879.TC120B_OP.F_CV;6.145952225;100.0 +25/10/2020 02:06:18;U879.TC120B_OP.F_CV;4.827172279;100.0 +25/10/2020 02:06:19;U879.TC120B_OP.F_CV;3.507392168;100.0 +25/10/2020 02:06:20;U879.TC120B_OP.F_CV;6.147952557;100.0 +25/10/2020 02:06:23;U879.TC120B_OP.F_CV;5.029927254;100.0 +25/10/2020 02:06:27;U879.TC120B_OP.F_CV;4.272159576;100.0 +25/10/2020 02:06:28;U879.TC120B_OP.F_CV;3.512392521;100.0 +25/10/2020 02:06:29;U879.TC120B_OP.F_CV;6.152952671;100.0 +25/10/2020 02:06:31;U879.TC120B_OP.F_CV;3.513392925;100.0 +25/10/2020 02:06:32;U879.TC120B_OP.F_CV;6.153953552;100.0 +25/10/2020 02:06:34;U879.TC120B_OP.F_CV;5.034927845;100.0 +25/10/2020 02:06:36;U879.TC120B_OP.F_CV;4.276160240;100.0 +25/10/2020 02:06:37;U879.TC120B_OP.F_CV;3.516392946;100.0 +25/10/2020 02:06:38;U879.TC120B_OP.F_CV;7.677342892;100.0 +25/10/2020 02:06:40;U879.TC120B_OP.F_CV;3.919008970;100.0 +25/10/2020 02:06:41;U879.TC120B_OP.F_CV;3.519393206;100.0 +25/10/2020 02:06:43;U879.TC120B_OP.F_CV;6.159953594;100.0 +25/10/2020 02:06:44;U879.TC120B_OP.F_CV;5.040927410;100.0 +25/10/2020 02:06:46;U879.TC120B_OP.F_CV;3.521393299;100.0 +25/10/2020 02:06:47;U879.TC120B_OP.F_CV;4.641418934;100.0 +25/10/2020 02:06:50;U879.TC120B_OP.F_CV;7.682343483;100.0 +25/10/2020 02:06:53;U879.TC120B_OP.F_CV;3.926009178;100.0 +25/10/2020 02:06:55;U879.TC120B_OP.F_CV;6.567317963;100.0 +25/10/2020 02:06:56;U879.TC120B_OP.F_CV;3.929009199;100.0 +25/10/2020 02:06:58;U879.TC120B_OP.F_CV;6.570317745;100.0 +25/10/2020 02:06:59;U879.TC120B_OP.F_CV;3.932009459;100.0 +25/10/2020 02:06:00;U879.TC120B_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:21;U879.TC120B_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U879.TC120C_OP.F_CV;4.224127293;100.0 +25/10/2020 02:06:02;U879.TC120C_OP.F_CV;5.744662285;100.0 +25/10/2020 02:06:04;U879.TC120C_OP.F_CV;3.105101824;100.0 +25/10/2020 02:06:05;U879.TC120C_OP.F_CV;4.225127697;100.0 +25/10/2020 02:06:07;U879.TC120C_OP.F_CV;5.745662689;100.0 +25/10/2020 02:06:08;U879.TC120C_OP.F_CV;4.626636982;100.0 +25/10/2020 02:06:10;U879.TC120C_OP.F_CV;3.107102394;100.0 +25/10/2020 02:06:11;U879.TC120C_OP.F_CV;5.747662067;100.0 +25/10/2020 02:06:13;U879.TC120C_OP.F_CV;4.628636837;100.0 +25/10/2020 02:06:17;U879.TC120C_OP.F_CV;4.628636837;100.0 +25/10/2020 02:06:19;U879.TC120C_OP.F_CV;3.112102032;100.0 +25/10/2020 02:06:20;U879.TC120C_OP.F_CV;4.232127666;100.0 +25/10/2020 02:06:23;U879.TC120C_OP.F_CV;5.752662182;100.0 +25/10/2020 02:06:27;U879.TC120C_OP.F_CV;4.433882713;100.0 +25/10/2020 02:06:28;U879.TC120C_OP.F_CV;3.114102602;100.0 +25/10/2020 02:06:29;U879.TC120C_OP.F_CV;5.754663467;100.0 +25/10/2020 02:06:31;U879.TC120C_OP.F_CV;3.115103006;100.0 +25/10/2020 02:06:32;U879.TC120C_OP.F_CV;5.755663872;100.0 +25/10/2020 02:06:34;U879.TC120C_OP.F_CV;4.636638165;100.0 +25/10/2020 02:06:40;U879.TC120C_OP.F_CV;4.636638165;100.0 +25/10/2020 02:06:41;U879.TC120C_OP.F_CV;3.121103048;100.0 +25/10/2020 02:06:43;U879.TC120C_OP.F_CV;4.241128922;100.0 +25/10/2020 02:06:47;U879.TC120C_OP.F_CV;5.761663914;100.0 +25/10/2020 02:06:49;U879.TC120C_OP.F_CV;3.122103453;100.0 +25/10/2020 02:06:50;U879.TC120C_OP.F_CV;7.283053398;100.0 +25/10/2020 02:06:53;U879.TC120C_OP.F_CV;2.006184578;100.0 +25/10/2020 02:06:55;U879.TC120C_OP.F_CV;4.246129036;100.0 +25/10/2020 02:06:59;U879.TC120C_OP.F_CV;5.766663551;100.0 +25/10/2020 02:06:31;U879.TC120C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:23;U879.TC120C_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U879.TC120D_OP.F_CV;3.594351053;100.0 +25/10/2020 02:06:02;U879.TC120D_OP.F_CV;2.475352049;100.0 +25/10/2020 02:06:06;U879.TC120D_OP.F_CV;1.238675833;100.0 +25/10/2020 02:06:07;U879.TC120D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U879.TC120D_OP.F_CV;6.237848282;100.0 +25/10/2020 02:06:10;U879.TC120D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U879.TC120D_OP.F_CV;3.197851419;100.0 +25/10/2020 02:06:13;U879.TC120D_OP.F_CV;2.077852488;100.0 +25/10/2020 02:06:16;U879.TC120D_OP.F_CV;3.598351002;100.0 +25/10/2020 02:06:17;U879.TC120D_OP.F_CV;2.479351997;100.0 +25/10/2020 02:06:19;U879.TC120D_OP.F_CV;0.959853411;100.0 +25/10/2020 02:06:20;U879.TC120D_OP.F_CV;2.079852343;100.0 +25/10/2020 02:06:26;U879.TC120D_OP.F_CV;3.600350857;100.0 +25/10/2020 02:06:28;U879.TC120D_OP.F_CV;0.960853338;100.0 +25/10/2020 02:06:29;U879.TC120D_OP.F_CV;2.080852270;100.0 +25/10/2020 02:06:32;U879.TC120D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U879.TC120D_OP.F_CV;5.840848446;100.0 +25/10/2020 02:06:35;U879.TC120D_OP.F_CV;2.481851339;100.0 +25/10/2020 02:06:38;U879.TC120D_OP.F_CV;3.602850199;100.0 +25/10/2020 02:06:40;U879.TC120D_OP.F_CV;0.963352859;100.0 +25/10/2020 02:06:41;U879.TC120D_OP.F_CV;2.083351851;100.0 +25/10/2020 02:06:43;U879.TC120D_OP.F_CV;3.603850365;100.0 +25/10/2020 02:06:44;U879.TC120D_OP.F_CV;2.484851360;100.0 +25/10/2020 02:06:47;U879.TC120D_OP.F_CV;0.966352642;100.0 +25/10/2020 02:06:49;U879.TC120D_OP.F_CV;3.606850147;100.0 +25/10/2020 02:06:50;U879.TC120D_OP.F_CV;2.487851143;100.0 +25/10/2020 02:06:53;U879.TC120D_OP.F_CV;0.969352484;100.0 +25/10/2020 02:06:55;U879.TC120D_OP.F_CV;0.568852842;100.0 +25/10/2020 02:06:56;U879.TC120D_OP.F_CV;3.208350182;100.0 +25/10/2020 02:06:58;U879.TC120D_OP.F_CV;2.088351250;100.0 +25/10/2020 02:06:59;U879.TC120D_OP.F_CV;3.608849764;100.0 +25/10/2020 02:06:08;U879.TC120D_PV.F_CV;29.799999237;100.0 +25/10/2020 02:06:09;U879.TC120D_PV.F_CV;30.100000381;100.0 +25/10/2020 02:06:10;U879.TC120D_PV.F_CV;29.899999619;100.0 +25/10/2020 02:06:31;U879.TC120D_PV.F_CV;30.049999237;100.0 +25/10/2020 02:06:32;U879.TC120D_PV.F_CV;30.200000763;100.0 +25/10/2020 02:06:33;U879.TC120D_PV.F_CV;29.899999619;100.0 +25/10/2020 02:06:52;U879.TC120D_PV.F_CV;30.100000381;100.0 +25/10/2020 02:06:55;U879.TC120D_PV.F_CV;29.899999619;100.0 +25/10/2020 02:06:23;U879.TC120D_SP.F_CV;30.000000000;100.0 +25/10/2020 02:06:20;U879.TC120E_OP.F_CV;3.230001688;100.0 +25/10/2020 02:06:22;U879.TC120E_OP.F_CV;1.687468648;100.0 +25/10/2020 02:06:23;U879.TC120E_OP.F_CV;4.326029301;100.0 +25/10/2020 02:06:26;U879.TC120E_OP.F_CV;3.204003811;100.0 +25/10/2020 02:06:30;U879.TC120E_OP.F_CV;2.694492340;100.0 +25/10/2020 02:06:32;U879.TC120E_OP.F_CV;1.679469228;100.0 +25/10/2020 02:06:34;U879.TC120E_OP.F_CV;4.318029881;100.0 +25/10/2020 02:06:35;U879.TC120E_OP.F_CV;1.676469564;100.0 +25/10/2020 02:06:37;U879.TC120E_OP.F_CV;4.315030098;100.0 +25/10/2020 02:06:38;U879.TC120E_OP.F_CV;3.194004536;100.0 +25/10/2020 02:06:41;U879.TC120E_OP.F_CV;1.671469808;100.0 +25/10/2020 02:06:43;U879.TC120E_OP.F_CV;4.310030460;100.0 +25/10/2020 02:06:44;U879.TC120E_OP.F_CV;3.189004660;100.0 +25/10/2020 02:06:47;U879.TC120E_OP.F_CV;1.666470289;100.0 +25/10/2020 02:06:49;U879.TC120E_OP.F_CV;4.305030823;100.0 +25/10/2020 02:06:50;U879.TC120E_OP.F_CV;4.704466820;100.0 +25/10/2020 02:06:53;U879.TC120E_OP.F_CV;3.183004618;100.0 +25/10/2020 02:06:57;U879.TC120E_OP.F_CV;1.660006046;100.0 +25/10/2020 02:06:58;U879.TC120E_OP.F_CV;0.139007807;100.0 +25/10/2020 02:06:59;U879.TC120E_OP.F_CV;5.417002678;100.0 +25/10/2020 02:06:02;U879.TC120E_PV.F_CV;50.062500000;100.0 +25/10/2020 02:06:31;U879.TC120E_PV.F_CV;50.190002441;100.0 +25/10/2020 02:06:49;U879.TC120E_PV.F_CV;50.049999237;100.0 +25/10/2020 02:06:54;U879.TC120E_PV.F_CV;50.199996948;100.0 +25/10/2020 02:06:55;U879.TC120E_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:01;U879.TC120F_OP.F_CV;2.757304907;100.0 +25/10/2020 02:06:02;U879.TC120F_OP.F_CV;3.877277136;100.0 +25/10/2020 02:06:04;U879.TC120F_OP.F_CV;2.716805935;100.0 +25/10/2020 02:06:05;U879.TC120F_OP.F_CV;4.996249199;100.0 +25/10/2020 02:06:07;U879.TC120F_OP.F_CV;7.357801437;100.0 +25/10/2020 02:06:08;U879.TC120F_OP.F_CV;1.679724693;100.0 +25/10/2020 02:06:10;U879.TC120F_OP.F_CV;2.760304451;100.0 +25/10/2020 02:06:11;U879.TC120F_OP.F_CV;3.880276680;100.0 +25/10/2020 02:06:13;U879.TC120F_OP.F_CV;5.040747643;100.0 +25/10/2020 02:06:14;U879.TC120F_OP.F_CV;3.921775818;100.0 +25/10/2020 02:06:23;U879.TC120F_OP.F_CV;3.921775818;100.0 +25/10/2020 02:06:25;U879.TC120F_OP.F_CV;2.768304110;100.0 +25/10/2020 02:06:26;U879.TC120F_OP.F_CV;5.048747540;100.0 +25/10/2020 02:06:28;U879.TC120F_OP.F_CV;3.929775238;100.0 +25/10/2020 02:06:29;U879.TC120F_OP.F_CV;1.609832764;100.0 +25/10/2020 02:06:32;U879.TC120F_OP.F_CV;3.930775166;100.0 +25/10/2020 02:06:34;U879.TC120F_OP.F_CV;5.092301369;100.0 +25/10/2020 02:06:35;U879.TC120F_OP.F_CV;1.653277874;100.0 +25/10/2020 02:06:37;U879.TC120F_OP.F_CV;3.893275738;100.0 +25/10/2020 02:06:40;U879.TC120F_OP.F_CV;5.053747177;100.0 +25/10/2020 02:06:41;U879.TC120F_OP.F_CV;2.774303913;100.0 +25/10/2020 02:06:43;U879.TC120F_OP.F_CV;5.054747581;100.0 +25/10/2020 02:06:44;U879.TC120F_OP.F_CV;3.935775042;100.0 +25/10/2020 02:06:46;U879.TC120F_OP.F_CV;5.097301483;100.0 +25/10/2020 02:06:47;U879.TC120F_OP.F_CV;2.818749428;100.0 +25/10/2020 02:06:51;U879.TC120F_OP.F_CV;3.195757866;100.0 +25/10/2020 02:06:53;U879.TC120F_OP.F_CV;3.943774939;100.0 +25/10/2020 02:06:55;U879.TC120F_OP.F_CV;5.105301857;100.0 +25/10/2020 02:06:56;U879.TC120F_OP.F_CV;3.987275839;100.0 +25/10/2020 02:06:59;U879.TC120F_OP.F_CV;1.670278311;100.0 +25/10/2020 02:06:05;U879.TC120F_PV.F_CV;49.849998474;100.0 +25/10/2020 02:06:06;U879.TC120F_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:07;U879.TC120F_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:18;U879.TC120F_PV.F_CV;49.849998474;100.0 +25/10/2020 02:06:24;U879.TC120F_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:27;U879.TC120F_PV.F_CV;49.849998474;100.0 +25/10/2020 02:06:35;U879.TC120F_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:43;U879.TC120F_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:59;U879.TC120F_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:42;U879.TC120F_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:00;U879.TC121A_OP.F_CV;13.173989296;100.0 +25/10/2020 02:06:01;U879.TC121A_OP.F_CV;7.496610641;100.0 +25/10/2020 02:06:02;U879.TC121A_OP.F_CV;13.898649216;100.0 +25/10/2020 02:06:04;U879.TC121A_OP.F_CV;11.661599159;100.0 +25/10/2020 02:06:08;U879.TC121A_OP.F_CV;8.629529953;100.0 +25/10/2020 02:06:10;U879.TC121A_OP.F_CV;13.911649704;100.0 +25/10/2020 02:06:11;U879.TC121A_OP.F_CV;14.715523720;100.0 +25/10/2020 02:06:13;U879.TC121A_OP.F_CV;9.439654350;100.0 +25/10/2020 02:06:14;U879.TC121A_OP.F_CV;14.723522186;100.0 +25/10/2020 02:06:18;U879.TC121A_OP.F_CV;12.093587875;100.0 +25/10/2020 02:06:19;U879.TC121A_OP.F_CV;9.455653191;100.0 +25/10/2020 02:06:20;U879.TC121A_OP.F_CV;10.177917480;100.0 +25/10/2020 02:06:23;U879.TC121A_OP.F_CV;13.223986626;100.0 +25/10/2020 02:06:25;U879.TC121A_OP.F_CV;12.108067513;100.0 +25/10/2020 02:06:26;U879.TC121A_OP.F_CV;10.591676712;100.0 +25/10/2020 02:06:28;U879.TC121A_OP.F_CV;11.714596748;100.0 +25/10/2020 02:06:30;U879.TC121A_OP.F_CV;12.479290962;100.0 +25/10/2020 02:06:31;U879.TC121A_OP.F_CV;13.240985870;100.0 +25/10/2020 02:06:32;U879.TC121A_OP.F_CV;13.645603180;100.0 +25/10/2020 02:06:34;U879.TC121A_OP.F_CV;7.968973160;100.0 +25/10/2020 02:06:35;U879.TC121A_OP.F_CV;15.892653465;100.0 +25/10/2020 02:06:37;U879.TC121A_OP.F_CV;9.496652603;100.0 +25/10/2020 02:06:38;U879.TC121A_OP.F_CV;10.218915939;100.0 +25/10/2020 02:06:40;U879.TC121A_OP.F_CV;15.902653694;100.0 +25/10/2020 02:06:41;U879.TC121A_OP.F_CV;6.465582848;100.0 +25/10/2020 02:06:43;U879.TC121A_OP.F_CV;12.466968536;100.0 +25/10/2020 02:06:44;U879.TC121A_OP.F_CV;11.349048615;100.0 +25/10/2020 02:06:46;U879.TC121A_OP.F_CV;14.392118454;100.0 +25/10/2020 02:06:47;U879.TC121A_OP.F_CV;12.156067848;100.0 +25/10/2020 02:06:49;U879.TC121A_OP.F_CV;9.118998528;100.0 +25/10/2020 02:06:50;U879.TC121A_OP.F_CV;15.922653198;100.0 +25/10/2020 02:06:52;U879.TC121A_OP.F_CV;9.526652336;100.0 +25/10/2020 02:06:53;U879.TC121A_OP.F_CV;8.728527069;100.0 +25/10/2020 02:06:55;U879.TC121A_OP.F_CV;15.531037331;100.0 +25/10/2020 02:06:56;U879.TC121A_OP.F_CV;9.133997917;100.0 +25/10/2020 02:06:58;U879.TC121A_OP.F_CV;12.896728516;100.0 +25/10/2020 02:06:59;U879.TC121A_OP.F_CV;11.779595375;100.0 +25/10/2020 02:06:00;U879.TC121A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:01;U879.TC121A_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:08;U879.TC121A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:09;U879.TC121A_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:14;U879.TC121A_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:15;U879.TC121A_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:17;U879.TC121A_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:18;U879.TC121A_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:31;U879.TC121A_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:33;U879.TC121A_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:34;U879.TC121A_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:36;U879.TC121A_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:39;U879.TC121A_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:41;U879.TC121A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:45;U879.TC121A_PV.F_CV;69.574996948;100.0 +25/10/2020 02:06:48;U879.TC121A_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:49;U879.TC121A_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:52;U879.TC121A_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:54;U879.TC121A_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:56;U879.TC121A_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:23;U879.TC121A_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC121B_OP.F_CV;5.347545624;100.0 +25/10/2020 02:06:01;U879.TC121B_OP.F_CV;6.867079735;100.0 +25/10/2020 02:06:02;U879.TC121B_OP.F_CV;5.747054100;100.0 +25/10/2020 02:06:05;U879.TC121B_OP.F_CV;4.226519585;100.0 +25/10/2020 02:06:07;U879.TC121B_OP.F_CV;5.345544815;100.0 +25/10/2020 02:06:08;U879.TC121B_OP.F_CV;6.865079880;100.0 +25/10/2020 02:06:10;U879.TC121B_OP.F_CV;5.745054245;100.0 +25/10/2020 02:06:14;U879.TC121B_OP.F_CV;4.224519253;100.0 +25/10/2020 02:06:17;U879.TC121B_OP.F_CV;5.744053841;100.0 +25/10/2020 02:06:23;U879.TC121B_OP.F_CV;6.863079071;100.0 +25/10/2020 02:06:25;U879.TC121B_OP.F_CV;5.743053436;100.0 +25/10/2020 02:06:34;U879.TC121B_OP.F_CV;4.222518444;100.0 +25/10/2020 02:06:35;U879.TC121B_OP.F_CV;6.862078667;100.0 +25/10/2020 02:06:37;U879.TC121B_OP.F_CV;4.221518040;100.0 +25/10/2020 02:06:38;U879.TC121B_OP.F_CV;6.861078262;100.0 +25/10/2020 02:06:40;U879.TC121B_OP.F_CV;5.741052628;100.0 +25/10/2020 02:06:44;U879.TC121B_OP.F_CV;4.220517635;100.0 +25/10/2020 02:06:46;U879.TC121B_OP.F_CV;6.860077858;100.0 +25/10/2020 02:06:47;U879.TC121B_OP.F_CV;4.219517231;100.0 +25/10/2020 02:06:49;U879.TC121B_OP.F_CV;6.859076977;100.0 +25/10/2020 02:06:50;U879.TC121B_OP.F_CV;4.218516827;100.0 +25/10/2020 02:06:53;U879.TC121B_OP.F_CV;5.738050938;100.0 +25/10/2020 02:06:55;U879.TC121B_OP.F_CV;4.217516422;100.0 +25/10/2020 02:06:56;U879.TC121B_OP.F_CV;6.857076168;100.0 +25/10/2020 02:06:58;U879.TC121B_OP.F_CV;2.696126461;100.0 +25/10/2020 02:06:59;U879.TC121B_OP.F_CV;7.974995613;100.0 +25/10/2020 02:06:08;U879.TC121B_PV.F_CV;70.033332825;100.0 +25/10/2020 02:06:46;U879.TC121B_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:57;U879.TC121B_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:58;U879.TC121B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:04;U879.TC121B_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U879.TC121C_OP.F_CV;6.953583717;100.0 +25/10/2020 02:06:02;U879.TC121C_OP.F_CV;5.435194016;100.0 +25/10/2020 02:06:04;U879.TC121C_OP.F_CV;6.556112289;100.0 +25/10/2020 02:06:05;U879.TC121C_OP.F_CV;8.077503204;100.0 +25/10/2020 02:06:07;U879.TC121C_OP.F_CV;5.439194679;100.0 +25/10/2020 02:06:08;U879.TC121C_OP.F_CV;6.560113430;100.0 +25/10/2020 02:06:12;U879.TC121C_OP.F_CV;7.322807789;100.0 +25/10/2020 02:06:13;U879.TC121C_OP.F_CV;8.083502769;100.0 +25/10/2020 02:06:14;U879.TC121C_OP.F_CV;6.965584755;100.0 +25/10/2020 02:06:17;U879.TC121C_OP.F_CV;6.568113804;100.0 +25/10/2020 02:06:20;U879.TC121C_OP.F_CV;5.049579144;100.0 +25/10/2020 02:06:23;U879.TC121C_OP.F_CV;6.571113586;100.0 +25/10/2020 02:06:26;U879.TC121C_OP.F_CV;3.933660746;100.0 +25/10/2020 02:06:28;U879.TC121C_OP.F_CV;6.173605442;100.0 +25/10/2020 02:06:35;U879.TC121C_OP.F_CV;7.694140434;100.0 +25/10/2020 02:06:37;U879.TC121C_OP.F_CV;6.575114727;100.0 +25/10/2020 02:06:39;U879.TC121C_OP.F_CV;5.816347122;100.0 +25/10/2020 02:06:40;U879.TC121C_OP.F_CV;5.056580067;100.0 +25/10/2020 02:06:41;U879.TC121C_OP.F_CV;6.176605701;100.0 +25/10/2020 02:06:46;U879.TC121C_OP.F_CV;7.697140217;100.0 +25/10/2020 02:06:47;U879.TC121C_OP.F_CV;5.057580471;100.0 +25/10/2020 02:06:49;U879.TC121C_OP.F_CV;6.177606106;100.0 +25/10/2020 02:06:50;U879.TC121C_OP.F_CV;7.698140621;100.0 +25/10/2020 02:06:53;U879.TC121C_OP.F_CV;6.178606510;100.0 +25/10/2020 02:06:02;U879.TC121C_PV.F_CV;69.933334351;100.0 +25/10/2020 02:06:05;U879.TC121C_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:17;U879.TC121C_PV.F_CV;69.949996948;100.0 +25/10/2020 02:06:24;U879.TC121C_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:25;U879.TC121C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC121C_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC121D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U879.TC121D_PV.F_CV;24.950000763;100.0 +25/10/2020 02:06:11;U879.TC121D_PV.F_CV;24.799999237;100.0 +25/10/2020 02:06:12;U879.TC121D_PV.F_CV;25.000000000;100.0 +25/10/2020 02:06:13;U879.TC121D_PV.F_CV;24.799999237;100.0 +25/10/2020 02:06:15;U879.TC121D_PV.F_CV;25.000000000;100.0 +25/10/2020 02:06:23;U879.TC121D_PV.F_CV;24.799999237;100.0 +25/10/2020 02:06:35;U879.TC121D_PV.F_CV;25.000000000;100.0 +25/10/2020 02:06:45;U879.TC121D_PV.F_CV;24.799999237;100.0 +25/10/2020 02:06:53;U879.TC121D_PV.F_CV;25.100000381;100.0 +25/10/2020 02:06:54;U879.TC121D_PV.F_CV;24.899999619;100.0 +25/10/2020 02:06:23;U879.TC121D_SP.F_CV;30.000000000;100.0 +25/10/2020 02:06:01;U879.TC121E_OP.F_CV;3.933620930;100.0 +25/10/2020 02:06:07;U879.TC121E_OP.F_CV;3.933620930;100.0 +25/10/2020 02:06:08;U879.TC121E_OP.F_CV;2.408086538;100.0 +25/10/2020 02:06:10;U879.TC121E_OP.F_CV;5.046647072;100.0 +25/10/2020 02:06:11;U879.TC121E_OP.F_CV;3.925621510;100.0 +25/10/2020 02:06:14;U879.TC121E_OP.F_CV;2.403086901;100.0 +25/10/2020 02:06:16;U879.TC121E_OP.F_CV;5.041647434;100.0 +25/10/2020 02:06:17;U879.TC121E_OP.F_CV;3.920621872;100.0 +25/10/2020 02:06:21;U879.TC121E_OP.F_CV;3.157854557;100.0 +25/10/2020 02:06:22;U879.TC121E_OP.F_CV;2.397087336;100.0 +25/10/2020 02:06:23;U879.TC121E_OP.F_CV;5.035647869;100.0 +25/10/2020 02:06:26;U879.TC121E_OP.F_CV;5.434084415;100.0 +25/10/2020 02:06:28;U879.TC121E_OP.F_CV;2.793649435;100.0 +25/10/2020 02:06:29;U879.TC121E_OP.F_CV;3.912621975;100.0 +25/10/2020 02:06:55;U879.TC121E_OP.F_CV;3.912621975;100.0 +25/10/2020 02:06:56;U879.TC121E_OP.F_CV;8.456083298;100.0 +25/10/2020 02:06:58;U879.TC121E_OP.F_CV;0.536653936;100.0 +25/10/2020 02:06:59;U879.TC121E_OP.F_CV;3.895623922;100.0 +25/10/2020 02:06:45;U879.TC121E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:52;U879.TC121E_PV.F_CV;49.899997711;100.0 +25/10/2020 02:06:57;U879.TC121E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:23;U879.TC121E_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:00;U879.TC121F_OP.F_CV;1.666909575;100.0 +25/10/2020 02:06:01;U879.TC121F_OP.F_CV;3.952352762;100.0 +25/10/2020 02:06:03;U879.TC121F_OP.F_CV;3.442394733;100.0 +25/10/2020 02:06:04;U879.TC121F_OP.F_CV;2.885881901;100.0 +25/10/2020 02:06:05;U879.TC121F_OP.F_CV;0.571884155;100.0 +25/10/2020 02:06:07;U879.TC121F_OP.F_CV;5.137879372;100.0 +25/10/2020 02:06:08;U879.TC121F_OP.F_CV;2.904881716;100.0 +25/10/2020 02:06:11;U879.TC121F_OP.F_CV;4.079353333;100.0 +25/10/2020 02:06:13;U879.TC121F_OP.F_CV;1.806910038;100.0 +25/10/2020 02:06:14;U879.TC121F_OP.F_CV;4.094353676;100.0 +25/10/2020 02:06:16;U879.TC121F_OP.F_CV;2.982381105;100.0 +25/10/2020 02:06:17;U879.TC121F_OP.F_CV;4.150907993;100.0 +25/10/2020 02:06:19;U879.TC121F_OP.F_CV;3.039882183;100.0 +25/10/2020 02:06:21;U879.TC121F_OP.F_CV;2.473118782;100.0 +25/10/2020 02:06:22;U879.TC121F_OP.F_CV;1.897355795;100.0 +25/10/2020 02:06:23;U879.TC121F_OP.F_CV;5.346379280;100.0 +25/10/2020 02:06:25;U879.TC121F_OP.F_CV;1.955910087;100.0 +25/10/2020 02:06:26;U879.TC121F_OP.F_CV;3.084882498;100.0 +25/10/2020 02:06:28;U879.TC121F_OP.F_CV;4.254353523;100.0 +25/10/2020 02:06:29;U879.TC121F_OP.F_CV;3.144381285;100.0 +25/10/2020 02:06:33;U879.TC121F_OP.F_CV;3.707618237;100.0 +25/10/2020 02:06:34;U879.TC121F_OP.F_CV;4.292353630;100.0 +25/10/2020 02:06:35;U879.TC121F_OP.F_CV;3.182381630;100.0 +25/10/2020 02:06:38;U879.TC121F_OP.F_CV;0.964383602;100.0 +25/10/2020 02:06:40;U879.TC121F_OP.F_CV;4.374907970;100.0 +25/10/2020 02:06:41;U879.TC121F_OP.F_CV;4.426353455;100.0 +25/10/2020 02:06:43;U879.TC121F_OP.F_CV;2.157909870;100.0 +25/10/2020 02:06:44;U879.TC121F_OP.F_CV;3.288882017;100.0 +25/10/2020 02:06:48;U879.TC121F_OP.F_CV;3.705039024;100.0 +25/10/2020 02:06:50;U879.TC121F_OP.F_CV;4.493352890;100.0 +25/10/2020 02:06:53;U879.TC121F_OP.F_CV;2.278354645;100.0 +25/10/2020 02:06:55;U879.TC121F_OP.F_CV;4.570906639;100.0 +25/10/2020 02:06:56;U879.TC121F_OP.F_CV;3.463880777;100.0 +25/10/2020 02:06:58;U879.TC121F_OP.F_CV;4.637351990;100.0 +25/10/2020 02:06:59;U879.TC121F_OP.F_CV;1.210381985;100.0 +25/10/2020 02:06:01;U879.TC121F_PV.F_CV;49.349998474;100.0 +25/10/2020 02:06:05;U879.TC121F_PV.F_CV;49.500000000;100.0 +25/10/2020 02:06:06;U879.TC121F_PV.F_CV;49.299999237;100.0 +25/10/2020 02:06:27;U879.TC121F_PV.F_CV;48.950000763;100.0 +25/10/2020 02:06:30;U879.TC121F_PV.F_CV;49.099998474;100.0 +25/10/2020 02:06:36;U879.TC121F_PV.F_CV;48.799999237;100.0 +25/10/2020 02:06:38;U879.TC121F_PV.F_CV;49.000000000;100.0 +25/10/2020 02:06:57;U879.TC121F_PV.F_CV;48.599998474;100.0 +25/10/2020 02:06:58;U879.TC121F_PV.F_CV;48.799999237;100.0 +25/10/2020 02:06:05;U879.TC121F_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:00;U879.TC122A_OP.F_CV;7.432838440;100.0 +25/10/2020 02:06:01;U879.TC122A_OP.F_CV;4.795026779;100.0 +25/10/2020 02:06:02;U879.TC122A_OP.F_CV;7.437838554;100.0 +25/10/2020 02:06:04;U879.TC122A_OP.F_CV;4.800026894;100.0 +25/10/2020 02:06:05;U879.TC122A_OP.F_CV;8.963228226;100.0 +25/10/2020 02:06:07;U879.TC122A_OP.F_CV;5.206787109;100.0 +25/10/2020 02:06:08;U879.TC122A_OP.F_CV;4.809026241;100.0 +25/10/2020 02:06:10;U879.TC122A_OP.F_CV;5.931158543;100.0 +25/10/2020 02:06:14;U879.TC122A_OP.F_CV;5.931158543;100.0 +25/10/2020 02:06:17;U879.TC122A_OP.F_CV;8.580756187;100.0 +25/10/2020 02:06:19;U879.TC122A_OP.F_CV;3.302636147;100.0 +25/10/2020 02:06:20;U879.TC122A_OP.F_CV;4.023152351;100.0 +25/10/2020 02:06:23;U879.TC122A_OP.F_CV;6.663712502;100.0 +25/10/2020 02:06:25;U879.TC122A_OP.F_CV;5.544687271;100.0 +25/10/2020 02:06:26;U879.TC122A_OP.F_CV;7.066077232;100.0 +25/10/2020 02:06:28;U879.TC122A_OP.F_CV;2.907233477;100.0 +25/10/2020 02:06:29;U879.TC122A_OP.F_CV;5.147178173;100.0 +25/10/2020 02:06:31;U879.TC122A_OP.F_CV;8.188102722;100.0 +25/10/2020 02:06:32;U879.TC122A_OP.F_CV;4.429768562;100.0 +25/10/2020 02:06:34;U879.TC122A_OP.F_CV;5.550687313;100.0 +25/10/2020 02:06:38;U879.TC122A_OP.F_CV;4.033152580;100.0 +25/10/2020 02:06:40;U879.TC122A_OP.F_CV;5.153178215;100.0 +25/10/2020 02:06:41;U879.TC122A_OP.F_CV;6.673713207;100.0 +25/10/2020 02:06:43;U879.TC122A_OP.F_CV;5.554687500;100.0 +25/10/2020 02:06:45;U879.TC122A_OP.F_CV;4.795919895;100.0 +25/10/2020 02:06:46;U879.TC122A_OP.F_CV;4.036152840;100.0 +25/10/2020 02:06:47;U879.TC122A_OP.F_CV;6.676712990;100.0 +25/10/2020 02:06:49;U879.TC122A_OP.F_CV;5.557687759;100.0 +25/10/2020 02:06:50;U879.TC122A_OP.F_CV;4.038153172;100.0 +25/10/2020 02:06:52;U879.TC122A_OP.F_CV;6.678713799;100.0 +25/10/2020 02:06:53;U879.TC122A_OP.F_CV;5.559688091;100.0 +25/10/2020 02:06:55;U879.TC122A_OP.F_CV;4.040153503;100.0 +25/10/2020 02:06:56;U879.TC122A_OP.F_CV;5.160179138;100.0 +25/10/2020 02:06:01;U879.TC122A_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:03;U879.TC122A_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:05;U879.TC122A_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:07;U879.TC122A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:17;U879.TC122A_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:18;U879.TC122A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:23;U879.TC122A_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC122B_OP.F_CV;4.712398529;100.0 +25/10/2020 02:06:01;U879.TC122B_OP.F_CV;6.230787754;100.0 +25/10/2020 02:06:02;U879.TC122B_OP.F_CV;5.109869480;100.0 +25/10/2020 02:06:04;U879.TC122B_OP.F_CV;3.588479519;100.0 +25/10/2020 02:06:05;U879.TC122B_OP.F_CV;7.747323036;100.0 +25/10/2020 02:06:07;U879.TC122B_OP.F_CV;2.466454029;100.0 +25/10/2020 02:06:08;U879.TC122B_OP.F_CV;4.704398155;100.0 +25/10/2020 02:06:10;U879.TC122B_OP.F_CV;3.181718588;100.0 +25/10/2020 02:06:11;U879.TC122B_OP.F_CV;5.819530964;100.0 +25/10/2020 02:06:13;U879.TC122B_OP.F_CV;4.697398663;100.0 +25/10/2020 02:06:16;U879.TC122B_OP.F_CV;4.960379601;100.0 +25/10/2020 02:06:17;U879.TC122B_OP.F_CV;5.092869759;100.0 +25/10/2020 02:06:19;U879.TC122B_OP.F_CV;3.571479797;100.0 +25/10/2020 02:06:20;U879.TC122B_OP.F_CV;3.168718815;100.0 +25/10/2020 02:06:23;U879.TC122B_OP.F_CV;4.684398651;100.0 +25/10/2020 02:06:26;U879.TC122B_OP.F_CV;5.799530983;100.0 +25/10/2020 02:06:28;U879.TC122B_OP.F_CV;3.156718731;100.0 +25/10/2020 02:06:29;U879.TC122B_OP.F_CV;4.273851395;100.0 +25/10/2020 02:06:31;U879.TC122B_OP.F_CV;2.750461340;100.0 +25/10/2020 02:06:32;U879.TC122B_OP.F_CV;6.907449722;100.0 +25/10/2020 02:06:34;U879.TC122B_OP.F_CV;4.665398598;100.0 +25/10/2020 02:06:38;U879.TC122B_OP.F_CV;3.138719082;100.0 +25/10/2020 02:06:40;U879.TC122B_OP.F_CV;2.735461712;100.0 +25/10/2020 02:06:41;U879.TC122B_OP.F_CV;5.371770382;100.0 +25/10/2020 02:06:43;U879.TC122B_OP.F_CV;5.769531250;100.0 +25/10/2020 02:06:44;U879.TC122B_OP.F_CV;3.126718998;100.0 +25/10/2020 02:06:46;U879.TC122B_OP.F_CV;5.764531136;100.0 +25/10/2020 02:06:47;U879.TC122B_OP.F_CV;3.121718645;100.0 +25/10/2020 02:06:49;U879.TC122B_OP.F_CV;1.197926760;100.0 +25/10/2020 02:06:50;U879.TC122B_OP.F_CV;6.473795414;100.0 +25/10/2020 02:06:53;U879.TC122B_OP.F_CV;5.748530865;100.0 +25/10/2020 02:06:55;U879.TC122B_OP.F_CV;3.105718613;100.0 +25/10/2020 02:06:56;U879.TC122B_OP.F_CV;5.743530750;100.0 +25/10/2020 02:06:58;U879.TC122B_OP.F_CV;4.621398449;100.0 +25/10/2020 02:06:05;U879.TC122B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:10;U879.TC122B_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:11;U879.TC122B_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:28;U879.TC122B_PV.F_CV;70.333335876;100.0 +25/10/2020 02:06:31;U879.TC122B_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:33;U879.TC122B_PV.F_CV;70.333335876;100.0 +25/10/2020 02:06:35;U879.TC122B_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:37;U879.TC122B_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:40;U879.TC122B_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:48;U879.TC122B_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:50;U879.TC122B_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:23;U879.TC122B_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U879.TC122C_OP.F_CV;9.566473007;100.0 +25/10/2020 02:06:02;U879.TC122C_OP.F_CV;4.685112953;100.0 +25/10/2020 02:06:04;U879.TC122C_OP.F_CV;5.803031921;100.0 +25/10/2020 02:06:05;U879.TC122C_OP.F_CV;4.280352116;100.0 +25/10/2020 02:06:07;U879.TC122C_OP.F_CV;5.397483826;100.0 +25/10/2020 02:06:08;U879.TC122C_OP.F_CV;6.915163994;100.0 +25/10/2020 02:06:10;U879.TC122C_OP.F_CV;5.793031693;100.0 +25/10/2020 02:06:11;U879.TC122C_OP.F_CV;4.270351887;100.0 +25/10/2020 02:06:13;U879.TC122C_OP.F_CV;5.387484074;100.0 +25/10/2020 02:06:14;U879.TC122C_OP.F_CV;6.905163288;100.0 +25/10/2020 02:06:18;U879.TC122C_OP.F_CV;6.339097500;100.0 +25/10/2020 02:06:19;U879.TC122C_OP.F_CV;5.778031349;100.0 +25/10/2020 02:06:20;U879.TC122C_OP.F_CV;4.255351543;100.0 +25/10/2020 02:06:23;U879.TC122C_OP.F_CV;5.771031380;100.0 +25/10/2020 02:06:26;U879.TC122C_OP.F_CV;6.168501854;100.0 +25/10/2020 02:06:28;U879.TC122C_OP.F_CV;3.126432657;100.0 +25/10/2020 02:06:29;U879.TC122C_OP.F_CV;6.884163857;100.0 +25/10/2020 02:06:31;U879.TC122C_OP.F_CV;5.762031078;100.0 +25/10/2020 02:06:32;U879.TC122C_OP.F_CV;7.280420780;100.0 +25/10/2020 02:06:34;U879.TC122C_OP.F_CV;4.639112473;100.0 +25/10/2020 02:06:35;U879.TC122C_OP.F_CV;7.277420998;100.0 +25/10/2020 02:06:37;U879.TC122C_OP.F_CV;6.156501770;100.0 +25/10/2020 02:06:38;U879.TC122C_OP.F_CV;4.635112286;100.0 +25/10/2020 02:06:40;U879.TC122C_OP.F_CV;8.793955803;100.0 +25/10/2020 02:06:41;U879.TC122C_OP.F_CV;6.554010868;100.0 +25/10/2020 02:06:47;U879.TC122C_OP.F_CV;5.033476353;100.0 +25/10/2020 02:06:49;U879.TC122C_OP.F_CV;7.673036098;100.0 +25/10/2020 02:06:50;U879.TC122C_OP.F_CV;6.553010941;100.0 +25/10/2020 02:06:53;U879.TC122C_OP.F_CV;7.672036171;100.0 +25/10/2020 02:06:56;U879.TC122C_OP.F_CV;6.045165539;100.0 +25/10/2020 02:06:58;U879.TC122C_OP.F_CV;5.031475544;100.0 +25/10/2020 02:06:59;U879.TC122C_OP.F_CV;7.671035767;100.0 +25/10/2020 02:06:00;U879.TC122C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:05;U879.TC122C_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:40;U879.TC122C_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U879.TC122D_OP.F_CV;6.268994808;100.0 +25/10/2020 02:06:02;U879.TC122D_OP.F_CV;8.911807060;100.0 +25/10/2020 02:06:04;U879.TC122D_OP.F_CV;6.273993969;100.0 +25/10/2020 02:06:05;U879.TC122D_OP.F_CV;7.396126747;100.0 +25/10/2020 02:06:08;U879.TC122D_OP.F_CV;8.920806885;100.0 +25/10/2020 02:06:10;U879.TC122D_OP.F_CV;6.282994270;100.0 +25/10/2020 02:06:11;U879.TC122D_OP.F_CV;7.405126095;100.0 +25/10/2020 02:06:14;U879.TC122D_OP.F_CV;8.929805756;100.0 +25/10/2020 02:06:16;U879.TC122D_OP.F_CV;6.291993141;100.0 +25/10/2020 02:06:17;U879.TC122D_OP.F_CV;8.934804916;100.0 +25/10/2020 02:06:19;U879.TC122D_OP.F_CV;6.296991825;100.0 +25/10/2020 02:06:20;U879.TC122D_OP.F_CV;4.378200054;100.0 +25/10/2020 02:06:23;U879.TC122D_OP.F_CV;8.941803932;100.0 +25/10/2020 02:06:26;U879.TC122D_OP.F_CV;4.385199070;100.0 +25/10/2020 02:06:28;U879.TC122D_OP.F_CV;9.666068077;100.0 +25/10/2020 02:06:29;U879.TC122D_OP.F_CV;8.948802948;100.0 +25/10/2020 02:06:33;U879.TC122D_OP.F_CV;7.634895325;100.0 +25/10/2020 02:06:34;U879.TC122D_OP.F_CV;6.315989017;100.0 +25/10/2020 02:06:35;U879.TC122D_OP.F_CV;8.958801270;100.0 +25/10/2020 02:06:39;U879.TC122D_OP.F_CV;7.644893646;100.0 +25/10/2020 02:06:40;U879.TC122D_OP.F_CV;6.325987339;100.0 +25/10/2020 02:06:41;U879.TC122D_OP.F_CV;8.968799591;100.0 +25/10/2020 02:06:43;U879.TC122D_OP.F_CV;6.330986977;100.0 +25/10/2020 02:06:44;U879.TC122D_OP.F_CV;7.453119278;100.0 +25/10/2020 02:06:46;U879.TC122D_OP.F_CV;4.414194584;100.0 +25/10/2020 02:06:47;U879.TC122D_OP.F_CV;9.695063591;100.0 +25/10/2020 02:06:49;U879.TC122D_OP.F_CV;7.457118988;100.0 +25/10/2020 02:06:50;U879.TC122D_OP.F_CV;4.418194294;100.0 +25/10/2020 02:06:53;U879.TC122D_OP.F_CV;7.461118698;100.0 +25/10/2020 02:06:19;U879.TC122D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:22;U879.TC122D_PV.F_CV;69.750000000;100.0 +25/10/2020 02:06:25;U879.TC122D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:27;U879.TC122D_PV.F_CV;69.799995422;100.0 +25/10/2020 02:06:34;U879.TC122D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:36;U879.TC122D_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:40;U879.TC122D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:41;U879.TC122D_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:45;U879.TC122D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:46;U879.TC122D_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:49;U879.TC122D_PV.F_CV;69.949996948;100.0 +25/10/2020 02:06:51;U879.TC122D_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:23;U879.TC122D_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U879.TC122E_OP.F_CV;10.395461082;100.0 +25/10/2020 02:06:02;U879.TC122E_OP.F_CV;6.233473301;100.0 +25/10/2020 02:06:04;U879.TC122E_OP.F_CV;9.991205215;100.0 +25/10/2020 02:06:05;U879.TC122E_OP.F_CV;8.869072914;100.0 +25/10/2020 02:06:08;U879.TC122E_OP.F_CV;11.905997276;100.0 +25/10/2020 02:06:10;U879.TC122E_OP.F_CV;6.625127316;100.0 +25/10/2020 02:06:11;U879.TC122E_OP.F_CV;10.383461952;100.0 +25/10/2020 02:06:13;U879.TC122E_OP.F_CV;9.262542725;100.0 +25/10/2020 02:06:14;U879.TC122E_OP.F_CV;12.302592278;100.0 +25/10/2020 02:06:16;U879.TC122E_OP.F_CV;7.022598267;100.0 +25/10/2020 02:06:17;U879.TC122E_OP.F_CV;9.261596680;100.0 +25/10/2020 02:06:19;U879.TC122E_OP.F_CV;10.781131744;100.0 +25/10/2020 02:06:20;U879.TC122E_OP.F_CV;9.661106110;100.0 +25/10/2020 02:06:22;U879.TC122E_OP.F_CV;8.140570641;100.0 +25/10/2020 02:06:23;U879.TC122E_OP.F_CV;9.259596825;100.0 +25/10/2020 02:06:26;U879.TC122E_OP.F_CV;8.138571739;100.0 +25/10/2020 02:06:28;U879.TC122E_OP.F_CV;7.737207413;100.0 +25/10/2020 02:06:29;U879.TC122E_OP.F_CV;10.375515938;100.0 +25/10/2020 02:06:32;U879.TC122E_OP.F_CV;9.253596306;100.0 +25/10/2020 02:06:34;U879.TC122E_OP.F_CV;7.732206345;100.0 +25/10/2020 02:06:35;U879.TC122E_OP.F_CV;10.370514870;100.0 +25/10/2020 02:06:37;U879.TC122E_OP.F_CV;7.729205608;100.0 +25/10/2020 02:06:38;U879.TC122E_OP.F_CV;11.888049126;100.0 +25/10/2020 02:06:40;U879.TC122E_OP.F_CV;8.127570152;100.0 +25/10/2020 02:06:41;U879.TC122E_OP.F_CV;9.246595383;100.0 +25/10/2020 02:06:43;U879.TC122E_OP.F_CV;6.204525471;100.0 +25/10/2020 02:06:44;U879.TC122E_OP.F_CV;14.523695946;100.0 +25/10/2020 02:06:46;U879.TC122E_OP.F_CV;7.003650188;100.0 +25/10/2020 02:06:47;U879.TC122E_OP.F_CV;9.242649078;100.0 +25/10/2020 02:06:50;U879.TC122E_OP.F_CV;12.281699181;100.0 +25/10/2020 02:06:53;U879.TC122E_OP.F_CV;7.720311642;100.0 +25/10/2020 02:06:55;U879.TC122E_OP.F_CV;11.879155159;100.0 +25/10/2020 02:06:56;U879.TC122E_OP.F_CV;8.118676186;100.0 +25/10/2020 02:06:58;U879.TC122E_OP.F_CV;9.237701416;100.0 +25/10/2020 02:06:02;U879.TC122E_PV.F_CV;80.300003052;100.0 +25/10/2020 02:06:04;U879.TC122E_PV.F_CV;80.000000000;100.0 +25/10/2020 02:06:05;U879.TC122E_PV.F_CV;80.199996948;100.0 +25/10/2020 02:06:07;U879.TC122E_PV.F_CV;80.000000000;100.0 +25/10/2020 02:06:09;U879.TC122E_PV.F_CV;80.199996948;100.0 +25/10/2020 02:06:14;U879.TC122E_PV.F_CV;79.900001526;100.0 +25/10/2020 02:06:15;U879.TC122E_PV.F_CV;80.099998474;100.0 +25/10/2020 02:06:41;U879.TC122E_PV.F_CV;80.233337402;100.0 +25/10/2020 02:06:44;U879.TC122E_PV.F_CV;79.900001526;100.0 +25/10/2020 02:06:45;U879.TC122E_PV.F_CV;80.099998474;100.0 +25/10/2020 02:06:50;U879.TC122E_PV.F_CV;79.900001526;100.0 +25/10/2020 02:06:51;U879.TC122E_PV.F_CV;80.099998474;100.0 +25/10/2020 02:06:55;U879.TC122E_PV.F_CV;79.900001526;100.0 +25/10/2020 02:06:56;U879.TC122E_PV.F_CV;80.099998474;100.0 +25/10/2020 02:06:23;U879.TC122E_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:00;U879.TC122F_OP.F_CV;6.325326920;100.0 +25/10/2020 02:06:01;U879.TC122F_OP.F_CV;10.487315178;100.0 +25/10/2020 02:06:02;U879.TC122F_OP.F_CV;8.250264168;100.0 +25/10/2020 02:06:04;U879.TC122F_OP.F_CV;6.732584000;100.0 +25/10/2020 02:06:05;U879.TC122F_OP.F_CV;7.854716778;100.0 +25/10/2020 02:06:07;U879.TC122F_OP.F_CV;9.377396584;100.0 +25/10/2020 02:06:08;U879.TC122F_OP.F_CV;6.739583492;100.0 +25/10/2020 02:06:10;U879.TC122F_OP.F_CV;6.341326714;100.0 +25/10/2020 02:06:11;U879.TC122F_OP.F_CV;7.462245464;100.0 +25/10/2020 02:06:13;U879.TC122F_OP.F_CV;8.983634949;100.0 +25/10/2020 02:06:14;U879.TC122F_OP.F_CV;7.865715981;100.0 +25/10/2020 02:06:16;U879.TC122F_OP.F_CV;4.826791286;100.0 +25/10/2020 02:06:17;U879.TC122F_OP.F_CV;10.107660294;100.0 +25/10/2020 02:06:19;U879.TC122F_OP.F_CV;9.390394211;100.0 +25/10/2020 02:06:20;U879.TC122F_OP.F_CV;5.232192993;100.0 +25/10/2020 02:06:22;U879.TC122F_OP.F_CV;8.993634224;100.0 +25/10/2020 02:06:23;U879.TC122F_OP.F_CV;7.875715256;100.0 +25/10/2020 02:06:25;U879.TC122F_OP.F_CV;9.398394585;100.0 +25/10/2020 02:06:26;U879.TC122F_OP.F_CV;5.240191936;100.0 +25/10/2020 02:06:28;U879.TC122F_OP.F_CV;10.522313118;100.0 +25/10/2020 02:06:29;U879.TC122F_OP.F_CV;8.285262108;100.0 +25/10/2020 02:06:32;U879.TC122F_OP.F_CV;8.607269287;100.0 +25/10/2020 02:06:34;U879.TC122F_OP.F_CV;9.008633614;100.0 +25/10/2020 02:06:35;U879.TC122F_OP.F_CV;6.370325089;100.0 +25/10/2020 02:06:38;U879.TC122F_OP.F_CV;7.492243290;100.0 +25/10/2020 02:06:41;U879.TC122F_OP.F_CV;9.014633179;100.0 +25/10/2020 02:06:43;U879.TC122F_OP.F_CV;6.376324177;100.0 +25/10/2020 02:06:44;U879.TC122F_OP.F_CV;5.976708889;100.0 +25/10/2020 02:06:46;U879.TC122F_OP.F_CV;10.137659073;100.0 +25/10/2020 02:06:47;U879.TC122F_OP.F_CV;7.899713993;100.0 +25/10/2020 02:06:50;U879.TC122F_OP.F_CV;9.022633553;100.0 +25/10/2020 02:06:53;U879.TC122F_OP.F_CV;7.505243301;100.0 +25/10/2020 02:06:55;U879.TC122F_OP.F_CV;10.547312737;100.0 +25/10/2020 02:06:56;U879.TC122F_OP.F_CV;5.269191742;100.0 +25/10/2020 02:06:58;U879.TC122F_OP.F_CV;9.030632973;100.0 +25/10/2020 02:06:59;U879.TC122F_OP.F_CV;6.392323971;100.0 +25/10/2020 02:06:00;U879.TC122F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:04;U879.TC122F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:06;U879.TC122F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:15;U879.TC122F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:16;U879.TC122F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:29;U879.TC122F_PV.F_CV;69.949996948;100.0 +25/10/2020 02:06:33;U879.TC122F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:44;U879.TC122F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:45;U879.TC122F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:56;U879.TC122F_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC123A_OP.F_CV;5.902459145;100.0 +25/10/2020 02:06:01;U879.TC123A_OP.F_CV;4.382924557;100.0 +25/10/2020 02:06:02;U879.TC123A_OP.F_CV;5.502950191;100.0 +25/10/2020 02:06:04;U879.TC123A_OP.F_CV;2.462025642;100.0 +25/10/2020 02:06:05;U879.TC123A_OP.F_CV;9.261429787;100.0 +25/10/2020 02:06:07;U879.TC123A_OP.F_CV;4.381924629;100.0 +25/10/2020 02:06:08;U879.TC123A_OP.F_CV;3.981415272;100.0 +25/10/2020 02:06:10;U879.TC123A_OP.F_CV;6.620975971;100.0 +25/10/2020 02:06:11;U879.TC123A_OP.F_CV;5.500950336;100.0 +25/10/2020 02:06:17;U879.TC123A_OP.F_CV;3.980415344;100.0 +25/10/2020 02:06:19;U879.TC123A_OP.F_CV;6.619975567;100.0 +25/10/2020 02:06:20;U879.TC123A_OP.F_CV;5.499949932;100.0 +25/10/2020 02:06:28;U879.TC123A_OP.F_CV;2.459025383;100.0 +25/10/2020 02:06:29;U879.TC123A_OP.F_CV;7.737894058;100.0 +25/10/2020 02:06:31;U879.TC123A_OP.F_CV;7.018483639;100.0 +25/10/2020 02:06:32;U879.TC123A_OP.F_CV;2.858388901;100.0 +25/10/2020 02:06:34;U879.TC123A_OP.F_CV;6.617975235;100.0 +25/10/2020 02:06:35;U879.TC123A_OP.F_CV;7.018484116;100.0 +25/10/2020 02:06:37;U879.TC123A_OP.F_CV;4.378924370;100.0 +25/10/2020 02:06:38;U879.TC123A_OP.F_CV;5.498950005;100.0 +25/10/2020 02:06:40;U879.TC123A_OP.F_CV;3.978414774;100.0 +25/10/2020 02:06:41;U879.TC123A_OP.F_CV;6.617975235;100.0 +25/10/2020 02:06:43;U879.TC123A_OP.F_CV;5.497949600;100.0 +25/10/2020 02:06:47;U879.TC123A_OP.F_CV;3.977414370;100.0 +25/10/2020 02:06:49;U879.TC123A_OP.F_CV;3.576050282;100.0 +25/10/2020 02:06:50;U879.TC123A_OP.F_CV;4.693969727;100.0 +25/10/2020 02:06:53;U879.TC123A_OP.F_CV;7.730894566;100.0 +25/10/2020 02:06:55;U879.TC123A_OP.F_CV;2.450025558;100.0 +25/10/2020 02:06:56;U879.TC123A_OP.F_CV;4.687970161;100.0 +25/10/2020 02:06:58;U879.TC123A_OP.F_CV;7.726894855;100.0 +25/10/2020 02:06:59;U879.TC123A_OP.F_CV;5.486950397;100.0 +25/10/2020 02:06:03;U879.TC123A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:04;U879.TC123A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:24;U879.TC123A_PV.F_CV;70.133331299;100.0 +25/10/2020 02:06:28;U879.TC123A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:46;U879.TC123A_PV.F_CV;70.149993896;100.0 +25/10/2020 02:06:52;U879.TC123A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:54;U879.TC123A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:55;U879.TC123A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:56;U879.TC123A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:57;U879.TC123A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC123A_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC123B_OP.F_CV;5.167918205;100.0 +25/10/2020 02:06:01;U879.TC123B_OP.F_CV;3.647455692;100.0 +25/10/2020 02:06:02;U879.TC123B_OP.F_CV;6.286890030;100.0 +25/10/2020 02:06:04;U879.TC123B_OP.F_CV;5.166917801;100.0 +25/10/2020 02:06:10;U879.TC123B_OP.F_CV;3.646455288;100.0 +25/10/2020 02:06:11;U879.TC123B_OP.F_CV;4.765427589;100.0 +25/10/2020 02:06:13;U879.TC123B_OP.F_CV;7.805352211;100.0 +25/10/2020 02:06:14;U879.TC123B_OP.F_CV;5.566407204;100.0 +25/10/2020 02:06:17;U879.TC123B_OP.F_CV;5.166917801;100.0 +25/10/2020 02:06:20;U879.TC123B_OP.F_CV;6.687380314;100.0 +25/10/2020 02:06:23;U879.TC123B_OP.F_CV;4.048945904;100.0 +25/10/2020 02:06:26;U879.TC123B_OP.F_CV;3.648455381;100.0 +25/10/2020 02:06:28;U879.TC123B_OP.F_CV;6.287889957;100.0 +25/10/2020 02:06:29;U879.TC123B_OP.F_CV;5.167917252;100.0 +25/10/2020 02:06:35;U879.TC123B_OP.F_CV;3.647454977;100.0 +25/10/2020 02:06:37;U879.TC123B_OP.F_CV;6.286889553;100.0 +25/10/2020 02:06:38;U879.TC123B_OP.F_CV;6.687379837;100.0 +25/10/2020 02:06:40;U879.TC123B_OP.F_CV;4.047945499;100.0 +25/10/2020 02:06:41;U879.TC123B_OP.F_CV;3.647455454;100.0 +25/10/2020 02:06:43;U879.TC123B_OP.F_CV;6.286889553;100.0 +25/10/2020 02:06:44;U879.TC123B_OP.F_CV;6.687379837;100.0 +25/10/2020 02:06:46;U879.TC123B_OP.F_CV;4.047945499;100.0 +25/10/2020 02:06:47;U879.TC123B_OP.F_CV;6.688379765;100.0 +25/10/2020 02:06:49;U879.TC123B_OP.F_CV;5.569407940;100.0 +25/10/2020 02:06:52;U879.TC123B_OP.F_CV;5.304080963;100.0 +25/10/2020 02:06:53;U879.TC123B_OP.F_CV;5.170917988;100.0 +25/10/2020 02:06:56;U879.TC123B_OP.F_CV;6.691380501;100.0 +25/10/2020 02:06:58;U879.TC123B_OP.F_CV;5.572408199;100.0 +25/10/2020 02:06:59;U879.TC123B_OP.F_CV;4.052946091;100.0 +25/10/2020 02:06:01;U879.TC123B_PV.F_CV;54.900001526;100.0 +25/10/2020 02:06:04;U879.TC123B_PV.F_CV;55.028572083;100.0 +25/10/2020 02:06:10;U879.TC123B_PV.F_CV;54.900001526;100.0 +25/10/2020 02:06:18;U879.TC123B_PV.F_CV;55.049999237;100.0 +25/10/2020 02:06:20;U879.TC123B_PV.F_CV;54.900001526;100.0 +25/10/2020 02:06:24;U879.TC123B_PV.F_CV;55.033332825;100.0 +25/10/2020 02:06:34;U879.TC123B_PV.F_CV;54.900001526;100.0 +25/10/2020 02:06:35;U879.TC123B_PV.F_CV;55.099998474;100.0 +25/10/2020 02:06:40;U879.TC123B_PV.F_CV;54.900001526;100.0 +25/10/2020 02:06:41;U879.TC123B_PV.F_CV;55.099998474;100.0 +25/10/2020 02:06:43;U879.TC123B_PV.F_CV;54.900001526;100.0 +25/10/2020 02:06:46;U879.TC123B_PV.F_CV;55.200000763;100.0 +25/10/2020 02:06:47;U879.TC123B_PV.F_CV;54.900001526;100.0 +25/10/2020 02:06:57;U879.TC123B_SP.F_CV;55.000000000;100.0 +25/10/2020 02:06:01;U879.TC123C_OP.F_CV;9.391591072;100.0 +25/10/2020 02:06:02;U879.TC123C_OP.F_CV;7.872056007;100.0 +25/10/2020 02:06:04;U879.TC123C_OP.F_CV;10.512616158;100.0 +25/10/2020 02:06:05;U879.TC123C_OP.F_CV;7.873055458;100.0 +25/10/2020 02:06:07;U879.TC123C_OP.F_CV;8.993081093;100.0 +25/10/2020 02:06:40;U879.TC123C_OP.F_CV;8.993081093;100.0 +25/10/2020 02:06:41;U879.TC123C_OP.F_CV;10.318675041;100.0 +25/10/2020 02:06:45;U879.TC123C_OP.F_CV;10.474627495;100.0 +25/10/2020 02:06:47;U879.TC123C_OP.F_CV;7.874054909;100.0 +25/10/2020 02:06:49;U879.TC123C_OP.F_CV;8.994080544;100.0 +25/10/2020 02:06:56;U879.TC123C_OP.F_CV;10.514615059;100.0 +25/10/2020 02:06:58;U879.TC123C_OP.F_CV;7.875054359;100.0 +25/10/2020 02:06:59;U879.TC123C_OP.F_CV;10.515613556;100.0 +25/10/2020 02:06:09;U879.TC123C_PV.F_CV;69.944442749;100.0 +25/10/2020 02:06:32;U879.TC123C_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC123D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U879.TC123D_PV.F_CV;31.733333588;100.0 +25/10/2020 02:06:13;U879.TC123D_PV.F_CV;31.600000381;100.0 +25/10/2020 02:06:23;U879.TC123D_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:01;U879.TC123E_OP.F_CV;2.429599285;100.0 +25/10/2020 02:06:02;U879.TC123E_OP.F_CV;5.069034100;100.0 +25/10/2020 02:06:04;U879.TC123E_OP.F_CV;2.428599358;100.0 +25/10/2020 02:06:05;U879.TC123E_OP.F_CV;5.068034172;100.0 +25/10/2020 02:06:07;U879.TC123E_OP.F_CV;3.948061705;100.0 +25/10/2020 02:06:08;U879.TC123E_OP.F_CV;5.468523979;100.0 +25/10/2020 02:06:10;U879.TC123E_OP.F_CV;1.308627605;100.0 +25/10/2020 02:06:11;U879.TC123E_OP.F_CV;3.547571898;100.0 +25/10/2020 02:06:13;U879.TC123E_OP.F_CV;6.587496758;100.0 +25/10/2020 02:06:14;U879.TC123E_OP.F_CV;2.828090191;100.0 +25/10/2020 02:06:17;U879.TC123E_OP.F_CV;4.454883099;100.0 +25/10/2020 02:06:19;U879.TC123E_OP.F_CV;5.468524456;100.0 +25/10/2020 02:06:20;U879.TC123E_OP.F_CV;2.829090595;100.0 +25/10/2020 02:06:22;U879.TC123E_OP.F_CV;2.428600550;100.0 +25/10/2020 02:06:23;U879.TC123E_OP.F_CV;6.588497162;100.0 +25/10/2020 02:06:26;U879.TC123E_OP.F_CV;5.469524860;100.0 +25/10/2020 02:06:28;U879.TC123E_OP.F_CV;2.830090761;100.0 +25/10/2020 02:06:29;U879.TC123E_OP.F_CV;3.950062990;100.0 +25/10/2020 02:06:34;U879.TC123E_OP.F_CV;5.470525265;100.0 +25/10/2020 02:06:35;U879.TC123E_OP.F_CV;2.831091166;100.0 +25/10/2020 02:06:37;U879.TC123E_OP.F_CV;5.471525669;100.0 +25/10/2020 02:06:38;U879.TC123E_OP.F_CV;2.832091570;100.0 +25/10/2020 02:06:40;U879.TC123E_OP.F_CV;3.952063799;100.0 +25/10/2020 02:06:43;U879.TC123E_OP.F_CV;2.431601763;100.0 +25/10/2020 02:06:44;U879.TC123E_OP.F_CV;6.591498375;100.0 +25/10/2020 02:06:46;U879.TC123E_OP.F_CV;2.832091570;100.0 +25/10/2020 02:06:47;U879.TC123E_OP.F_CV;3.952063799;100.0 +25/10/2020 02:06:53;U879.TC123E_OP.F_CV;5.071036339;100.0 +25/10/2020 02:06:55;U879.TC123E_OP.F_CV;3.951064110;100.0 +25/10/2020 02:06:58;U879.TC123E_OP.F_CV;5.471526146;100.0 +25/10/2020 02:06:59;U879.TC123E_OP.F_CV;2.832092285;100.0 +25/10/2020 02:06:01;U879.TC123E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:03;U879.TC123E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:04;U879.TC123E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:09;U879.TC123E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:18;U879.TC123E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:37;U879.TC123E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:44;U879.TC123E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:46;U879.TC123E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:58;U879.TC123E_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:59;U879.TC123E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:23;U879.TC123E_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:01;U879.TC123F_OP.F_CV;4.826967239;100.0 +25/10/2020 02:06:02;U879.TC123F_OP.F_CV;5.946939468;100.0 +25/10/2020 02:06:05;U879.TC123F_OP.F_CV;8.987936020;100.0 +25/10/2020 02:06:07;U879.TC123F_OP.F_CV;5.229403496;100.0 +25/10/2020 02:06:08;U879.TC123F_OP.F_CV;7.870964050;100.0 +25/10/2020 02:06:10;U879.TC123F_OP.F_CV;6.752938271;100.0 +25/10/2020 02:06:11;U879.TC123F_OP.F_CV;5.234403610;100.0 +25/10/2020 02:06:13;U879.TC123F_OP.F_CV;7.875964165;100.0 +25/10/2020 02:06:14;U879.TC123F_OP.F_CV;6.757937908;100.0 +25/10/2020 02:06:16;U879.TC123F_OP.F_CV;3.718941212;100.0 +25/10/2020 02:06:17;U879.TC123F_OP.F_CV;7.479401588;100.0 +25/10/2020 02:06:19;U879.TC123F_OP.F_CV;6.360428810;100.0 +25/10/2020 02:06:23;U879.TC123F_OP.F_CV;7.883964062;100.0 +25/10/2020 02:06:25;U879.TC123F_OP.F_CV;3.724941254;100.0 +25/10/2020 02:06:26;U879.TC123F_OP.F_CV;7.485401630;100.0 +25/10/2020 02:06:28;U879.TC123F_OP.F_CV;9.407498360;100.0 +25/10/2020 02:06:29;U879.TC123F_OP.F_CV;4.129377365;100.0 +25/10/2020 02:06:32;U879.TC123F_OP.F_CV;8.293472290;100.0 +25/10/2020 02:06:34;U879.TC123F_OP.F_CV;7.176446915;100.0 +25/10/2020 02:06:35;U879.TC123F_OP.F_CV;5.658912182;100.0 +25/10/2020 02:06:38;U879.TC123F_OP.F_CV;5.262403011;100.0 +25/10/2020 02:06:40;U879.TC123F_OP.F_CV;6.383428097;100.0 +25/10/2020 02:06:41;U879.TC123F_OP.F_CV;7.904963017;100.0 +25/10/2020 02:06:43;U879.TC123F_OP.F_CV;6.786937714;100.0 +25/10/2020 02:06:44;U879.TC123F_OP.F_CV;5.268403053;100.0 +25/10/2020 02:06:46;U879.TC123F_OP.F_CV;4.868966579;100.0 +25/10/2020 02:06:47;U879.TC123F_OP.F_CV;9.029935837;100.0 +25/10/2020 02:06:50;U879.TC123F_OP.F_CV;6.793937683;100.0 +25/10/2020 02:06:53;U879.TC123F_OP.F_CV;6.396428585;100.0 +25/10/2020 02:06:55;U879.TC123F_OP.F_CV;7.917963028;100.0 +25/10/2020 02:06:56;U879.TC123F_OP.F_CV;5.279402733;100.0 +25/10/2020 02:06:58;U879.TC123F_OP.F_CV;7.920963764;100.0 +25/10/2020 02:06:59;U879.TC123F_OP.F_CV;6.802937984;100.0 +25/10/2020 02:06:01;U879.TC123F_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:02;U879.TC123F_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:04;U879.TC123F_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:15;U879.TC123F_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:16;U879.TC123F_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:24;U879.TC123F_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:25;U879.TC123F_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:44;U879.TC123F_PV.F_CV;49.950000763;100.0 +25/10/2020 02:06:46;U879.TC123F_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:47;U879.TC123F_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:00;U879.TC124A_OP.F_CV;29.524974823;100.0 +25/10/2020 02:06:01;U879.TC124A_OP.F_CV;29.924589157;100.0 +25/10/2020 02:06:02;U879.TC124A_OP.F_CV;27.284030914;100.0 +25/10/2020 02:06:04;U879.TC124A_OP.F_CV;28.403055191;100.0 +25/10/2020 02:06:08;U879.TC124A_OP.F_CV;29.920593262;100.0 +25/10/2020 02:06:10;U879.TC124A_OP.F_CV;27.280033112;100.0 +25/10/2020 02:06:11;U879.TC124A_OP.F_CV;28.399059296;100.0 +25/10/2020 02:06:14;U879.TC124A_OP.F_CV;29.917594910;100.0 +25/10/2020 02:06:17;U879.TC124A_OP.F_CV;28.290721893;100.0 +25/10/2020 02:06:19;U879.TC124A_OP.F_CV;27.277032852;100.0 +25/10/2020 02:06:20;U879.TC124A_OP.F_CV;28.396060944;100.0 +25/10/2020 02:06:23;U879.TC124A_OP.F_CV;28.795570374;100.0 +25/10/2020 02:06:31;U879.TC124A_OP.F_CV;25.754646301;100.0 +25/10/2020 02:06:32;U879.TC124A_OP.F_CV;31.033514023;100.0 +25/10/2020 02:06:34;U879.TC124A_OP.F_CV;28.793571472;100.0 +25/10/2020 02:06:35;U879.TC124A_OP.F_CV;27.273036957;100.0 +25/10/2020 02:06:37;U879.TC124A_OP.F_CV;29.912597656;100.0 +25/10/2020 02:06:38;U879.TC124A_OP.F_CV;28.792572021;100.0 +25/10/2020 02:06:43;U879.TC124A_OP.F_CV;30.313104630;100.0 +25/10/2020 02:06:44;U879.TC124A_OP.F_CV;26.153009415;100.0 +25/10/2020 02:06:46;U879.TC124A_OP.F_CV;29.912597656;100.0 +25/10/2020 02:06:47;U879.TC124A_OP.F_CV;27.272037506;100.0 +25/10/2020 02:06:49;U879.TC124A_OP.F_CV;29.911598206;100.0 +25/10/2020 02:06:50;U879.TC124A_OP.F_CV;27.271036148;100.0 +25/10/2020 02:06:52;U879.TC124A_OP.F_CV;29.910596848;100.0 +25/10/2020 02:06:53;U879.TC124A_OP.F_CV;27.270038605;100.0 +25/10/2020 02:06:55;U879.TC124A_OP.F_CV;29.909599304;100.0 +25/10/2020 02:06:56;U879.TC124A_OP.F_CV;27.269037247;100.0 +25/10/2020 02:06:58;U879.TC124A_OP.F_CV;26.867675781;100.0 +25/10/2020 02:06:59;U879.TC124A_OP.F_CV;27.985591888;100.0 +25/10/2020 02:06:00;U879.TC124A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:28;U879.TC124A_PV.F_CV;70.142852783;100.0 +25/10/2020 02:06:32;U879.TC124A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:57;U879.TC124A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:34;U879.TC124A_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC124B_OP.F_CV;24.167087555;100.0 +25/10/2020 02:06:01;U879.TC124B_OP.F_CV;21.527526855;100.0 +25/10/2020 02:06:02;U879.TC124B_OP.F_CV;24.168085098;100.0 +25/10/2020 02:06:04;U879.TC124B_OP.F_CV;20.007991791;100.0 +25/10/2020 02:06:05;U879.TC124B_OP.F_CV;23.767578125;100.0 +25/10/2020 02:06:07;U879.TC124B_OP.F_CV;22.647552490;100.0 +25/10/2020 02:06:08;U879.TC124B_OP.F_CV;21.127017975;100.0 +25/10/2020 02:06:10;U879.TC124B_OP.F_CV;22.246044159;100.0 +25/10/2020 02:06:11;U879.TC124B_OP.F_CV;20.724655151;100.0 +25/10/2020 02:06:13;U879.TC124B_OP.F_CV;21.842573166;100.0 +25/10/2020 02:06:14;U879.TC124B_OP.F_CV;23.360963821;100.0 +25/10/2020 02:06:17;U879.TC124B_OP.F_CV;22.239044189;100.0 +25/10/2020 02:06:20;U879.TC124B_OP.F_CV;23.757579803;100.0 +25/10/2020 02:06:23;U879.TC124B_OP.F_CV;21.834575653;100.0 +25/10/2020 02:06:26;U879.TC124B_OP.F_CV;21.113021851;100.0 +25/10/2020 02:06:28;U879.TC124B_OP.F_CV;22.232048035;100.0 +25/10/2020 02:06:30;U879.TC124B_OP.F_CV;21.470354080;100.0 +25/10/2020 02:06:31;U879.TC124B_OP.F_CV;20.709659576;100.0 +25/10/2020 02:06:32;U879.TC124B_OP.F_CV;20.306898117;100.0 +25/10/2020 02:06:34;U879.TC124B_OP.F_CV;22.944709778;100.0 +25/10/2020 02:06:35;U879.TC124B_OP.F_CV;20.301897049;100.0 +25/10/2020 02:06:37;U879.TC124B_OP.F_CV;24.460096359;100.0 +25/10/2020 02:06:38;U879.TC124B_OP.F_CV;20.698656082;100.0 +25/10/2020 02:06:40;U879.TC124B_OP.F_CV;23.336967468;100.0 +25/10/2020 02:06:41;U879.TC124B_OP.F_CV;20.695659637;100.0 +25/10/2020 02:06:43;U879.TC124B_OP.F_CV;21.813575745;100.0 +25/10/2020 02:06:44;U879.TC124B_OP.F_CV;20.290897369;100.0 +25/10/2020 02:06:46;U879.TC124B_OP.F_CV;22.928707123;100.0 +25/10/2020 02:06:47;U879.TC124B_OP.F_CV;23.326967239;100.0 +25/10/2020 02:06:49;U879.TC124B_OP.F_CV;22.206048965;100.0 +25/10/2020 02:06:51;U879.TC124B_OP.F_CV;21.324577332;100.0 +25/10/2020 02:06:53;U879.TC124B_OP.F_CV;19.563634872;100.0 +25/10/2020 02:06:55;U879.TC124B_OP.F_CV;23.321969986;100.0 +25/10/2020 02:06:56;U879.TC124B_OP.F_CV;20.680660248;100.0 +25/10/2020 02:06:58;U879.TC124B_OP.F_CV;23.318971634;100.0 +25/10/2020 02:06:59;U879.TC124B_OP.F_CV;23.718587875;100.0 +25/10/2020 02:06:09;U879.TC124B_PV.F_CV;70.149993896;100.0 +25/10/2020 02:06:18;U879.TC124B_PV.F_CV;70.016662598;100.0 +25/10/2020 02:06:21;U879.TC124B_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:23;U879.TC124B_PV.F_CV;70.066665649;100.0 +25/10/2020 02:06:28;U879.TC124B_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:51;U879.TC124B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:53;U879.TC124B_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:58;U879.TC124B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC124B_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U879.TC124C_OP.F_CV;26.640834808;100.0 +25/10/2020 02:06:02;U879.TC124C_OP.F_CV;25.520807266;100.0 +25/10/2020 02:06:05;U879.TC124C_OP.F_CV;24.000272751;100.0 +25/10/2020 02:06:07;U879.TC124C_OP.F_CV;25.119300842;100.0 +25/10/2020 02:06:08;U879.TC124C_OP.F_CV;26.638834000;100.0 +25/10/2020 02:06:10;U879.TC124C_OP.F_CV;25.518810272;100.0 +25/10/2020 02:06:11;U879.TC124C_OP.F_CV;23.998275757;100.0 +25/10/2020 02:06:13;U879.TC124C_OP.F_CV;26.637836456;100.0 +25/10/2020 02:06:14;U879.TC124C_OP.F_CV;23.997274399;100.0 +25/10/2020 02:06:17;U879.TC124C_OP.F_CV;26.635837555;100.0 +25/10/2020 02:06:19;U879.TC124C_OP.F_CV;25.515811920;100.0 +25/10/2020 02:06:23;U879.TC124C_OP.F_CV;26.634838104;100.0 +25/10/2020 02:06:27;U879.TC124C_OP.F_CV;25.313556671;100.0 +25/10/2020 02:06:28;U879.TC124C_OP.F_CV;23.993278503;100.0 +25/10/2020 02:06:29;U879.TC124C_OP.F_CV;26.632839203;100.0 +25/10/2020 02:06:32;U879.TC124C_OP.F_CV;25.005968094;100.0 +25/10/2020 02:06:34;U879.TC124C_OP.F_CV;23.992279053;100.0 +25/10/2020 02:06:35;U879.TC124C_OP.F_CV;26.631839752;100.0 +25/10/2020 02:06:37;U879.TC124C_OP.F_CV;25.511814117;100.0 +25/10/2020 02:06:38;U879.TC124C_OP.F_CV;23.991279602;100.0 +25/10/2020 02:06:40;U879.TC124C_OP.F_CV;26.630838394;100.0 +25/10/2020 02:06:41;U879.TC124C_OP.F_CV;25.510814667;100.0 +25/10/2020 02:06:46;U879.TC124C_OP.F_CV;25.510814667;100.0 +25/10/2020 02:06:47;U879.TC124C_OP.F_CV;26.271081924;100.0 +25/10/2020 02:06:53;U879.TC124C_OP.F_CV;27.031349182;100.0 +25/10/2020 02:06:55;U879.TC124C_OP.F_CV;24.391788483;100.0 +25/10/2020 02:06:56;U879.TC124C_OP.F_CV;25.511814117;100.0 +25/10/2020 02:06:23;U879.TC124C_PV.F_CV;70.050003052;100.0 +25/10/2020 02:06:50;U879.TC124C_PV.F_CV;69.921432495;100.0 +25/10/2020 02:06:11;U879.TC124C_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC124D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U879.TC124D_PV.F_CV;26.799999237;100.0 +25/10/2020 02:06:14;U879.TC124D_PV.F_CV;26.600000381;100.0 +25/10/2020 02:06:16;U879.TC124D_PV.F_CV;26.733333588;100.0 +25/10/2020 02:06:21;U879.TC124D_PV.F_CV;26.600000381;100.0 +25/10/2020 02:06:26;U879.TC124D_PV.F_CV;26.733333588;100.0 +25/10/2020 02:06:29;U879.TC124D_PV.F_CV;26.600000381;100.0 +25/10/2020 02:06:35;U879.TC124D_PV.F_CV;26.750000000;100.0 +25/10/2020 02:06:38;U879.TC124D_PV.F_CV;26.600000381;100.0 +25/10/2020 02:06:49;U879.TC124D_PV.F_CV;26.799999237;100.0 +25/10/2020 02:06:50;U879.TC124D_PV.F_CV;26.600000381;100.0 +25/10/2020 02:06:23;U879.TC124D_SP.F_CV;30.000000000;100.0 +25/10/2020 02:06:01;U879.TC124E_OP.F_CV;8.685728073;100.0 +25/10/2020 02:06:02;U879.TC124E_OP.F_CV;9.803753853;100.0 +25/10/2020 02:06:04;U879.TC124E_OP.F_CV;11.322288513;100.0 +25/10/2020 02:06:05;U879.TC124E_OP.F_CV;8.680727959;100.0 +25/10/2020 02:06:07;U879.TC124E_OP.F_CV;11.319288254;100.0 +25/10/2020 02:06:08;U879.TC124E_OP.F_CV;10.198262215;100.0 +25/10/2020 02:06:12;U879.TC124E_OP.F_CV;13.236759186;100.0 +25/10/2020 02:06:13;U879.TC124E_OP.F_CV;16.277256012;100.0 +25/10/2020 02:06:14;U879.TC124E_OP.F_CV;8.759190559;100.0 +25/10/2020 02:06:16;U879.TC124E_OP.F_CV;7.959316730;100.0 +25/10/2020 02:06:17;U879.TC124E_OP.F_CV;16.280256271;100.0 +25/10/2020 02:06:19;U879.TC124E_OP.F_CV;10.282725334;100.0 +25/10/2020 02:06:20;U879.TC124E_OP.F_CV;11.404750824;100.0 +25/10/2020 02:06:22;U879.TC124E_OP.F_CV;9.886216164;100.0 +25/10/2020 02:06:23;U879.TC124E_OP.F_CV;14.048311234;100.0 +25/10/2020 02:06:26;U879.TC124E_OP.F_CV;11.814259529;100.0 +25/10/2020 02:06:28;U879.TC124E_OP.F_CV;13.337795258;100.0 +25/10/2020 02:06:29;U879.TC124E_OP.F_CV;10.701234818;100.0 +25/10/2020 02:06:32;U879.TC124E_OP.F_CV;11.827260017;100.0 +25/10/2020 02:06:34;U879.TC124E_OP.F_CV;10.309724808;100.0 +25/10/2020 02:06:35;U879.TC124E_OP.F_CV;14.472820282;100.0 +25/10/2020 02:06:37;U879.TC124E_OP.F_CV;10.716235161;100.0 +25/10/2020 02:06:38;U879.TC124E_OP.F_CV;10.318725586;100.0 +25/10/2020 02:06:40;U879.TC124E_OP.F_CV;11.440750122;100.0 +25/10/2020 02:06:44;U879.TC124E_OP.F_CV;9.926215172;100.0 +25/10/2020 02:06:46;U879.TC124E_OP.F_CV;11.047242165;100.0 +25/10/2020 02:06:48;U879.TC124E_OP.F_CV;9.528280258;100.0 +25/10/2020 02:06:49;U879.TC124E_OP.F_CV;8.008317947;100.0 +25/10/2020 02:06:50;U879.TC124E_OP.F_CV;10.247262001;100.0 +25/10/2020 02:06:55;U879.TC124E_OP.F_CV;10.247262001;100.0 +25/10/2020 02:06:56;U879.TC124E_OP.F_CV;8.722725868;100.0 +25/10/2020 02:06:58;U879.TC124E_OP.F_CV;11.361286163;100.0 +25/10/2020 02:06:59;U879.TC124E_OP.F_CV;10.240260124;100.0 +25/10/2020 02:06:12;U879.TC124E_PV.F_CV;49.842857361;100.0 +25/10/2020 02:06:15;U879.TC124E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:16;U879.TC124E_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:34;U879.TC124E_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:48;U879.TC124E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:49;U879.TC124E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:50;U879.TC124E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:59;U879.TC124E_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:00;U879.TC124F_OP.F_CV;9.019680977;100.0 +25/10/2020 02:06:01;U879.TC124F_OP.F_CV;10.138652802;100.0 +25/10/2020 02:06:05;U879.TC124F_OP.F_CV;11.296122551;100.0 +25/10/2020 02:06:07;U879.TC124F_OP.F_CV;9.015680313;100.0 +25/10/2020 02:06:08;U879.TC124F_OP.F_CV;11.295124054;100.0 +25/10/2020 02:06:10;U879.TC124F_OP.F_CV;10.175151825;100.0 +25/10/2020 02:06:11;U879.TC124F_OP.F_CV;9.014680862;100.0 +25/10/2020 02:06:13;U879.TC124F_OP.F_CV;10.133652687;100.0 +25/10/2020 02:06:19;U879.TC124F_OP.F_CV;10.133652687;100.0 +25/10/2020 02:06:20;U879.TC124F_OP.F_CV;12.449593544;100.0 +25/10/2020 02:06:22;U879.TC124F_OP.F_CV;7.889706135;100.0 +25/10/2020 02:06:23;U879.TC124F_OP.F_CV;10.128650665;100.0 +25/10/2020 02:06:25;U879.TC124F_OP.F_CV;11.288122177;100.0 +25/10/2020 02:06:27;U879.TC124F_OP.F_CV;11.349397659;100.0 +25/10/2020 02:06:29;U879.TC124F_OP.F_CV;6.770680428;100.0 +25/10/2020 02:06:32;U879.TC124F_OP.F_CV;11.289120674;100.0 +25/10/2020 02:06:34;U879.TC124F_OP.F_CV;12.490147591;100.0 +25/10/2020 02:06:35;U879.TC124F_OP.F_CV;7.931152344;100.0 +25/10/2020 02:06:38;U879.TC124F_OP.F_CV;12.492148399;100.0 +25/10/2020 02:06:40;U879.TC124F_OP.F_CV;6.772681236;100.0 +25/10/2020 02:06:41;U879.TC124F_OP.F_CV;13.613121033;100.0 +25/10/2020 02:06:43;U879.TC124F_OP.F_CV;9.094624519;100.0 +25/10/2020 02:06:45;U879.TC124F_OP.F_CV;10.775663376;100.0 +25/10/2020 02:06:46;U879.TC124F_OP.F_CV;12.496148109;100.0 +25/10/2020 02:06:47;U879.TC124F_OP.F_CV;7.937153816;100.0 +25/10/2020 02:06:51;U879.TC124F_OP.F_CV;8.312829971;100.0 +25/10/2020 02:06:53;U879.TC124F_OP.F_CV;9.060180664;100.0 +25/10/2020 02:06:55;U879.TC124F_OP.F_CV;10.180151939;100.0 +25/10/2020 02:06:56;U879.TC124F_OP.F_CV;11.340623856;100.0 +25/10/2020 02:06:58;U879.TC124F_OP.F_CV;9.061180115;100.0 +25/10/2020 02:06:59;U879.TC124F_OP.F_CV;11.341623306;100.0 +25/10/2020 02:06:01;U879.TC124F_PV.F_CV;50.200000763;100.0 +25/10/2020 02:06:03;U879.TC124F_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:13;U879.TC124F_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:14;U879.TC124F_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:16;U879.TC124F_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:17;U879.TC124F_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:19;U879.TC124F_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:21;U879.TC124F_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:25;U879.TC124F_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:29;U879.TC124F_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:32;U879.TC124F_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:39;U879.TC124F_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:40;U879.TC124F_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:46;U879.TC124F_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:48;U879.TC124F_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:50;U879.TC124F_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:23;U879.TC124F_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:02;U879.TC140A_OP.F_CV;5.396836281;100.0 +25/10/2020 02:06:04;U879.TC140A_OP.F_CV;3.532671690;100.0 +25/10/2020 02:06:05;U879.TC140A_OP.F_CV;1.001007795;100.0 +25/10/2020 02:06:07;U879.TC140A_OP.F_CV;1.601405740;100.0 +25/10/2020 02:06:08;U879.TC140A_OP.F_CV;3.801851749;100.0 +25/10/2020 02:06:10;U879.TC140A_OP.F_CV;5.403503418;100.0 +25/10/2020 02:06:11;U879.TC140A_OP.F_CV;3.539338589;100.0 +25/10/2020 02:06:13;U879.TC140A_OP.F_CV;1.007674456;100.0 +25/10/2020 02:06:14;U879.TC140A_OP.F_CV;5.409337044;100.0 +25/10/2020 02:06:18;U879.TC140A_OP.F_CV;3.213505745;100.0 +25/10/2020 02:06:19;U879.TC140A_OP.F_CV;1.014340878;100.0 +25/10/2020 02:06:20;U879.TC140A_OP.F_CV;6.683067322;100.0 +25/10/2020 02:06:23;U879.TC140A_OP.F_CV;1.021007657;100.0 +25/10/2020 02:06:25;U879.TC140A_OP.F_CV;2.888505697;100.0 +25/10/2020 02:06:26;U879.TC140A_OP.F_CV;5.423503876;100.0 +25/10/2020 02:06:28;U879.TC140A_OP.F_CV;1.025174618;100.0 +25/10/2020 02:06:29;U879.TC140A_OP.F_CV;5.426836967;100.0 +25/10/2020 02:06:31;U879.TC140A_OP.F_CV;1.028507710;100.0 +25/10/2020 02:06:32;U879.TC140A_OP.F_CV;5.430170059;100.0 +25/10/2020 02:06:34;U879.TC140A_OP.F_CV;3.566005230;100.0 +25/10/2020 02:06:35;U879.TC140A_OP.F_CV;1.034341097;100.0 +25/10/2020 02:06:37;U879.TC140A_OP.F_CV;5.436003208;100.0 +25/10/2020 02:06:38;U879.TC140A_OP.F_CV;1.037674427;100.0 +25/10/2020 02:06:40;U879.TC140A_OP.F_CV;1.638072491;100.0 +25/10/2020 02:06:41;U879.TC140A_OP.F_CV;6.372682571;100.0 +25/10/2020 02:06:43;U879.TC140A_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U879.TC140A_OP.F_CV;1.306853890;100.0 +25/10/2020 02:06:46;U879.TC140A_OP.F_CV;7.307667732;100.0 +25/10/2020 02:06:47;U879.TC140A_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U879.TC140A_OP.F_CV;2.575583696;100.0 +25/10/2020 02:06:50;U879.TC140A_OP.F_CV;1.308519840;100.0 +25/10/2020 02:06:52;U879.TC140A_OP.F_CV;3.508069277;100.0 +25/10/2020 02:06:53;U879.TC140A_OP.F_CV;1.307686329;100.0 +25/10/2020 02:06:55;U879.TC140A_OP.F_CV;2.240172148;100.0 +25/10/2020 02:06:56;U879.TC140A_OP.F_CV;0.972202301;100.0 +25/10/2020 02:06:58;U879.TC140A_OP.F_CV;0.636880338;100.0 +25/10/2020 02:06:59;U879.TC140A_OP.F_CV;1.567672729;100.0 +25/10/2020 02:06:01;U879.TC140A_PV.F_CV;29.733333588;100.0 +25/10/2020 02:06:04;U879.TC140A_PV.F_CV;29.899999619;100.0 +25/10/2020 02:06:07;U879.TC140A_PV.F_CV;29.700000763;100.0 +25/10/2020 02:06:08;U879.TC140A_PV.F_CV;29.899999619;100.0 +25/10/2020 02:06:10;U879.TC140A_PV.F_CV;29.600000381;100.0 +25/10/2020 02:06:12;U879.TC140A_PV.F_CV;29.899999619;100.0 +25/10/2020 02:06:13;U879.TC140A_PV.F_CV;29.700000763;100.0 +25/10/2020 02:06:15;U879.TC140A_PV.F_CV;29.899999619;100.0 +25/10/2020 02:06:17;U879.TC140A_PV.F_CV;29.700000763;100.0 +25/10/2020 02:06:18;U879.TC140A_PV.F_CV;29.899999619;100.0 +25/10/2020 02:06:19;U879.TC140A_PV.F_CV;29.700000763;100.0 +25/10/2020 02:06:23;U879.TC140A_PV.F_CV;29.899999619;100.0 +25/10/2020 02:06:25;U879.TC140A_PV.F_CV;29.700000763;100.0 +25/10/2020 02:06:27;U879.TC140A_PV.F_CV;29.899999619;100.0 +25/10/2020 02:06:28;U879.TC140A_PV.F_CV;29.700000763;100.0 +25/10/2020 02:06:30;U879.TC140A_PV.F_CV;29.899999619;100.0 +25/10/2020 02:06:31;U879.TC140A_PV.F_CV;29.700000763;100.0 +25/10/2020 02:06:34;U879.TC140A_PV.F_CV;29.899999619;100.0 +25/10/2020 02:06:36;U879.TC140A_PV.F_CV;29.700000763;100.0 +25/10/2020 02:06:37;U879.TC140A_PV.F_CV;30.000000000;100.0 +25/10/2020 02:06:41;U879.TC140A_PV.F_CV;29.700000763;100.0 +25/10/2020 02:06:44;U879.TC140A_PV.F_CV;30.100000381;100.0 +25/10/2020 02:06:28;U879.TC140A_SP.F_CV;30.000000000;100.0 +25/10/2020 02:06:00;U879.TC140B_OP.F_CV;4.168992996;100.0 +25/10/2020 02:06:01;U879.TC140B_OP.F_CV;5.436926365;100.0 +25/10/2020 02:06:02;U879.TC140B_OP.F_CV;1.971046805;100.0 +25/10/2020 02:06:04;U879.TC140B_OP.F_CV;3.837738514;100.0 +25/10/2020 02:06:05;U879.TC140B_OP.F_CV;5.104838848;100.0 +25/10/2020 02:06:07;U879.TC140B_OP.F_CV;4.172326565;100.0 +25/10/2020 02:06:08;U879.TC140B_OP.F_CV;5.440259933;100.0 +25/10/2020 02:06:10;U879.TC140B_OP.F_CV;3.241480350;100.0 +25/10/2020 02:06:11;U879.TC140B_OP.F_CV;4.175659180;100.0 +25/10/2020 02:06:14;U879.TC140B_OP.F_CV;5.444426060;100.0 +25/10/2020 02:06:17;U879.TC140B_OP.F_CV;2.912725449;100.0 +25/10/2020 02:06:19;U879.TC140B_OP.F_CV;3.846071005;100.0 +25/10/2020 02:06:20;U879.TC140B_OP.F_CV;2.579043150;100.0 +25/10/2020 02:06:23;U879.TC140B_OP.F_CV;2.912725449;100.0 +25/10/2020 02:06:25;U879.TC140B_OP.F_CV;3.846071005;100.0 +25/10/2020 02:06:29;U879.TC140B_OP.F_CV;2.579043150;100.0 +25/10/2020 02:06:31;U879.TC140B_OP.F_CV;4.778530121;100.0 +25/10/2020 02:06:32;U879.TC140B_OP.F_CV;2.578209877;100.0 +25/10/2020 02:06:34;U879.TC140B_OP.F_CV;4.777696609;100.0 +25/10/2020 02:06:35;U879.TC140B_OP.F_CV;3.844404221;100.0 +25/10/2020 02:06:37;U879.TC140B_OP.F_CV;2.577376366;100.0 +25/10/2020 02:06:38;U879.TC140B_OP.F_CV;3.509835482;100.0 +25/10/2020 02:06:40;U879.TC140B_OP.F_CV;2.241865635;100.0 +25/10/2020 02:06:41;U879.TC140B_OP.F_CV;5.707736015;100.0 +25/10/2020 02:06:43;U879.TC140B_OP.F_CV;3.841071129;100.0 +25/10/2020 02:06:44;U879.TC140B_OP.F_CV;5.108171463;100.0 +25/10/2020 02:06:46;U879.TC140B_OP.F_CV;4.175659180;100.0 +25/10/2020 02:06:47;U879.TC140B_OP.F_CV;0.375227928;100.0 +25/10/2020 02:06:49;U879.TC140B_OP.F_CV;5.707736015;100.0 +25/10/2020 02:06:50;U879.TC140B_OP.F_CV;3.841071129;100.0 +25/10/2020 02:06:53;U879.TC140B_OP.F_CV;2.574043274;100.0 +25/10/2020 02:06:55;U879.TC140B_OP.F_CV;4.773530006;100.0 +25/10/2020 02:06:56;U879.TC140B_OP.F_CV;3.840237617;100.0 +25/10/2020 02:06:58;U879.TC140B_OP.F_CV;2.573209763;100.0 +25/10/2020 02:06:59;U879.TC140B_OP.F_CV;3.505668879;100.0 +25/10/2020 02:06:02;U879.TC140B_PV.F_CV;35.000000000;100.0 +25/10/2020 02:06:06;U879.TC140B_PV.F_CV;34.849998474;100.0 +25/10/2020 02:06:38;U879.TC140B_PV.F_CV;35.166667938;100.0 +25/10/2020 02:06:40;U879.TC140B_PV.F_CV;35.000000000;100.0 +25/10/2020 02:06:23;U879.TC140B_SP.F_CV;35.000000000;100.0 +25/10/2020 02:06:00;U879.TC140C_OP.F_CV;3.949614525;100.0 +25/10/2020 02:06:01;U879.TC140C_OP.F_CV;3.317350626;100.0 +25/10/2020 02:06:02;U879.TC140C_OP.F_CV;4.252309799;100.0 +25/10/2020 02:06:04;U879.TC140C_OP.F_CV;6.788140774;100.0 +25/10/2020 02:06:05;U879.TC140C_OP.F_CV;3.657672644;100.0 +25/10/2020 02:06:07;U879.TC140C_OP.F_CV;4.593545437;100.0 +25/10/2020 02:06:08;U879.TC140C_OP.F_CV;3.329017639;100.0 +25/10/2020 02:06:10;U879.TC140C_OP.F_CV;4.263977051;100.0 +25/10/2020 02:06:14;U879.TC140C_OP.F_CV;3.001876354;100.0 +25/10/2020 02:06:17;U879.TC140C_OP.F_CV;4.271476746;100.0 +25/10/2020 02:06:20;U879.TC140C_OP.F_CV;3.007709503;100.0 +25/10/2020 02:06:23;U879.TC140C_OP.F_CV;6.476850033;100.0 +25/10/2020 02:06:26;U879.TC140C_OP.F_CV;7.412695885;100.0 +25/10/2020 02:06:28;U879.TC140C_OP.F_CV;3.348184109;100.0 +25/10/2020 02:06:29;U879.TC140C_OP.F_CV;3.016042948;100.0 +25/10/2020 02:06:31;U879.TC140C_OP.F_CV;3.950222015;100.0 +25/10/2020 02:06:32;U879.TC140C_OP.F_CV;5.218155384;100.0 +25/10/2020 02:06:34;U879.TC140C_OP.F_CV;3.019375801;100.0 +25/10/2020 02:06:35;U879.TC140C_OP.F_CV;3.953554869;100.0 +25/10/2020 02:06:38;U879.TC140C_OP.F_CV;2.688121319;100.0 +25/10/2020 02:06:42;U879.TC140C_OP.F_CV;4.466200829;100.0 +25/10/2020 02:06:43;U879.TC140C_OP.F_CV;4.888567448;100.0 +25/10/2020 02:06:44;U879.TC140C_OP.F_CV;3.956055164;100.0 +25/10/2020 02:06:47;U879.TC140C_OP.F_CV;1.423593760;100.0 +25/10/2020 02:06:49;U879.TC140C_OP.F_CV;3.289398670;100.0 +25/10/2020 02:06:50;U879.TC140C_OP.F_CV;4.555593014;100.0 +25/10/2020 02:06:54;U879.TC140C_OP.F_CV;2.777615309;100.0 +25/10/2020 02:06:55;U879.TC140C_OP.F_CV;2.355272770;100.0 +25/10/2020 02:06:56;U879.TC140C_OP.F_CV;4.554759502;100.0 +25/10/2020 02:06:58;U879.TC140C_OP.F_CV;3.621466875;100.0 +25/10/2020 02:06:59;U879.TC140C_OP.F_CV;2.354439259;100.0 +25/10/2020 02:06:09;U879.TC140C_PV.F_CV;34.866668701;100.0 +25/10/2020 02:06:23;U879.TC140C_PV.F_CV;34.700000763;100.0 +25/10/2020 02:06:24;U879.TC140C_PV.F_CV;35.000000000;100.0 +25/10/2020 02:06:25;U879.TC140C_PV.F_CV;34.849998474;100.0 +25/10/2020 02:06:37;U879.TC140C_PV.F_CV;35.000000000;100.0 +25/10/2020 02:06:43;U879.TC140C_PV.F_CV;34.799999237;100.0 +25/10/2020 02:06:45;U879.TC140C_PV.F_CV;34.966667175;100.0 +25/10/2020 02:06:23;U879.TC140C_SP.F_CV;35.000000000;100.0 +25/10/2020 02:06:05;U879.TC140D_OP.F_CV;4.057018280;100.0 +25/10/2020 02:06:08;U879.TC140D_OP.F_CV;4.271600246;100.0 +25/10/2020 02:06:17;U879.TC140D_OP.F_CV;4.115350723;100.0 +25/10/2020 02:06:19;U879.TC140D_OP.F_CV;4.252852440;100.0 +25/10/2020 02:06:29;U879.TC140D_OP.F_CV;4.375765324;100.0 +25/10/2020 02:06:31;U879.TC140D_OP.F_CV;4.300766468;100.0 +25/10/2020 02:06:34;U879.TC140D_OP.F_CV;4.404931545;100.0 +25/10/2020 02:06:07;U879.TC140D_PV.F_CV;34.750000000;100.0 +25/10/2020 02:06:16;U879.TC140D_PV.F_CV;34.900001526;100.0 +25/10/2020 02:06:25;U879.TC140D_PV.F_CV;34.750000000;100.0 +25/10/2020 02:06:32;U879.TC140D_PV.F_CV;34.900001526;100.0 +25/10/2020 02:06:33;U879.TC140D_PV.F_CV;34.700000763;100.0 +25/10/2020 02:06:34;U879.TC140D_PV.F_CV;34.900001526;100.0 +25/10/2020 02:06:35;U879.TC140D_PV.F_CV;34.700000763;100.0 +25/10/2020 02:06:51;U879.TC140D_PV.F_CV;34.900001526;100.0 +25/10/2020 02:06:52;U879.TC140D_PV.F_CV;34.700000763;100.0 +25/10/2020 02:06:54;U879.TC140D_SP.F_CV;35.000000000;100.0 +25/10/2020 02:06:01;U879.TC140E_OP.F_CV;3.621520281;100.0 +25/10/2020 02:06:02;U879.TC140E_OP.F_CV;4.888620853;100.0 +25/10/2020 02:06:04;U879.TC140E_OP.F_CV;3.956108570;100.0 +25/10/2020 02:06:05;U879.TC140E_OP.F_CV;5.224041462;100.0 +25/10/2020 02:06:07;U879.TC140E_OP.F_CV;3.025262356;100.0 +25/10/2020 02:06:08;U879.TC140E_OP.F_CV;3.959441423;100.0 +25/10/2020 02:06:14;U879.TC140E_OP.F_CV;3.959441423;100.0 +25/10/2020 02:06:16;U879.TC140E_OP.F_CV;5.230707169;100.0 +25/10/2020 02:06:17;U879.TC140E_OP.F_CV;3.031928062;100.0 +25/10/2020 02:06:19;U879.TC140E_OP.F_CV;2.699006796;100.0 +25/10/2020 02:06:20;U879.TC140E_OP.F_CV;3.632352829;100.0 +25/10/2020 02:06:22;U879.TC140E_OP.F_CV;4.899453163;100.0 +25/10/2020 02:06:23;U879.TC140E_OP.F_CV;3.966940880;100.0 +25/10/2020 02:06:26;U879.TC140E_OP.F_CV;5.833579063;100.0 +25/10/2020 02:06:28;U879.TC140E_OP.F_CV;3.967774153;100.0 +25/10/2020 02:06:30;U879.TC140E_OP.F_CV;3.435291290;100.0 +25/10/2020 02:06:32;U879.TC140E_OP.F_CV;2.368658781;100.0 +25/10/2020 02:06:34;U879.TC140E_OP.F_CV;4.568145752;100.0 +25/10/2020 02:06:35;U879.TC140E_OP.F_CV;4.901953697;100.0 +25/10/2020 02:06:37;U879.TC140E_OP.F_CV;2.702340841;100.0 +25/10/2020 02:06:38;U879.TC140E_OP.F_CV;1.101522684;100.0 +25/10/2020 02:06:40;U879.TC140E_OP.F_CV;6.767785072;100.0 +25/10/2020 02:06:41;U879.TC140E_OP.F_CV;1.434479594;100.0 +25/10/2020 02:06:43;U879.TC140E_OP.F_CV;4.567312241;100.0 +25/10/2020 02:06:44;U879.TC140E_OP.F_CV;2.366991997;100.0 +25/10/2020 02:06:46;U879.TC140E_OP.F_CV;2.032314539;100.0 +25/10/2020 02:06:47;U879.TC140E_OP.F_CV;2.964020252;100.0 +25/10/2020 02:06:50;U879.TC140E_OP.F_CV;5.494851112;100.0 +25/10/2020 02:06:53;U879.TC140E_OP.F_CV;3.293617487;100.0 +25/10/2020 02:06:56;U879.TC140E_OP.F_CV;4.558978558;100.0 +25/10/2020 02:06:58;U879.TC140E_OP.F_CV;1.091521978;100.0 +25/10/2020 02:06:59;U879.TC140E_OP.F_CV;4.223656654;100.0 +25/10/2020 02:06:01;U879.TC140E_PV.F_CV;35.099998474;100.0 +25/10/2020 02:06:02;U879.TC140E_PV.F_CV;34.900001526;100.0 +25/10/2020 02:06:19;U879.TC140E_PV.F_CV;35.099998474;100.0 +25/10/2020 02:06:21;U879.TC140E_PV.F_CV;34.900001526;100.0 +25/10/2020 02:06:24;U879.TC140E_PV.F_CV;35.099998474;100.0 +25/10/2020 02:06:26;U879.TC140E_PV.F_CV;34.900001526;100.0 +25/10/2020 02:06:32;U879.TC140E_PV.F_CV;35.099998474;100.0 +25/10/2020 02:06:23;U879.TC140E_SP.F_CV;35.000000000;100.0 +25/10/2020 02:06:00;U879.TC140F_OP.F_CV;3.992478132;100.0 +25/10/2020 02:06:01;U879.TC140F_OP.F_CV;2.726211548;100.0 +25/10/2020 02:06:02;U879.TC140F_OP.F_CV;3.659557343;100.0 +25/10/2020 02:06:04;U879.TC140F_OP.F_CV;4.926657677;100.0 +25/10/2020 02:06:05;U879.TC140F_OP.F_CV;3.994145393;100.0 +25/10/2020 02:06:10;U879.TC140F_OP.F_CV;3.994145393;100.0 +25/10/2020 02:06:11;U879.TC140F_OP.F_CV;5.264578342;100.0 +25/10/2020 02:06:13;U879.TC140F_OP.F_CV;5.599926472;100.0 +25/10/2020 02:06:14;U879.TC140F_OP.F_CV;0.867906094;100.0 +25/10/2020 02:06:16;U879.TC140F_OP.F_CV;4.934990406;100.0 +25/10/2020 02:06:17;U879.TC140F_OP.F_CV;4.002478123;100.0 +25/10/2020 02:06:19;U879.TC140F_OP.F_CV;5.270411491;100.0 +25/10/2020 02:06:20;U879.TC140F_OP.F_CV;4.338732243;100.0 +25/10/2020 02:06:23;U879.TC140F_OP.F_CV;3.074964762;100.0 +25/10/2020 02:06:25;U879.TC140F_OP.F_CV;4.009143353;100.0 +25/10/2020 02:06:27;U879.TC140F_OP.F_CV;4.643943787;100.0 +25/10/2020 02:06:28;U879.TC140F_OP.F_CV;5.277910709;100.0 +25/10/2020 02:06:29;U879.TC140F_OP.F_CV;1.812031269;100.0 +25/10/2020 02:06:32;U879.TC140F_OP.F_CV;6.212923527;100.0 +25/10/2020 02:06:34;U879.TC140F_OP.F_CV;3.080797911;100.0 +25/10/2020 02:06:35;U879.TC140F_OP.F_CV;5.282077312;100.0 +25/10/2020 02:06:38;U879.TC140F_OP.F_CV;0.550836980;100.0 +25/10/2020 02:06:40;U879.TC140F_OP.F_CV;5.884115696;100.0 +25/10/2020 02:06:41;U879.TC140F_OP.F_CV;5.285410881;100.0 +25/10/2020 02:06:43;U879.TC140F_OP.F_CV;4.353731632;100.0 +25/10/2020 02:06:44;U879.TC140F_OP.F_CV;3.088297606;100.0 +25/10/2020 02:06:46;U879.TC140F_OP.F_CV;2.755376816;100.0 +25/10/2020 02:06:47;U879.TC140F_OP.F_CV;6.222923279;100.0 +25/10/2020 02:06:50;U879.TC140F_OP.F_CV;4.024976730;100.0 +25/10/2020 02:06:53;U879.TC140F_OP.F_CV;3.094130516;100.0 +25/10/2020 02:06:55;U879.TC140F_OP.F_CV;4.028309822;100.0 +25/10/2020 02:06:56;U879.TC140F_OP.F_CV;5.296243191;100.0 +25/10/2020 02:06:58;U879.TC140F_OP.F_CV;1.830363750;100.0 +25/10/2020 02:06:59;U879.TC140F_OP.F_CV;6.231255531;100.0 +25/10/2020 02:06:36;U879.TC140F_PV.F_CV;34.899997711;100.0 +25/10/2020 02:06:38;U879.TC140F_PV.F_CV;35.099998474;100.0 +25/10/2020 02:06:39;U879.TC140F_PV.F_CV;34.900001526;100.0 +25/10/2020 02:06:12;U879.TC140F_SP.F_CV;35.000000000;100.0 +25/10/2020 02:06:00;U879.TC141A_OP.F_CV;5.566672325;100.0 +25/10/2020 02:06:01;U879.TC141A_OP.F_CV;4.634133339;100.0 +25/10/2020 02:06:02;U879.TC141A_OP.F_CV;3.367830038;100.0 +25/10/2020 02:06:04;U879.TC141A_OP.F_CV;5.568338871;100.0 +25/10/2020 02:06:05;U879.TC141A_OP.F_CV;3.368663788;100.0 +25/10/2020 02:06:07;U879.TC141A_OP.F_CV;4.302035809;100.0 +25/10/2020 02:06:08;U879.TC141A_OP.F_CV;5.569172859;100.0 +25/10/2020 02:06:10;U879.TC141A_OP.F_CV;2.102505684;100.0 +25/10/2020 02:06:11;U879.TC141A_OP.F_CV;7.769575119;100.0 +25/10/2020 02:06:13;U879.TC141A_OP.F_CV;2.436958313;100.0 +25/10/2020 02:06:14;U879.TC141A_OP.F_CV;3.036711693;100.0 +25/10/2020 02:06:17;U879.TC141A_OP.F_CV;5.235301971;100.0 +25/10/2020 02:06:19;U879.TC141A_OP.F_CV;3.035044432;100.0 +25/10/2020 02:06:20;U879.TC141A_OP.F_CV;5.234468460;100.0 +25/10/2020 02:06:23;U879.TC141A_OP.F_CV;3.034211159;100.0 +25/10/2020 02:06:25;U879.TC141A_OP.F_CV;3.966643572;100.0 +25/10/2020 02:06:29;U879.TC141A_OP.F_CV;5.231135368;100.0 +25/10/2020 02:06:31;U879.TC141A_OP.F_CV;3.030877829;100.0 +25/10/2020 02:06:32;U879.TC141A_OP.F_CV;3.963310480;100.0 +25/10/2020 02:06:36;U879.TC141A_OP.F_CV;3.327658892;100.0 +25/10/2020 02:06:37;U879.TC141A_OP.F_CV;2.693673849;100.0 +25/10/2020 02:06:38;U879.TC141A_OP.F_CV;4.892516136;100.0 +25/10/2020 02:06:40;U879.TC141A_OP.F_CV;3.958310127;100.0 +25/10/2020 02:06:42;U879.TC141A_OP.F_CV;3.323491812;100.0 +25/10/2020 02:06:43;U879.TC141A_OP.F_CV;2.689507008;100.0 +25/10/2020 02:06:44;U879.TC141A_OP.F_CV;3.621212959;100.0 +25/10/2020 02:06:46;U879.TC141A_OP.F_CV;4.886682510;100.0 +25/10/2020 02:06:47;U879.TC141A_OP.F_CV;3.952476501;100.0 +25/10/2020 02:06:50;U879.TC141A_OP.F_CV;5.217800617;100.0 +25/10/2020 02:06:52;U879.TC141A_OP.F_CV;3.017543793;100.0 +25/10/2020 02:06:53;U879.TC141A_OP.F_CV;3.949976206;100.0 +25/10/2020 02:06:57;U879.TC141A_OP.F_CV;4.581388474;100.0 +25/10/2020 02:06:58;U879.TC141A_OP.F_CV;5.214467525;100.0 +25/10/2020 02:06:59;U879.TC141A_OP.F_CV;4.281202316;100.0 +25/10/2020 02:06:09;U879.TC141A_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:23;U879.TC141A_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:31;U879.TC141B_OP.F_CV;5.122316360;100.0 +25/10/2020 02:06:32;U879.TC141B_OP.F_CV;5.022732735;100.0 +25/10/2020 02:06:34;U879.TC141B_OP.F_CV;5.089398384;100.0 +25/10/2020 02:06:35;U879.TC141B_OP.F_CV;5.022732735;100.0 +25/10/2020 02:06:37;U879.TC141B_OP.F_CV;5.089398384;100.0 +25/10/2020 02:06:38;U879.TC141B_OP.F_CV;5.022732735;100.0 +25/10/2020 02:06:40;U879.TC141B_OP.F_CV;5.123149872;100.0 +25/10/2020 02:06:42;U879.TC141B_OP.F_CV;5.057732582;100.0 +25/10/2020 02:06:50;U879.TC141B_OP.F_CV;5.124816895;100.0 +25/10/2020 02:06:52;U879.TC141B_OP.F_CV;5.058983326;100.0 +25/10/2020 02:06:02;U879.TC141B_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:03;U879.TC141B_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:04;U879.TC141B_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:05;U879.TC141B_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:08;U879.TC141B_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:09;U879.TC141B_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:16;U879.TC141B_PV.F_CV;49.944446564;100.0 +25/10/2020 02:06:19;U879.TC141B_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:28;U879.TC141B_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:29;U879.TC141B_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:30;U879.TC141B_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:34;U879.TC141B_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:39;U879.TC141B_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:41;U879.TC141B_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:50;U879.TC141B_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:52;U879.TC141B_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:56;U879.TC141B_PV.F_CV;49.940002441;100.0 +25/10/2020 02:06:58;U879.TC141B_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:23;U879.TC141B_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:04;U879.TC141C_OP.F_CV;5.556591034;100.0 +25/10/2020 02:06:05;U879.TC141C_OP.F_CV;3.356915474;100.0 +25/10/2020 02:06:09;U879.TC141C_OP.F_CV;5.135045052;100.0 +25/10/2020 02:06:10;U879.TC141C_OP.F_CV;5.557424068;100.0 +25/10/2020 02:06:11;U879.TC141C_OP.F_CV;4.624885559;100.0 +25/10/2020 02:06:13;U879.TC141C_OP.F_CV;3.358582497;100.0 +25/10/2020 02:06:14;U879.TC141C_OP.F_CV;4.291954994;100.0 +25/10/2020 02:06:17;U879.TC141C_OP.F_CV;5.559091568;100.0 +25/10/2020 02:06:19;U879.TC141C_OP.F_CV;4.626552582;100.0 +25/10/2020 02:06:20;U879.TC141C_OP.F_CV;5.894522667;100.0 +25/10/2020 02:06:23;U879.TC141C_OP.F_CV;4.629886150;100.0 +25/10/2020 02:06:26;U879.TC141C_OP.F_CV;5.564092159;100.0 +25/10/2020 02:06:28;U879.TC141C_OP.F_CV;3.364417076;100.0 +25/10/2020 02:06:29;U879.TC141C_OP.F_CV;6.832062721;100.0 +25/10/2020 02:06:31;U879.TC141C_OP.F_CV;3.699847937;100.0 +25/10/2020 02:06:32;U879.TC141C_OP.F_CV;4.634054184;100.0 +25/10/2020 02:06:37;U879.TC141C_OP.F_CV;4.634054184;100.0 +25/10/2020 02:06:38;U879.TC141C_OP.F_CV;3.370251656;100.0 +25/10/2020 02:06:40;U879.TC141C_OP.F_CV;4.303624153;100.0 +25/10/2020 02:06:44;U879.TC141C_OP.F_CV;5.570760250;100.0 +25/10/2020 02:06:46;U879.TC141C_OP.F_CV;2.104093552;100.0 +25/10/2020 02:06:47;U879.TC141C_OP.F_CV;3.969898224;100.0 +25/10/2020 02:06:49;U879.TC141C_OP.F_CV;5.236056328;100.0 +25/10/2020 02:06:50;U879.TC141C_OP.F_CV;6.837063313;100.0 +25/10/2020 02:06:53;U879.TC141C_OP.F_CV;5.236889362;100.0 +25/10/2020 02:06:55;U879.TC141C_OP.F_CV;4.303624153;100.0 +25/10/2020 02:06:56;U879.TC141C_OP.F_CV;5.570760250;100.0 +25/10/2020 02:06:58;U879.TC141C_OP.F_CV;4.638221741;100.0 +25/10/2020 02:06:20;U879.TC141C_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:24;U879.TC141C_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:31;U879.TC141C_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:33;U879.TC141C_PV.F_CV;49.950000763;100.0 +25/10/2020 02:06:50;U879.TC141C_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:51;U879.TC141C_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:56;U879.TC141C_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:37;U879.TC141C_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:01;U879.TC141D_OP.F_CV;4.453778267;100.0 +25/10/2020 02:06:02;U879.TC141D_OP.F_CV;2.251728535;100.0 +25/10/2020 02:06:04;U879.TC141D_OP.F_CV;5.716747761;100.0 +25/10/2020 02:06:05;U879.TC141D_OP.F_CV;3.849222898;100.0 +25/10/2020 02:06:07;U879.TC141D_OP.F_CV;1.314189434;100.0 +25/10/2020 02:06:08;U879.TC141D_OP.F_CV;5.712581635;100.0 +25/10/2020 02:06:10;U879.TC141D_OP.F_CV;2.577920437;100.0 +25/10/2020 02:06:11;U879.TC141D_OP.F_CV;3.509626389;100.0 +25/10/2020 02:06:13;U879.TC141D_OP.F_CV;4.775095940;100.0 +25/10/2020 02:06:14;U879.TC141D_OP.F_CV;3.840889692;100.0 +25/10/2020 02:06:16;U879.TC141D_OP.F_CV;0.038792133;100.0 +25/10/2020 02:06:17;U879.TC141D_OP.F_CV;5.369596958;100.0 +25/10/2020 02:06:19;U879.TC141D_OP.F_CV;3.501292706;100.0 +25/10/2020 02:06:20;U879.TC141D_OP.F_CV;4.766762733;100.0 +25/10/2020 02:06:26;U879.TC141D_OP.F_CV;4.766762733;100.0 +25/10/2020 02:06:28;U879.TC141D_OP.F_CV;3.827557564;100.0 +25/10/2020 02:06:29;U879.TC141D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U879.TC141D_OP.F_CV;3.489626646;100.0 +25/10/2020 02:06:35;U879.TC141D_OP.F_CV;4.753430367;100.0 +25/10/2020 02:06:38;U879.TC141D_OP.F_CV;4.152950287;100.0 +25/10/2020 02:06:40;U879.TC141D_OP.F_CV;1.618822336;100.0 +25/10/2020 02:06:41;U879.TC141D_OP.F_CV;6.017921448;100.0 +25/10/2020 02:06:43;U879.TC141D_OP.F_CV;2.884291887;100.0 +25/10/2020 02:06:44;U879.TC141D_OP.F_CV;2.549587965;100.0 +25/10/2020 02:06:46;U879.TC141D_OP.F_CV;4.748430252;100.0 +25/10/2020 02:06:47;U879.TC141D_OP.F_CV;3.814224243;100.0 +25/10/2020 02:06:51;U879.TC141D_OP.F_CV;3.389623165;100.0 +25/10/2020 02:06:53;U879.TC141D_OP.F_CV;2.543754578;100.0 +25/10/2020 02:06:55;U879.TC141D_OP.F_CV;4.742596626;100.0 +25/10/2020 02:06:56;U879.TC141D_OP.F_CV;3.808390379;100.0 +25/10/2020 02:06:01;U879.TC141D_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:02;U879.TC141D_PV.F_CV;50.299999237;100.0 +25/10/2020 02:06:03;U879.TC141D_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:14;U879.TC141D_PV.F_CV;50.300003052;100.0 +25/10/2020 02:06:16;U879.TC141D_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:57;U879.TC141D_PV.F_CV;50.250000000;100.0 +25/10/2020 02:06:59;U879.TC141D_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:23;U879.TC141D_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:03;U879.TC141E_OP.F_CV;3.636070490;100.0 +25/10/2020 02:06:04;U879.TC141E_OP.F_CV;3.213740110;100.0 +25/10/2020 02:06:05;U879.TC141E_OP.F_CV;5.413164139;100.0 +25/10/2020 02:06:07;U879.TC141E_OP.F_CV;4.479898453;100.0 +25/10/2020 02:06:10;U879.TC141E_OP.F_CV;5.747034550;100.0 +25/10/2020 02:06:11;U879.TC141E_OP.F_CV;4.814496040;100.0 +25/10/2020 02:06:13;U879.TC141E_OP.F_CV;3.548192978;100.0 +25/10/2020 02:06:14;U879.TC141E_OP.F_CV;4.481565475;100.0 +25/10/2020 02:06:17;U879.TC141E_OP.F_CV;5.748701572;100.0 +25/10/2020 02:06:19;U879.TC141E_OP.F_CV;2.282034874;100.0 +25/10/2020 02:06:20;U879.TC141E_OP.F_CV;5.414830685;100.0 +25/10/2020 02:06:22;U879.TC141E_OP.F_CV;4.481565475;100.0 +25/10/2020 02:06:23;U879.TC141E_OP.F_CV;5.748701572;100.0 +25/10/2020 02:06:26;U879.TC141E_OP.F_CV;3.549859762;100.0 +25/10/2020 02:06:28;U879.TC141E_OP.F_CV;4.483232498;100.0 +25/10/2020 02:06:29;U879.TC141E_OP.F_CV;5.750369072;100.0 +25/10/2020 02:06:33;U879.TC141E_OP.F_CV;4.651364326;100.0 +25/10/2020 02:06:34;U879.TC141E_OP.F_CV;3.551527023;100.0 +25/10/2020 02:06:35;U879.TC141E_OP.F_CV;4.484899521;100.0 +25/10/2020 02:06:38;U879.TC141E_OP.F_CV;3.217907906;100.0 +25/10/2020 02:06:40;U879.TC141E_OP.F_CV;5.417331219;100.0 +25/10/2020 02:06:41;U879.TC141E_OP.F_CV;5.751202106;100.0 +25/10/2020 02:06:43;U879.TC141E_OP.F_CV;4.818663597;100.0 +25/10/2020 02:06:44;U879.TC141E_OP.F_CV;2.285368919;100.0 +25/10/2020 02:06:46;U879.TC141E_OP.F_CV;5.418165207;100.0 +25/10/2020 02:06:47;U879.TC141E_OP.F_CV;5.752036095;100.0 +25/10/2020 02:06:49;U879.TC141E_OP.F_CV;4.819497108;100.0 +25/10/2020 02:06:51;U879.TC141E_OP.F_CV;4.287023067;100.0 +25/10/2020 02:06:53;U879.TC141E_OP.F_CV;3.220408201;100.0 +25/10/2020 02:06:55;U879.TC141E_OP.F_CV;7.954104900;100.0 +25/10/2020 02:06:56;U879.TC141E_OP.F_CV;2.621488571;100.0 +25/10/2020 02:06:58;U879.TC141E_OP.F_CV;4.488233566;100.0 +25/10/2020 02:06:59;U879.TC141E_OP.F_CV;3.221241951;100.0 +25/10/2020 02:06:19;U879.TC141E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:38;U879.TC141E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:41;U879.TC141E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:44;U879.TC141E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:47;U879.TC141E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:53;U879.TC141E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:54;U879.TC141E_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:55;U879.TC141E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:23;U879.TC141E_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:00;U879.TC141F_OP.F_CV;3.006524086;100.0 +25/10/2020 02:06:01;U879.TC141F_OP.F_CV;4.253587723;100.0 +25/10/2020 02:06:02;U879.TC141F_OP.F_CV;2.051537991;100.0 +25/10/2020 02:06:04;U879.TC141F_OP.F_CV;2.982357025;100.0 +25/10/2020 02:06:10;U879.TC141F_OP.F_CV;2.982357025;100.0 +25/10/2020 02:06:11;U879.TC141F_OP.F_CV;4.236920834;100.0 +25/10/2020 02:06:13;U879.TC141F_OP.F_CV;2.034871101;100.0 +25/10/2020 02:06:14;U879.TC141F_OP.F_CV;2.965689898;100.0 +25/10/2020 02:06:18;U879.TC141F_OP.F_CV;2.325890064;100.0 +25/10/2020 02:06:19;U879.TC141F_OP.F_CV;1.691089869;100.0 +25/10/2020 02:06:20;U879.TC141F_OP.F_CV;3.888202429;100.0 +25/10/2020 02:06:22;U879.TC141F_OP.F_CV;2.952356815;100.0 +25/10/2020 02:06:23;U879.TC141F_OP.F_CV;4.216920853;100.0 +25/10/2020 02:06:25;U879.TC141F_OP.F_CV;2.014871120;100.0 +25/10/2020 02:06:26;U879.TC141F_OP.F_CV;2.945690155;100.0 +25/10/2020 02:06:29;U879.TC141F_OP.F_CV;4.207754135;100.0 +25/10/2020 02:06:32;U879.TC141F_OP.F_CV;2.936523438;100.0 +25/10/2020 02:06:35;U879.TC141F_OP.F_CV;5.465687752;100.0 +25/10/2020 02:06:38;U879.TC141F_OP.F_CV;1.063191891;100.0 +25/10/2020 02:06:40;U879.TC141F_OP.F_CV;2.927356482;100.0 +25/10/2020 02:06:41;U879.TC141F_OP.F_CV;4.191920757;100.0 +25/10/2020 02:06:43;U879.TC141F_OP.F_CV;3.256935120;100.0 +25/10/2020 02:06:45;U879.TC141F_OP.F_CV;2.620903254;100.0 +25/10/2020 02:06:46;U879.TC141F_OP.F_CV;1.986537933;100.0 +25/10/2020 02:06:47;U879.TC141F_OP.F_CV;5.451521397;100.0 +25/10/2020 02:06:50;U879.TC141F_OP.F_CV;3.248602152;100.0 +25/10/2020 02:06:55;U879.TC141F_OP.F_CV;3.248602152;100.0 +25/10/2020 02:06:56;U879.TC141F_OP.F_CV;4.509036064;100.0 +25/10/2020 02:06:58;U879.TC141F_OP.F_CV;2.307756901;100.0 +25/10/2020 02:06:59;U879.TC141F_OP.F_CV;4.506536484;100.0 +25/10/2020 02:06:33;U879.TC141F_PV.F_CV;45.149997711;100.0 +25/10/2020 02:06:37;U879.TC141F_PV.F_CV;45.299999237;100.0 +25/10/2020 02:06:23;U879.TC141F_SP.F_CV;45.000000000;100.0 +25/10/2020 02:06:02;U879.TC142A_OP.F_CV;7.644025803;100.0 +25/10/2020 02:06:03;U879.TC142A_OP.F_CV;9.883970261;100.0 +25/10/2020 02:06:21;U879.TC142A_OP.F_CV;9.883970261;100.0 +25/10/2020 02:06:22;U879.TC142A_OP.F_CV;8.363435745;100.0 +25/10/2020 02:06:23;U879.TC142A_OP.F_CV;9.482460976;100.0 +25/10/2020 02:06:25;U879.TC142A_OP.F_CV;8.361435890;100.0 +25/10/2020 02:06:27;U879.TC142A_OP.F_CV;11.000995636;100.0 +25/10/2020 02:06:28;U879.TC142A_OP.F_CV;9.880970955;100.0 +25/10/2020 02:06:32;U879.TC142A_OP.F_CV;8.360436440;100.0 +25/10/2020 02:06:34;U879.TC142A_OP.F_CV;9.479461670;100.0 +25/10/2020 02:06:38;U879.TC142A_OP.F_CV;7.956070900;100.0 +25/10/2020 02:06:40;U879.TC142A_OP.F_CV;9.073989868;100.0 +25/10/2020 02:06:43;U879.TC142A_OP.F_CV;10.590379715;100.0 +25/10/2020 02:06:44;U879.TC142A_OP.F_CV;7.949070930;100.0 +25/10/2020 02:06:45;U879.TC142A_OP.F_CV;12.107913971;100.0 +25/10/2020 02:06:47;U879.TC142A_OP.F_CV;6.827044487;100.0 +25/10/2020 02:06:48;U879.TC142A_OP.F_CV;9.064989090;100.0 +25/10/2020 02:06:50;U879.TC142A_OP.F_CV;10.583378792;100.0 +25/10/2020 02:06:52;U879.TC142A_OP.F_CV;6.421390057;100.0 +25/10/2020 02:06:53;U879.TC142A_OP.F_CV;8.658441544;100.0 +25/10/2020 02:06:55;U879.TC142A_OP.F_CV;10.176121712;100.0 +25/10/2020 02:06:56;U879.TC142A_OP.F_CV;9.053989410;100.0 +25/10/2020 02:06:58;U879.TC142A_OP.F_CV;7.531309605;100.0 +25/10/2020 02:06:59;U879.TC142A_OP.F_CV;10.169122696;100.0 +25/10/2020 02:06:38;U879.TC142A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:23;U879.TC142A_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC142B_OP.F_CV;9.379067421;100.0 +25/10/2020 02:06:02;U879.TC142B_OP.F_CV;6.738506794;100.0 +25/10/2020 02:06:03;U879.TC142B_OP.F_CV;9.378067017;100.0 +25/10/2020 02:06:04;U879.TC142B_OP.F_CV;8.258041382;100.0 +25/10/2020 02:06:06;U879.TC142B_OP.F_CV;6.737505913;100.0 +25/10/2020 02:06:07;U879.TC142B_OP.F_CV;9.377066612;100.0 +25/10/2020 02:06:09;U879.TC142B_OP.F_CV;8.257040977;100.0 +25/10/2020 02:06:13;U879.TC142B_OP.F_CV;8.257040977;100.0 +25/10/2020 02:06:14;U879.TC142B_OP.F_CV;6.736505508;100.0 +25/10/2020 02:06:15;U879.TC142B_OP.F_CV;9.376066208;100.0 +25/10/2020 02:06:17;U879.TC142B_OP.F_CV;8.256040573;100.0 +25/10/2020 02:06:19;U879.TC142B_OP.F_CV;10.493985176;100.0 +25/10/2020 02:06:22;U879.TC142B_OP.F_CV;8.254040718;100.0 +25/10/2020 02:06:25;U879.TC142B_OP.F_CV;6.733505726;100.0 +25/10/2020 02:06:29;U879.TC142B_OP.F_CV;6.733505726;100.0 +25/10/2020 02:06:30;U879.TC142B_OP.F_CV;9.372066498;100.0 +25/10/2020 02:06:32;U879.TC142B_OP.F_CV;8.252040863;100.0 +25/10/2020 02:06:34;U879.TC142B_OP.F_CV;6.731505394;100.0 +25/10/2020 02:06:35;U879.TC142B_OP.F_CV;9.371066093;100.0 +25/10/2020 02:06:37;U879.TC142B_OP.F_CV;6.730505943;100.0 +25/10/2020 02:06:38;U879.TC142B_OP.F_CV;7.849531651;100.0 +25/10/2020 02:06:40;U879.TC142B_OP.F_CV;9.369066238;100.0 +25/10/2020 02:06:41;U879.TC142B_OP.F_CV;8.249040604;100.0 +25/10/2020 02:06:45;U879.TC142B_OP.F_CV;9.769575119;100.0 +25/10/2020 02:06:46;U879.TC142B_OP.F_CV;7.130014420;100.0 +25/10/2020 02:06:49;U879.TC142B_OP.F_CV;8.250040054;100.0 +25/10/2020 02:06:54;U879.TC142B_OP.F_CV;8.250040054;100.0 +25/10/2020 02:06:55;U879.TC142B_OP.F_CV;7.848530769;100.0 +25/10/2020 02:06:58;U879.TC142B_OP.F_CV;9.368065834;100.0 +25/10/2020 02:06:59;U879.TC142B_OP.F_CV;8.248040199;100.0 +25/10/2020 02:06:24;U879.TC142B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC142B_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC142C_OP.F_CV;10.637569427;100.0 +25/10/2020 02:06:01;U879.TC142C_OP.F_CV;5.356699944;100.0 +25/10/2020 02:06:03;U879.TC142C_OP.F_CV;7.594644547;100.0 +25/10/2020 02:06:06;U879.TC142C_OP.F_CV;6.069964409;100.0 +25/10/2020 02:06:07;U879.TC142C_OP.F_CV;10.228166580;100.0 +25/10/2020 02:06:09;U879.TC142C_OP.F_CV;6.466725349;100.0 +25/10/2020 02:06:10;U879.TC142C_OP.F_CV;7.584643841;100.0 +25/10/2020 02:06:13;U879.TC142C_OP.F_CV;6.059964657;100.0 +25/10/2020 02:06:15;U879.TC142C_OP.F_CV;8.697776794;100.0 +25/10/2020 02:06:17;U879.TC142C_OP.F_CV;7.575644493;100.0 +25/10/2020 02:06:21;U879.TC142C_OP.F_CV;7.575644493;100.0 +25/10/2020 02:06:22;U879.TC142C_OP.F_CV;9.090033531;100.0 +25/10/2020 02:06:23;U879.TC142C_OP.F_CV;6.448725224;100.0 +25/10/2020 02:06:25;U879.TC142C_OP.F_CV;7.564644814;100.0 +25/10/2020 02:06:29;U879.TC142C_OP.F_CV;7.564644814;100.0 +25/10/2020 02:06:30;U879.TC142C_OP.F_CV;6.037964821;100.0 +25/10/2020 02:06:32;U879.TC142C_OP.F_CV;8.675777435;100.0 +25/10/2020 02:06:34;U879.TC142C_OP.F_CV;9.074034691;100.0 +25/10/2020 02:06:35;U879.TC142C_OP.F_CV;6.432725906;100.0 +25/10/2020 02:06:37;U879.TC142C_OP.F_CV;7.550644875;100.0 +25/10/2020 02:06:38;U879.TC142C_OP.F_CV;6.027965069;100.0 +25/10/2020 02:06:40;U879.TC142C_OP.F_CV;8.665777206;100.0 +25/10/2020 02:06:41;U879.TC142C_OP.F_CV;7.543644905;100.0 +25/10/2020 02:06:43;U879.TC142C_OP.F_CV;9.062034607;100.0 +25/10/2020 02:06:44;U879.TC142C_OP.F_CV;4.900046349;100.0 +25/10/2020 02:06:46;U879.TC142C_OP.F_CV;8.657777786;100.0 +25/10/2020 02:06:47;U879.TC142C_OP.F_CV;7.535645485;100.0 +25/10/2020 02:06:49;U879.TC142C_OP.F_CV;6.012965679;100.0 +25/10/2020 02:06:50;U879.TC142C_OP.F_CV;8.650777817;100.0 +25/10/2020 02:06:51;U879.TC142C_OP.F_CV;7.528645515;100.0 +25/10/2020 02:06:53;U879.TC142C_OP.F_CV;6.005965233;100.0 +25/10/2020 02:06:55;U879.TC142C_OP.F_CV;7.521645546;100.0 +25/10/2020 02:06:05;U879.TC142C_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:06;U879.TC142C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:13;U879.TC142C_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:15;U879.TC142C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:17;U879.TC142C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:37;U879.TC142C_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:39;U879.TC142C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:23;U879.TC142C_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC142D_OP.F_CV;7.334394932;100.0 +25/10/2020 02:06:01;U879.TC142D_OP.F_CV;4.696835041;100.0 +25/10/2020 02:06:03;U879.TC142D_OP.F_CV;8.859930038;100.0 +25/10/2020 02:06:04;U879.TC142D_OP.F_CV;6.623878002;100.0 +25/10/2020 02:06:06;U879.TC142D_OP.F_CV;5.107343674;100.0 +25/10/2020 02:06:07;U879.TC142D_OP.F_CV;6.230369568;100.0 +25/10/2020 02:06:09;U879.TC142D_OP.F_CV;4.712834835;100.0 +25/10/2020 02:06:10;U879.TC142D_OP.F_CV;8.875930786;100.0 +25/10/2020 02:06:12;U879.TC142D_OP.F_CV;5.119344711;100.0 +25/10/2020 02:06:13;U879.TC142D_OP.F_CV;4.721835613;100.0 +25/10/2020 02:06:15;U879.TC142D_OP.F_CV;7.364396095;100.0 +25/10/2020 02:06:17;U879.TC142D_OP.F_CV;6.247370243;100.0 +25/10/2020 02:06:19;U879.TC142D_OP.F_CV;4.732836246;100.0 +25/10/2020 02:06:21;U879.TC142D_OP.F_CV;7.375396729;100.0 +25/10/2020 02:06:22;U879.TC142D_OP.F_CV;4.737836361;100.0 +25/10/2020 02:06:25;U879.TC142D_OP.F_CV;5.545908928;100.0 +25/10/2020 02:06:28;U879.TC142D_OP.F_CV;6.673881531;100.0 +25/10/2020 02:06:30;U879.TC142D_OP.F_CV;5.157346725;100.0 +25/10/2020 02:06:32;U879.TC142D_OP.F_CV;9.321369171;100.0 +25/10/2020 02:06:34;U879.TC142D_OP.F_CV;5.169346809;100.0 +25/10/2020 02:06:36;U879.TC142D_OP.F_CV;6.292372227;100.0 +25/10/2020 02:06:38;U879.TC142D_OP.F_CV;7.815907478;100.0 +25/10/2020 02:06:40;U879.TC142D_OP.F_CV;5.183347225;100.0 +25/10/2020 02:06:42;U879.TC142D_OP.F_CV;6.306373119;100.0 +25/10/2020 02:06:44;U879.TC142D_OP.F_CV;9.350370407;100.0 +25/10/2020 02:06:46;U879.TC142D_OP.F_CV;5.594910622;100.0 +25/10/2020 02:06:47;U879.TC142D_OP.F_CV;8.239345551;100.0 +25/10/2020 02:06:49;U879.TC142D_OP.F_CV;2.562841415;100.0 +25/10/2020 02:06:50;U879.TC142D_OP.F_CV;10.486395836;100.0 +25/10/2020 02:06:52;U879.TC142D_OP.F_CV;5.610910892;100.0 +25/10/2020 02:06:53;U879.TC142D_OP.F_CV;5.214348793;100.0 +25/10/2020 02:06:55;U879.TC142D_OP.F_CV;7.860909462;100.0 +25/10/2020 02:06:58;U879.TC142D_OP.F_CV;5.224348545;100.0 +25/10/2020 02:06:59;U879.TC142D_OP.F_CV;7.867909431;100.0 +25/10/2020 02:06:02;U879.TC142D_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:03;U879.TC142D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:04;U879.TC142D_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:09;U879.TC142D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:10;U879.TC142D_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:12;U879.TC142D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:21;U879.TC142D_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:22;U879.TC142D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:24;U879.TC142D_PV.F_CV;49.500000000;100.0 +25/10/2020 02:06:30;U879.TC142D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:32;U879.TC142D_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:48;U879.TC142D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:50;U879.TC142D_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:47;U879.TC142D_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:26;U879.TC142E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U879.TC142E_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:48;U879.TC142E_PV.F_CV;26.299999237;100.0 +25/10/2020 02:06:54;U879.TC142E_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:55;U879.TC142E_PV.F_CV;26.299999237;100.0 +25/10/2020 02:06:10;U879.TC142E_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:26;U879.TC142F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U879.TC142F_PV.F_CV;26.500000000;100.0 +25/10/2020 02:06:25;U879.TC142F_PV.F_CV;26.299999237;100.0 +25/10/2020 02:06:26;U879.TC142F_PV.F_CV;26.500000000;100.0 +25/10/2020 02:06:28;U879.TC142F_PV.F_CV;26.299999237;100.0 +25/10/2020 02:06:48;U879.TC142F_PV.F_CV;26.500000000;100.0 +25/10/2020 02:06:49;U879.TC142F_PV.F_CV;26.299999237;100.0 +25/10/2020 02:06:23;U879.TC142F_SP.F_CV;25.991664886;100.0 +25/10/2020 02:06:00;U879.TC143A_OP.F_CV;8.794324875;100.0 +25/10/2020 02:06:02;U879.TC143A_OP.F_CV;9.914350510;100.0 +25/10/2020 02:06:09;U879.TC143A_OP.F_CV;9.914350510;100.0 +25/10/2020 02:06:10;U879.TC143A_OP.F_CV;11.434885025;100.0 +25/10/2020 02:06:12;U879.TC143A_OP.F_CV;10.315858841;100.0 +25/10/2020 02:06:14;U879.TC143A_OP.F_CV;8.796324730;100.0 +25/10/2020 02:06:15;U879.TC143A_OP.F_CV;9.916349411;100.0 +25/10/2020 02:06:30;U879.TC143A_OP.F_CV;9.916349411;100.0 +25/10/2020 02:06:31;U879.TC143A_OP.F_CV;11.436884880;100.0 +25/10/2020 02:06:32;U879.TC143A_OP.F_CV;10.317859650;100.0 +25/10/2020 02:06:34;U879.TC143A_OP.F_CV;8.798324585;100.0 +25/10/2020 02:06:35;U879.TC143A_OP.F_CV;12.959274292;100.0 +25/10/2020 02:06:37;U879.TC143A_OP.F_CV;7.680406094;100.0 +25/10/2020 02:06:38;U879.TC143A_OP.F_CV;11.440884590;100.0 +25/10/2020 02:06:40;U879.TC143A_OP.F_CV;8.801324844;100.0 +25/10/2020 02:06:41;U879.TC143A_OP.F_CV;11.441884041;100.0 +25/10/2020 02:06:43;U879.TC143A_OP.F_CV;10.322859764;100.0 +25/10/2020 02:06:44;U879.TC143A_OP.F_CV;8.803324699;100.0 +25/10/2020 02:06:45;U879.TC143A_OP.F_CV;9.923350334;100.0 +25/10/2020 02:06:47;U879.TC143A_OP.F_CV;11.443883896;100.0 +25/10/2020 02:06:48;U879.TC143A_OP.F_CV;10.324859619;100.0 +25/10/2020 02:06:52;U879.TC143A_OP.F_CV;8.806324959;100.0 +25/10/2020 02:06:53;U879.TC143A_OP.F_CV;9.926350594;100.0 +25/10/2020 02:06:55;U879.TC143A_OP.F_CV;11.446884155;100.0 +25/10/2020 02:06:56;U879.TC143A_OP.F_CV;8.807324409;100.0 +25/10/2020 02:06:58;U879.TC143A_OP.F_CV;9.927350044;100.0 +25/10/2020 02:06:00;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:02;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:03;U879.TC143A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:04;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:05;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:06;U879.TC143A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:07;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:08;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:09;U879.TC143A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:10;U879.TC143A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:11;U879.TC143A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:12;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:13;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:14;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:15;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:16;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:17;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:18;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:19;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:20;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:21;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:22;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:24;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:25;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:26;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:27;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:28;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:29;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:30;U879.TC143A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:31;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:32;U879.TC143A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:33;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:34;U879.TC143A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:35;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:36;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:37;U879.TC143A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:38;U879.TC143A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:39;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:40;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:41;U879.TC143A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:42;U879.TC143A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:43;U879.TC143A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:44;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:45;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:46;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:47;U879.TC143A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:48;U879.TC143A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:49;U879.TC143A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:50;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:51;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:52;U879.TC143A_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:53;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:54;U879.TC143A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:55;U879.TC143A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:56;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:57;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:58;U879.TC143A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:59;U879.TC143A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC143A_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC143B_OP.F_CV;10.278829575;100.0 +25/10/2020 02:06:02;U879.TC143B_OP.F_CV;10.201328278;100.0 +25/10/2020 02:06:19;U879.TC143B_OP.F_CV;10.118825912;100.0 +25/10/2020 02:06:22;U879.TC143B_OP.F_CV;10.196326256;100.0 +25/10/2020 02:06:23;U879.TC143B_OP.F_CV;10.113824844;100.0 +25/10/2020 02:06:28;U879.TC143B_OP.F_CV;10.176326752;100.0 +25/10/2020 02:06:32;U879.TC143B_OP.F_CV;10.006330490;100.0 +25/10/2020 02:06:34;U879.TC143B_OP.F_CV;10.161326408;100.0 +25/10/2020 02:06:37;U879.TC143B_OP.F_CV;9.996330261;100.0 +25/10/2020 02:06:38;U879.TC143B_OP.F_CV;10.151326180;100.0 +25/10/2020 02:06:39;U879.TC143B_OP.F_CV;10.068823814;100.0 +25/10/2020 02:06:43;U879.TC143B_OP.F_CV;10.141326904;100.0 +25/10/2020 02:06:45;U879.TC143B_OP.F_CV;10.058824539;100.0 +25/10/2020 02:06:46;U879.TC143B_OP.F_CV;10.136325836;100.0 +25/10/2020 02:06:50;U879.TC143B_OP.F_CV;10.053823471;100.0 +25/10/2020 02:06:55;U879.TC143B_OP.F_CV;10.121324539;100.0 +25/10/2020 02:06:00;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:02;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:03;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:04;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:05;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:06;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:07;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:08;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:09;U879.TC143B_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:10;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:11;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:12;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:13;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:14;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:15;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:16;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:17;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:18;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:19;U879.TC143B_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:20;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:21;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:22;U879.TC143B_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:23;U879.TC143B_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:24;U879.TC143B_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:25;U879.TC143B_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:26;U879.TC143B_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:27;U879.TC143B_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:28;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:29;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:30;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:31;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:32;U879.TC143B_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:33;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:34;U879.TC143B_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:35;U879.TC143B_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:36;U879.TC143B_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:37;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:38;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:39;U879.TC143B_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:40;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:41;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:42;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:43;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:44;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:45;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:46;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:47;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:48;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:49;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:50;U879.TC143B_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:51;U879.TC143B_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:52;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:53;U879.TC143B_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:54;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:55;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:56;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:57;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:58;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:59;U879.TC143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC143B_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U879.TC143C_OP.F_CV;10.208953857;100.0 +25/10/2020 02:06:06;U879.TC143C_OP.F_CV;10.053949356;100.0 +25/10/2020 02:06:07;U879.TC143C_OP.F_CV;10.131450653;100.0 +25/10/2020 02:06:23;U879.TC143C_OP.F_CV;10.213953018;100.0 +25/10/2020 02:06:25;U879.TC143C_OP.F_CV;10.136450768;100.0 +25/10/2020 02:06:41;U879.TC143C_OP.F_CV;10.218954086;100.0 +25/10/2020 02:06:43;U879.TC143C_OP.F_CV;10.141452789;100.0 +25/10/2020 02:06:44;U879.TC143C_OP.F_CV;10.223955154;100.0 +25/10/2020 02:06:46;U879.TC143C_OP.F_CV;10.146453857;100.0 +25/10/2020 02:06:51;U879.TC143C_OP.F_CV;10.228956223;100.0 +25/10/2020 02:06:55;U879.TC143C_OP.F_CV;10.161455154;100.0 +25/10/2020 02:06:58;U879.TC143C_OP.F_CV;10.243957520;100.0 +25/10/2020 02:06:59;U879.TC143C_OP.F_CV;10.166456223;100.0 +25/10/2020 02:06:00;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U879.TC143C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:02;U879.TC143C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:03;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:04;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:05;U879.TC143C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:06;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:07;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:08;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:09;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:10;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:11;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:12;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:13;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:14;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:15;U879.TC143C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:16;U879.TC143C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:17;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:18;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:19;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:20;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:21;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:22;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC143C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:24;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:25;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:26;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:27;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:28;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:29;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:30;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:31;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:32;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:33;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:34;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:35;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:36;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:37;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:38;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:39;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:40;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:41;U879.TC143C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:42;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:43;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:44;U879.TC143C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:45;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:46;U879.TC143C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:47;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:48;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:49;U879.TC143C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:50;U879.TC143C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:51;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:52;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:53;U879.TC143C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:54;U879.TC143C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:55;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:56;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:57;U879.TC143C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:58;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:59;U879.TC143C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:43;U879.TC143C_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC143D_OP.F_CV;7.413736343;100.0 +25/10/2020 02:06:01;U879.TC143D_OP.F_CV;4.775176048;100.0 +25/10/2020 02:06:03;U879.TC143D_OP.F_CV;5.896201611;100.0 +25/10/2020 02:06:04;U879.TC143D_OP.F_CV;4.376739502;100.0 +25/10/2020 02:06:06;U879.TC143D_OP.F_CV;8.537708282;100.0 +25/10/2020 02:06:07;U879.TC143D_OP.F_CV;4.779175758;100.0 +25/10/2020 02:06:09;U879.TC143D_OP.F_CV;5.900201321;100.0 +25/10/2020 02:06:10;U879.TC143D_OP.F_CV;4.380739212;100.0 +25/10/2020 02:06:12;U879.TC143D_OP.F_CV;7.021173477;100.0 +25/10/2020 02:06:13;U879.TC143D_OP.F_CV;7.422736645;100.0 +25/10/2020 02:06:15;U879.TC143D_OP.F_CV;4.784176350;100.0 +25/10/2020 02:06:17;U879.TC143D_OP.F_CV;5.905201912;100.0 +25/10/2020 02:06:19;U879.TC143D_OP.F_CV;7.427736759;100.0 +25/10/2020 02:06:21;U879.TC143D_OP.F_CV;6.309710503;100.0 +25/10/2020 02:06:22;U879.TC143D_OP.F_CV;4.791176319;100.0 +25/10/2020 02:06:28;U879.TC143D_OP.F_CV;3.992249250;100.0 +25/10/2020 02:06:30;U879.TC143D_OP.F_CV;6.631683826;100.0 +25/10/2020 02:06:34;U879.TC143D_OP.F_CV;4.392739773;100.0 +25/10/2020 02:06:36;U879.TC143D_OP.F_CV;8.553709030;100.0 +25/10/2020 02:06:38;U879.TC143D_OP.F_CV;6.315711021;100.0 +25/10/2020 02:06:40;U879.TC143D_OP.F_CV;10.078243256;100.0 +25/10/2020 02:06:42;U879.TC143D_OP.F_CV;5.200684547;100.0 +25/10/2020 02:06:44;U879.TC143D_OP.F_CV;3.281712770;100.0 +25/10/2020 02:06:46;U879.TC143D_OP.F_CV;8.562707901;100.0 +25/10/2020 02:06:47;U879.TC143D_OP.F_CV;3.283712626;100.0 +25/10/2020 02:06:49;U879.TC143D_OP.F_CV;8.564707756;100.0 +25/10/2020 02:06:50;U879.TC143D_OP.F_CV;3.285712481;100.0 +25/10/2020 02:06:52;U879.TC143D_OP.F_CV;8.566707611;100.0 +25/10/2020 02:06:53;U879.TC143D_OP.F_CV;4.808175087;100.0 +25/10/2020 02:06:55;U879.TC143D_OP.F_CV;6.331709385;100.0 +25/10/2020 02:06:58;U879.TC143D_OP.F_CV;4.813174725;100.0 +25/10/2020 02:06:59;U879.TC143D_OP.F_CV;7.454735756;100.0 +25/10/2020 02:06:00;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:01;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:02;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:03;U879.TC143D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:04;U879.TC143D_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:05;U879.TC143D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:06;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:07;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:08;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:09;U879.TC143D_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:10;U879.TC143D_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:11;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:12;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:13;U879.TC143D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:14;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:15;U879.TC143D_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:16;U879.TC143D_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:17;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:18;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:19;U879.TC143D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:20;U879.TC143D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:21;U879.TC143D_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:22;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:23;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:24;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:25;U879.TC143D_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:26;U879.TC143D_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:27;U879.TC143D_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:28;U879.TC143D_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:29;U879.TC143D_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:30;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:31;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:32;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:33;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:34;U879.TC143D_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:35;U879.TC143D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:36;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:37;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:38;U879.TC143D_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:39;U879.TC143D_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:40;U879.TC143D_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:41;U879.TC143D_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:42;U879.TC143D_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:43;U879.TC143D_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:44;U879.TC143D_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:45;U879.TC143D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:46;U879.TC143D_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:47;U879.TC143D_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:48;U879.TC143D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:49;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:50;U879.TC143D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:51;U879.TC143D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:52;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:53;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:54;U879.TC143D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:55;U879.TC143D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:56;U879.TC143D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:57;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:58;U879.TC143D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:59;U879.TC143D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:23;U879.TC143D_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:26;U879.TC143E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:01;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:02;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:03;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:04;U879.TC143E_PV.F_CV;25.700000763;100.0 +25/10/2020 02:06:05;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:06;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:07;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:08;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:09;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:10;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:11;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:12;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:13;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:14;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:15;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:16;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:17;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:18;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:19;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:20;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:21;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:22;U879.TC143E_PV.F_CV;25.399999619;100.0 +25/10/2020 02:06:23;U879.TC143E_PV.F_CV;25.399999619;100.0 +25/10/2020 02:06:24;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:25;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:26;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:27;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:28;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:29;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:30;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:31;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:32;U879.TC143E_PV.F_CV;25.700000763;100.0 +25/10/2020 02:06:33;U879.TC143E_PV.F_CV;25.700000763;100.0 +25/10/2020 02:06:34;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:35;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:36;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:37;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:38;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:39;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:40;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:41;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:42;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:43;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:44;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:45;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:46;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:47;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:48;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:49;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:50;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:51;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:52;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:53;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:54;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:55;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:56;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:57;U879.TC143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:58;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:59;U879.TC143E_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:23;U879.TC143E_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:26;U879.TC143F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U879.TC143F_PV.F_CV;26.000000000;100.0 +25/10/2020 02:06:01;U879.TC143F_PV.F_CV;26.200000763;100.0 +25/10/2020 02:06:02;U879.TC143F_PV.F_CV;26.200000763;100.0 +25/10/2020 02:06:03;U879.TC143F_PV.F_CV;26.000000000;100.0 +25/10/2020 02:06:04;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:05;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:06;U879.TC143F_PV.F_CV;26.200000763;100.0 +25/10/2020 02:06:07;U879.TC143F_PV.F_CV;26.200000763;100.0 +25/10/2020 02:06:08;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:09;U879.TC143F_PV.F_CV;26.200000763;100.0 +25/10/2020 02:06:10;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:11;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:12;U879.TC143F_PV.F_CV;26.200000763;100.0 +25/10/2020 02:06:13;U879.TC143F_PV.F_CV;26.000000000;100.0 +25/10/2020 02:06:14;U879.TC143F_PV.F_CV;26.000000000;100.0 +25/10/2020 02:06:15;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:16;U879.TC143F_PV.F_CV;26.000000000;100.0 +25/10/2020 02:06:17;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:18;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:19;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:20;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:21;U879.TC143F_PV.F_CV;26.000000000;100.0 +25/10/2020 02:06:22;U879.TC143F_PV.F_CV;26.000000000;100.0 +25/10/2020 02:06:23;U879.TC143F_PV.F_CV;26.000000000;100.0 +25/10/2020 02:06:24;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:25;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:26;U879.TC143F_PV.F_CV;26.200000763;100.0 +25/10/2020 02:06:27;U879.TC143F_PV.F_CV;26.200000763;100.0 +25/10/2020 02:06:28;U879.TC143F_PV.F_CV;26.000000000;100.0 +25/10/2020 02:06:29;U879.TC143F_PV.F_CV;26.000000000;100.0 +25/10/2020 02:06:30;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:31;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:32;U879.TC143F_PV.F_CV;26.200000763;100.0 +25/10/2020 02:06:33;U879.TC143F_PV.F_CV;26.200000763;100.0 +25/10/2020 02:06:34;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:35;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:36;U879.TC143F_PV.F_CV;26.000000000;100.0 +25/10/2020 02:06:37;U879.TC143F_PV.F_CV;26.000000000;100.0 +25/10/2020 02:06:38;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:39;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:40;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:41;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:42;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:43;U879.TC143F_PV.F_CV;26.200000763;100.0 +25/10/2020 02:06:44;U879.TC143F_PV.F_CV;26.200000763;100.0 +25/10/2020 02:06:45;U879.TC143F_PV.F_CV;26.200000763;100.0 +25/10/2020 02:06:46;U879.TC143F_PV.F_CV;26.200000763;100.0 +25/10/2020 02:06:47;U879.TC143F_PV.F_CV;26.299999237;100.0 +25/10/2020 02:06:48;U879.TC143F_PV.F_CV;26.000000000;100.0 +25/10/2020 02:06:49;U879.TC143F_PV.F_CV;26.200000763;100.0 +25/10/2020 02:06:50;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:51;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:52;U879.TC143F_PV.F_CV;26.000000000;100.0 +25/10/2020 02:06:53;U879.TC143F_PV.F_CV;26.000000000;100.0 +25/10/2020 02:06:54;U879.TC143F_PV.F_CV;26.000000000;100.0 +25/10/2020 02:06:55;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:56;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:57;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:58;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:59;U879.TC143F_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:36;U879.TC143F_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:00;U879.TC150_OP.F_CV;25.343500137;100.0 +25/10/2020 02:06:01;U879.TC150_OP.F_CV;23.822113037;100.0 +25/10/2020 02:06:03;U879.TC150_OP.F_CV;24.940031052;100.0 +25/10/2020 02:06:08;U879.TC150_OP.F_CV;24.940031052;100.0 +25/10/2020 02:06:09;U879.TC150_OP.F_CV;23.411346436;100.0 +25/10/2020 02:06:10;U879.TC150_OP.F_CV;26.049160004;100.0 +25/10/2020 02:06:13;U879.TC150_OP.F_CV;26.445417404;100.0 +25/10/2020 02:06:15;U879.TC150_OP.F_CV;25.324499130;100.0 +25/10/2020 02:06:16;U879.TC150_OP.F_CV;23.803110123;100.0 +25/10/2020 02:06:18;U879.TC150_OP.F_CV;24.921028137;100.0 +25/10/2020 02:06:23;U879.TC150_OP.F_CV;24.921028137;100.0 +25/10/2020 02:06:24;U879.TC150_OP.F_CV;26.433414459;100.0 +25/10/2020 02:06:25;U879.TC150_OP.F_CV;23.792108536;100.0 +25/10/2020 02:06:27;U879.TC150_OP.F_CV;26.430416107;100.0 +25/10/2020 02:06:28;U879.TC150_OP.F_CV;25.309499741;100.0 +25/10/2020 02:06:30;U879.TC150_OP.F_CV;23.788110733;100.0 +25/10/2020 02:06:31;U879.TC150_OP.F_CV;26.426420212;100.0 +25/10/2020 02:06:36;U879.TC150_OP.F_CV;26.426420212;100.0 +25/10/2020 02:06:37;U879.TC150_OP.F_CV;25.302501678;100.0 +25/10/2020 02:06:38;U879.TC150_OP.F_CV;23.781114578;100.0 +25/10/2020 02:06:40;U879.TC150_OP.F_CV;24.897029877;100.0 +25/10/2020 02:06:43;U879.TC150_OP.F_CV;26.415422440;100.0 +25/10/2020 02:06:44;U879.TC150_OP.F_CV;25.294504166;100.0 +25/10/2020 02:06:49;U879.TC150_OP.F_CV;25.294504166;100.0 +25/10/2020 02:06:50;U879.TC150_OP.F_CV;23.770116806;100.0 +25/10/2020 02:06:52;U879.TC150_OP.F_CV;24.888034821;100.0 +25/10/2020 02:06:53;U879.TC150_OP.F_CV;26.406425476;100.0 +25/10/2020 02:06:55;U879.TC150_OP.F_CV;25.285507202;100.0 +25/10/2020 02:06:56;U879.TC150_OP.F_CV;23.764118195;100.0 +25/10/2020 02:06:58;U879.TC150_OP.F_CV;24.882036209;100.0 +25/10/2020 02:06:59;U879.TC150_OP.F_CV;26.400426865;100.0 +25/10/2020 02:06:08;U879.TC150_PV.F_CV;110.300003052;100.0 +25/10/2020 02:06:09;U879.TC150_PV.F_CV;110.099998474;100.0 +25/10/2020 02:06:23;U879.TC150_SP.F_CV;110.000000000;100.0 +25/10/2020 02:06:23;U879.TC189_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:40;U879.TC190_SP.F_CV;100.000000000;100.0 +25/10/2020 02:06:01;U879.TC191_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC192_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC193_SP.F_CV;100.000000000;100.0 +25/10/2020 02:06:43;U879.TC194_SP.F_CV;100.000000000;100.0 +25/10/2020 02:06:23;U879.TC195_SP.F_CV;95.000000000;100.0 +25/10/2020 02:06:23;U879.TC196_SP.F_CV;100.000000000;100.0 +25/10/2020 02:06:23;U879.TC198_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC199_SP.F_CV;95.000000000;100.0 +25/10/2020 02:06:00;U879.TC201A_OP.F_CV;14.873012543;100.0 +25/10/2020 02:06:01;U879.TC201A_OP.F_CV;15.270629883;100.0 +25/10/2020 02:06:03;U879.TC201A_OP.F_CV;15.540495872;100.0 +25/10/2020 02:06:04;U879.TC201A_OP.F_CV;15.810403824;100.0 +25/10/2020 02:06:05;U879.TC201A_OP.F_CV;14.873199463;100.0 +25/10/2020 02:06:07;U879.TC201A_OP.F_CV;15.810674667;100.0 +25/10/2020 02:06:08;U879.TC201A_OP.F_CV;14.873470306;100.0 +25/10/2020 02:06:10;U879.TC201A_OP.F_CV;14.731373787;100.0 +25/10/2020 02:06:11;U879.TC201A_OP.F_CV;16.208101273;100.0 +25/10/2020 02:06:13;U879.TC201A_OP.F_CV;14.873344421;100.0 +25/10/2020 02:06:14;U879.TC201A_OP.F_CV;14.731248856;100.0 +25/10/2020 02:06:17;U879.TC201A_OP.F_CV;15.270522118;100.0 +25/10/2020 02:06:19;U879.TC201A_OP.F_CV;14.730767250;100.0 +25/10/2020 02:06:20;U879.TC201A_OP.F_CV;15.667635918;100.0 +25/10/2020 02:06:23;U879.TC201A_OP.F_CV;14.730287552;100.0 +25/10/2020 02:06:25;U879.TC201A_OP.F_CV;15.667155266;100.0 +25/10/2020 02:06:26;U879.TC201A_OP.F_CV;15.269561768;100.0 +25/10/2020 02:06:30;U879.TC201A_OP.F_CV;15.539384842;100.0 +25/10/2020 02:06:31;U879.TC201A_OP.F_CV;15.809292793;100.0 +25/10/2020 02:06:32;U879.TC201A_OP.F_CV;14.332376480;100.0 +25/10/2020 02:06:34;U879.TC201A_OP.F_CV;16.206762314;100.0 +25/10/2020 02:06:35;U879.TC201A_OP.F_CV;14.872005463;100.0 +25/10/2020 02:06:37;U879.TC201A_OP.F_CV;14.729908943;100.0 +25/10/2020 02:06:38;U879.TC201A_OP.F_CV;15.127064705;100.0 +25/10/2020 02:06:44;U879.TC201A_OP.F_CV;15.127064705;100.0 +25/10/2020 02:06:46;U879.TC201A_OP.F_CV;15.664794922;100.0 +25/10/2020 02:06:47;U879.TC201A_OP.F_CV;15.267200470;100.0 +25/10/2020 02:06:52;U879.TC201A_OP.F_CV;15.267200470;100.0 +25/10/2020 02:06:53;U879.TC201A_OP.F_CV;14.727318764;100.0 +25/10/2020 02:06:55;U879.TC201A_OP.F_CV;15.124474525;100.0 +25/10/2020 02:06:56;U879.TC201A_OP.F_CV;15.663790703;100.0 +25/10/2020 02:06:58;U879.TC201A_OP.F_CV;15.266197205;100.0 +25/10/2020 02:06:20;U879.TC201A_PV.F_CV;403.011749268;100.0 +25/10/2020 02:06:23;U879.TC201A_SP.F_CV;403.000000000;100.0 +25/10/2020 02:06:00;U879.TC201B_OP.F_CV;15.721895218;100.0 +25/10/2020 02:06:01;U879.TC201B_OP.F_CV;15.321740150;100.0 +25/10/2020 02:06:03;U879.TC201B_OP.F_CV;15.050345421;100.0 +25/10/2020 02:06:04;U879.TC201B_OP.F_CV;14.778671265;100.0 +25/10/2020 02:06:05;U879.TC201B_OP.F_CV;15.179030418;100.0 +25/10/2020 02:06:09;U879.TC201B_OP.F_CV;15.450651169;100.0 +25/10/2020 02:06:10;U879.TC201B_OP.F_CV;15.722426414;100.0 +25/10/2020 02:06:11;U879.TC201B_OP.F_CV;15.865319252;100.0 +25/10/2020 02:06:13;U879.TC201B_OP.F_CV;14.922899246;100.0 +25/10/2020 02:06:14;U879.TC201B_OP.F_CV;14.779560089;100.0 +25/10/2020 02:06:17;U879.TC201B_OP.F_CV;15.323390961;100.0 +25/10/2020 02:06:19;U879.TC201B_OP.F_CV;14.780042648;100.0 +25/10/2020 02:06:20;U879.TC201B_OP.F_CV;15.724029541;100.0 +25/10/2020 02:06:23;U879.TC201B_OP.F_CV;15.180603981;100.0 +25/10/2020 02:06:26;U879.TC201B_OP.F_CV;15.724077225;100.0 +25/10/2020 02:06:28;U879.TC201B_OP.F_CV;15.323920250;100.0 +25/10/2020 02:06:29;U879.TC201B_OP.F_CV;14.780571938;100.0 +25/10/2020 02:06:31;U879.TC201B_OP.F_CV;15.724558830;100.0 +25/10/2020 02:06:32;U879.TC201B_OP.F_CV;15.324403763;100.0 +25/10/2020 02:06:34;U879.TC201B_OP.F_CV;15.867732048;100.0 +25/10/2020 02:06:35;U879.TC201B_OP.F_CV;15.468358994;100.0 +25/10/2020 02:06:37;U879.TC201B_OP.F_CV;14.925949097;100.0 +25/10/2020 02:06:38;U879.TC201B_OP.F_CV;15.869286537;100.0 +25/10/2020 02:06:40;U879.TC201B_OP.F_CV;15.469914436;100.0 +25/10/2020 02:06:41;U879.TC201B_OP.F_CV;14.927503586;100.0 +25/10/2020 02:06:43;U879.TC201B_OP.F_CV;16.414178848;100.0 +25/10/2020 02:06:44;U879.TC201B_OP.F_CV;14.528553963;100.0 +25/10/2020 02:06:46;U879.TC201B_OP.F_CV;15.872115135;100.0 +25/10/2020 02:06:47;U879.TC201B_OP.F_CV;14.929694176;100.0 +25/10/2020 02:06:49;U879.TC201B_OP.F_CV;15.873031616;100.0 +25/10/2020 02:06:50;U879.TC201B_OP.F_CV;15.473660469;100.0 +25/10/2020 02:06:53;U879.TC201B_OP.F_CV;16.417924881;100.0 +25/10/2020 02:06:55;U879.TC201B_OP.F_CV;15.075349808;100.0 +25/10/2020 02:06:56;U879.TC201B_OP.F_CV;15.476209641;100.0 +25/10/2020 02:06:59;U879.TC201B_OP.F_CV;16.020820618;100.0 +25/10/2020 02:06:20;U879.TC201B_PV.F_CV;402.021697998;100.0 +25/10/2020 02:06:23;U879.TC201B_SP.F_CV;402.000000000;100.0 +25/10/2020 02:06:01;U879.TC201C_OP.F_CV;15.502450943;100.0 +25/10/2020 02:06:02;U879.TC201C_OP.F_CV;14.558247566;100.0 +25/10/2020 02:06:04;U879.TC201C_OP.F_CV;15.501314163;100.0 +25/10/2020 02:06:05;U879.TC201C_OP.F_CV;15.643932343;100.0 +25/10/2020 02:06:07;U879.TC201C_OP.F_CV;14.700340271;100.0 +25/10/2020 02:06:08;U879.TC201C_OP.F_CV;15.643511772;100.0 +25/10/2020 02:06:10;U879.TC201C_OP.F_CV;14.699917793;100.0 +25/10/2020 02:06:11;U879.TC201C_OP.F_CV;15.643090248;100.0 +25/10/2020 02:06:13;U879.TC201C_OP.F_CV;15.242834091;100.0 +25/10/2020 02:06:14;U879.TC201C_OP.F_CV;14.699464798;100.0 +25/10/2020 02:06:17;U879.TC201C_OP.F_CV;15.642247200;100.0 +25/10/2020 02:06:19;U879.TC201C_OP.F_CV;15.241991997;100.0 +25/10/2020 02:06:26;U879.TC201C_OP.F_CV;15.241991997;100.0 +25/10/2020 02:06:28;U879.TC201C_OP.F_CV;14.698458672;100.0 +25/10/2020 02:06:29;U879.TC201C_OP.F_CV;15.641630173;100.0 +25/10/2020 02:06:31;U879.TC201C_OP.F_CV;14.698038101;100.0 +25/10/2020 02:06:32;U879.TC201C_OP.F_CV;15.641209602;100.0 +25/10/2020 02:06:34;U879.TC201C_OP.F_CV;15.240954399;100.0 +25/10/2020 02:06:35;U879.TC201C_OP.F_CV;14.697584152;100.0 +25/10/2020 02:06:37;U879.TC201C_OP.F_CV;15.097417831;100.0 +25/10/2020 02:06:38;U879.TC201C_OP.F_CV;14.553544998;100.0 +25/10/2020 02:06:40;U879.TC201C_OP.F_CV;16.039949417;100.0 +25/10/2020 02:06:41;U879.TC201C_OP.F_CV;14.696025848;100.0 +25/10/2020 02:06:43;U879.TC201C_OP.F_CV;15.095860481;100.0 +25/10/2020 02:06:44;U879.TC201C_OP.F_CV;14.551986694;100.0 +25/10/2020 02:06:46;U879.TC201C_OP.F_CV;16.038391113;100.0 +25/10/2020 02:06:47;U879.TC201C_OP.F_CV;14.694468498;100.0 +25/10/2020 02:06:49;U879.TC201C_OP.F_CV;15.094301224;100.0 +25/10/2020 02:06:50;U879.TC201C_OP.F_CV;15.637250900;100.0 +25/10/2020 02:06:54;U879.TC201C_OP.F_CV;15.436701775;100.0 +25/10/2020 02:06:55;U879.TC201C_OP.F_CV;15.236574173;100.0 +25/10/2020 02:06:56;U879.TC201C_OP.F_CV;15.780170441;100.0 +25/10/2020 02:06:58;U879.TC201C_OP.F_CV;14.293092728;100.0 +25/10/2020 02:06:59;U879.TC201C_OP.F_CV;15.636701584;100.0 +25/10/2020 02:06:59;U879.TC201C_PV.F_CV;409.983886719;100.0 +25/10/2020 02:06:23;U879.TC201C_SP.F_CV;410.000000000;100.0 +25/10/2020 02:06:01;U879.TC201D_OP.F_CV;11.732632637;100.0 +25/10/2020 02:06:02;U879.TC201D_OP.F_CV;11.334648132;100.0 +25/10/2020 02:06:04;U879.TC201D_OP.F_CV;10.794234276;100.0 +25/10/2020 02:06:05;U879.TC201D_OP.F_CV;11.733221054;100.0 +25/10/2020 02:06:07;U879.TC201D_OP.F_CV;11.335235596;100.0 +25/10/2020 02:06:08;U879.TC201D_OP.F_CV;10.794821739;100.0 +25/10/2020 02:06:10;U879.TC201D_OP.F_CV;12.274826050;100.0 +25/10/2020 02:06:11;U879.TC201D_OP.F_CV;10.396937370;100.0 +25/10/2020 02:06:13;U879.TC201D_OP.F_CV;11.193710327;100.0 +25/10/2020 02:06:17;U879.TC201D_OP.F_CV;11.734314919;100.0 +25/10/2020 02:06:19;U879.TC201D_OP.F_CV;11.336329460;100.0 +25/10/2020 02:06:21;U879.TC201D_OP.F_CV;11.156611443;100.0 +25/10/2020 02:06:23;U879.TC201D_OP.F_CV;10.796545029;100.0 +25/10/2020 02:06:26;U879.TC201D_OP.F_CV;12.276508331;100.0 +25/10/2020 02:06:28;U879.TC201D_OP.F_CV;10.398618698;100.0 +25/10/2020 02:06:29;U879.TC201D_OP.F_CV;11.195392609;100.0 +25/10/2020 02:06:32;U879.TC201D_OP.F_CV;11.736037254;100.0 +25/10/2020 02:06:34;U879.TC201D_OP.F_CV;10.797324181;100.0 +25/10/2020 02:06:35;U879.TC201D_OP.F_CV;11.195583344;100.0 +25/10/2020 02:06:38;U879.TC201D_OP.F_CV;10.797555923;100.0 +25/10/2020 02:06:40;U879.TC201D_OP.F_CV;11.195815086;100.0 +25/10/2020 02:06:44;U879.TC201D_OP.F_CV;11.195815086;100.0 +25/10/2020 02:06:46;U879.TC201D_OP.F_CV;11.736377716;100.0 +25/10/2020 02:06:47;U879.TC201D_OP.F_CV;11.338393211;100.0 +25/10/2020 02:06:55;U879.TC201D_OP.F_CV;11.338393211;100.0 +25/10/2020 02:06:56;U879.TC201D_OP.F_CV;10.799552917;100.0 +25/10/2020 02:06:58;U879.TC201D_OP.F_CV;11.738539696;100.0 +25/10/2020 02:06:59;U879.TC201D_OP.F_CV;10.799825668;100.0 +25/10/2020 02:06:23;U879.TC201D_PV.F_CV;350.011535645;100.0 +25/10/2020 02:06:23;U879.TC201D_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:01;U879.TC201E_OP.F_CV;10.787563324;100.0 +25/10/2020 02:06:02;U879.TC201E_OP.F_CV;10.930386543;100.0 +25/10/2020 02:06:04;U879.TC201E_OP.F_CV;9.446240425;100.0 +25/10/2020 02:06:05;U879.TC201E_OP.F_CV;10.244558334;100.0 +25/10/2020 02:06:07;U879.TC201E_OP.F_CV;10.786104202;100.0 +25/10/2020 02:06:08;U879.TC201E_OP.F_CV;9.844282150;100.0 +25/10/2020 02:06:10;U879.TC201E_OP.F_CV;10.785196304;100.0 +25/10/2020 02:06:11;U879.TC201E_OP.F_CV;10.385552406;100.0 +25/10/2020 02:06:13;U879.TC201E_OP.F_CV;9.843098640;100.0 +25/10/2020 02:06:14;U879.TC201E_OP.F_CV;10.784011841;100.0 +25/10/2020 02:06:16;U879.TC201E_OP.F_CV;10.926836967;100.0 +25/10/2020 02:06:17;U879.TC201E_OP.F_CV;9.984868050;100.0 +25/10/2020 02:06:19;U879.TC201E_OP.F_CV;10.926641464;100.0 +25/10/2020 02:06:20;U879.TC201E_OP.F_CV;9.984673500;100.0 +25/10/2020 02:06:22;U879.TC201E_OP.F_CV;10.383978844;100.0 +25/10/2020 02:06:30;U879.TC201E_OP.F_CV;10.515420914;100.0 +25/10/2020 02:06:32;U879.TC201E_OP.F_CV;10.781062126;100.0 +25/10/2020 02:06:34;U879.TC201E_OP.F_CV;9.839240074;100.0 +25/10/2020 02:06:35;U879.TC201E_OP.F_CV;10.780153275;100.0 +25/10/2020 02:06:37;U879.TC201E_OP.F_CV;10.380510330;100.0 +25/10/2020 02:06:38;U879.TC201E_OP.F_CV;10.922702789;100.0 +25/10/2020 02:06:40;U879.TC201E_OP.F_CV;9.980733871;100.0 +25/10/2020 02:06:41;U879.TC201E_OP.F_CV;10.380040169;100.0 +25/10/2020 02:06:43;U879.TC201E_OP.F_CV;10.922232628;100.0 +25/10/2020 02:06:44;U879.TC201E_OP.F_CV;9.980263710;100.0 +25/10/2020 02:06:46;U879.TC201E_OP.F_CV;10.379570007;100.0 +25/10/2020 02:06:48;U879.TC201E_OP.F_CV;10.650390625;100.0 +25/10/2020 02:06:49;U879.TC201E_OP.F_CV;10.921486855;100.0 +25/10/2020 02:06:50;U879.TC201E_OP.F_CV;9.979517937;100.0 +25/10/2020 02:06:54;U879.TC201E_OP.F_CV;10.450209618;100.0 +25/10/2020 02:06:55;U879.TC201E_OP.F_CV;10.921096802;100.0 +25/10/2020 02:06:56;U879.TC201E_OP.F_CV;10.521596909;100.0 +25/10/2020 02:06:59;U879.TC201E_OP.F_CV;9.979290962;100.0 +25/10/2020 02:06:08;U879.TC201E_PV.F_CV;321.127197266;100.0 +25/10/2020 02:06:23;U879.TC201E_SP.F_CV;321.000000000;100.0 +25/10/2020 02:06:00;U879.TC201F_OP.F_CV;14.742938995;100.0 +25/10/2020 02:06:02;U879.TC201F_OP.F_CV;15.013832092;100.0 +25/10/2020 02:06:03;U879.TC201F_OP.F_CV;15.284807205;100.0 +25/10/2020 02:06:04;U879.TC201F_OP.F_CV;14.343786240;100.0 +25/10/2020 02:06:05;U879.TC201F_OP.F_CV;14.742964745;100.0 +25/10/2020 02:06:11;U879.TC201F_OP.F_CV;14.742964745;100.0 +25/10/2020 02:06:13;U879.TC201F_OP.F_CV;15.284582138;100.0 +25/10/2020 02:06:14;U879.TC201F_OP.F_CV;14.343562126;100.0 +25/10/2020 02:06:16;U879.TC201F_OP.F_CV;15.284773827;100.0 +25/10/2020 02:06:17;U879.TC201F_OP.F_CV;14.343751907;100.0 +25/10/2020 02:06:19;U879.TC201F_OP.F_CV;14.742930412;100.0 +25/10/2020 02:06:36;U879.TC201F_OP.F_CV;14.922640800;100.0 +25/10/2020 02:06:38;U879.TC201F_OP.F_CV;15.283885002;100.0 +25/10/2020 02:06:40;U879.TC201F_OP.F_CV;14.884898186;100.0 +25/10/2020 02:06:42;U879.TC201F_OP.F_CV;14.614292145;100.0 +25/10/2020 02:06:43;U879.TC201F_OP.F_CV;14.343411446;100.0 +25/10/2020 02:06:44;U879.TC201F_OP.F_CV;14.742589951;100.0 +25/10/2020 02:06:51;U879.TC201F_OP.F_CV;14.922881126;100.0 +25/10/2020 02:06:53;U879.TC201F_OP.F_CV;15.284125328;100.0 +25/10/2020 02:06:55;U879.TC201F_OP.F_CV;14.343105316;100.0 +25/10/2020 02:06:56;U879.TC201F_OP.F_CV;15.284316063;100.0 +25/10/2020 02:06:58;U879.TC201F_OP.F_CV;14.343296051;100.0 +25/10/2020 02:06:59;U879.TC201F_OP.F_CV;14.742473602;100.0 +25/10/2020 02:06:28;U879.TC201F_PV.F_CV;349.998229980;100.0 +25/10/2020 02:06:23;U879.TC201F_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:02;U879.TC202A_OP.F_CV;8.895531654;100.0 +25/10/2020 02:06:04;U879.TC202A_OP.F_CV;10.375231743;100.0 +25/10/2020 02:06:05;U879.TC202A_OP.F_CV;9.037047386;100.0 +25/10/2020 02:06:07;U879.TC202A_OP.F_CV;9.435067177;100.0 +25/10/2020 02:06:08;U879.TC202A_OP.F_CV;9.975590706;100.0 +25/10/2020 02:06:10;U879.TC202A_OP.F_CV;9.576938629;100.0 +25/10/2020 02:06:16;U879.TC202A_OP.F_CV;9.481099129;100.0 +25/10/2020 02:06:18;U879.TC202A_OP.F_CV;9.162630081;100.0 +25/10/2020 02:06:19;U879.TC202A_OP.F_CV;8.891874313;100.0 +25/10/2020 02:06:20;U879.TC202A_OP.F_CV;9.830555916;100.0 +25/10/2020 02:06:22;U879.TC202A_OP.F_CV;9.924900055;100.0 +25/10/2020 02:06:24;U879.TC202A_OP.F_CV;9.502236366;100.0 +25/10/2020 02:06:25;U879.TC202A_OP.F_CV;9.032401085;100.0 +25/10/2020 02:06:26;U879.TC202A_OP.F_CV;9.430420876;100.0 +25/10/2020 02:06:28;U879.TC202A_OP.F_CV;9.970944405;100.0 +25/10/2020 02:06:29;U879.TC202A_OP.F_CV;9.031273842;100.0 +25/10/2020 02:06:31;U879.TC202A_OP.F_CV;9.970311165;100.0 +25/10/2020 02:06:32;U879.TC202A_OP.F_CV;9.030640602;100.0 +25/10/2020 02:06:34;U879.TC202A_OP.F_CV;9.969677925;100.0 +25/10/2020 02:06:35;U879.TC202A_OP.F_CV;9.030007362;100.0 +25/10/2020 02:06:37;U879.TC202A_OP.F_CV;9.428027153;100.0 +25/10/2020 02:06:38;U879.TC202A_OP.F_CV;9.968549728;100.0 +25/10/2020 02:06:40;U879.TC202A_OP.F_CV;9.028880119;100.0 +25/10/2020 02:06:41;U879.TC202A_OP.F_CV;8.885881424;100.0 +25/10/2020 02:06:43;U879.TC202A_OP.F_CV;9.283544540;100.0 +25/10/2020 02:06:45;U879.TC202A_OP.F_CV;9.552778244;100.0 +25/10/2020 02:06:46;U879.TC202A_OP.F_CV;9.822861671;100.0 +25/10/2020 02:06:47;U879.TC202A_OP.F_CV;9.423853874;100.0 +25/10/2020 02:06:49;U879.TC202A_OP.F_CV;9.964377403;100.0 +25/10/2020 02:06:50;U879.TC202A_OP.F_CV;9.565725327;100.0 +25/10/2020 02:06:52;U879.TC202A_OP.F_CV;9.024568558;100.0 +25/10/2020 02:06:53;U879.TC202A_OP.F_CV;9.422588348;100.0 +25/10/2020 02:06:55;U879.TC202A_OP.F_CV;9.963110924;100.0 +25/10/2020 02:06:56;U879.TC202A_OP.F_CV;9.564459801;100.0 +25/10/2020 02:06:58;U879.TC202A_OP.F_CV;8.482285500;100.0 +25/10/2020 02:06:59;U879.TC202A_OP.F_CV;10.360499382;100.0 +25/10/2020 02:06:17;U879.TC202A_PV.F_CV;403.138458252;100.0 +25/10/2020 02:06:23;U879.TC202A_SP.F_CV;403.000000000;100.0 +25/10/2020 02:06:00;U879.TC202B_OP.F_CV;10.357739449;100.0 +25/10/2020 02:06:02;U879.TC202B_OP.F_CV;9.816226006;100.0 +25/10/2020 02:06:04;U879.TC202B_OP.F_CV;11.302417755;100.0 +25/10/2020 02:06:05;U879.TC202B_OP.F_CV;9.960510254;100.0 +25/10/2020 02:06:07;U879.TC202B_OP.F_CV;9.818310738;100.0 +25/10/2020 02:06:08;U879.TC202B_OP.F_CV;10.761453629;100.0 +25/10/2020 02:06:10;U879.TC202B_OP.F_CV;10.362245560;100.0 +25/10/2020 02:06:12;U879.TC202B_OP.F_CV;10.634813309;100.0 +25/10/2020 02:06:13;U879.TC202B_OP.F_CV;10.906683922;100.0 +25/10/2020 02:06:14;U879.TC202B_OP.F_CV;9.964679718;100.0 +25/10/2020 02:06:18;U879.TC202B_OP.F_CV;10.166778564;100.0 +25/10/2020 02:06:21;U879.TC202B_OP.F_CV;10.682486534;100.0 +25/10/2020 02:06:23;U879.TC202B_OP.F_CV;11.311808586;100.0 +25/10/2020 02:06:26;U879.TC202B_OP.F_CV;10.370606422;100.0 +25/10/2020 02:06:29;U879.TC202B_OP.F_CV;10.915044785;100.0 +25/10/2020 02:06:31;U879.TC202B_OP.F_CV;10.516087532;100.0 +25/10/2020 02:06:32;U879.TC202B_OP.F_CV;9.974091530;100.0 +25/10/2020 02:06:34;U879.TC202B_OP.F_CV;10.374795914;100.0 +25/10/2020 02:06:36;U879.TC202B_OP.F_CV;10.104386330;100.0 +25/10/2020 02:06:37;U879.TC202B_OP.F_CV;9.833282471;100.0 +25/10/2020 02:06:38;U879.TC202B_OP.F_CV;10.776425362;100.0 +25/10/2020 02:06:40;U879.TC202B_OP.F_CV;10.920266151;100.0 +25/10/2020 02:06:41;U879.TC202B_OP.F_CV;9.978260994;100.0 +25/10/2020 02:06:43;U879.TC202B_OP.F_CV;10.378964424;100.0 +25/10/2020 02:06:44;U879.TC202B_OP.F_CV;10.922708511;100.0 +25/10/2020 02:06:46;U879.TC202B_OP.F_CV;10.523751259;100.0 +25/10/2020 02:06:47;U879.TC202B_OP.F_CV;9.981755257;100.0 +25/10/2020 02:06:49;U879.TC202B_OP.F_CV;10.382459641;100.0 +25/10/2020 02:06:58;U879.TC202B_OP.F_CV;10.382459641;100.0 +25/10/2020 02:06:59;U879.TC202B_OP.F_CV;10.930373192;100.0 +25/10/2020 02:06:54;U879.TC202B_PV.F_CV;401.717956543;100.0 +25/10/2020 02:06:23;U879.TC202B_SP.F_CV;402.000000000;100.0 +25/10/2020 02:06:01;U879.TC202C_OP.F_CV;9.638833046;100.0 +25/10/2020 02:06:02;U879.TC202C_OP.F_CV;10.580188751;100.0 +25/10/2020 02:06:04;U879.TC202C_OP.F_CV;9.638807297;100.0 +25/10/2020 02:06:05;U879.TC202C_OP.F_CV;10.037985802;100.0 +25/10/2020 02:06:10;U879.TC202C_OP.F_CV;10.037985802;100.0 +25/10/2020 02:06:11;U879.TC202C_OP.F_CV;9.494754791;100.0 +25/10/2020 02:06:13;U879.TC202C_OP.F_CV;9.893789291;100.0 +25/10/2020 02:06:17;U879.TC202C_OP.F_CV;9.636378288;100.0 +25/10/2020 02:06:19;U879.TC202C_OP.F_CV;10.035555840;100.0 +25/10/2020 02:06:20;U879.TC202C_OP.F_CV;10.577542305;100.0 +25/10/2020 02:06:24;U879.TC202C_OP.F_CV;9.902209282;100.0 +25/10/2020 02:06:26;U879.TC202C_OP.F_CV;9.635947227;100.0 +25/10/2020 02:06:28;U879.TC202C_OP.F_CV;10.577302933;100.0 +25/10/2020 02:06:29;U879.TC202C_OP.F_CV;9.635922432;100.0 +25/10/2020 02:06:31;U879.TC202C_OP.F_CV;10.035099983;100.0 +25/10/2020 02:06:35;U879.TC202C_OP.F_CV;10.576705933;100.0 +25/10/2020 02:06:37;U879.TC202C_OP.F_CV;9.635325432;100.0 +25/10/2020 02:06:38;U879.TC202C_OP.F_CV;10.034502983;100.0 +25/10/2020 02:06:40;U879.TC202C_OP.F_CV;9.491844177;100.0 +25/10/2020 02:06:41;U879.TC202C_OP.F_CV;10.975524902;100.0 +25/10/2020 02:06:43;U879.TC202C_OP.F_CV;9.634562492;100.0 +25/10/2020 02:06:44;U879.TC202C_OP.F_CV;9.491271973;100.0 +25/10/2020 02:06:46;U879.TC202C_OP.F_CV;9.890306473;100.0 +25/10/2020 02:06:48;U879.TC202C_OP.F_CV;10.160718918;100.0 +25/10/2020 02:06:49;U879.TC202C_OP.F_CV;10.431679726;100.0 +25/10/2020 02:06:50;U879.TC202C_OP.F_CV;9.489439011;100.0 +25/10/2020 02:06:53;U879.TC202C_OP.F_CV;10.031168938;100.0 +25/10/2020 02:06:59;U879.TC202C_OP.F_CV;10.031168938;100.0 +25/10/2020 02:06:08;U879.TC202C_PV.F_CV;410.103271484;100.0 +25/10/2020 02:06:23;U879.TC202C_SP.F_CV;410.000000000;100.0 +25/10/2020 02:06:01;U879.TC202D_OP.F_CV;9.172001839;100.0 +25/10/2020 02:06:02;U879.TC202D_OP.F_CV;10.112478256;100.0 +25/10/2020 02:06:04;U879.TC202D_OP.F_CV;9.713113785;100.0 +25/10/2020 02:06:06;U879.TC202D_OP.F_CV;9.984033585;100.0 +25/10/2020 02:06:07;U879.TC202D_OP.F_CV;10.255162239;100.0 +25/10/2020 02:06:08;U879.TC202D_OP.F_CV;9.855726242;100.0 +25/10/2020 02:06:10;U879.TC202D_OP.F_CV;9.313405991;100.0 +25/10/2020 02:06:11;U879.TC202D_OP.F_CV;10.255246162;100.0 +25/10/2020 02:06:13;U879.TC202D_OP.F_CV;9.855811119;100.0 +25/10/2020 02:06:14;U879.TC202D_OP.F_CV;10.398281097;100.0 +25/10/2020 02:06:16;U879.TC202D_OP.F_CV;8.914518356;100.0 +25/10/2020 02:06:17;U879.TC202D_OP.F_CV;10.255833626;100.0 +25/10/2020 02:06:19;U879.TC202D_OP.F_CV;9.313930511;100.0 +25/10/2020 02:06:20;U879.TC202D_OP.F_CV;9.713302612;100.0 +25/10/2020 02:06:23;U879.TC202D_OP.F_CV;10.255351067;100.0 +25/10/2020 02:06:26;U879.TC202D_OP.F_CV;9.712820053;100.0 +25/10/2020 02:06:29;U879.TC202D_OP.F_CV;10.254867554;100.0 +25/10/2020 02:06:33;U879.TC202D_OP.F_CV;9.783853531;100.0 +25/10/2020 02:06:34;U879.TC202D_OP.F_CV;9.312902451;100.0 +25/10/2020 02:06:35;U879.TC202D_OP.F_CV;10.254742622;100.0 +25/10/2020 02:06:38;U879.TC202D_OP.F_CV;9.712211609;100.0 +25/10/2020 02:06:40;U879.TC202D_OP.F_CV;10.254469872;100.0 +25/10/2020 02:06:41;U879.TC202D_OP.F_CV;9.855034828;100.0 +25/10/2020 02:06:44;U879.TC202D_OP.F_CV;10.397650719;100.0 +25/10/2020 02:06:46;U879.TC202D_OP.F_CV;8.913888931;100.0 +25/10/2020 02:06:47;U879.TC202D_OP.F_CV;9.712736130;100.0 +25/10/2020 02:06:50;U879.TC202D_OP.F_CV;10.797107697;100.0 +25/10/2020 02:06:55;U879.TC202D_OP.F_CV;9.855643272;100.0 +25/10/2020 02:06:56;U879.TC202D_OP.F_CV;9.313322067;100.0 +25/10/2020 02:06:58;U879.TC202D_OP.F_CV;9.712694168;100.0 +25/10/2020 02:06:59;U879.TC202D_OP.F_CV;10.797275543;100.0 +25/10/2020 02:06:07;U879.TC202D_PV.F_CV;350.058654785;100.0 +25/10/2020 02:06:23;U879.TC202D_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:04;U879.TC202E_OP.F_CV;5.629487991;100.0 +25/10/2020 02:06:05;U879.TC202E_OP.F_CV;5.088305473;100.0 +25/10/2020 02:06:07;U879.TC202E_OP.F_CV;6.029168129;100.0 +25/10/2020 02:06:08;U879.TC202E_OP.F_CV;5.630189896;100.0 +25/10/2020 02:06:10;U879.TC202E_OP.F_CV;5.088478088;100.0 +25/10/2020 02:06:11;U879.TC202E_OP.F_CV;6.570794106;100.0 +25/10/2020 02:06:13;U879.TC202E_OP.F_CV;4.689996719;100.0 +25/10/2020 02:06:14;U879.TC202E_OP.F_CV;6.029693604;100.0 +25/10/2020 02:06:16;U879.TC202E_OP.F_CV;5.630715370;100.0 +25/10/2020 02:06:20;U879.TC202E_OP.F_CV;5.630715370;100.0 +25/10/2020 02:06:22;U879.TC202E_OP.F_CV;5.089532852;100.0 +25/10/2020 02:06:23;U879.TC202E_OP.F_CV;6.571848392;100.0 +25/10/2020 02:06:26;U879.TC202E_OP.F_CV;5.488860130;100.0 +25/10/2020 02:06:29;U879.TC202E_OP.F_CV;6.030388832;100.0 +25/10/2020 02:06:33;U879.TC202E_OP.F_CV;5.830895901;100.0 +25/10/2020 02:06:34;U879.TC202E_OP.F_CV;5.631406784;100.0 +25/10/2020 02:06:35;U879.TC202E_OP.F_CV;6.173036575;100.0 +25/10/2020 02:06:37;U879.TC202E_OP.F_CV;5.233281612;100.0 +25/10/2020 02:06:38;U879.TC202E_OP.F_CV;6.173746109;100.0 +25/10/2020 02:06:40;U879.TC202E_OP.F_CV;5.775444031;100.0 +25/10/2020 02:06:42;U879.TC202E_OP.F_CV;5.505517006;100.0 +25/10/2020 02:06:43;U879.TC202E_OP.F_CV;5.235056877;100.0 +25/10/2020 02:06:44;U879.TC202E_OP.F_CV;5.634067059;100.0 +25/10/2020 02:06:46;U879.TC202E_OP.F_CV;6.175696850;100.0 +25/10/2020 02:06:47;U879.TC202E_OP.F_CV;5.777395725;100.0 +25/10/2020 02:06:51;U879.TC202E_OP.F_CV;5.417702198;100.0 +25/10/2020 02:06:53;U879.TC202E_OP.F_CV;4.696185112;100.0 +25/10/2020 02:06:55;U879.TC202E_OP.F_CV;6.577334881;100.0 +25/10/2020 02:06:56;U879.TC202E_OP.F_CV;5.779879093;100.0 +25/10/2020 02:06:18;U879.TC202E_PV.F_CV;320.950592041;100.0 +25/10/2020 02:06:10;U879.TC202E_SP.F_CV;321.000000000;100.0 +25/10/2020 02:06:00;U879.TC202F_OP.F_CV;9.861714363;100.0 +25/10/2020 02:06:01;U879.TC202F_OP.F_CV;9.317243576;100.0 +25/10/2020 02:06:03;U879.TC202F_OP.F_CV;10.257909775;100.0 +25/10/2020 02:06:04;U879.TC202F_OP.F_CV;9.858378410;100.0 +25/10/2020 02:06:08;U879.TC202F_OP.F_CV;9.858378410;100.0 +25/10/2020 02:06:10;U879.TC202F_OP.F_CV;10.399618149;100.0 +25/10/2020 02:06:11;U879.TC202F_OP.F_CV;9.457905769;100.0 +25/10/2020 02:06:13;U879.TC202F_OP.F_CV;9.315076828;100.0 +25/10/2020 02:06:14;U879.TC202F_OP.F_CV;10.255743027;100.0 +25/10/2020 02:06:16;U879.TC202F_OP.F_CV;9.856211662;100.0 +25/10/2020 02:06:18;U879.TC202F_OP.F_CV;10.126966476;100.0 +25/10/2020 02:06:19;U879.TC202F_OP.F_CV;10.397993088;100.0 +25/10/2020 02:06:20;U879.TC202F_OP.F_CV;9.456280708;100.0 +25/10/2020 02:06:22;U879.TC202F_OP.F_CV;9.313451767;100.0 +25/10/2020 02:06:23;U879.TC202F_OP.F_CV;9.712085724;100.0 +25/10/2020 02:06:26;U879.TC202F_OP.F_CV;10.252863884;100.0 +25/10/2020 02:06:28;U879.TC202F_OP.F_CV;9.853330612;100.0 +25/10/2020 02:06:29;U879.TC202F_OP.F_CV;9.311027527;100.0 +25/10/2020 02:06:32;U879.TC202F_OP.F_CV;9.852162361;100.0 +25/10/2020 02:06:36;U879.TC202F_OP.F_CV;9.984408379;100.0 +25/10/2020 02:06:38;U879.TC202F_OP.F_CV;10.249983788;100.0 +25/10/2020 02:06:40;U879.TC202F_OP.F_CV;9.850451469;100.0 +25/10/2020 02:06:56;U879.TC202F_OP.F_CV;9.850451469;100.0 +25/10/2020 02:06:58;U879.TC202F_OP.F_CV;9.305168152;100.0 +25/10/2020 02:06:59;U879.TC202F_OP.F_CV;10.245834351;100.0 +25/10/2020 02:06:41;U879.TC202F_PV.F_CV;350.120178223;100.0 +25/10/2020 02:06:23;U879.TC202F_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:00;U879.TC203A_OP.F_CV;15.181608200;100.0 +25/10/2020 02:06:01;U879.TC203A_OP.F_CV;14.242907524;100.0 +25/10/2020 02:06:02;U879.TC203A_OP.F_CV;15.181402206;100.0 +25/10/2020 02:06:04;U879.TC203A_OP.F_CV;14.242701530;100.0 +25/10/2020 02:06:05;U879.TC203A_OP.F_CV;14.640613556;100.0 +25/10/2020 02:06:07;U879.TC203A_OP.F_CV;15.180916786;100.0 +25/10/2020 02:06:08;U879.TC203A_OP.F_CV;14.242215157;100.0 +25/10/2020 02:06:10;U879.TC203A_OP.F_CV;14.640128136;100.0 +25/10/2020 02:06:14;U879.TC203A_OP.F_CV;15.179868698;100.0 +25/10/2020 02:06:17;U879.TC203A_OP.F_CV;14.241243362;100.0 +25/10/2020 02:06:19;U879.TC203A_OP.F_CV;14.639156342;100.0 +25/10/2020 02:06:26;U879.TC203A_OP.F_CV;14.639156342;100.0 +25/10/2020 02:06:28;U879.TC203A_OP.F_CV;15.718639374;100.0 +25/10/2020 02:06:29;U879.TC203A_OP.F_CV;13.841518402;100.0 +25/10/2020 02:06:31;U879.TC203A_OP.F_CV;15.178207397;100.0 +25/10/2020 02:06:32;U879.TC203A_OP.F_CV;14.239505768;100.0 +25/10/2020 02:06:34;U879.TC203A_OP.F_CV;15.178001404;100.0 +25/10/2020 02:06:35;U879.TC203A_OP.F_CV;14.239298820;100.0 +25/10/2020 02:06:37;U879.TC203A_OP.F_CV;14.637212753;100.0 +25/10/2020 02:06:39;U879.TC203A_OP.F_CV;14.907083511;100.0 +25/10/2020 02:06:40;U879.TC203A_OP.F_CV;15.177234650;100.0 +25/10/2020 02:06:41;U879.TC203A_OP.F_CV;14.238532066;100.0 +25/10/2020 02:06:43;U879.TC203A_OP.F_CV;15.177028656;100.0 +25/10/2020 02:06:44;U879.TC203A_OP.F_CV;14.778910637;100.0 +25/10/2020 02:06:46;U879.TC203A_OP.F_CV;15.319568634;100.0 +25/10/2020 02:06:47;U879.TC203A_OP.F_CV;14.381222725;100.0 +25/10/2020 02:06:49;U879.TC203A_OP.F_CV;14.238906860;100.0 +25/10/2020 02:06:50;U879.TC203A_OP.F_CV;14.636820793;100.0 +25/10/2020 02:06:58;U879.TC203A_OP.F_CV;14.636820793;100.0 +25/10/2020 02:06:59;U879.TC203A_OP.F_CV;15.175721169;100.0 +25/10/2020 02:06:17;U879.TC203A_PV.F_CV;403.078613281;100.0 +25/10/2020 02:06:23;U879.TC203A_SP.F_CV;403.000000000;100.0 +25/10/2020 02:06:00;U879.TC203B_OP.F_CV;10.710519791;100.0 +25/10/2020 02:06:03;U879.TC203B_OP.F_CV;10.982294083;100.0 +25/10/2020 02:06:04;U879.TC203B_OP.F_CV;11.253984451;100.0 +25/10/2020 02:06:05;U879.TC203B_OP.F_CV;10.310823441;100.0 +25/10/2020 02:06:07;U879.TC203B_OP.F_CV;10.711087227;100.0 +25/10/2020 02:06:13;U879.TC203B_OP.F_CV;10.711087227;100.0 +25/10/2020 02:06:14;U879.TC203B_OP.F_CV;11.254635811;100.0 +25/10/2020 02:06:17;U879.TC203B_OP.F_CV;10.711740494;100.0 +25/10/2020 02:06:23;U879.TC203B_OP.F_CV;10.711740494;100.0 +25/10/2020 02:06:26;U879.TC203B_OP.F_CV;9.912475586;100.0 +25/10/2020 02:06:28;U879.TC203B_OP.F_CV;11.256088257;100.0 +25/10/2020 02:06:29;U879.TC203B_OP.F_CV;10.312927246;100.0 +25/10/2020 02:06:31;U879.TC203B_OP.F_CV;10.713191986;100.0 +25/10/2020 02:06:33;U879.TC203B_OP.F_CV;11.256447792;100.0 +25/10/2020 02:06:34;U879.TC203B_OP.F_CV;11.799662590;100.0 +25/10/2020 02:06:35;U879.TC203B_OP.F_CV;9.913801193;100.0 +25/10/2020 02:06:37;U879.TC203B_OP.F_CV;10.714074135;100.0 +25/10/2020 02:06:46;U879.TC203B_OP.F_CV;10.714074135;100.0 +25/10/2020 02:06:47;U879.TC203B_OP.F_CV;11.257707596;100.0 +25/10/2020 02:06:49;U879.TC203B_OP.F_CV;10.314546585;100.0 +25/10/2020 02:06:50;U879.TC203B_OP.F_CV;10.714810371;100.0 +25/10/2020 02:06:58;U879.TC203B_OP.F_CV;10.714810371;100.0 +25/10/2020 02:06:59;U879.TC203B_OP.F_CV;11.258401871;100.0 +25/10/2020 02:06:39;U879.TC203B_PV.F_CV;401.988128662;100.0 +25/10/2020 02:06:23;U879.TC203B_SP.F_CV;402.000000000;100.0 +25/10/2020 02:06:01;U879.TC203C_OP.F_CV;14.528923988;100.0 +25/10/2020 02:06:02;U879.TC203C_OP.F_CV;14.928938866;100.0 +25/10/2020 02:06:04;U879.TC203C_OP.F_CV;15.472144127;100.0 +25/10/2020 02:06:05;U879.TC203C_OP.F_CV;15.614981651;100.0 +25/10/2020 02:06:07;U879.TC203C_OP.F_CV;14.128084183;100.0 +25/10/2020 02:06:08;U879.TC203C_OP.F_CV;16.015289307;100.0 +25/10/2020 02:06:10;U879.TC203C_OP.F_CV;14.671584129;100.0 +25/10/2020 02:06:11;U879.TC203C_OP.F_CV;15.071742058;100.0 +25/10/2020 02:06:13;U879.TC203C_OP.F_CV;14.528048515;100.0 +25/10/2020 02:06:14;U879.TC203C_OP.F_CV;14.928063393;100.0 +25/10/2020 02:06:19;U879.TC203C_OP.F_CV;14.928063393;100.0 +25/10/2020 02:06:20;U879.TC203C_OP.F_CV;15.470002174;100.0 +25/10/2020 02:06:24;U879.TC203C_OP.F_CV;15.154784203;100.0 +25/10/2020 02:06:26;U879.TC203C_OP.F_CV;14.525321960;100.0 +25/10/2020 02:06:28;U879.TC203C_OP.F_CV;14.925334930;100.0 +25/10/2020 02:06:30;U879.TC203C_OP.F_CV;15.196516037;100.0 +25/10/2020 02:06:31;U879.TC203C_OP.F_CV;15.468119621;100.0 +25/10/2020 02:06:32;U879.TC203C_OP.F_CV;15.067618370;100.0 +25/10/2020 02:06:51;U879.TC203C_OP.F_CV;14.885586739;100.0 +25/10/2020 02:06:53;U879.TC203C_OP.F_CV;14.523081779;100.0 +25/10/2020 02:06:55;U879.TC203C_OP.F_CV;14.923096657;100.0 +25/10/2020 02:06:56;U879.TC203C_OP.F_CV;15.466301918;100.0 +25/10/2020 02:06:58;U879.TC203C_OP.F_CV;15.065801620;100.0 +25/10/2020 02:06:59;U879.TC203C_OP.F_CV;14.522109032;100.0 +25/10/2020 02:06:25;U879.TC203C_PV.F_CV;410.084869385;100.0 +25/10/2020 02:06:23;U879.TC203C_SP.F_CV;410.000000000;100.0 +25/10/2020 02:06:01;U879.TC203D_OP.F_CV;9.357310295;100.0 +25/10/2020 02:06:02;U879.TC203D_OP.F_CV;10.301236153;100.0 +25/10/2020 02:06:04;U879.TC203D_OP.F_CV;8.814558029;100.0 +25/10/2020 02:06:05;U879.TC203D_OP.F_CV;9.614866257;100.0 +25/10/2020 02:06:07;U879.TC203D_OP.F_CV;10.157962799;100.0 +25/10/2020 02:06:08;U879.TC203D_OP.F_CV;9.757854462;100.0 +25/10/2020 02:06:10;U879.TC203D_OP.F_CV;9.214631081;100.0 +25/10/2020 02:06:11;U879.TC203D_OP.F_CV;9.614610672;100.0 +25/10/2020 02:06:13;U879.TC203D_OP.F_CV;10.701189041;100.0 +25/10/2020 02:06:14;U879.TC203D_OP.F_CV;9.357625008;100.0 +25/10/2020 02:06:16;U879.TC203D_OP.F_CV;10.301550865;100.0 +25/10/2020 02:06:17;U879.TC203D_OP.F_CV;9.901694298;100.0 +25/10/2020 02:06:19;U879.TC203D_OP.F_CV;8.815344810;100.0 +25/10/2020 02:06:20;U879.TC203D_OP.F_CV;10.158992767;100.0 +25/10/2020 02:06:22;U879.TC203D_OP.F_CV;10.254652023;100.0 +25/10/2020 02:06:24;U879.TC203D_OP.F_CV;10.121516228;100.0 +25/10/2020 02:06:26;U879.TC203D_OP.F_CV;9.759584427;100.0 +25/10/2020 02:06:28;U879.TC203D_OP.F_CV;10.303180695;100.0 +25/10/2020 02:06:29;U879.TC203D_OP.F_CV;8.816502571;100.0 +25/10/2020 02:06:32;U879.TC203D_OP.F_CV;10.159907341;100.0 +25/10/2020 02:06:34;U879.TC203D_OP.F_CV;9.759799004;100.0 +25/10/2020 02:06:37;U879.TC203D_OP.F_CV;9.493417740;100.0 +25/10/2020 02:06:38;U879.TC203D_OP.F_CV;9.360169411;100.0 +25/10/2020 02:06:40;U879.TC203D_OP.F_CV;9.760613441;100.0 +25/10/2020 02:06:42;U879.TC203D_OP.F_CV;10.032526016;100.0 +25/10/2020 02:06:43;U879.TC203D_OP.F_CV;10.304325104;100.0 +25/10/2020 02:06:44;U879.TC203D_OP.F_CV;8.817646027;100.0 +25/10/2020 02:06:46;U879.TC203D_OP.F_CV;10.704776764;100.0 +25/10/2020 02:06:47;U879.TC203D_OP.F_CV;10.448034286;100.0 +25/10/2020 02:06:49;U879.TC203D_OP.F_CV;8.961819649;100.0 +25/10/2020 02:06:50;U879.TC203D_OP.F_CV;9.762486458;100.0 +25/10/2020 02:06:58;U879.TC203D_OP.F_CV;9.762486458;100.0 +25/10/2020 02:06:59;U879.TC203D_OP.F_CV;9.219835281;100.0 +25/10/2020 02:06:23;U879.TC203D_PV.F_CV;349.867889404;100.0 +25/10/2020 02:06:23;U879.TC203D_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:01;U879.TC203E_OP.F_CV;10.349749565;100.0 +25/10/2020 02:06:08;U879.TC203E_OP.F_CV;10.349749565;100.0 +25/10/2020 02:06:10;U879.TC203E_OP.F_CV;9.269475937;100.0 +25/10/2020 02:06:11;U879.TC203E_OP.F_CV;11.148120880;100.0 +25/10/2020 02:06:13;U879.TC203E_OP.F_CV;10.351387978;100.0 +25/10/2020 02:06:17;U879.TC203E_OP.F_CV;10.893141747;100.0 +25/10/2020 02:06:19;U879.TC203E_OP.F_CV;9.954511642;100.0 +25/10/2020 02:06:20;U879.TC203E_OP.F_CV;10.353212357;100.0 +25/10/2020 02:06:23;U879.TC203E_OP.F_CV;9.271764755;100.0 +25/10/2020 02:06:26;U879.TC203E_OP.F_CV;11.149991989;100.0 +25/10/2020 02:06:28;U879.TC203E_OP.F_CV;10.353259087;100.0 +25/10/2020 02:06:30;U879.TC203E_OP.F_CV;10.619186401;100.0 +25/10/2020 02:06:32;U879.TC203E_OP.F_CV;11.150456429;100.0 +25/10/2020 02:06:34;U879.TC203E_OP.F_CV;9.271686554;100.0 +25/10/2020 02:06:35;U879.TC203E_OP.F_CV;11.150331497;100.0 +25/10/2020 02:06:37;U879.TC203E_OP.F_CV;10.353598595;100.0 +25/10/2020 02:06:39;U879.TC203E_OP.F_CV;9.813020706;100.0 +25/10/2020 02:06:40;U879.TC203E_OP.F_CV;9.272150040;100.0 +25/10/2020 02:06:41;U879.TC203E_OP.F_CV;11.150795937;100.0 +25/10/2020 02:06:43;U879.TC203E_OP.F_CV;10.354062080;100.0 +25/10/2020 02:06:47;U879.TC203E_OP.F_CV;9.272907257;100.0 +25/10/2020 02:06:49;U879.TC203E_OP.F_CV;11.151552200;100.0 +25/10/2020 02:06:50;U879.TC203E_OP.F_CV;9.272783279;100.0 +25/10/2020 02:06:53;U879.TC203E_OP.F_CV;11.151011467;100.0 +25/10/2020 02:06:55;U879.TC203E_OP.F_CV;9.272241592;100.0 +25/10/2020 02:06:56;U879.TC203E_OP.F_CV;10.068851471;100.0 +25/10/2020 02:06:00;U879.TC203E_PV.F_CV;321.050506592;100.0 +25/10/2020 02:06:23;U879.TC203E_SP.F_CV;321.000000000;100.0 +25/10/2020 02:06:00;U879.TC203F_OP.F_CV;10.497547150;100.0 +25/10/2020 02:06:01;U879.TC203F_OP.F_CV;10.240883827;100.0 +25/10/2020 02:06:03;U879.TC203F_OP.F_CV;9.298063278;100.0 +25/10/2020 02:06:04;U879.TC203F_OP.F_CV;10.240999222;100.0 +25/10/2020 02:06:05;U879.TC203F_OP.F_CV;9.298179626;100.0 +25/10/2020 02:06:07;U879.TC203F_OP.F_CV;10.241116524;100.0 +25/10/2020 02:06:08;U879.TC203F_OP.F_CV;9.298295975;100.0 +25/10/2020 02:06:10;U879.TC203F_OP.F_CV;9.155570984;100.0 +25/10/2020 02:06:11;U879.TC203F_OP.F_CV;10.097394943;100.0 +25/10/2020 02:06:13;U879.TC203F_OP.F_CV;9.697584152;100.0 +25/10/2020 02:06:14;U879.TC203F_OP.F_CV;9.154850960;100.0 +25/10/2020 02:06:16;U879.TC203F_OP.F_CV;10.639723778;100.0 +25/10/2020 02:06:17;U879.TC203F_OP.F_CV;9.840262413;100.0 +25/10/2020 02:06:20;U879.TC203F_OP.F_CV;9.297687531;100.0 +25/10/2020 02:06:22;U879.TC203F_OP.F_CV;10.240624428;100.0 +25/10/2020 02:06:23;U879.TC203F_OP.F_CV;9.297803879;100.0 +25/10/2020 02:06:25;U879.TC203F_OP.F_CV;9.697690964;100.0 +25/10/2020 02:06:27;U879.TC203F_OP.F_CV;9.426203728;100.0 +25/10/2020 02:06:28;U879.TC203F_OP.F_CV;9.154836655;100.0 +25/10/2020 02:06:29;U879.TC203F_OP.F_CV;10.639709473;100.0 +25/10/2020 02:06:32;U879.TC203F_OP.F_CV;9.840484619;100.0 +25/10/2020 02:06:35;U879.TC203F_OP.F_CV;9.297909737;100.0 +25/10/2020 02:06:38;U879.TC203F_OP.F_CV;10.240724564;100.0 +25/10/2020 02:06:40;U879.TC203F_OP.F_CV;9.297904968;100.0 +25/10/2020 02:06:41;U879.TC203F_OP.F_CV;9.697793007;100.0 +25/10/2020 02:06:43;U879.TC203F_OP.F_CV;10.240719795;100.0 +25/10/2020 02:06:44;U879.TC203F_OP.F_CV;9.840948105;100.0 +25/10/2020 02:06:46;U879.TC203F_OP.F_CV;8.755523682;100.0 +25/10/2020 02:06:47;U879.TC203F_OP.F_CV;10.640404701;100.0 +25/10/2020 02:06:50;U879.TC203F_OP.F_CV;9.841180801;100.0 +25/10/2020 02:06:52;U879.TC203F_OP.F_CV;9.745898247;100.0 +25/10/2020 02:06:56;U879.TC203F_OP.F_CV;10.241064072;100.0 +25/10/2020 02:06:58;U879.TC203F_OP.F_CV;9.841291428;100.0 +25/10/2020 02:06:59;U879.TC203F_OP.F_CV;8.755866051;100.0 +25/10/2020 02:06:52;U879.TC203F_PV.F_CV;350.033782959;100.0 +25/10/2020 02:06:23;U879.TC203F_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:00;U879.TC204A_OP.F_CV;15.603342056;100.0 +25/10/2020 02:06:01;U879.TC204A_OP.F_CV;14.661868095;100.0 +25/10/2020 02:06:02;U879.TC204A_OP.F_CV;15.602125168;100.0 +25/10/2020 02:06:04;U879.TC204A_OP.F_CV;15.202540398;100.0 +25/10/2020 02:06:15;U879.TC204A_OP.F_CV;15.018612862;100.0 +25/10/2020 02:06:17;U879.TC204A_OP.F_CV;14.656780243;100.0 +25/10/2020 02:06:19;U879.TC204A_OP.F_CV;15.597037315;100.0 +25/10/2020 02:06:20;U879.TC204A_OP.F_CV;15.739629745;100.0 +25/10/2020 02:06:24;U879.TC204A_OP.F_CV;15.268317223;100.0 +25/10/2020 02:06:25;U879.TC204A_OP.F_CV;14.797507286;100.0 +25/10/2020 02:06:26;U879.TC204A_OP.F_CV;14.654556274;100.0 +25/10/2020 02:06:28;U879.TC204A_OP.F_CV;15.594813347;100.0 +25/10/2020 02:06:29;U879.TC204A_OP.F_CV;15.195227623;100.0 +25/10/2020 02:06:32;U879.TC204A_OP.F_CV;15.736546516;100.0 +25/10/2020 02:06:34;U879.TC204A_OP.F_CV;15.337103844;100.0 +25/10/2020 02:06:35;U879.TC204A_OP.F_CV;15.879064560;100.0 +25/10/2020 02:06:37;U879.TC204A_OP.F_CV;15.480086327;100.0 +25/10/2020 02:06:38;U879.TC204A_OP.F_CV;14.938335419;100.0 +25/10/2020 02:06:40;U879.TC204A_OP.F_CV;14.795346260;100.0 +25/10/2020 02:06:41;U879.TC204A_OP.F_CV;15.194284439;100.0 +25/10/2020 02:06:45;U879.TC204A_OP.F_CV;15.464297295;100.0 +25/10/2020 02:06:46;U879.TC204A_OP.F_CV;15.735171318;100.0 +25/10/2020 02:06:47;U879.TC204A_OP.F_CV;14.793551445;100.0 +25/10/2020 02:06:49;U879.TC204A_OP.F_CV;15.734668732;100.0 +25/10/2020 02:06:50;U879.TC204A_OP.F_CV;14.793048859;100.0 +25/10/2020 02:06:52;U879.TC204A_OP.F_CV;15.191987038;100.0 +25/10/2020 02:06:53;U879.TC204A_OP.F_CV;15.733735085;100.0 +25/10/2020 02:06:55;U879.TC204A_OP.F_CV;14.792115211;100.0 +25/10/2020 02:06:56;U879.TC204A_OP.F_CV;16.275264740;100.0 +25/10/2020 02:06:58;U879.TC204A_OP.F_CV;15.476918221;100.0 +25/10/2020 02:06:59;U879.TC204A_OP.F_CV;14.935169220;100.0 +25/10/2020 02:06:31;U879.TC204A_PV.F_CV;393.053741455;100.0 +25/10/2020 02:06:23;U879.TC204A_SP.F_CV;393.000000000;100.0 +25/10/2020 02:06:00;U879.TC204B_OP.F_CV;15.148844719;100.0 +25/10/2020 02:06:01;U879.TC204B_OP.F_CV;14.605815887;100.0 +25/10/2020 02:06:02;U879.TC204B_OP.F_CV;15.547743797;100.0 +25/10/2020 02:06:04;U879.TC204B_OP.F_CV;14.062306404;100.0 +25/10/2020 02:06:05;U879.TC204B_OP.F_CV;15.946178436;100.0 +25/10/2020 02:06:07;U879.TC204B_OP.F_CV;15.146425247;100.0 +25/10/2020 02:06:08;U879.TC204B_OP.F_CV;14.603398323;100.0 +25/10/2020 02:06:10;U879.TC204B_OP.F_CV;15.545324326;100.0 +25/10/2020 02:06:11;U879.TC204B_OP.F_CV;14.602501869;100.0 +25/10/2020 02:06:13;U879.TC204B_OP.F_CV;15.544428825;100.0 +25/10/2020 02:06:15;U879.TC204B_OP.F_CV;14.830119133;100.0 +25/10/2020 02:06:17;U879.TC204B_OP.F_CV;14.201629639;100.0 +25/10/2020 02:06:19;U879.TC204B_OP.F_CV;15.543352127;100.0 +25/10/2020 02:06:20;U879.TC204B_OP.F_CV;15.143286705;100.0 +25/10/2020 02:06:23;U879.TC204B_OP.F_CV;14.599989891;100.0 +25/10/2020 02:06:27;U879.TC204B_OP.F_CV;15.070056915;100.0 +25/10/2020 02:06:28;U879.TC204B_OP.F_CV;15.541021347;100.0 +25/10/2020 02:06:29;U879.TC204B_OP.F_CV;15.140956879;100.0 +25/10/2020 02:06:31;U879.TC204B_OP.F_CV;14.597928047;100.0 +25/10/2020 02:06:32;U879.TC204B_OP.F_CV;14.997097969;100.0 +25/10/2020 02:06:35;U879.TC204B_OP.F_CV;15.538601875;100.0 +25/10/2020 02:06:37;U879.TC204B_OP.F_CV;14.595778465;100.0 +25/10/2020 02:06:38;U879.TC204B_OP.F_CV;14.452335358;100.0 +25/10/2020 02:06:40;U879.TC204B_OP.F_CV;14.851040840;100.0 +25/10/2020 02:06:44;U879.TC204B_OP.F_CV;15.933461189;100.0 +25/10/2020 02:06:46;U879.TC204B_OP.F_CV;14.590949059;100.0 +25/10/2020 02:06:47;U879.TC204B_OP.F_CV;14.447505951;100.0 +25/10/2020 02:06:49;U879.TC204B_OP.F_CV;15.388824463;100.0 +25/10/2020 02:06:50;U879.TC204B_OP.F_CV;14.988509178;100.0 +25/10/2020 02:06:53;U879.TC204B_OP.F_CV;14.301217079;100.0 +25/10/2020 02:06:55;U879.TC204B_OP.F_CV;15.242429733;100.0 +25/10/2020 02:06:56;U879.TC204B_OP.F_CV;15.384264946;100.0 +25/10/2020 02:06:58;U879.TC204B_OP.F_CV;14.441336632;100.0 +25/10/2020 02:06:59;U879.TC204B_OP.F_CV;15.382655144;100.0 +25/10/2020 02:06:14;U879.TC204B_PV.F_CV;392.125366211;100.0 +25/10/2020 02:06:23;U879.TC204B_SP.F_CV;392.000000000;100.0 +25/10/2020 02:06:01;U879.TC204C_OP.F_CV;16.377271652;100.0 +25/10/2020 02:06:02;U879.TC204C_OP.F_CV;15.033867836;100.0 +25/10/2020 02:06:04;U879.TC204C_OP.F_CV;15.977663994;100.0 +25/10/2020 02:06:05;U879.TC204C_OP.F_CV;15.034695625;100.0 +25/10/2020 02:06:07;U879.TC204C_OP.F_CV;15.435154915;100.0 +25/10/2020 02:06:08;U879.TC204C_OP.F_CV;14.891760826;100.0 +25/10/2020 02:06:10;U879.TC204C_OP.F_CV;16.379041672;100.0 +25/10/2020 02:06:11;U879.TC204C_OP.F_CV;15.035637856;100.0 +25/10/2020 02:06:13;U879.TC204C_OP.F_CV;14.892467499;100.0 +25/10/2020 02:06:14;U879.TC204C_OP.F_CV;15.292782784;100.0 +25/10/2020 02:06:17;U879.TC204C_OP.F_CV;14.892457962;100.0 +25/10/2020 02:06:19;U879.TC204C_OP.F_CV;15.292773247;100.0 +25/10/2020 02:06:21;U879.TC204C_OP.F_CV;15.025921822;100.0 +25/10/2020 02:06:23;U879.TC204C_OP.F_CV;14.492462158;100.0 +25/10/2020 02:06:26;U879.TC204C_OP.F_CV;15.979763985;100.0 +25/10/2020 02:06:28;U879.TC204C_OP.F_CV;15.036795616;100.0 +25/10/2020 02:06:29;U879.TC204C_OP.F_CV;15.437252998;100.0 +25/10/2020 02:06:32;U879.TC204C_OP.F_CV;15.981062889;100.0 +25/10/2020 02:06:34;U879.TC204C_OP.F_CV;15.581431389;100.0 +25/10/2020 02:06:46;U879.TC204C_OP.F_CV;15.581431389;100.0 +25/10/2020 02:06:47;U879.TC204C_OP.F_CV;15.043423653;100.0 +25/10/2020 02:06:49;U879.TC204C_OP.F_CV;15.443882942;100.0 +25/10/2020 02:06:51;U879.TC204C_OP.F_CV;15.263065338;100.0 +25/10/2020 02:06:53;U879.TC204C_OP.F_CV;14.900959969;100.0 +25/10/2020 02:06:55;U879.TC204C_OP.F_CV;16.388240814;100.0 +25/10/2020 02:06:56;U879.TC204C_OP.F_CV;15.044836044;100.0 +25/10/2020 02:06:58;U879.TC204C_OP.F_CV;15.445293427;100.0 +25/10/2020 02:06:00;U879.TC204C_PV.F_CV;399.834106445;100.0 +25/10/2020 02:06:23;U879.TC204C_SP.F_CV;400.000000000;100.0 +25/10/2020 02:06:10;U879.TC204D_OP.F_CV;15.715504646;100.0 +25/10/2020 02:06:11;U879.TC204D_OP.F_CV;15.177719116;100.0 +25/10/2020 02:06:13;U879.TC204D_OP.F_CV;15.579182625;100.0 +25/10/2020 02:06:15;U879.TC204D_OP.F_CV;15.852012634;100.0 +25/10/2020 02:06:16;U879.TC204D_OP.F_CV;16.124456406;100.0 +25/10/2020 02:06:17;U879.TC204D_OP.F_CV;15.724123955;100.0 +25/10/2020 02:06:19;U879.TC204D_OP.F_CV;15.180372238;100.0 +25/10/2020 02:06:20;U879.TC204D_OP.F_CV;15.581836700;100.0 +25/10/2020 02:06:26;U879.TC204D_OP.F_CV;14.782198906;100.0 +25/10/2020 02:06:28;U879.TC204D_OP.F_CV;16.673990250;100.0 +25/10/2020 02:06:29;U879.TC204D_OP.F_CV;14.783691406;100.0 +25/10/2020 02:06:32;U879.TC204D_OP.F_CV;16.675868988;100.0 +25/10/2020 02:06:34;U879.TC204D_OP.F_CV;15.330067635;100.0 +25/10/2020 02:06:35;U879.TC204D_OP.F_CV;15.187500000;100.0 +25/10/2020 02:06:38;U879.TC204D_OP.F_CV;15.589351654;100.0 +25/10/2020 02:06:41;U879.TC204D_OP.F_CV;16.134624481;100.0 +25/10/2020 02:06:43;U879.TC204D_OP.F_CV;15.734292984;100.0 +25/10/2020 02:06:45;U879.TC204D_OP.F_CV;15.463162422;100.0 +25/10/2020 02:06:46;U879.TC204D_OP.F_CV;15.191286087;100.0 +25/10/2020 02:06:47;U879.TC204D_OP.F_CV;16.137248993;100.0 +25/10/2020 02:06:49;U879.TC204D_OP.F_CV;16.281560898;100.0 +25/10/2020 02:06:50;U879.TC204D_OP.F_CV;14.792338371;100.0 +25/10/2020 02:06:53;U879.TC204D_OP.F_CV;16.540485382;100.0 +25/10/2020 02:06:55;U879.TC204D_OP.F_CV;15.739183426;100.0 +25/10/2020 02:06:57;U879.TC204D_OP.F_CV;15.468052864;100.0 +25/10/2020 02:06:58;U879.TC204D_OP.F_CV;15.196176529;100.0 +25/10/2020 02:06:59;U879.TC204D_OP.F_CV;15.597640991;100.0 +25/10/2020 02:06:16;U879.TC204D_PV.F_CV;349.824676514;100.0 +25/10/2020 02:06:03;U879.TC204D_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:01;U879.TC204E_OP.F_CV;10.877349854;100.0 +25/10/2020 02:06:02;U879.TC204E_OP.F_CV;11.420258522;100.0 +25/10/2020 02:06:04;U879.TC204E_OP.F_CV;9.937223434;100.0 +25/10/2020 02:06:05;U879.TC204E_OP.F_CV;10.736295700;100.0 +25/10/2020 02:06:10;U879.TC204E_OP.F_CV;10.736295700;100.0 +25/10/2020 02:06:11;U879.TC204E_OP.F_CV;10.195034027;100.0 +25/10/2020 02:06:13;U879.TC204E_OP.F_CV;10.594274521;100.0 +25/10/2020 02:06:14;U879.TC204E_OP.F_CV;11.136323929;100.0 +25/10/2020 02:06:16;U879.TC204E_OP.F_CV;10.737184525;100.0 +25/10/2020 02:06:17;U879.TC204E_OP.F_CV;11.279591560;100.0 +25/10/2020 02:06:19;U879.TC204E_OP.F_CV;10.338631630;100.0 +25/10/2020 02:06:20;U879.TC204E_OP.F_CV;10.738228798;100.0 +25/10/2020 02:06:25;U879.TC204E_OP.F_CV;10.643547058;100.0 +25/10/2020 02:06:29;U879.TC204E_OP.F_CV;11.137900352;100.0 +25/10/2020 02:06:31;U879.TC204E_OP.F_CV;11.042451859;100.0 +25/10/2020 02:06:33;U879.TC204E_OP.F_CV;10.795032501;100.0 +25/10/2020 02:06:34;U879.TC204E_OP.F_CV;10.595338821;100.0 +25/10/2020 02:06:35;U879.TC204E_OP.F_CV;10.053177834;100.0 +25/10/2020 02:06:37;U879.TC204E_OP.F_CV;10.993988037;100.0 +25/10/2020 02:06:38;U879.TC204E_OP.F_CV;10.052564621;100.0 +25/10/2020 02:06:40;U879.TC204E_OP.F_CV;11.535553932;100.0 +25/10/2020 02:06:41;U879.TC204E_OP.F_CV;10.737153053;100.0 +25/10/2020 02:06:45;U879.TC204E_OP.F_CV;10.466636658;100.0 +25/10/2020 02:06:46;U879.TC204E_OP.F_CV;10.195661545;100.0 +25/10/2020 02:06:47;U879.TC204E_OP.F_CV;10.594902039;100.0 +25/10/2020 02:06:49;U879.TC204E_OP.F_CV;11.136951447;100.0 +25/10/2020 02:06:50;U879.TC204E_OP.F_CV;10.195634842;100.0 +25/10/2020 02:06:53;U879.TC204E_OP.F_CV;10.594747543;100.0 +25/10/2020 02:06:55;U879.TC204E_OP.F_CV;11.136797905;100.0 +25/10/2020 02:06:56;U879.TC204E_OP.F_CV;10.737658501;100.0 +25/10/2020 02:06:58;U879.TC204E_OP.F_CV;11.280065536;100.0 +25/10/2020 02:06:59;U879.TC204E_OP.F_CV;10.339104652;100.0 +25/10/2020 02:06:54;U879.TC204E_PV.F_CV;310.935913086;100.0 +25/10/2020 02:06:23;U879.TC204E_SP.F_CV;311.000000000;100.0 +25/10/2020 02:06:00;U879.TC204F_OP.F_CV;15.749059677;100.0 +25/10/2020 02:06:01;U879.TC204F_OP.F_CV;14.805208206;100.0 +25/10/2020 02:06:03;U879.TC204F_OP.F_CV;15.205142021;100.0 +25/10/2020 02:06:06;U879.TC204F_OP.F_CV;15.475894928;100.0 +25/10/2020 02:06:07;U879.TC204F_OP.F_CV;15.747438431;100.0 +25/10/2020 02:06:08;U879.TC204F_OP.F_CV;14.803588867;100.0 +25/10/2020 02:06:10;U879.TC204F_OP.F_CV;15.203522682;100.0 +25/10/2020 02:06:12;U879.TC204F_OP.F_CV;15.474670410;100.0 +25/10/2020 02:06:13;U879.TC204F_OP.F_CV;15.746213913;100.0 +25/10/2020 02:06:14;U879.TC204F_OP.F_CV;15.889765739;100.0 +25/10/2020 02:06:16;U879.TC204F_OP.F_CV;14.402033806;100.0 +25/10/2020 02:06:17;U879.TC204F_OP.F_CV;15.202616692;100.0 +25/10/2020 02:06:19;U879.TC204F_OP.F_CV;15.745705605;100.0 +25/10/2020 02:06:20;U879.TC204F_OP.F_CV;14.801855087;100.0 +25/10/2020 02:06:22;U879.TC204F_OP.F_CV;15.201787949;100.0 +25/10/2020 02:06:23;U879.TC204F_OP.F_CV;15.744875908;100.0 +25/10/2020 02:06:25;U879.TC204F_OP.F_CV;15.344509125;100.0 +25/10/2020 02:06:30;U879.TC204F_OP.F_CV;15.163208008;100.0 +25/10/2020 02:06:32;U879.TC204F_OP.F_CV;14.800835609;100.0 +25/10/2020 02:06:34;U879.TC204F_OP.F_CV;15.200768471;100.0 +25/10/2020 02:06:35;U879.TC204F_OP.F_CV;15.743857384;100.0 +25/10/2020 02:06:40;U879.TC204F_OP.F_CV;15.886974335;100.0 +25/10/2020 02:06:41;U879.TC204F_OP.F_CV;14.399242401;100.0 +25/10/2020 02:06:43;U879.TC204F_OP.F_CV;15.199826241;100.0 +25/10/2020 02:06:45;U879.TC204F_OP.F_CV;15.470974922;100.0 +25/10/2020 02:06:46;U879.TC204F_OP.F_CV;15.742519379;100.0 +25/10/2020 02:06:47;U879.TC204F_OP.F_CV;15.342151642;100.0 +25/10/2020 02:06:52;U879.TC204F_OP.F_CV;15.437774658;100.0 +25/10/2020 02:06:54;U879.TC204F_OP.F_CV;15.213825226;100.0 +25/10/2020 02:06:55;U879.TC204F_OP.F_CV;14.942027092;100.0 +25/10/2020 02:06:56;U879.TC204F_OP.F_CV;15.886557579;100.0 +25/10/2020 02:06:58;U879.TC204F_OP.F_CV;14.942309380;100.0 +25/10/2020 02:06:59;U879.TC204F_OP.F_CV;15.886838913;100.0 +25/10/2020 02:06:49;U879.TC204F_PV.F_CV;349.943908691;100.0 +25/10/2020 02:06:23;U879.TC204F_SP.F_CV;350.000000000;100.0 +25/10/2020 02:06:05;U879.TC205A_OP.F_CV;16.849918365;100.0 +25/10/2020 02:06:06;U879.TC205A_OP.F_CV;18.370452881;100.0 +25/10/2020 02:06:07;U879.TC205A_OP.F_CV;15.730892181;100.0 +25/10/2020 02:06:09;U879.TC205A_OP.F_CV;16.850917816;100.0 +25/10/2020 02:06:12;U879.TC205A_OP.F_CV;18.371452332;100.0 +25/10/2020 02:06:14;U879.TC205A_OP.F_CV;15.731891632;100.0 +25/10/2020 02:06:15;U879.TC205A_OP.F_CV;16.851917267;100.0 +25/10/2020 02:06:21;U879.TC205A_OP.F_CV;16.851917267;100.0 +25/10/2020 02:06:22;U879.TC205A_OP.F_CV;18.372449875;100.0 +25/10/2020 02:06:23;U879.TC205A_OP.F_CV;17.253425598;100.0 +25/10/2020 02:06:27;U879.TC205A_OP.F_CV;15.735889435;100.0 +25/10/2020 02:06:28;U879.TC205A_OP.F_CV;18.376449585;100.0 +25/10/2020 02:06:31;U879.TC205A_OP.F_CV;17.257423401;100.0 +25/10/2020 02:06:32;U879.TC205A_OP.F_CV;15.737887383;100.0 +25/10/2020 02:06:34;U879.TC205A_OP.F_CV;16.857913971;100.0 +25/10/2020 02:06:40;U879.TC205A_OP.F_CV;16.857913971;100.0 +25/10/2020 02:06:41;U879.TC205A_OP.F_CV;15.337378502;100.0 +25/10/2020 02:06:43;U879.TC205A_OP.F_CV;17.976940155;100.0 +25/10/2020 02:06:44;U879.TC205A_OP.F_CV;16.856914520;100.0 +25/10/2020 02:06:49;U879.TC205A_OP.F_CV;16.856914520;100.0 +25/10/2020 02:06:50;U879.TC205A_OP.F_CV;13.815989494;100.0 +25/10/2020 02:06:52;U879.TC205A_OP.F_CV;17.574325562;100.0 +25/10/2020 02:06:53;U879.TC205A_OP.F_CV;14.933016777;100.0 +25/10/2020 02:06:55;U879.TC205A_OP.F_CV;16.050937653;100.0 +25/10/2020 02:06:00;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:02;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:03;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:04;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:05;U879.TC205A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:06;U879.TC205A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:07;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:08;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:09;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:10;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:11;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:12;U879.TC205A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:13;U879.TC205A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:14;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:15;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:16;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:17;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:18;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:19;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:20;U879.TC205A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:21;U879.TC205A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:22;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC205A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:24;U879.TC205A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:25;U879.TC205A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:26;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:27;U879.TC205A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:28;U879.TC205A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:29;U879.TC205A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:30;U879.TC205A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:31;U879.TC205A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:32;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:33;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:34;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:35;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:36;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:37;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:38;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:39;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:40;U879.TC205A_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:41;U879.TC205A_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:42;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:43;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:44;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:45;U879.TC205A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:46;U879.TC205A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:47;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:48;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:49;U879.TC205A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:50;U879.TC205A_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:51;U879.TC205A_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:52;U879.TC205A_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:53;U879.TC205A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:54;U879.TC205A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:55;U879.TC205A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:56;U879.TC205A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:57;U879.TC205A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:58;U879.TC205A_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:59;U879.TC205A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:23;U879.TC205A_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC205B_OP.F_CV;17.646902084;100.0 +25/10/2020 02:06:02;U879.TC205B_OP.F_CV;16.529769897;100.0 +25/10/2020 02:06:03;U879.TC205B_OP.F_CV;15.012090683;100.0 +25/10/2020 02:06:04;U879.TC205B_OP.F_CV;19.175292969;100.0 +25/10/2020 02:06:06;U879.TC205B_OP.F_CV;13.898172379;100.0 +25/10/2020 02:06:07;U879.TC205B_OP.F_CV;19.181293488;100.0 +25/10/2020 02:06:09;U879.TC205B_OP.F_CV;16.945241928;100.0 +25/10/2020 02:06:10;U879.TC205B_OP.F_CV;13.908172607;100.0 +25/10/2020 02:06:12;U879.TC205B_OP.F_CV;17.670902252;100.0 +25/10/2020 02:06:14;U879.TC205B_OP.F_CV;15.033090591;100.0 +25/10/2020 02:06:15;U879.TC205B_OP.F_CV;17.675903320;100.0 +25/10/2020 02:06:17;U879.TC205B_OP.F_CV;15.038091660;100.0 +25/10/2020 02:06:19;U879.TC205B_OP.F_CV;16.162225723;100.0 +25/10/2020 02:06:22;U879.TC205B_OP.F_CV;19.205295563;100.0 +25/10/2020 02:06:23;U879.TC205B_OP.F_CV;16.969244003;100.0 +25/10/2020 02:06:25;U879.TC205B_OP.F_CV;18.096162796;100.0 +25/10/2020 02:06:28;U879.TC205B_OP.F_CV;16.984243393;100.0 +25/10/2020 02:06:30;U879.TC205B_OP.F_CV;13.947174072;100.0 +25/10/2020 02:06:32;U879.TC205B_OP.F_CV;17.709903717;100.0 +25/10/2020 02:06:34;U879.TC205B_OP.F_CV;16.592771530;100.0 +25/10/2020 02:06:35;U879.TC205B_OP.F_CV;15.075092316;100.0 +25/10/2020 02:06:37;U879.TC205B_OP.F_CV;19.238294601;100.0 +25/10/2020 02:06:38;U879.TC205B_OP.F_CV;15.481852531;100.0 +25/10/2020 02:06:39;U879.TC205B_OP.F_CV;16.604772568;100.0 +25/10/2020 02:06:43;U879.TC205B_OP.F_CV;18.131162643;100.0 +25/10/2020 02:06:44;U879.TC205B_OP.F_CV;15.494853020;100.0 +25/10/2020 02:06:45;U879.TC205B_OP.F_CV;15.097091675;100.0 +25/10/2020 02:06:46;U879.TC205B_OP.F_CV;16.219224930;100.0 +25/10/2020 02:06:49;U879.TC205B_OP.F_CV;17.741905212;100.0 +25/10/2020 02:06:50;U879.TC205B_OP.F_CV;15.104092598;100.0 +25/10/2020 02:06:52;U879.TC205B_OP.F_CV;19.267295837;100.0 +25/10/2020 02:06:53;U879.TC205B_OP.F_CV;13.990175247;100.0 +25/10/2020 02:06:55;U879.TC205B_OP.F_CV;16.234228134;100.0 +25/10/2020 02:06:00;U879.TC205B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:01;U879.TC205B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:02;U879.TC205B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:03;U879.TC205B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:04;U879.TC205B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:05;U879.TC205B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:06;U879.TC205B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:07;U879.TC205B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:08;U879.TC205B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:09;U879.TC205B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:10;U879.TC205B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:11;U879.TC205B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:12;U879.TC205B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:13;U879.TC205B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:14;U879.TC205B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:15;U879.TC205B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:16;U879.TC205B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:17;U879.TC205B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:18;U879.TC205B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:19;U879.TC205B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:20;U879.TC205B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:21;U879.TC205B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:22;U879.TC205B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:23;U879.TC205B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:24;U879.TC205B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:25;U879.TC205B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:26;U879.TC205B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:27;U879.TC205B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:28;U879.TC205B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:29;U879.TC205B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:30;U879.TC205B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:31;U879.TC205B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:32;U879.TC205B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:33;U879.TC205B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:34;U879.TC205B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:35;U879.TC205B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:36;U879.TC205B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:37;U879.TC205B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:38;U879.TC205B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:39;U879.TC205B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:40;U879.TC205B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:41;U879.TC205B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:42;U879.TC205B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:43;U879.TC205B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:44;U879.TC205B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:45;U879.TC205B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:46;U879.TC205B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:47;U879.TC205B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:48;U879.TC205B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:49;U879.TC205B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:50;U879.TC205B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:51;U879.TC205B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:52;U879.TC205B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:53;U879.TC205B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:54;U879.TC205B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:55;U879.TC205B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:56;U879.TC205B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:57;U879.TC205B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:58;U879.TC205B_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:59;U879.TC205B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:23;U879.TC205B_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC205C_OP.F_CV;16.005195618;100.0 +25/10/2020 02:06:01;U879.TC205C_OP.F_CV;12.244716644;100.0 +25/10/2020 02:06:03;U879.TC205C_OP.F_CV;14.884277344;100.0 +25/10/2020 02:06:04;U879.TC205C_OP.F_CV;12.243717194;100.0 +25/10/2020 02:06:06;U879.TC205C_OP.F_CV;13.362742424;100.0 +25/10/2020 02:06:07;U879.TC205C_OP.F_CV;14.882277489;100.0 +25/10/2020 02:06:09;U879.TC205C_OP.F_CV;10.721326828;100.0 +25/10/2020 02:06:10;U879.TC205C_OP.F_CV;12.959270477;100.0 +25/10/2020 02:06:12;U879.TC205C_OP.F_CV;14.477661133;100.0 +25/10/2020 02:06:13;U879.TC205C_OP.F_CV;13.356741905;100.0 +25/10/2020 02:06:15;U879.TC205C_OP.F_CV;14.876276970;100.0 +25/10/2020 02:06:17;U879.TC205C_OP.F_CV;9.194646835;100.0 +25/10/2020 02:06:19;U879.TC205C_OP.F_CV;14.872277260;100.0 +25/10/2020 02:06:22;U879.TC205C_OP.F_CV;13.752251625;100.0 +25/10/2020 02:06:23;U879.TC205C_OP.F_CV;12.231717110;100.0 +25/10/2020 02:06:25;U879.TC205C_OP.F_CV;13.349741936;100.0 +25/10/2020 02:06:28;U879.TC205C_OP.F_CV;14.868275642;100.0 +25/10/2020 02:06:30;U879.TC205C_OP.F_CV;13.748250008;100.0 +25/10/2020 02:06:34;U879.TC205C_OP.F_CV;13.748250008;100.0 +25/10/2020 02:06:35;U879.TC205C_OP.F_CV;12.227715492;100.0 +25/10/2020 02:06:37;U879.TC205C_OP.F_CV;13.346741676;100.0 +25/10/2020 02:06:41;U879.TC205C_OP.F_CV;14.864275932;100.0 +25/10/2020 02:06:43;U879.TC205C_OP.F_CV;13.744250298;100.0 +25/10/2020 02:06:44;U879.TC205C_OP.F_CV;12.223715782;100.0 +25/10/2020 02:06:46;U879.TC205C_OP.F_CV;14.863276482;100.0 +25/10/2020 02:06:47;U879.TC205C_OP.F_CV;12.222715378;100.0 +25/10/2020 02:06:49;U879.TC205C_OP.F_CV;14.862276077;100.0 +25/10/2020 02:06:50;U879.TC205C_OP.F_CV;13.742250443;100.0 +25/10/2020 02:06:51;U879.TC205C_OP.F_CV;12.221715927;100.0 +25/10/2020 02:06:53;U879.TC205C_OP.F_CV;13.340742111;100.0 +25/10/2020 02:06:55;U879.TC205C_OP.F_CV;17.498729706;100.0 +25/10/2020 02:06:58;U879.TC205C_OP.F_CV;9.578300476;100.0 +25/10/2020 02:06:59;U879.TC205C_OP.F_CV;15.977194786;100.0 +25/10/2020 02:06:00;U879.TC205C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:02;U879.TC205C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:03;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:04;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:05;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:06;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:07;U879.TC205C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:08;U879.TC205C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:09;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:10;U879.TC205C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:11;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:12;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:13;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:14;U879.TC205C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:15;U879.TC205C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:16;U879.TC205C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:17;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:18;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:19;U879.TC205C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:20;U879.TC205C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:21;U879.TC205C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:22;U879.TC205C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:24;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:25;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:26;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:27;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:28;U879.TC205C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:29;U879.TC205C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:30;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:31;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:32;U879.TC205C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:33;U879.TC205C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:34;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:35;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:36;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:37;U879.TC205C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:38;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:39;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:40;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:41;U879.TC205C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:42;U879.TC205C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:43;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:44;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:45;U879.TC205C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:46;U879.TC205C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:47;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:48;U879.TC205C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:49;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:50;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:51;U879.TC205C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:52;U879.TC205C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:53;U879.TC205C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:54;U879.TC205C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:55;U879.TC205C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:56;U879.TC205C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:57;U879.TC205C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:58;U879.TC205C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:59;U879.TC205C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC205C_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC205D_OP.F_CV;14.966240883;100.0 +25/10/2020 02:06:01;U879.TC205D_OP.F_CV;13.847215652;100.0 +25/10/2020 02:06:05;U879.TC205D_OP.F_CV;13.847215652;100.0 +25/10/2020 02:06:06;U879.TC205D_OP.F_CV;12.329681396;100.0 +25/10/2020 02:06:07;U879.TC205D_OP.F_CV;13.449707031;100.0 +25/10/2020 02:06:09;U879.TC205D_OP.F_CV;14.970241547;100.0 +25/10/2020 02:06:10;U879.TC205D_OP.F_CV;12.330680847;100.0 +25/10/2020 02:06:12;U879.TC205D_OP.F_CV;13.450706482;100.0 +25/10/2020 02:06:15;U879.TC205D_OP.F_CV;16.491630554;100.0 +25/10/2020 02:06:17;U879.TC205D_OP.F_CV;11.212761879;100.0 +25/10/2020 02:06:18;U879.TC205D_OP.F_CV;13.452706337;100.0 +25/10/2020 02:06:24;U879.TC205D_OP.F_CV;13.452706337;100.0 +25/10/2020 02:06:25;U879.TC205D_OP.F_CV;14.973240852;100.0 +25/10/2020 02:06:28;U879.TC205D_OP.F_CV;13.453705788;100.0 +25/10/2020 02:06:30;U879.TC205D_OP.F_CV;14.974240303;100.0 +25/10/2020 02:06:32;U879.TC205D_OP.F_CV;15.375603676;100.0 +25/10/2020 02:06:36;U879.TC205D_OP.F_CV;12.338680267;100.0 +25/10/2020 02:06:38;U879.TC205D_OP.F_CV;14.979240417;100.0 +25/10/2020 02:06:42;U879.TC205D_OP.F_CV;13.861214638;100.0 +25/10/2020 02:06:46;U879.TC205D_OP.F_CV;12.342679024;100.0 +25/10/2020 02:06:47;U879.TC205D_OP.F_CV;14.983239174;100.0 +25/10/2020 02:06:49;U879.TC205D_OP.F_CV;12.343678474;100.0 +25/10/2020 02:06:50;U879.TC205D_OP.F_CV;13.463704109;100.0 +25/10/2020 02:06:54;U879.TC205D_OP.F_CV;13.463704109;100.0 +25/10/2020 02:06:55;U879.TC205D_OP.F_CV;14.266686440;100.0 +25/10/2020 02:06:58;U879.TC205D_OP.F_CV;12.748296738;100.0 +25/10/2020 02:06:59;U879.TC205D_OP.F_CV;13.869215965;100.0 +25/10/2020 02:06:00;U879.TC205D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:01;U879.TC205D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:02;U879.TC205D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:03;U879.TC205D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:04;U879.TC205D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:05;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:06;U879.TC205D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:07;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:08;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:09;U879.TC205D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:10;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:11;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:12;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:13;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:14;U879.TC205D_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:15;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:16;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:17;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:18;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:19;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:20;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:21;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:22;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:24;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:25;U879.TC205D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:26;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:27;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:28;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:29;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:30;U879.TC205D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:31;U879.TC205D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:32;U879.TC205D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:33;U879.TC205D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:34;U879.TC205D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:35;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:36;U879.TC205D_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:37;U879.TC205D_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:38;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:39;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:40;U879.TC205D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:41;U879.TC205D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:42;U879.TC205D_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:43;U879.TC205D_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:44;U879.TC205D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:45;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:46;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:47;U879.TC205D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:48;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:49;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:50;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:51;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:52;U879.TC205D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:53;U879.TC205D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:54;U879.TC205D_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:55;U879.TC205D_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:56;U879.TC205D_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:57;U879.TC205D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:58;U879.TC205D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:59;U879.TC205D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:23;U879.TC205D_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC205E_OP.F_CV;11.550556183;100.0 +25/10/2020 02:06:01;U879.TC205E_OP.F_CV;14.192116737;100.0 +25/10/2020 02:06:03;U879.TC205E_OP.F_CV;13.074090004;100.0 +25/10/2020 02:06:04;U879.TC205E_OP.F_CV;10.035093307;100.0 +25/10/2020 02:06:06;U879.TC205E_OP.F_CV;12.275091171;100.0 +25/10/2020 02:06:07;U879.TC205E_OP.F_CV;13.795554161;100.0 +25/10/2020 02:06:09;U879.TC205E_OP.F_CV;11.156119347;100.0 +25/10/2020 02:06:10;U879.TC205E_OP.F_CV;12.276090622;100.0 +25/10/2020 02:06:12;U879.TC205E_OP.F_CV;13.796553612;100.0 +25/10/2020 02:06:13;U879.TC205E_OP.F_CV;11.157118797;100.0 +25/10/2020 02:06:15;U879.TC205E_OP.F_CV;10.756628036;100.0 +25/10/2020 02:06:16;U879.TC205E_OP.F_CV;14.916525841;100.0 +25/10/2020 02:06:18;U879.TC205E_OP.F_CV;12.677581787;100.0 +25/10/2020 02:06:19;U879.TC205E_OP.F_CV;11.158118248;100.0 +25/10/2020 02:06:21;U879.TC205E_OP.F_CV;10.757629395;100.0 +25/10/2020 02:06:22;U879.TC205E_OP.F_CV;11.876601219;100.0 +25/10/2020 02:06:29;U879.TC205E_OP.F_CV;11.876601219;100.0 +25/10/2020 02:06:30;U879.TC205E_OP.F_CV;13.392061234;100.0 +25/10/2020 02:06:32;U879.TC205E_OP.F_CV;10.751627922;100.0 +25/10/2020 02:06:34;U879.TC205E_OP.F_CV;13.390062332;100.0 +25/10/2020 02:06:36;U879.TC205E_OP.F_CV;10.749627113;100.0 +25/10/2020 02:06:38;U879.TC205E_OP.F_CV;11.868599892;100.0 +25/10/2020 02:06:42;U879.TC205E_OP.F_CV;13.386061668;100.0 +25/10/2020 02:06:44;U879.TC205E_OP.F_CV;10.745627403;100.0 +25/10/2020 02:06:46;U879.TC205E_OP.F_CV;11.864599228;100.0 +25/10/2020 02:06:47;U879.TC205E_OP.F_CV;13.384060860;100.0 +25/10/2020 02:06:49;U879.TC205E_OP.F_CV;10.743627548;100.0 +25/10/2020 02:06:50;U879.TC205E_OP.F_CV;11.862598419;100.0 +25/10/2020 02:06:58;U879.TC205E_OP.F_CV;11.862598419;100.0 +25/10/2020 02:06:59;U879.TC205E_OP.F_CV;10.336061478;100.0 +25/10/2020 02:06:00;U879.TC205E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:01;U879.TC205E_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:02;U879.TC205E_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:03;U879.TC205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:04;U879.TC205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:05;U879.TC205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:06;U879.TC205E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:07;U879.TC205E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:08;U879.TC205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:09;U879.TC205E_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:10;U879.TC205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:11;U879.TC205E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:12;U879.TC205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:13;U879.TC205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:14;U879.TC205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:15;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:16;U879.TC205E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:17;U879.TC205E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:18;U879.TC205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:19;U879.TC205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:20;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:21;U879.TC205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:22;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:23;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:24;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:25;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:26;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:27;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:28;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:29;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:30;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:31;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:32;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:33;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:34;U879.TC205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:35;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:36;U879.TC205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:37;U879.TC205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:38;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:39;U879.TC205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:40;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:41;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:42;U879.TC205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:43;U879.TC205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:44;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:45;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:46;U879.TC205E_PV.F_CV;50.200000763;100.0 +25/10/2020 02:06:47;U879.TC205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:48;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:49;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:50;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:51;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:52;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:53;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:54;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:55;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:56;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:57;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:58;U879.TC205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:59;U879.TC205E_PV.F_CV;50.200000763;100.0 +25/10/2020 02:06:23;U879.TC205E_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:00;U879.TC205F_OP.F_CV;11.863411903;100.0 +25/10/2020 02:06:02;U879.TC205F_OP.F_CV;12.983437538;100.0 +25/10/2020 02:06:03;U879.TC205F_OP.F_CV;14.503972054;100.0 +25/10/2020 02:06:04;U879.TC205F_OP.F_CV;13.384945869;100.0 +25/10/2020 02:06:06;U879.TC205F_OP.F_CV;11.865410805;100.0 +25/10/2020 02:06:07;U879.TC205F_OP.F_CV;12.985436440;100.0 +25/10/2020 02:06:09;U879.TC205F_OP.F_CV;14.505970955;100.0 +25/10/2020 02:06:10;U879.TC205F_OP.F_CV;11.866411209;100.0 +25/10/2020 02:06:12;U879.TC205F_OP.F_CV;12.986436844;100.0 +25/10/2020 02:06:15;U879.TC205F_OP.F_CV;14.506971359;100.0 +25/10/2020 02:06:16;U879.TC205F_OP.F_CV;11.867410660;100.0 +25/10/2020 02:06:18;U879.TC205F_OP.F_CV;12.987436295;100.0 +25/10/2020 02:06:21;U879.TC205F_OP.F_CV;16.028362274;100.0 +25/10/2020 02:06:22;U879.TC205F_OP.F_CV;10.749493599;100.0 +25/10/2020 02:06:24;U879.TC205F_OP.F_CV;12.989438057;100.0 +25/10/2020 02:06:25;U879.TC205F_OP.F_CV;14.509972572;100.0 +25/10/2020 02:06:27;U879.TC205F_OP.F_CV;11.870410919;100.0 +25/10/2020 02:06:28;U879.TC205F_OP.F_CV;16.031362534;100.0 +25/10/2020 02:06:30;U879.TC205F_OP.F_CV;12.273028374;100.0 +25/10/2020 02:06:32;U879.TC205F_OP.F_CV;11.873411179;100.0 +25/10/2020 02:06:34;U879.TC205F_OP.F_CV;14.513972282;100.0 +25/10/2020 02:06:36;U879.TC205F_OP.F_CV;13.394947052;100.0 +25/10/2020 02:06:38;U879.TC205F_OP.F_CV;11.875411987;100.0 +25/10/2020 02:06:40;U879.TC205F_OP.F_CV;12.995436668;100.0 +25/10/2020 02:06:45;U879.TC205F_OP.F_CV;12.995436668;100.0 +25/10/2020 02:06:46;U879.TC205F_OP.F_CV;11.474903107;100.0 +25/10/2020 02:06:47;U879.TC205F_OP.F_CV;14.114463806;100.0 +25/10/2020 02:06:49;U879.TC205F_OP.F_CV;12.994438171;100.0 +25/10/2020 02:06:50;U879.TC205F_OP.F_CV;11.473903656;100.0 +25/10/2020 02:06:52;U879.TC205F_OP.F_CV;12.993438721;100.0 +25/10/2020 02:06:55;U879.TC205F_OP.F_CV;14.112463951;100.0 +25/10/2020 02:06:58;U879.TC205F_OP.F_CV;12.992438316;100.0 +25/10/2020 02:06:00;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U879.TC205F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:02;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:03;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:04;U879.TC205F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:05;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:06;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:07;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:08;U879.TC205F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:09;U879.TC205F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:10;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:11;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:12;U879.TC205F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:13;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:14;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:15;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:16;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:17;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:18;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:19;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:20;U879.TC205F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:21;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:22;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:24;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:25;U879.TC205F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:26;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:27;U879.TC205F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:28;U879.TC205F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:29;U879.TC205F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:30;U879.TC205F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:31;U879.TC205F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:32;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:33;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:34;U879.TC205F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:35;U879.TC205F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:36;U879.TC205F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:37;U879.TC205F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:38;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:39;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:40;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:41;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:42;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:43;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:44;U879.TC205F_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:45;U879.TC205F_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:46;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:47;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:48;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:49;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:50;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:51;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:52;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:53;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:54;U879.TC205F_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:55;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:56;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:57;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:58;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:59;U879.TC205F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC205F_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC206A_OP.F_CV;7.066012383;100.0 +25/10/2020 02:06:02;U879.TC206A_OP.F_CV;4.429703712;100.0 +25/10/2020 02:06:03;U879.TC206A_OP.F_CV;5.552622318;100.0 +25/10/2020 02:06:06;U879.TC206A_OP.F_CV;4.037943363;100.0 +25/10/2020 02:06:07;U879.TC206A_OP.F_CV;6.680755615;100.0 +25/10/2020 02:06:09;U879.TC206A_OP.F_CV;5.563623428;100.0 +25/10/2020 02:06:10;U879.TC206A_OP.F_CV;1.005019188;100.0 +25/10/2020 02:06:12;U879.TC206A_OP.F_CV;7.406020164;100.0 +25/10/2020 02:06:14;U879.TC206A_OP.F_CV;5.168076038;100.0 +25/10/2020 02:06:15;U879.TC206A_OP.F_CV;3.649686098;100.0 +25/10/2020 02:06:16;U879.TC206A_OP.F_CV;6.290994644;100.0 +25/10/2020 02:06:19;U879.TC206A_OP.F_CV;3.253070593;100.0 +25/10/2020 02:06:22;U879.TC206A_OP.F_CV;7.414021015;100.0 +25/10/2020 02:06:23;U879.TC206A_OP.F_CV;2.135151863;100.0 +25/10/2020 02:06:27;U879.TC206A_OP.F_CV;4.377096176;100.0 +25/10/2020 02:06:31;U879.TC206A_OP.F_CV;2.856561184;100.0 +25/10/2020 02:06:32;U879.TC206A_OP.F_CV;5.496121883;100.0 +25/10/2020 02:06:34;U879.TC206A_OP.F_CV;4.376096249;100.0 +25/10/2020 02:06:35;U879.TC206A_OP.F_CV;2.855561495;100.0 +25/10/2020 02:06:37;U879.TC206A_OP.F_CV;5.495121956;100.0 +25/10/2020 02:06:38;U879.TC206A_OP.F_CV;2.854561329;100.0 +25/10/2020 02:06:40;U879.TC206A_OP.F_CV;3.973587036;100.0 +25/10/2020 02:06:44;U879.TC206A_OP.F_CV;3.973587036;100.0 +25/10/2020 02:06:45;U879.TC206A_OP.F_CV;2.449197531;100.0 +25/10/2020 02:06:47;U879.TC206A_OP.F_CV;3.567116261;100.0 +25/10/2020 02:06:51;U879.TC206A_OP.F_CV;3.567116261;100.0 +25/10/2020 02:06:52;U879.TC206A_OP.F_CV;2.040436983;100.0 +25/10/2020 02:06:53;U879.TC206A_OP.F_CV;3.157569170;100.0 +25/10/2020 02:06:55;U879.TC206A_OP.F_CV;4.675249100;100.0 +25/10/2020 02:06:56;U879.TC206A_OP.F_CV;2.032436848;100.0 +25/10/2020 02:06:58;U879.TC206A_OP.F_CV;3.149569273;100.0 +25/10/2020 02:06:05;U879.TC206A_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:10;U879.TC206A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:12;U879.TC206A_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:14;U879.TC206A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:23;U879.TC206A_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:02;U879.TC206B_OP.F_CV;4.988614082;100.0 +25/10/2020 02:06:03;U879.TC206B_OP.F_CV;6.509149075;100.0 +25/10/2020 02:06:04;U879.TC206B_OP.F_CV;6.910512924;100.0 +25/10/2020 02:06:06;U879.TC206B_OP.F_CV;4.272204876;100.0 +25/10/2020 02:06:07;U879.TC206B_OP.F_CV;5.393123627;100.0 +25/10/2020 02:06:09;U879.TC206B_OP.F_CV;6.914513588;100.0 +25/10/2020 02:06:10;U879.TC206B_OP.F_CV;7.317274570;100.0 +25/10/2020 02:06:12;U879.TC206B_OP.F_CV;4.679461956;100.0 +25/10/2020 02:06:14;U879.TC206B_OP.F_CV;7.322274685;100.0 +25/10/2020 02:06:15;U879.TC206B_OP.F_CV;6.205142021;100.0 +25/10/2020 02:06:17;U879.TC206B_OP.F_CV;4.687462807;100.0 +25/10/2020 02:06:21;U879.TC206B_OP.F_CV;4.687462807;100.0 +25/10/2020 02:06:22;U879.TC206B_OP.F_CV;8.855665207;100.0 +25/10/2020 02:06:23;U879.TC206B_OP.F_CV;5.099224091;100.0 +25/10/2020 02:06:25;U879.TC206B_OP.F_CV;7.344275475;100.0 +25/10/2020 02:06:29;U879.TC206B_OP.F_CV;7.344275475;100.0 +25/10/2020 02:06:30;U879.TC206B_OP.F_CV;6.232143402;100.0 +25/10/2020 02:06:32;U879.TC206B_OP.F_CV;7.755533218;100.0 +25/10/2020 02:06:34;U879.TC206B_OP.F_CV;5.119224548;100.0 +25/10/2020 02:06:35;U879.TC206B_OP.F_CV;6.242143631;100.0 +25/10/2020 02:06:39;U879.TC206B_OP.F_CV;9.292068481;100.0 +25/10/2020 02:06:41;U879.TC206B_OP.F_CV;4.016199112;100.0 +25/10/2020 02:06:43;U879.TC206B_OP.F_CV;6.259143353;100.0 +25/10/2020 02:06:45;U879.TC206B_OP.F_CV;4.744464397;100.0 +25/10/2020 02:06:46;U879.TC206B_OP.F_CV;7.387276649;100.0 +25/10/2020 02:06:49;U879.TC206B_OP.F_CV;6.270144463;100.0 +25/10/2020 02:06:52;U879.TC206B_OP.F_CV;4.755465031;100.0 +25/10/2020 02:06:53;U879.TC206B_OP.F_CV;7.398277283;100.0 +25/10/2020 02:06:55;U879.TC206B_OP.F_CV;6.685615540;100.0 +25/10/2020 02:06:58;U879.TC206B_OP.F_CV;3.648545980;100.0 +25/10/2020 02:06:59;U879.TC206B_OP.F_CV;7.411277294;100.0 +25/10/2020 02:06:20;U879.TC206B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:22;U879.TC206B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:32;U879.TC206B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:50;U879.TC206B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:54;U879.TC206B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:57;U879.TC206B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:23;U879.TC206B_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:06;U879.TC206C_OP.F_CV;5.168573380;100.0 +25/10/2020 02:06:07;U879.TC206C_OP.F_CV;3.648038149;100.0 +25/10/2020 02:06:09;U879.TC206C_OP.F_CV;4.767064095;100.0 +25/10/2020 02:06:10;U879.TC206C_OP.F_CV;6.286598206;100.0 +25/10/2020 02:06:12;U879.TC206C_OP.F_CV;5.166572571;100.0 +25/10/2020 02:06:16;U879.TC206C_OP.F_CV;5.166572571;100.0 +25/10/2020 02:06:17;U879.TC206C_OP.F_CV;3.646038055;100.0 +25/10/2020 02:06:19;U879.TC206C_OP.F_CV;4.764063835;100.0 +25/10/2020 02:06:22;U879.TC206C_OP.F_CV;6.283598423;100.0 +25/10/2020 02:06:23;U879.TC206C_OP.F_CV;5.163572788;100.0 +25/10/2020 02:06:25;U879.TC206C_OP.F_CV;3.643037558;100.0 +25/10/2020 02:06:28;U879.TC206C_OP.F_CV;6.281597614;100.0 +25/10/2020 02:06:30;U879.TC206C_OP.F_CV;3.641037464;100.0 +25/10/2020 02:06:32;U879.TC206C_OP.F_CV;4.760063171;100.0 +25/10/2020 02:06:36;U879.TC206C_OP.F_CV;4.760063171;100.0 +25/10/2020 02:06:37;U879.TC206C_OP.F_CV;3.236673117;100.0 +25/10/2020 02:06:38;U879.TC206C_OP.F_CV;5.874981403;100.0 +25/10/2020 02:06:40;U879.TC206C_OP.F_CV;6.274597645;100.0 +25/10/2020 02:06:41;U879.TC206C_OP.F_CV;5.154572010;100.0 +25/10/2020 02:06:43;U879.TC206C_OP.F_CV;3.634036779;100.0 +25/10/2020 02:06:44;U879.TC206C_OP.F_CV;3.232672930;100.0 +25/10/2020 02:06:46;U879.TC206C_OP.F_CV;5.870981216;100.0 +25/10/2020 02:06:47;U879.TC206C_OP.F_CV;4.750062943;100.0 +25/10/2020 02:06:49;U879.TC206C_OP.F_CV;3.228672981;100.0 +25/10/2020 02:06:50;U879.TC206C_OP.F_CV;5.866981030;100.0 +25/10/2020 02:06:51;U879.TC206C_OP.F_CV;4.746062279;100.0 +25/10/2020 02:06:53;U879.TC206C_OP.F_CV;6.265597343;100.0 +25/10/2020 02:06:55;U879.TC206C_OP.F_CV;3.223672390;100.0 +25/10/2020 02:06:58;U879.TC206C_OP.F_CV;5.861980915;100.0 +25/10/2020 02:06:59;U879.TC206C_OP.F_CV;3.220672607;100.0 +25/10/2020 02:06:35;U879.TC206C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:39;U879.TC206C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:44;U879.TC206C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:53;U879.TC206C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:55;U879.TC206C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:23;U879.TC206C_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC206D_OP.F_CV;1.479111552;100.0 +25/10/2020 02:06:01;U879.TC206D_OP.F_CV;2.595030546;100.0 +25/10/2020 02:06:03;U879.TC206D_OP.F_CV;4.111420631;100.0 +25/10/2020 02:06:04;U879.TC206D_OP.F_CV;2.988501549;100.0 +25/10/2020 02:06:09;U879.TC206D_OP.F_CV;2.988501549;100.0 +25/10/2020 02:06:10;U879.TC206D_OP.F_CV;4.497180462;100.0 +25/10/2020 02:06:12;U879.TC206D_OP.F_CV;0.333978862;100.0 +25/10/2020 02:06:13;U879.TC206D_OP.F_CV;4.090419769;100.0 +25/10/2020 02:06:15;U879.TC206D_OP.F_CV;2.967500448;100.0 +25/10/2020 02:06:18;U879.TC206D_OP.F_CV;6.002570152;100.0 +25/10/2020 02:06:19;U879.TC206D_OP.F_CV;0.720449448;100.0 +25/10/2020 02:06:21;U879.TC206D_OP.F_CV;2.957500458;100.0 +25/10/2020 02:06:22;U879.TC206D_OP.F_CV;4.475180626;100.0 +25/10/2020 02:06:25;U879.TC206D_OP.F_CV;2.232129097;100.0 +25/10/2020 02:06:28;U879.TC206D_OP.F_CV;3.348047972;100.0 +25/10/2020 02:06:30;U879.TC206D_OP.F_CV;4.866437912;100.0 +25/10/2020 02:06:32;U879.TC206D_OP.F_CV;2.225129128;100.0 +25/10/2020 02:06:34;U879.TC206D_OP.F_CV;4.460180283;100.0 +25/10/2020 02:06:36;U879.TC206D_OP.F_CV;4.858437538;100.0 +25/10/2020 02:06:38;U879.TC206D_OP.F_CV;2.217128754;100.0 +25/10/2020 02:06:40;U879.TC206D_OP.F_CV;4.452179909;100.0 +25/10/2020 02:06:42;U879.TC206D_OP.F_CV;4.850436687;100.0 +25/10/2020 02:06:44;U879.TC206D_OP.F_CV;3.729518414;100.0 +25/10/2020 02:06:46;U879.TC206D_OP.F_CV;5.249052525;100.0 +25/10/2020 02:06:47;U879.TC206D_OP.F_CV;2.608492374;100.0 +25/10/2020 02:06:49;U879.TC206D_OP.F_CV;3.727517843;100.0 +25/10/2020 02:06:52;U879.TC206D_OP.F_CV;5.246052742;100.0 +25/10/2020 02:06:53;U879.TC206D_OP.F_CV;2.605492115;100.0 +25/10/2020 02:06:55;U879.TC206D_OP.F_CV;5.244051933;100.0 +25/10/2020 02:06:58;U879.TC206D_OP.F_CV;4.124026775;100.0 +25/10/2020 02:06:17;U879.TC206D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:18;U879.TC206D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:24;U879.TC206D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:32;U879.TC206D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:35;U879.TC206D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:38;U879.TC206D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:23;U879.TC206D_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:14;U879.TC206E_OP.F_CV;3.622871876;100.0 +25/10/2020 02:06:15;U879.TC206E_OP.F_CV;2.102337122;100.0 +25/10/2020 02:06:16;U879.TC206E_OP.F_CV;4.741897583;100.0 +25/10/2020 02:06:18;U879.TC206E_OP.F_CV;3.621871948;100.0 +25/10/2020 02:06:21;U879.TC206E_OP.F_CV;2.101337194;100.0 +25/10/2020 02:06:22;U879.TC206E_OP.F_CV;3.220362663;100.0 +25/10/2020 02:06:24;U879.TC206E_OP.F_CV;4.739897728;100.0 +25/10/2020 02:06:25;U879.TC206E_OP.F_CV;3.619872093;100.0 +25/10/2020 02:06:28;U879.TC206E_OP.F_CV;4.738897800;100.0 +25/10/2020 02:06:30;U879.TC206E_OP.F_CV;0.577947617;100.0 +25/10/2020 02:06:32;U879.TC206E_OP.F_CV;5.856816769;100.0 +25/10/2020 02:06:34;U879.TC206E_OP.F_CV;3.616872072;100.0 +25/10/2020 02:06:36;U879.TC206E_OP.F_CV;2.096337557;100.0 +25/10/2020 02:06:38;U879.TC206E_OP.F_CV;3.215363026;100.0 +25/10/2020 02:06:39;U879.TC206E_OP.F_CV;4.734898090;100.0 +25/10/2020 02:06:40;U879.TC206E_OP.F_CV;3.614872456;100.0 +25/10/2020 02:06:42;U879.TC206E_OP.F_CV;2.094337702;100.0 +25/10/2020 02:06:44;U879.TC206E_OP.F_CV;4.733898163;100.0 +25/10/2020 02:06:46;U879.TC206E_OP.F_CV;2.093337536;100.0 +25/10/2020 02:06:47;U879.TC206E_OP.F_CV;4.732897758;100.0 +25/10/2020 02:06:49;U879.TC206E_OP.F_CV;3.612871885;100.0 +25/10/2020 02:06:44;U879.TC206E_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:23;U879.TC206E_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC206F_OP.F_CV;6.633373737;100.0 +25/10/2020 02:06:03;U879.TC206F_OP.F_CV;8.155763626;100.0 +25/10/2020 02:06:05;U879.TC206F_OP.F_CV;3.996920109;100.0 +25/10/2020 02:06:06;U879.TC206F_OP.F_CV;7.757399082;100.0 +25/10/2020 02:06:07;U879.TC206F_OP.F_CV;5.117839336;100.0 +25/10/2020 02:06:09;U879.TC206F_OP.F_CV;7.758399487;100.0 +25/10/2020 02:06:10;U879.TC206F_OP.F_CV;8.159764290;100.0 +25/10/2020 02:06:12;U879.TC206F_OP.F_CV;4.000920773;100.0 +25/10/2020 02:06:13;U879.TC206F_OP.F_CV;9.281789780;100.0 +25/10/2020 02:06:15;U879.TC206F_OP.F_CV;5.523455620;100.0 +25/10/2020 02:06:16;U879.TC206F_OP.F_CV;6.644374371;100.0 +25/10/2020 02:06:20;U879.TC206F_OP.F_CV;6.644374371;100.0 +25/10/2020 02:06:21;U879.TC206F_OP.F_CV;8.167764664;100.0 +25/10/2020 02:06:22;U879.TC206F_OP.F_CV;5.529456139;100.0 +25/10/2020 02:06:24;U879.TC206F_OP.F_CV;8.170764923;100.0 +25/10/2020 02:06:25;U879.TC206F_OP.F_CV;7.052845955;100.0 +25/10/2020 02:06:27;U879.TC206F_OP.F_CV;4.013921261;100.0 +25/10/2020 02:06:28;U879.TC206F_OP.F_CV;6.253865719;100.0 +25/10/2020 02:06:30;U879.TC206F_OP.F_CV;9.294790268;100.0 +25/10/2020 02:06:32;U879.TC206F_OP.F_CV;5.536456108;100.0 +25/10/2020 02:06:34;U879.TC206F_OP.F_CV;4.018921375;100.0 +25/10/2020 02:06:36;U879.TC206F_OP.F_CV;6.258865833;100.0 +25/10/2020 02:06:40;U879.TC206F_OP.F_CV;6.660375118;100.0 +25/10/2020 02:06:43;U879.TC206F_OP.F_CV;8.181764603;100.0 +25/10/2020 02:06:44;U879.TC206F_OP.F_CV;4.022921085;100.0 +25/10/2020 02:06:46;U879.TC206F_OP.F_CV;7.783400059;100.0 +25/10/2020 02:06:47;U879.TC206F_OP.F_CV;5.143840313;100.0 +25/10/2020 02:06:49;U879.TC206F_OP.F_CV;6.263865948;100.0 +25/10/2020 02:06:52;U879.TC206F_OP.F_CV;6.665375233;100.0 +25/10/2020 02:06:55;U879.TC206F_OP.F_CV;8.187765121;100.0 +25/10/2020 02:06:58;U879.TC206F_OP.F_CV;5.549456596;100.0 +25/10/2020 02:06:59;U879.TC206F_OP.F_CV;5.149840355;100.0 +25/10/2020 02:06:44;U879.TC206F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:23;U879.TC206F_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:13;U879.TC222A_OP.F_CV;5.190768719;100.0 +25/10/2020 02:06:14;U879.TC222A_OP.F_CV;2.149844646;100.0 +25/10/2020 02:06:15;U879.TC222A_OP.F_CV;4.387789249;100.0 +25/10/2020 02:06:16;U879.TC222A_OP.F_CV;7.426713467;100.0 +25/10/2020 02:06:19;U879.TC222A_OP.F_CV;5.186769485;100.0 +25/10/2020 02:06:27;U879.TC222A_OP.F_CV;5.186769485;100.0 +25/10/2020 02:06:28;U879.TC222A_OP.F_CV;2.145844936;100.0 +25/10/2020 02:06:31;U879.TC222A_OP.F_CV;7.424714088;100.0 +25/10/2020 02:06:32;U879.TC222A_OP.F_CV;5.184769630;100.0 +25/10/2020 02:06:34;U879.TC222A_OP.F_CV;6.705304623;100.0 +25/10/2020 02:06:35;U879.TC222A_OP.F_CV;4.065744400;100.0 +25/10/2020 02:06:37;U879.TC222A_OP.F_CV;2.144845486;100.0 +25/10/2020 02:06:38;U879.TC222A_OP.F_CV;8.944249153;100.0 +25/10/2020 02:06:40;U879.TC222A_OP.F_CV;1.023819447;100.0 +25/10/2020 02:06:41;U879.TC222A_OP.F_CV;7.422714233;100.0 +25/10/2020 02:06:43;U879.TC222A_OP.F_CV;2.141845226;100.0 +25/10/2020 02:06:44;U879.TC222A_OP.F_CV;7.420713902;100.0 +25/10/2020 02:06:45;U879.TC222A_OP.F_CV;5.180769444;100.0 +25/10/2020 02:06:54;U879.TC222A_OP.F_CV;5.180769444;100.0 +25/10/2020 02:06:55;U879.TC222A_OP.F_CV;0.619165421;100.0 +25/10/2020 02:06:56;U879.TC222A_OP.F_CV;8.537846565;100.0 +25/10/2020 02:06:58;U879.TC222A_OP.F_CV;5.177769661;100.0 +25/10/2020 02:06:59;U879.TC222A_OP.F_CV;0.616165161;100.0 +25/10/2020 02:06:03;U879.TC222A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:04;U879.TC222A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:14;U879.TC222A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:16;U879.TC222A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:28;U879.TC222A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:30;U879.TC222A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:35;U879.TC222A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:37;U879.TC222A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:39;U879.TC222A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:40;U879.TC222A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:42;U879.TC222A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:43;U879.TC222A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:54;U879.TC222A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:55;U879.TC222A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:59;U879.TC222A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:23;U879.TC222A_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:02;U879.TC222B_OP.F_CV;8.531194687;100.0 +25/10/2020 02:06:03;U879.TC222B_OP.F_CV;4.372351170;100.0 +25/10/2020 02:06:04;U879.TC222B_OP.F_CV;8.132830620;100.0 +25/10/2020 02:06:06;U879.TC222B_OP.F_CV;7.013805389;100.0 +25/10/2020 02:06:09;U879.TC222B_OP.F_CV;5.495270729;100.0 +25/10/2020 02:06:10;U879.TC222B_OP.F_CV;8.135831833;100.0 +25/10/2020 02:06:12;U879.TC222B_OP.F_CV;8.537196159;100.0 +25/10/2020 02:06:14;U879.TC222B_OP.F_CV;7.419277191;100.0 +25/10/2020 02:06:15;U879.TC222B_OP.F_CV;5.900887489;100.0 +25/10/2020 02:06:17;U879.TC222B_OP.F_CV;7.021805763;100.0 +25/10/2020 02:06:19;U879.TC222B_OP.F_CV;8.544196129;100.0 +25/10/2020 02:06:22;U879.TC222B_OP.F_CV;5.905887127;100.0 +25/10/2020 02:06:23;U879.TC222B_OP.F_CV;5.506271839;100.0 +25/10/2020 02:06:27;U879.TC222B_OP.F_CV;5.506271839;100.0 +25/10/2020 02:06:28;U879.TC222B_OP.F_CV;9.668222427;100.0 +25/10/2020 02:06:30;U879.TC222B_OP.F_CV;7.430277348;100.0 +25/10/2020 02:06:32;U879.TC222B_OP.F_CV;5.911888123;100.0 +25/10/2020 02:06:34;U879.TC222B_OP.F_CV;5.512272358;100.0 +25/10/2020 02:06:35;U879.TC222B_OP.F_CV;8.152832985;100.0 +25/10/2020 02:06:37;U879.TC222B_OP.F_CV;7.033807755;100.0 +25/10/2020 02:06:41;U879.TC222B_OP.F_CV;5.516273022;100.0 +25/10/2020 02:06:43;U879.TC222B_OP.F_CV;8.156833649;100.0 +25/10/2020 02:06:44;U879.TC222B_OP.F_CV;7.037807941;100.0 +25/10/2020 02:06:46;U879.TC222B_OP.F_CV;8.560197830;100.0 +25/10/2020 02:06:49;U879.TC222B_OP.F_CV;4.401354313;100.0 +25/10/2020 02:06:50;U879.TC222B_OP.F_CV;8.161833763;100.0 +25/10/2020 02:06:52;U879.TC222B_OP.F_CV;7.042808533;100.0 +25/10/2020 02:06:53;U879.TC222B_OP.F_CV;8.564198494;100.0 +25/10/2020 02:06:55;U879.TC222B_OP.F_CV;5.927889824;100.0 +25/10/2020 02:06:58;U879.TC222B_OP.F_CV;5.528273582;100.0 +25/10/2020 02:06:59;U879.TC222B_OP.F_CV;9.689224243;100.0 +25/10/2020 02:06:02;U879.TC222B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:03;U879.TC222B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:25;U879.TC222B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:28;U879.TC222B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:33;U879.TC222B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:34;U879.TC222B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:48;U879.TC222B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:52;U879.TC222B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:57;U879.TC222B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:58;U879.TC222B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:23;U879.TC222B_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC222C_OP.F_CV;6.369069576;100.0 +25/10/2020 02:06:06;U879.TC222C_OP.F_CV;6.369069576;100.0 +25/10/2020 02:06:07;U879.TC222C_OP.F_CV;4.848535061;100.0 +25/10/2020 02:06:09;U879.TC222C_OP.F_CV;7.488094807;100.0 +25/10/2020 02:06:10;U879.TC222C_OP.F_CV;6.368069172;100.0 +25/10/2020 02:06:12;U879.TC222C_OP.F_CV;4.847534657;100.0 +25/10/2020 02:06:13;U879.TC222C_OP.F_CV;7.487094402;100.0 +25/10/2020 02:06:15;U879.TC222C_OP.F_CV;6.367068768;100.0 +25/10/2020 02:06:21;U879.TC222C_OP.F_CV;6.367068768;100.0 +25/10/2020 02:06:22;U879.TC222C_OP.F_CV;4.846533775;100.0 +25/10/2020 02:06:23;U879.TC222C_OP.F_CV;7.486093998;100.0 +25/10/2020 02:06:25;U879.TC222C_OP.F_CV;4.845533848;100.0 +25/10/2020 02:06:28;U879.TC222C_OP.F_CV;6.365068436;100.0 +25/10/2020 02:06:32;U879.TC222C_OP.F_CV;7.885603428;100.0 +25/10/2020 02:06:34;U879.TC222C_OP.F_CV;6.766577721;100.0 +25/10/2020 02:06:35;U879.TC222C_OP.F_CV;5.247042656;100.0 +25/10/2020 02:06:37;U879.TC222C_OP.F_CV;6.367068291;100.0 +25/10/2020 02:06:42;U879.TC222C_OP.F_CV;6.367068291;100.0 +25/10/2020 02:06:43;U879.TC222C_OP.F_CV;7.887603760;100.0 +25/10/2020 02:06:44;U879.TC222C_OP.F_CV;6.768577576;100.0 +25/10/2020 02:06:46;U879.TC222C_OP.F_CV;5.249043465;100.0 +25/10/2020 02:06:47;U879.TC222C_OP.F_CV;7.889603615;100.0 +25/10/2020 02:06:49;U879.TC222C_OP.F_CV;6.770578384;100.0 +25/10/2020 02:06:51;U879.TC222C_OP.F_CV;5.252043247;100.0 +25/10/2020 02:06:53;U879.TC222C_OP.F_CV;6.372068882;100.0 +25/10/2020 02:06:55;U879.TC222C_OP.F_CV;5.654659748;100.0 +25/10/2020 02:06:58;U879.TC222C_OP.F_CV;6.775578976;100.0 +25/10/2020 02:06:54;U879.TC222C_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:58;U879.TC222C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC222C_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC222D_OP.F_CV;6.995995522;100.0 +25/10/2020 02:06:04;U879.TC222D_OP.F_CV;8.519385338;100.0 +25/10/2020 02:06:06;U879.TC222D_OP.F_CV;5.881076336;100.0 +25/10/2020 02:06:07;U879.TC222D_OP.F_CV;5.481461048;100.0 +25/10/2020 02:06:09;U879.TC222D_OP.F_CV;8.122021675;100.0 +25/10/2020 02:06:10;U879.TC222D_OP.F_CV;5.482461452;100.0 +25/10/2020 02:06:12;U879.TC222D_OP.F_CV;6.602487087;100.0 +25/10/2020 02:06:15;U879.TC222D_OP.F_CV;8.123022079;100.0 +25/10/2020 02:06:17;U879.TC222D_OP.F_CV;5.483461857;100.0 +25/10/2020 02:06:18;U879.TC222D_OP.F_CV;8.124022484;100.0 +25/10/2020 02:06:19;U879.TC222D_OP.F_CV;5.484462261;100.0 +25/10/2020 02:06:21;U879.TC222D_OP.F_CV;6.604487896;100.0 +25/10/2020 02:06:25;U879.TC222D_OP.F_CV;5.485462666;100.0 +25/10/2020 02:06:29;U879.TC222D_OP.F_CV;5.485462666;100.0 +25/10/2020 02:06:30;U879.TC222D_OP.F_CV;9.647413254;100.0 +25/10/2020 02:06:32;U879.TC222D_OP.F_CV;5.889078617;100.0 +25/10/2020 02:06:34;U879.TC222D_OP.F_CV;8.130023956;100.0 +25/10/2020 02:06:36;U879.TC222D_OP.F_CV;5.490463734;100.0 +25/10/2020 02:06:38;U879.TC222D_OP.F_CV;6.610489368;100.0 +25/10/2020 02:06:42;U879.TC222D_OP.F_CV;5.089953899;100.0 +25/10/2020 02:06:44;U879.TC222D_OP.F_CV;7.729514599;100.0 +25/10/2020 02:06:46;U879.TC222D_OP.F_CV;6.609488964;100.0 +25/10/2020 02:06:52;U879.TC222D_OP.F_CV;6.609488964;100.0 +25/10/2020 02:06:53;U879.TC222D_OP.F_CV;5.088953972;100.0 +25/10/2020 02:06:55;U879.TC222D_OP.F_CV;6.608488560;100.0 +25/10/2020 02:06:59;U879.TC222D_OP.F_CV;5.087953568;100.0 +25/10/2020 02:06:07;U879.TC222D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC222D_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC222E_OP.F_CV;11.069254875;100.0 +25/10/2020 02:06:01;U879.TC222E_OP.F_CV;10.272256851;100.0 +25/10/2020 02:06:04;U879.TC222E_OP.F_CV;10.676746368;100.0 +25/10/2020 02:06:06;U879.TC222E_OP.F_CV;10.279254913;100.0 +25/10/2020 02:06:07;U879.TC222E_OP.F_CV;10.681745529;100.0 +25/10/2020 02:06:09;U879.TC222E_OP.F_CV;10.284255028;100.0 +25/10/2020 02:06:18;U879.TC222E_OP.F_CV;10.284255028;100.0 +25/10/2020 02:06:19;U879.TC222E_OP.F_CV;10.698743820;100.0 +25/10/2020 02:06:21;U879.TC222E_OP.F_CV;10.301253319;100.0 +25/10/2020 02:06:43;U879.TC222E_OP.F_CV;10.301253319;100.0 +25/10/2020 02:06:44;U879.TC222E_OP.F_CV;9.930742264;100.0 +25/10/2020 02:06:48;U879.TC222E_OP.F_CV;9.930742264;100.0 +25/10/2020 02:06:49;U879.TC222E_OP.F_CV;10.334252357;100.0 +25/10/2020 02:06:53;U879.TC222E_OP.F_CV;9.939743042;100.0 +25/10/2020 02:06:55;U879.TC222E_OP.F_CV;9.139743805;100.0 +25/10/2020 02:06:58;U879.TC222E_OP.F_CV;9.539252281;100.0 +25/10/2020 02:06:59;U879.TC222E_OP.F_CV;9.138744354;100.0 +25/10/2020 02:06:42;U879.TC222E_PV.F_CV;79.900001526;100.0 +25/10/2020 02:06:55;U879.TC222E_PV.F_CV;80.099998474;100.0 +25/10/2020 02:06:58;U879.TC222E_PV.F_CV;79.900001526;100.0 +25/10/2020 02:06:59;U879.TC222E_PV.F_CV;80.099998474;100.0 +25/10/2020 02:06:23;U879.TC222E_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:00;U879.TC222F_OP.F_CV;1.054305077;100.0 +25/10/2020 02:06:02;U879.TC222F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U879.TC222F_OP.F_CV;4.808497906;100.0 +25/10/2020 02:06:04;U879.TC222F_OP.F_CV;3.365464926;100.0 +25/10/2020 02:06:06;U879.TC222F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U879.TC222F_OP.F_CV;16.244863510;100.0 +25/10/2020 02:06:09;U879.TC222F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U879.TC222F_OP.F_CV;13.921916008;100.0 +25/10/2020 02:06:12;U879.TC222F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U879.TC222F_OP.F_CV;4.963819027;100.0 +25/10/2020 02:06:15;U879.TC222F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U879.TC222F_OP.F_CV;16.159862518;100.0 +25/10/2020 02:06:18;U879.TC222F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U879.TC222F_OP.F_CV;7.032943726;100.0 +25/10/2020 02:06:22;U879.TC222F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U879.TC222F_OP.F_CV;20.309352875;100.0 +25/10/2020 02:06:27;U879.TC222F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U879.TC222F_OP.F_CV;22.228359222;100.0 +25/10/2020 02:06:32;U879.TC222F_OP.F_CV;5.834911346;100.0 +25/10/2020 02:06:34;U879.TC222F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U879.TC222F_OP.F_CV;23.759895325;100.0 +25/10/2020 02:06:40;U879.TC222F_OP.F_CV;27.200473785;100.0 +25/10/2020 02:06:43;U879.TC222F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U879.TC222F_OP.F_CV;2.011007309;100.0 +25/10/2020 02:06:46;U879.TC222F_OP.F_CV;9.215775490;100.0 +25/10/2020 02:06:47;U879.TC222F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U879.TC222F_OP.F_CV;5.530912399;100.0 +25/10/2020 02:06:52;U879.TC222F_OP.F_CV;16.968990326;100.0 +25/10/2020 02:06:55;U879.TC222F_OP.F_CV;17.768756866;100.0 +25/10/2020 02:06:58;U879.TC222F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U879.TC222F_OP.F_CV;26.090053558;100.0 +25/10/2020 02:06:02;U879.TC222F_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:03;U879.TC222F_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:04;U879.TC222F_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:05;U879.TC222F_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:06;U879.TC222F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:07;U879.TC222F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:08;U879.TC222F_PV.F_CV;70.800003052;100.0 +25/10/2020 02:06:09;U879.TC222F_PV.F_CV;71.000000000;100.0 +25/10/2020 02:06:10;U879.TC222F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:12;U879.TC222F_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:13;U879.TC222F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:15;U879.TC222F_PV.F_CV;71.000000000;100.0 +25/10/2020 02:06:16;U879.TC222F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:17;U879.TC222F_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:22;U879.TC222F_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:23;U879.TC222F_PV.F_CV;71.099998474;100.0 +25/10/2020 02:06:24;U879.TC222F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:25;U879.TC222F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:26;U879.TC222F_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:27;U879.TC222F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:28;U879.TC222F_PV.F_CV;71.000000000;100.0 +25/10/2020 02:06:30;U879.TC222F_PV.F_CV;70.800003052;100.0 +25/10/2020 02:06:32;U879.TC222F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:34;U879.TC222F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:35;U879.TC222F_PV.F_CV;71.000000000;100.0 +25/10/2020 02:06:36;U879.TC222F_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:38;U879.TC222F_PV.F_CV;70.900001526;100.0 +25/10/2020 02:06:40;U879.TC222F_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:42;U879.TC222F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:43;U879.TC222F_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:44;U879.TC222F_PV.F_CV;69.300003052;100.0 +25/10/2020 02:06:46;U879.TC222F_PV.F_CV;69.099998474;100.0 +25/10/2020 02:06:47;U879.TC222F_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:48;U879.TC222F_PV.F_CV;71.000000000;100.0 +25/10/2020 02:06:49;U879.TC222F_PV.F_CV;70.800003052;100.0 +25/10/2020 02:06:52;U879.TC222F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:54;U879.TC222F_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:55;U879.TC222F_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:57;U879.TC222F_PV.F_CV;70.800003052;100.0 +25/10/2020 02:06:58;U879.TC222F_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:23;U879.TC222F_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:18;U879.TC223A_OP.F_CV;6.097164154;100.0 +25/10/2020 02:06:19;U879.TC223A_OP.F_CV;7.216189384;100.0 +25/10/2020 02:06:22;U879.TC223A_OP.F_CV;6.096163750;100.0 +25/10/2020 02:06:33;U879.TC223A_OP.F_CV;6.096163750;100.0 +25/10/2020 02:06:34;U879.TC223A_OP.F_CV;4.575628757;100.0 +25/10/2020 02:06:35;U879.TC223A_OP.F_CV;7.215188980;100.0 +25/10/2020 02:06:37;U879.TC223A_OP.F_CV;7.615697861;100.0 +25/10/2020 02:06:38;U879.TC223A_OP.F_CV;4.976138115;100.0 +25/10/2020 02:06:40;U879.TC223A_OP.F_CV;6.096163750;100.0 +25/10/2020 02:06:41;U879.TC223A_OP.F_CV;4.575628757;100.0 +25/10/2020 02:06:43;U879.TC223A_OP.F_CV;7.215188980;100.0 +25/10/2020 02:06:44;U879.TC223A_OP.F_CV;6.095163345;100.0 +25/10/2020 02:06:45;U879.TC223A_OP.F_CV;4.574628353;100.0 +25/10/2020 02:06:47;U879.TC223A_OP.F_CV;5.693654060;100.0 +25/10/2020 02:06:48;U879.TC223A_OP.F_CV;7.213188171;100.0 +25/10/2020 02:06:50;U879.TC223A_OP.F_CV;6.093162537;100.0 +25/10/2020 02:06:52;U879.TC223A_OP.F_CV;4.572628021;100.0 +25/10/2020 02:06:53;U879.TC223A_OP.F_CV;5.691653252;100.0 +25/10/2020 02:06:56;U879.TC223A_OP.F_CV;7.210188389;100.0 +25/10/2020 02:06:58;U879.TC223A_OP.F_CV;4.569627762;100.0 +25/10/2020 02:06:59;U879.TC223A_OP.F_CV;7.209187984;100.0 +25/10/2020 02:06:17;U879.TC223A_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:35;U879.TC223A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:37;U879.TC223A_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:23;U879.TC223A_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC223B_OP.F_CV;6.213479996;100.0 +25/10/2020 02:06:02;U879.TC223B_OP.F_CV;5.092454433;100.0 +25/10/2020 02:06:04;U879.TC223B_OP.F_CV;3.569919348;100.0 +25/10/2020 02:06:06;U879.TC223B_OP.F_CV;6.208479404;100.0 +25/10/2020 02:06:07;U879.TC223B_OP.F_CV;5.087454319;100.0 +25/10/2020 02:06:09;U879.TC223B_OP.F_CV;3.565919399;100.0 +25/10/2020 02:06:10;U879.TC223B_OP.F_CV;6.204479694;100.0 +25/10/2020 02:06:12;U879.TC223B_OP.F_CV;6.603916645;100.0 +25/10/2020 02:06:14;U879.TC223B_OP.F_CV;2.442947388;100.0 +25/10/2020 02:06:15;U879.TC223B_OP.F_CV;6.201479912;100.0 +25/10/2020 02:06:17;U879.TC223B_OP.F_CV;5.080454350;100.0 +25/10/2020 02:06:19;U879.TC223B_OP.F_CV;6.197480202;100.0 +25/10/2020 02:06:22;U879.TC223B_OP.F_CV;5.076454639;100.0 +25/10/2020 02:06:23;U879.TC223B_OP.F_CV;3.554919720;100.0 +25/10/2020 02:06:25;U879.TC223B_OP.F_CV;6.191479206;100.0 +25/10/2020 02:06:28;U879.TC223B_OP.F_CV;5.069454193;100.0 +25/10/2020 02:06:30;U879.TC223B_OP.F_CV;3.547919273;100.0 +25/10/2020 02:06:32;U879.TC223B_OP.F_CV;6.186479568;100.0 +25/10/2020 02:06:34;U879.TC223B_OP.F_CV;5.065454006;100.0 +25/10/2020 02:06:37;U879.TC223B_OP.F_CV;3.542919159;100.0 +25/10/2020 02:06:38;U879.TC223B_OP.F_CV;6.181479454;100.0 +25/10/2020 02:06:39;U879.TC223B_OP.F_CV;5.060453892;100.0 +25/10/2020 02:06:43;U879.TC223B_OP.F_CV;5.060453892;100.0 +25/10/2020 02:06:44;U879.TC223B_OP.F_CV;3.536919117;100.0 +25/10/2020 02:06:45;U879.TC223B_OP.F_CV;6.175479412;100.0 +25/10/2020 02:06:46;U879.TC223B_OP.F_CV;3.533919334;100.0 +25/10/2020 02:06:49;U879.TC223B_OP.F_CV;4.651945114;100.0 +25/10/2020 02:06:52;U879.TC223B_OP.F_CV;6.168479919;100.0 +25/10/2020 02:06:53;U879.TC223B_OP.F_CV;3.526919127;100.0 +25/10/2020 02:06:55;U879.TC223B_OP.F_CV;5.044454098;100.0 +25/10/2020 02:06:29;U879.TC223B_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:23;U879.TC223B_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:00;U879.TC223C_OP.F_CV;8.118762970;100.0 +25/10/2020 02:06:01;U879.TC223C_OP.F_CV;5.479202747;100.0 +25/10/2020 02:06:03;U879.TC223C_OP.F_CV;6.599228382;100.0 +25/10/2020 02:06:21;U879.TC223C_OP.F_CV;6.599228382;100.0 +25/10/2020 02:06:22;U879.TC223C_OP.F_CV;8.119763374;100.0 +25/10/2020 02:06:23;U879.TC223C_OP.F_CV;7.000737667;100.0 +25/10/2020 02:06:25;U879.TC223C_OP.F_CV;6.601229191;100.0 +25/10/2020 02:06:28;U879.TC223C_OP.F_CV;7.720254421;100.0 +25/10/2020 02:06:30;U879.TC223C_OP.F_CV;6.600228786;100.0 +25/10/2020 02:06:43;U879.TC223C_OP.F_CV;6.600228786;100.0 +25/10/2020 02:06:44;U879.TC223C_OP.F_CV;8.120763779;100.0 +25/10/2020 02:06:46;U879.TC223C_OP.F_CV;5.481203556;100.0 +25/10/2020 02:06:47;U879.TC223C_OP.F_CV;8.121764183;100.0 +25/10/2020 02:06:49;U879.TC223C_OP.F_CV;7.002738953;100.0 +25/10/2020 02:06:50;U879.TC223C_OP.F_CV;5.483204365;100.0 +25/10/2020 02:06:51;U879.TC223C_OP.F_CV;8.123764992;100.0 +25/10/2020 02:06:53;U879.TC223C_OP.F_CV;7.004739761;100.0 +25/10/2020 02:06:55;U879.TC223C_OP.F_CV;6.605230331;100.0 +25/10/2020 02:06:26;U879.TC223C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:43;U879.TC223C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:23;U879.TC223C_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:26;U879.TC223D_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U879.TC223D_PV.F_CV;31.200000763;100.0 +25/10/2020 02:06:23;U879.TC223D_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:00;U879.TC223E_OP.F_CV;3.320089340;100.0 +25/10/2020 02:06:01;U879.TC223E_OP.F_CV;5.960523605;100.0 +25/10/2020 02:06:03;U879.TC223E_OP.F_CV;1.800626755;100.0 +25/10/2020 02:06:04;U879.TC223E_OP.F_CV;7.080495358;100.0 +25/10/2020 02:06:06;U879.TC223E_OP.F_CV;3.321089029;100.0 +25/10/2020 02:06:07;U879.TC223E_OP.F_CV;5.961524010;100.0 +25/10/2020 02:06:09;U879.TC223E_OP.F_CV;6.363086224;100.0 +25/10/2020 02:06:10;U879.TC223E_OP.F_CV;5.245060921;100.0 +25/10/2020 02:06:12;U879.TC223E_OP.F_CV;2.206063747;100.0 +25/10/2020 02:06:13;U879.TC223E_OP.F_CV;4.446061611;100.0 +25/10/2020 02:06:15;U879.TC223E_OP.F_CV;7.487058640;100.0 +25/10/2020 02:06:16;U879.TC223E_OP.F_CV;5.249060631;100.0 +25/10/2020 02:06:18;U879.TC223E_OP.F_CV;3.730525970;100.0 +25/10/2020 02:06:19;U879.TC223E_OP.F_CV;4.851551533;100.0 +25/10/2020 02:06:23;U879.TC223E_OP.F_CV;4.851551533;100.0 +25/10/2020 02:06:24;U879.TC223E_OP.F_CV;3.334089279;100.0 +25/10/2020 02:06:25;U879.TC223E_OP.F_CV;4.454061508;100.0 +25/10/2020 02:06:28;U879.TC223E_OP.F_CV;5.974524021;100.0 +25/10/2020 02:06:30;U879.TC223E_OP.F_CV;4.855551720;100.0 +25/10/2020 02:06:37;U879.TC223E_OP.F_CV;4.855551720;100.0 +25/10/2020 02:06:38;U879.TC223E_OP.F_CV;3.340089321;100.0 +25/10/2020 02:06:39;U879.TC223E_OP.F_CV;4.460061550;100.0 +25/10/2020 02:06:40;U879.TC223E_OP.F_CV;7.501058102;100.0 +25/10/2020 02:06:42;U879.TC223E_OP.F_CV;3.742525816;100.0 +25/10/2020 02:06:44;U879.TC223E_OP.F_CV;4.863551617;100.0 +25/10/2020 02:06:48;U879.TC223E_OP.F_CV;4.863551617;100.0 +25/10/2020 02:06:49;U879.TC223E_OP.F_CV;6.387085915;100.0 +25/10/2020 02:06:50;U879.TC223E_OP.F_CV;6.789595127;100.0 +25/10/2020 02:06:52;U879.TC223E_OP.F_CV;1.111038208;100.0 +25/10/2020 02:06:53;U879.TC223E_OP.F_CV;5.991523266;100.0 +25/10/2020 02:06:55;U879.TC223E_OP.F_CV;3.353089333;100.0 +25/10/2020 02:06:58;U879.TC223E_OP.F_CV;7.514058590;100.0 +25/10/2020 02:06:59;U879.TC223E_OP.F_CV;2.235063314;100.0 +25/10/2020 02:06:02;U879.TC223E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:04;U879.TC223E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:23;U879.TC223E_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:02;U879.TC223F_OP.F_CV;5.058368206;100.0 +25/10/2020 02:06:03;U879.TC223F_OP.F_CV;3.537906170;100.0 +25/10/2020 02:06:04;U879.TC223F_OP.F_CV;6.177340508;100.0 +25/10/2020 02:06:06;U879.TC223F_OP.F_CV;3.536905766;100.0 +25/10/2020 02:06:07;U879.TC223F_OP.F_CV;6.176340103;100.0 +25/10/2020 02:06:09;U879.TC223F_OP.F_CV;5.056367874;100.0 +25/10/2020 02:06:10;U879.TC223F_OP.F_CV;3.535905361;100.0 +25/10/2020 02:06:12;U879.TC223F_OP.F_CV;6.175339699;100.0 +25/10/2020 02:06:13;U879.TC223F_OP.F_CV;5.055367470;100.0 +25/10/2020 02:06:20;U879.TC223F_OP.F_CV;5.055367470;100.0 +25/10/2020 02:06:21;U879.TC223F_OP.F_CV;6.575829983;100.0 +25/10/2020 02:06:22;U879.TC223F_OP.F_CV;3.936395407;100.0 +25/10/2020 02:06:24;U879.TC223F_OP.F_CV;5.056367874;100.0 +25/10/2020 02:06:33;U879.TC223F_OP.F_CV;5.056367874;100.0 +25/10/2020 02:06:34;U879.TC223F_OP.F_CV;3.937395811;100.0 +25/10/2020 02:06:36;U879.TC223F_OP.F_CV;3.536906004;100.0 +25/10/2020 02:06:38;U879.TC223F_OP.F_CV;7.696802616;100.0 +25/10/2020 02:06:40;U879.TC223F_OP.F_CV;5.057368755;100.0 +25/10/2020 02:06:44;U879.TC223F_OP.F_CV;6.577831268;100.0 +25/10/2020 02:06:46;U879.TC223F_OP.F_CV;5.458858967;100.0 +25/10/2020 02:06:47;U879.TC223F_OP.F_CV;2.418934345;100.0 +25/10/2020 02:06:49;U879.TC223F_OP.F_CV;4.657878876;100.0 +25/10/2020 02:06:50;U879.TC223F_OP.F_CV;7.697803020;100.0 +25/10/2020 02:06:52;U879.TC223F_OP.F_CV;5.058369160;100.0 +25/10/2020 02:06:55;U879.TC223F_OP.F_CV;6.578831673;100.0 +25/10/2020 02:06:58;U879.TC223F_OP.F_CV;3.939397097;100.0 +25/10/2020 02:06:59;U879.TC223F_OP.F_CV;3.538907051;100.0 +25/10/2020 02:06:01;U879.TC223F_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:02;U879.TC223F_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:15;U879.TC223F_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:18;U879.TC223F_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:20;U879.TC223F_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:35;U879.TC223F_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:36;U879.TC223F_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:47;U879.TC223F_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:55;U879.TC223F_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:59;U879.TC223F_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:23;U879.TC223F_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:00;U879.TC240A_OP.F_CV;1.641629577;100.0 +25/10/2020 02:06:01;U879.TC240A_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U879.TC240A_OP.F_CV;1.639546275;100.0 +25/10/2020 02:06:04;U879.TC240A_OP.F_CV;0.704587281;100.0 +25/10/2020 02:06:08;U879.TC240A_OP.F_CV;0.704587281;100.0 +25/10/2020 02:06:10;U879.TC240A_OP.F_CV;3.232120991;100.0 +25/10/2020 02:06:11;U879.TC240A_OP.F_CV;1.365429401;100.0 +25/10/2020 02:06:13;U879.TC240A_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U879.TC240A_OP.F_CV;1.962140441;100.0 +25/10/2020 02:06:19;U879.TC240A_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U879.TC240A_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U879.TC240A_OP.F_CV;1.279197812;100.0 +25/10/2020 02:06:28;U879.TC240A_OP.F_CV;0.343352079;100.0 +25/10/2020 02:06:29;U879.TC240A_OP.F_CV;2.875016212;100.0 +25/10/2020 02:06:31;U879.TC240A_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U879.TC240A_OP.F_CV;0.339185476;100.0 +25/10/2020 02:06:34;U879.TC240A_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U879.TC240A_OP.F_CV;1.269614697;100.0 +25/10/2020 02:06:37;U879.TC240A_OP.F_CV;0.333768964;100.0 +25/10/2020 02:06:41;U879.TC240A_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U879.TC240A_OP.F_CV;1.259198070;100.0 +25/10/2020 02:06:44;U879.TC240A_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U879.TC240A_OP.F_CV;1.256281614;100.0 +25/10/2020 02:06:47;U879.TC240A_OP.F_CV;1.587463617;100.0 +25/10/2020 02:06:49;U879.TC240A_OP.F_CV;0.652504563;100.0 +25/10/2020 02:06:50;U879.TC240A_OP.F_CV;3.185038328;100.0 +25/10/2020 02:06:52;U879.TC240A_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U879.TC240A_OP.F_CV;1.582880378;100.0 +25/10/2020 02:06:56;U879.TC240A_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U879.TC240A_OP.F_CV;1.246698499;100.0 +25/10/2020 02:06:59;U879.TC240A_OP.F_CV;1.577880502;100.0 +25/10/2020 02:06:18;U879.TC240A_PV.F_CV;30.399999619;100.0 +25/10/2020 02:06:19;U879.TC240A_PV.F_CV;30.100000381;100.0 +25/10/2020 02:06:20;U879.TC240A_PV.F_CV;30.399999619;100.0 +25/10/2020 02:06:29;U879.TC240A_PV.F_CV;30.100000381;100.0 +25/10/2020 02:06:30;U879.TC240A_PV.F_CV;30.299999237;100.0 +25/10/2020 02:06:37;U879.TC240A_PV.F_CV;30.100000381;100.0 +25/10/2020 02:06:38;U879.TC240A_PV.F_CV;30.299999237;100.0 +25/10/2020 02:06:40;U879.TC240A_PV.F_CV;30.100000381;100.0 +25/10/2020 02:06:41;U879.TC240A_PV.F_CV;30.399999619;100.0 +25/10/2020 02:06:46;U879.TC240A_PV.F_CV;30.100000381;100.0 +25/10/2020 02:06:52;U879.TC240A_PV.F_CV;30.299999237;100.0 +25/10/2020 02:06:23;U879.TC240A_SP.F_CV;30.000000000;100.0 +25/10/2020 02:06:00;U879.TC240B_OP.F_CV;4.561005116;100.0 +25/10/2020 02:06:05;U879.TC240B_OP.F_CV;4.354754448;100.0 +25/10/2020 02:06:07;U879.TC240B_OP.F_CV;4.483920574;100.0 +25/10/2020 02:06:40;U879.TC240B_OP.F_CV;4.586004734;100.0 +25/10/2020 02:06:43;U879.TC240B_OP.F_CV;4.731835842;100.0 +25/10/2020 02:06:44;U879.TC240B_OP.F_CV;4.606837749;100.0 +25/10/2020 02:06:47;U879.TC240B_OP.F_CV;4.683921814;100.0 +25/10/2020 02:06:50;U879.TC240B_OP.F_CV;4.558919907;100.0 +25/10/2020 02:06:52;U879.TC240B_OP.F_CV;4.653365612;100.0 +25/10/2020 02:06:01;U879.TC240B_PV.F_CV;35.099998474;100.0 +25/10/2020 02:06:11;U879.TC240B_PV.F_CV;34.900001526;100.0 +25/10/2020 02:06:15;U879.TC240B_PV.F_CV;35.099998474;100.0 +25/10/2020 02:06:18;U879.TC240B_PV.F_CV;34.900001526;100.0 +25/10/2020 02:06:23;U879.TC240B_SP.F_CV;35.000000000;100.0 +25/10/2020 02:06:01;U879.TC240C_OP.F_CV;1.965892792;100.0 +25/10/2020 02:06:02;U879.TC240C_OP.F_CV;5.099684715;100.0 +25/10/2020 02:06:04;U879.TC240C_OP.F_CV;5.434272289;100.0 +25/10/2020 02:06:05;U879.TC240C_OP.F_CV;5.769620895;100.0 +25/10/2020 02:06:07;U879.TC240C_OP.F_CV;2.304700375;100.0 +25/10/2020 02:06:08;U879.TC240C_OP.F_CV;4.172171593;100.0 +25/10/2020 02:06:14;U879.TC240C_OP.F_CV;4.172171593;100.0 +25/10/2020 02:06:17;U879.TC240C_OP.F_CV;5.444272518;100.0 +25/10/2020 02:06:19;U879.TC240C_OP.F_CV;1.978393078;100.0 +25/10/2020 02:06:20;U879.TC240C_OP.F_CV;5.112185001;100.0 +25/10/2020 02:06:23;U879.TC240C_OP.F_CV;1.980893016;100.0 +25/10/2020 02:06:27;U879.TC240C_OP.F_CV;3.716749430;100.0 +25/10/2020 02:06:28;U879.TC240C_OP.F_CV;4.183838844;100.0 +25/10/2020 02:06:30;U879.TC240C_OP.F_CV;4.818638802;100.0 +25/10/2020 02:06:31;U879.TC240C_OP.F_CV;5.452605247;100.0 +25/10/2020 02:06:32;U879.TC240C_OP.F_CV;5.787953854;100.0 +25/10/2020 02:06:34;U879.TC240C_OP.F_CV;2.323033810;100.0 +25/10/2020 02:06:35;U879.TC240C_OP.F_CV;2.923405170;100.0 +25/10/2020 02:06:37;U879.TC240C_OP.F_CV;5.123851299;100.0 +25/10/2020 02:06:38;U879.TC240C_OP.F_CV;4.191339016;100.0 +25/10/2020 02:06:41;U879.TC240C_OP.F_CV;2.925905704;100.0 +25/10/2020 02:06:43;U879.TC240C_OP.F_CV;3.859251261;100.0 +25/10/2020 02:06:49;U879.TC240C_OP.F_CV;2.592223406;100.0 +25/10/2020 02:06:50;U879.TC240C_OP.F_CV;3.524682522;100.0 +25/10/2020 02:06:53;U879.TC240C_OP.F_CV;2.255879641;100.0 +25/10/2020 02:06:55;U879.TC240C_OP.F_CV;4.454721928;100.0 +25/10/2020 02:06:56;U879.TC240C_OP.F_CV;3.520515919;100.0 +25/10/2020 02:06:05;U879.TC240C_PV.F_CV;34.700000763;100.0 +25/10/2020 02:06:07;U879.TC240C_PV.F_CV;35.000000000;100.0 +25/10/2020 02:06:13;U879.TC240C_PV.F_CV;34.844444275;100.0 +25/10/2020 02:06:18;U879.TC240C_PV.F_CV;35.000000000;100.0 +25/10/2020 02:06:20;U879.TC240C_PV.F_CV;34.849998474;100.0 +25/10/2020 02:06:23;U879.TC240C_PV.F_CV;35.000000000;100.0 +25/10/2020 02:06:24;U879.TC240C_PV.F_CV;34.799999237;100.0 +25/10/2020 02:06:27;U879.TC240C_PV.F_CV;34.950000763;100.0 +25/10/2020 02:06:30;U879.TC240C_PV.F_CV;34.799999237;100.0 +25/10/2020 02:06:23;U879.TC240C_SP.F_CV;35.000000000;100.0 +25/10/2020 02:06:02;U879.TC240D_OP.F_CV;4.156874657;100.0 +25/10/2020 02:06:04;U879.TC240D_OP.F_CV;1.956554413;100.0 +25/10/2020 02:06:05;U879.TC240D_OP.F_CV;1.621876955;100.0 +25/10/2020 02:06:07;U879.TC240D_OP.F_CV;3.820719242;100.0 +25/10/2020 02:06:08;U879.TC240D_OP.F_CV;2.886513233;100.0 +25/10/2020 02:06:12;U879.TC240D_OP.F_CV;2.250861883;100.0 +25/10/2020 02:06:13;U879.TC240D_OP.F_CV;1.616877079;100.0 +25/10/2020 02:06:14;U879.TC240D_OP.F_CV;3.815719128;100.0 +25/10/2020 02:06:16;U879.TC240D_OP.F_CV;4.148541451;100.0 +25/10/2020 02:06:17;U879.TC240D_OP.F_CV;1.948221087;100.0 +25/10/2020 02:06:19;U879.TC240D_OP.F_CV;2.880680084;100.0 +25/10/2020 02:06:23;U879.TC240D_OP.F_CV;2.880680084;100.0 +25/10/2020 02:06:26;U879.TC240D_OP.F_CV;1.944054484;100.0 +25/10/2020 02:06:28;U879.TC240D_OP.F_CV;2.876513720;100.0 +25/10/2020 02:06:29;U879.TC240D_OP.F_CV;4.142707825;100.0 +25/10/2020 02:06:32;U879.TC240D_OP.F_CV;4.476515770;100.0 +25/10/2020 02:06:34;U879.TC240D_OP.F_CV;2.276902914;100.0 +25/10/2020 02:06:38;U879.TC240D_OP.F_CV;1.009875298;100.0 +25/10/2020 02:06:40;U879.TC240D_OP.F_CV;5.409808159;100.0 +25/10/2020 02:06:41;U879.TC240D_OP.F_CV;2.276902914;100.0 +25/10/2020 02:06:43;U879.TC240D_OP.F_CV;1.943221211;100.0 +25/10/2020 02:06:44;U879.TC240D_OP.F_CV;2.875680447;100.0 +25/10/2020 02:06:46;U879.TC240D_OP.F_CV;1.607710481;100.0 +25/10/2020 02:06:47;U879.TC240D_OP.F_CV;5.073580742;100.0 +25/10/2020 02:06:49;U879.TC240D_OP.F_CV;3.206915855;100.0 +25/10/2020 02:06:53;U879.TC240D_OP.F_CV;2.872347116;100.0 +25/10/2020 02:06:31;U879.TC240D_PV.F_CV;34.925003052;100.0 +25/10/2020 02:06:37;U879.TC240D_PV.F_CV;35.099998474;100.0 +25/10/2020 02:06:23;U879.TC240D_SP.F_CV;35.000000000;100.0 +25/10/2020 02:06:01;U879.TC240E_OP.F_CV;3.659502745;100.0 +25/10/2020 02:06:02;U879.TC240E_OP.F_CV;1.125338793;100.0 +25/10/2020 02:06:04;U879.TC240E_OP.F_CV;2.990336895;100.0 +25/10/2020 02:06:05;U879.TC240E_OP.F_CV;4.255806923;100.0 +25/10/2020 02:06:07;U879.TC240E_OP.F_CV;3.321600914;100.0 +25/10/2020 02:06:08;U879.TC240E_OP.F_CV;5.854895592;100.0 +25/10/2020 02:06:10;U879.TC240E_OP.F_CV;1.454962730;100.0 +25/10/2020 02:06:11;U879.TC240E_OP.F_CV;3.320767403;100.0 +25/10/2020 02:06:13;U879.TC240E_OP.F_CV;2.052797794;100.0 +25/10/2020 02:06:14;U879.TC240E_OP.F_CV;5.518668175;100.0 +25/10/2020 02:06:16;U879.TC240E_OP.F_CV;2.384975433;100.0 +25/10/2020 02:06:17;U879.TC240E_OP.F_CV;3.317434549;100.0 +25/10/2020 02:06:19;U879.TC240E_OP.F_CV;4.583628654;100.0 +25/10/2020 02:06:20;U879.TC240E_OP.F_CV;2.383308411;100.0 +25/10/2020 02:06:22;U879.TC240E_OP.F_CV;3.315767527;100.0 +25/10/2020 02:06:26;U879.TC240E_OP.F_CV;3.315767527;100.0 +25/10/2020 02:06:28;U879.TC240E_OP.F_CV;5.846562386;100.0 +25/10/2020 02:06:29;U879.TC240E_OP.F_CV;2.713657141;100.0 +25/10/2020 02:06:32;U879.TC240E_OP.F_CV;2.379975319;100.0 +25/10/2020 02:06:34;U879.TC240E_OP.F_CV;3.312434196;100.0 +25/10/2020 02:06:36;U879.TC240E_OP.F_CV;3.944698334;100.0 +25/10/2020 02:06:37;U879.TC240E_OP.F_CV;4.577795506;100.0 +25/10/2020 02:06:38;U879.TC240E_OP.F_CV;3.644503117;100.0 +25/10/2020 02:06:46;U879.TC240E_OP.F_CV;4.911603451;100.0 +25/10/2020 02:06:47;U879.TC240E_OP.F_CV;2.711990833;100.0 +25/10/2020 02:06:49;U879.TC240E_OP.F_CV;3.645336628;100.0 +25/10/2020 02:06:50;U879.TC240E_OP.F_CV;2.378308773;100.0 +25/10/2020 02:06:53;U879.TC240E_OP.F_CV;2.711990833;100.0 +25/10/2020 02:06:55;U879.TC240E_OP.F_CV;3.645336628;100.0 +25/10/2020 02:06:56;U879.TC240E_OP.F_CV;4.912436485;100.0 +25/10/2020 02:06:58;U879.TC240E_OP.F_CV;2.712824345;100.0 +25/10/2020 02:06:59;U879.TC240E_OP.F_CV;3.646169901;100.0 +25/10/2020 02:06:02;U879.TC240E_PV.F_CV;35.200000763;100.0 +25/10/2020 02:06:05;U879.TC240E_PV.F_CV;35.049999237;100.0 +25/10/2020 02:06:16;U879.TC240E_PV.F_CV;35.200000763;100.0 +25/10/2020 02:06:18;U879.TC240E_PV.F_CV;35.000000000;100.0 +25/10/2020 02:06:27;U879.TC240E_PV.F_CV;35.150001526;100.0 +25/10/2020 02:06:40;U879.TC240E_PV.F_CV;34.799999237;100.0 +25/10/2020 02:06:41;U879.TC240E_PV.F_CV;35.000000000;100.0 +25/10/2020 02:06:46;U879.TC240E_PV.F_CV;34.799999237;100.0 +25/10/2020 02:06:47;U879.TC240E_PV.F_CV;35.000000000;100.0 +25/10/2020 02:06:23;U879.TC240E_SP.F_CV;35.000000000;100.0 +25/10/2020 02:06:00;U879.TC240F_OP.F_CV;4.529619694;100.0 +25/10/2020 02:06:01;U879.TC240F_OP.F_CV;3.597107410;100.0 +25/10/2020 02:06:05;U879.TC240F_OP.F_CV;4.866707802;100.0 +25/10/2020 02:06:07;U879.TC240F_OP.F_CV;2.667928219;100.0 +25/10/2020 02:06:08;U879.TC240F_OP.F_CV;2.335007191;100.0 +25/10/2020 02:06:10;U879.TC240F_OP.F_CV;7.069581032;100.0 +25/10/2020 02:06:11;U879.TC240F_OP.F_CV;0.470868587;100.0 +25/10/2020 02:06:13;U879.TC240F_OP.F_CV;5.805052757;100.0 +25/10/2020 02:06:14;U879.TC240F_OP.F_CV;3.940027952;100.0 +25/10/2020 02:06:16;U879.TC240F_OP.F_CV;1.407494307;100.0 +25/10/2020 02:06:17;U879.TC240F_OP.F_CV;5.808386326;100.0 +25/10/2020 02:06:19;U879.TC240F_OP.F_CV;5.210389137;100.0 +25/10/2020 02:06:20;U879.TC240F_OP.F_CV;1.745468616;100.0 +25/10/2020 02:06:22;U879.TC240F_OP.F_CV;2.345839977;100.0 +25/10/2020 02:06:23;U879.TC240F_OP.F_CV;4.546286106;100.0 +25/10/2020 02:06:25;U879.TC240F_OP.F_CV;2.346673489;100.0 +25/10/2020 02:06:26;U879.TC240F_OP.F_CV;7.081247330;100.0 +25/10/2020 02:06:28;U879.TC240F_OP.F_CV;4.283763409;100.0 +25/10/2020 02:06:29;U879.TC240F_OP.F_CV;1.752135396;100.0 +25/10/2020 02:06:32;U879.TC240F_OP.F_CV;4.887540817;100.0 +25/10/2020 02:06:34;U879.TC240F_OP.F_CV;2.688761234;100.0 +25/10/2020 02:06:35;U879.TC240F_OP.F_CV;4.890040398;100.0 +25/10/2020 02:06:38;U879.TC240F_OP.F_CV;3.960027933;100.0 +25/10/2020 02:06:41;U879.TC240F_OP.F_CV;2.696261168;100.0 +25/10/2020 02:06:43;U879.TC240F_OP.F_CV;4.897540569;100.0 +25/10/2020 02:06:44;U879.TC240F_OP.F_CV;1.431661010;100.0 +25/10/2020 02:06:46;U879.TC240F_OP.F_CV;4.565453053;100.0 +25/10/2020 02:06:47;U879.TC240F_OP.F_CV;4.900040627;100.0 +25/10/2020 02:06:50;U879.TC240F_OP.F_CV;2.702927828;100.0 +25/10/2020 02:06:53;U879.TC240F_OP.F_CV;4.905040741;100.0 +25/10/2020 02:06:55;U879.TC240F_OP.F_CV;2.706261158;100.0 +25/10/2020 02:06:56;U879.TC240F_OP.F_CV;3.640440226;100.0 +25/10/2020 02:06:58;U879.TC240F_OP.F_CV;2.374173403;100.0 +25/10/2020 02:06:59;U879.TC240F_OP.F_CV;5.841719151;100.0 +25/10/2020 02:06:05;U879.TC240F_PV.F_CV;34.799999237;100.0 +25/10/2020 02:06:07;U879.TC240F_PV.F_CV;34.950000763;100.0 +25/10/2020 02:06:09;U879.TC240F_PV.F_CV;34.700000763;100.0 +25/10/2020 02:06:10;U879.TC240F_PV.F_CV;34.900001526;100.0 +25/10/2020 02:06:18;U879.TC240F_PV.F_CV;34.700000763;100.0 +25/10/2020 02:06:20;U879.TC240F_PV.F_CV;34.900001526;100.0 +25/10/2020 02:06:22;U879.TC240F_PV.F_CV;34.700000763;100.0 +25/10/2020 02:06:23;U879.TC240F_PV.F_CV;34.900001526;100.0 +25/10/2020 02:06:26;U879.TC240F_PV.F_CV;34.700000763;100.0 +25/10/2020 02:06:28;U879.TC240F_PV.F_CV;34.900001526;100.0 +25/10/2020 02:06:37;U879.TC240F_PV.F_CV;34.750000000;100.0 +25/10/2020 02:06:43;U879.TC240F_PV.F_CV;34.900001526;100.0 +25/10/2020 02:06:23;U879.TC240F_SP.F_CV;35.000000000;100.0 +25/10/2020 02:06:00;U879.TC241A_OP.F_CV;4.086020470;100.0 +25/10/2020 02:06:02;U879.TC241A_OP.F_CV;5.351345062;100.0 +25/10/2020 02:06:04;U879.TC241A_OP.F_CV;4.418078899;100.0 +25/10/2020 02:06:05;U879.TC241A_OP.F_CV;3.151087523;100.0 +25/10/2020 02:06:07;U879.TC241A_OP.F_CV;4.083519936;100.0 +25/10/2020 02:06:08;U879.TC241A_OP.F_CV;6.616814613;100.0 +25/10/2020 02:06:10;U879.TC241A_OP.F_CV;3.483873129;100.0 +25/10/2020 02:06:11;U879.TC241A_OP.F_CV;4.417245865;100.0 +25/10/2020 02:06:13;U879.TC241A_OP.F_CV;3.150254250;100.0 +25/10/2020 02:06:14;U879.TC241A_OP.F_CV;6.616814613;100.0 +25/10/2020 02:06:17;U879.TC241A_OP.F_CV;5.349677563;100.0 +25/10/2020 02:06:19;U879.TC241A_OP.F_CV;3.149420738;100.0 +25/10/2020 02:06:20;U879.TC241A_OP.F_CV;6.615980625;100.0 +25/10/2020 02:06:23;U879.TC241A_OP.F_CV;5.683548927;100.0 +25/10/2020 02:06:25;U879.TC241A_OP.F_CV;4.751009941;100.0 +25/10/2020 02:06:26;U879.TC241A_OP.F_CV;3.484706879;100.0 +25/10/2020 02:06:28;U879.TC241A_OP.F_CV;4.418078899;100.0 +25/10/2020 02:06:29;U879.TC241A_OP.F_CV;5.685215950;100.0 +25/10/2020 02:06:31;U879.TC241A_OP.F_CV;2.218548775;100.0 +25/10/2020 02:06:32;U879.TC241A_OP.F_CV;6.618481159;100.0 +25/10/2020 02:06:34;U879.TC241A_OP.F_CV;3.485540390;100.0 +25/10/2020 02:06:35;U879.TC241A_OP.F_CV;5.686048985;100.0 +25/10/2020 02:06:37;U879.TC241A_OP.F_CV;3.486373901;100.0 +25/10/2020 02:06:38;U879.TC241A_OP.F_CV;3.152754784;100.0 +25/10/2020 02:06:40;U879.TC241A_OP.F_CV;5.352178097;100.0 +25/10/2020 02:06:41;U879.TC241A_OP.F_CV;4.418912888;100.0 +25/10/2020 02:06:44;U879.TC241A_OP.F_CV;5.686048985;100.0 +25/10/2020 02:06:46;U879.TC241A_OP.F_CV;6.020647049;100.0 +25/10/2020 02:06:47;U879.TC241A_OP.F_CV;2.554668427;100.0 +25/10/2020 02:06:49;U879.TC241A_OP.F_CV;4.421413422;100.0 +25/10/2020 02:06:50;U879.TC241A_OP.F_CV;5.688549519;100.0 +25/10/2020 02:06:52;U879.TC241A_OP.F_CV;3.488874435;100.0 +25/10/2020 02:06:53;U879.TC241A_OP.F_CV;5.689383507;100.0 +25/10/2020 02:06:55;U879.TC241A_OP.F_CV;6.023981094;100.0 +25/10/2020 02:06:56;U879.TC241A_OP.F_CV;2.558002472;100.0 +25/10/2020 02:06:58;U879.TC241A_OP.F_CV;4.424746990;100.0 +25/10/2020 02:06:39;U879.TC241A_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:54;U879.TC241A_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:56;U879.TC241A_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:23;U879.TC241A_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:02;U879.TC241B_OP.F_CV;5.272403240;100.0 +25/10/2020 02:06:05;U879.TC241B_OP.F_CV;5.430735588;100.0 +25/10/2020 02:06:07;U879.TC241B_OP.F_CV;5.309904575;100.0 +25/10/2020 02:06:08;U879.TC241B_OP.F_CV;5.386983395;100.0 +25/10/2020 02:06:11;U879.TC241B_OP.F_CV;5.270318985;100.0 +25/10/2020 02:06:29;U879.TC241B_OP.F_CV;5.059902668;100.0 +25/10/2020 02:06:35;U879.TC241B_OP.F_CV;4.889071941;100.0 +25/10/2020 02:06:43;U879.TC241B_OP.F_CV;4.736987114;100.0 +25/10/2020 02:06:50;U879.TC241B_OP.F_CV;4.491156578;100.0 +25/10/2020 02:06:01;U879.TC241B_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:05;U879.TC241B_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:07;U879.TC241B_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:08;U879.TC241B_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:37;U879.TC241B_PV.F_CV;50.437500000;100.0 +25/10/2020 02:06:49;U879.TC241B_PV.F_CV;50.599998474;100.0 +25/10/2020 02:06:23;U879.TC241B_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:02;U879.TC241C_OP.F_CV;5.413921356;100.0 +25/10/2020 02:06:04;U879.TC241C_OP.F_CV;1.947254181;100.0 +25/10/2020 02:06:05;U879.TC241C_OP.F_CV;5.080050468;100.0 +25/10/2020 02:06:07;U879.TC241C_OP.F_CV;4.146784782;100.0 +25/10/2020 02:06:11;U879.TC241C_OP.F_CV;2.879792929;100.0 +25/10/2020 02:06:13;U879.TC241C_OP.F_CV;5.079216957;100.0 +25/10/2020 02:06:14;U879.TC241C_OP.F_CV;4.145951271;100.0 +25/10/2020 02:06:17;U879.TC241C_OP.F_CV;6.680224419;100.0 +25/10/2020 02:06:19;U879.TC241C_OP.F_CV;2.280873299;100.0 +25/10/2020 02:06:20;U879.TC241C_OP.F_CV;4.147618294;100.0 +25/10/2020 02:06:23;U879.TC241C_OP.F_CV;3.215079308;100.0 +25/10/2020 02:06:26;U879.TC241C_OP.F_CV;4.483049393;100.0 +25/10/2020 02:06:28;U879.TC241C_OP.F_CV;5.751019001;100.0 +25/10/2020 02:06:29;U879.TC241C_OP.F_CV;4.819313526;100.0 +25/10/2020 02:06:31;U879.TC241C_OP.F_CV;1.019715786;100.0 +25/10/2020 02:06:32;U879.TC241C_OP.F_CV;7.620157242;100.0 +25/10/2020 02:06:34;U879.TC241C_OP.F_CV;4.821813583;100.0 +25/10/2020 02:06:35;U879.TC241C_OP.F_CV;3.556344032;100.0 +25/10/2020 02:06:37;U879.TC241C_OP.F_CV;5.757686615;100.0 +25/10/2020 02:06:38;U879.TC241C_OP.F_CV;6.092972279;100.0 +25/10/2020 02:06:40;U879.TC241C_OP.F_CV;5.162206173;100.0 +25/10/2020 02:06:41;U879.TC241C_OP.F_CV;3.897715092;100.0 +25/10/2020 02:06:43;U879.TC241C_OP.F_CV;3.565510750;100.0 +25/10/2020 02:06:44;U879.TC241C_OP.F_CV;3.232580423;100.0 +25/10/2020 02:06:46;U879.TC241C_OP.F_CV;6.700225830;100.0 +25/10/2020 02:06:47;U879.TC241C_OP.F_CV;3.568011045;100.0 +25/10/2020 02:06:49;U879.TC241C_OP.F_CV;5.769353390;100.0 +25/10/2020 02:06:50;U879.TC241C_OP.F_CV;4.837647915;100.0 +25/10/2020 02:06:53;U879.TC241C_OP.F_CV;6.706059456;100.0 +25/10/2020 02:06:55;U879.TC241C_OP.F_CV;4.840981007;100.0 +25/10/2020 02:06:57;U879.TC241C_OP.F_CV;4.209912777;100.0 +25/10/2020 02:06:58;U879.TC241C_OP.F_CV;3.577178001;100.0 +25/10/2020 02:06:59;U879.TC241C_OP.F_CV;4.511384010;100.0 +25/10/2020 02:06:16;U879.TC241C_PV.F_CV;49.840000153;100.0 +25/10/2020 02:06:18;U879.TC241C_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:32;U879.TC241C_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:43;U879.TC241C_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:45;U879.TC241C_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:51;U879.TC241C_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:52;U879.TC241C_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:58;U879.TC241C_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:23;U879.TC241C_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:01;U879.TC241D_OP.F_CV;6.135047913;100.0 +25/10/2020 02:06:02;U879.TC241D_OP.F_CV;3.937291145;100.0 +25/10/2020 02:06:04;U879.TC241D_OP.F_CV;3.605086803;100.0 +25/10/2020 02:06:05;U879.TC241D_OP.F_CV;5.806429386;100.0 +25/10/2020 02:06:07;U879.TC241D_OP.F_CV;4.874723434;100.0 +25/10/2020 02:06:11;U879.TC241D_OP.F_CV;3.612586975;100.0 +25/10/2020 02:06:13;U879.TC241D_OP.F_CV;4.546792984;100.0 +25/10/2020 02:06:14;U879.TC241D_OP.F_CV;7.081754208;100.0 +25/10/2020 02:06:16;U879.TC241D_OP.F_CV;2.683487892;100.0 +25/10/2020 02:06:17;U879.TC241D_OP.F_CV;5.818096161;100.0 +25/10/2020 02:06:19;U879.TC241D_OP.F_CV;3.619254112;100.0 +25/10/2020 02:06:20;U879.TC241D_OP.F_CV;7.087587833;100.0 +25/10/2020 02:06:26;U879.TC241D_OP.F_CV;4.559293747;100.0 +25/10/2020 02:06:29;U879.TC241D_OP.F_CV;5.828097343;100.0 +25/10/2020 02:06:32;U879.TC241D_OP.F_CV;3.630921841;100.0 +25/10/2020 02:06:34;U879.TC241D_OP.F_CV;4.565127373;100.0 +25/10/2020 02:06:36;U879.TC241D_OP.F_CV;4.877362728;100.0 +25/10/2020 02:06:38;U879.TC241D_OP.F_CV;5.500166416;100.0 +25/10/2020 02:06:40;U879.TC241D_OP.F_CV;3.300491333;100.0 +25/10/2020 02:06:41;U879.TC241D_OP.F_CV;2.966872215;100.0 +25/10/2020 02:06:43;U879.TC241D_OP.F_CV;6.433432579;100.0 +25/10/2020 02:06:44;U879.TC241D_OP.F_CV;3.300491333;100.0 +25/10/2020 02:06:46;U879.TC241D_OP.F_CV;5.501000404;100.0 +25/10/2020 02:06:47;U879.TC241D_OP.F_CV;5.835597992;100.0 +25/10/2020 02:06:49;U879.TC241D_OP.F_CV;2.369619370;100.0 +25/10/2020 02:06:50;U879.TC241D_OP.F_CV;5.503500938;100.0 +25/10/2020 02:06:54;U879.TC241D_OP.F_CV;3.771000862;100.0 +25/10/2020 02:06:55;U879.TC241D_OP.F_CV;2.037667274;100.0 +25/10/2020 02:06:56;U879.TC241D_OP.F_CV;7.704736710;100.0 +25/10/2020 02:06:58;U879.TC241D_OP.F_CV;3.639256477;100.0 +25/10/2020 02:06:59;U879.TC241D_OP.F_CV;4.573462486;100.0 +25/10/2020 02:06:00;U879.TC241D_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:01;U879.TC241D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:04;U879.TC241D_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:07;U879.TC241D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:20;U879.TC241D_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:21;U879.TC241D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:41;U879.TC241D_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:42;U879.TC241D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:54;U879.TC241D_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:55;U879.TC241D_PV.F_CV;49.949996948;100.0 +25/10/2020 02:06:23;U879.TC241D_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:01;U879.TC241E_OP.F_CV;3.867006540;100.0 +25/10/2020 02:06:03;U879.TC241E_OP.F_CV;4.499252319;100.0 +25/10/2020 02:06:04;U879.TC241E_OP.F_CV;5.132331371;100.0 +25/10/2020 02:06:05;U879.TC241E_OP.F_CV;4.199065685;100.0 +25/10/2020 02:06:07;U879.TC241E_OP.F_CV;2.932073832;100.0 +25/10/2020 02:06:08;U879.TC241E_OP.F_CV;6.398634434;100.0 +25/10/2020 02:06:10;U879.TC241E_OP.F_CV;1.998701572;100.0 +25/10/2020 02:06:11;U879.TC241E_OP.F_CV;5.131497860;100.0 +25/10/2020 02:06:15;U879.TC241E_OP.F_CV;3.353571177;100.0 +25/10/2020 02:06:16;U879.TC241E_OP.F_CV;2.931240559;100.0 +25/10/2020 02:06:17;U879.TC241E_OP.F_CV;5.130663872;100.0 +25/10/2020 02:06:19;U879.TC241E_OP.F_CV;4.197398663;100.0 +25/10/2020 02:06:20;U879.TC241E_OP.F_CV;5.464535236;100.0 +25/10/2020 02:06:22;U879.TC241E_OP.F_CV;1.997867942;100.0 +25/10/2020 02:06:23;U879.TC241E_OP.F_CV;5.130663872;100.0 +25/10/2020 02:06:26;U879.TC241E_OP.F_CV;1.997867942;100.0 +25/10/2020 02:06:28;U879.TC241E_OP.F_CV;5.130663872;100.0 +25/10/2020 02:06:29;U879.TC241E_OP.F_CV;2.930407047;100.0 +25/10/2020 02:06:32;U879.TC241E_OP.F_CV;5.128997803;100.0 +25/10/2020 02:06:34;U879.TC241E_OP.F_CV;5.462868690;100.0 +25/10/2020 02:06:35;U879.TC241E_OP.F_CV;4.530329704;100.0 +25/10/2020 02:06:37;U879.TC241E_OP.F_CV;1.997035027;100.0 +25/10/2020 02:06:38;U879.TC241E_OP.F_CV;3.862839937;100.0 +25/10/2020 02:06:43;U879.TC241E_OP.F_CV;3.862839937;100.0 +25/10/2020 02:06:44;U879.TC241E_OP.F_CV;5.126498222;100.0 +25/10/2020 02:06:46;U879.TC241E_OP.F_CV;4.193232536;100.0 +25/10/2020 02:06:47;U879.TC241E_OP.F_CV;2.926240683;100.0 +25/10/2020 02:06:49;U879.TC241E_OP.F_CV;3.858673334;100.0 +25/10/2020 02:06:50;U879.TC241E_OP.F_CV;5.124830723;100.0 +25/10/2020 02:06:53;U879.TC241E_OP.F_CV;6.391133785;100.0 +25/10/2020 02:06:55;U879.TC241E_OP.F_CV;3.258193016;100.0 +25/10/2020 02:06:56;U879.TC241E_OP.F_CV;4.191565514;100.0 +25/10/2020 02:06:59;U879.TC241E_OP.F_CV;5.458702087;100.0 +25/10/2020 02:06:49;U879.TC241E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:23;U879.TC241E_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:00;U879.TC241F_OP.F_CV;4.148812294;100.0 +25/10/2020 02:06:02;U879.TC241F_OP.F_CV;3.648061752;100.0 +25/10/2020 02:06:03;U879.TC241F_OP.F_CV;3.147728443;100.0 +25/10/2020 02:06:04;U879.TC241F_OP.F_CV;5.080517769;100.0 +25/10/2020 02:06:05;U879.TC241F_OP.F_CV;3.146478176;100.0 +25/10/2020 02:06:07;U879.TC241F_OP.F_CV;5.079267502;100.0 +25/10/2020 02:06:08;U879.TC241F_OP.F_CV;4.145478249;100.0 +25/10/2020 02:06:11;U879.TC241F_OP.F_CV;3.144394398;100.0 +25/10/2020 02:06:13;U879.TC241F_OP.F_CV;5.077183723;100.0 +25/10/2020 02:06:14;U879.TC241F_OP.F_CV;4.143394470;100.0 +25/10/2020 02:06:16;U879.TC241F_OP.F_CV;5.143113136;100.0 +25/10/2020 02:06:17;U879.TC241F_OP.F_CV;3.209711790;100.0 +25/10/2020 02:06:19;U879.TC241F_OP.F_CV;4.142560959;100.0 +25/10/2020 02:06:46;U879.TC241F_OP.F_CV;4.142560959;100.0 +25/10/2020 02:06:47;U879.TC241F_OP.F_CV;5.134778500;100.0 +25/10/2020 02:06:53;U879.TC241F_OP.F_CV;3.200543404;100.0 +25/10/2020 02:06:55;U879.TC241F_OP.F_CV;5.133528233;100.0 +25/10/2020 02:06:56;U879.TC241F_OP.F_CV;3.200126648;100.0 +25/10/2020 02:06:58;U879.TC241F_OP.F_CV;4.132975578;100.0 +25/10/2020 02:06:59;U879.TC241F_OP.F_CV;7.133194923;100.0 +25/10/2020 02:06:14;U879.TC241F_PV.F_CV;50.033332825;100.0 +25/10/2020 02:06:59;U879.TC241F_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:23;U879.TC241F_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:00;U879.TC242A_OP.F_CV;9.094620705;100.0 +25/10/2020 02:06:02;U879.TC242A_OP.F_CV;10.216592789;100.0 +25/10/2020 02:06:15;U879.TC242A_OP.F_CV;10.216592789;100.0 +25/10/2020 02:06:16;U879.TC242A_OP.F_CV;11.757053375;100.0 +25/10/2020 02:06:22;U879.TC242A_OP.F_CV;8.723055840;100.0 +25/10/2020 02:06:23;U879.TC242A_OP.F_CV;11.364562988;100.0 +25/10/2020 02:06:27;U879.TC242A_OP.F_CV;8.728949547;100.0 +25/10/2020 02:06:28;U879.TC242A_OP.F_CV;8.329512596;100.0 +25/10/2020 02:06:31;U879.TC242A_OP.F_CV;9.449484825;100.0 +25/10/2020 02:06:32;U879.TC242A_OP.F_CV;12.490535736;100.0 +25/10/2020 02:06:34;U879.TC242A_OP.F_CV;8.732003212;100.0 +25/10/2020 02:06:35;U879.TC242A_OP.F_CV;8.332566261;100.0 +25/10/2020 02:06:37;U879.TC242A_OP.F_CV;9.452538490;100.0 +25/10/2020 02:06:38;U879.TC242A_OP.F_CV;7.932003498;100.0 +25/10/2020 02:06:40;U879.TC242A_OP.F_CV;7.530639648;100.0 +25/10/2020 02:06:41;U879.TC242A_OP.F_CV;10.168948174;100.0 +25/10/2020 02:06:43;U879.TC242A_OP.F_CV;9.048028946;100.0 +25/10/2020 02:06:44;U879.TC242A_OP.F_CV;7.526638508;100.0 +25/10/2020 02:06:45;U879.TC242A_OP.F_CV;11.685482025;100.0 +25/10/2020 02:06:47;U879.TC242A_OP.F_CV;6.404612064;100.0 +25/10/2020 02:06:48;U879.TC242A_OP.F_CV;8.642557144;100.0 +25/10/2020 02:06:50;U879.TC242A_OP.F_CV;10.160946846;100.0 +25/10/2020 02:06:52;U879.TC242A_OP.F_CV;9.040027618;100.0 +25/10/2020 02:06:53;U879.TC242A_OP.F_CV;10.559562683;100.0 +25/10/2020 02:06:55;U879.TC242A_OP.F_CV;7.919002533;100.0 +25/10/2020 02:06:56;U879.TC242A_OP.F_CV;9.038028717;100.0 +25/10/2020 02:06:58;U879.TC242A_OP.F_CV;7.516638756;100.0 +25/10/2020 02:06:59;U879.TC242A_OP.F_CV;10.154947281;100.0 +25/10/2020 02:06:28;U879.TC242A_PV.F_CV;80.000000000;100.0 +25/10/2020 02:06:32;U879.TC242A_PV.F_CV;79.800003052;100.0 +25/10/2020 02:06:39;U879.TC242A_PV.F_CV;80.199996948;100.0 +25/10/2020 02:06:45;U879.TC242A_PV.F_CV;80.000000000;100.0 +25/10/2020 02:06:47;U879.TC242A_PV.F_CV;80.199996948;100.0 +25/10/2020 02:06:53;U879.TC242A_PV.F_CV;80.000000000;100.0 +25/10/2020 02:06:55;U879.TC242A_PV.F_CV;80.199996948;100.0 +25/10/2020 02:06:23;U879.TC242A_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:00;U879.TC242B_OP.F_CV;9.069349289;100.0 +25/10/2020 02:06:02;U879.TC242B_OP.F_CV;15.152343750;100.0 +25/10/2020 02:06:03;U879.TC242B_OP.F_CV;6.115743160;100.0 +25/10/2020 02:06:04;U879.TC242B_OP.F_CV;12.518890381;100.0 +25/10/2020 02:06:06;U879.TC242B_OP.F_CV;7.241769791;100.0 +25/10/2020 02:06:07;U879.TC242B_OP.F_CV;12.524890900;100.0 +25/10/2020 02:06:09;U879.TC242B_OP.F_CV;10.288839340;100.0 +25/10/2020 02:06:10;U879.TC242B_OP.F_CV;11.813373566;100.0 +25/10/2020 02:06:12;U879.TC242B_OP.F_CV;10.698348999;100.0 +25/10/2020 02:06:18;U879.TC242B_OP.F_CV;10.698348999;100.0 +25/10/2020 02:06:19;U879.TC242B_OP.F_CV;10.321840286;100.0 +25/10/2020 02:06:22;U879.TC242B_OP.F_CV;11.846375465;100.0 +25/10/2020 02:06:23;U879.TC242B_OP.F_CV;9.210815430;100.0 +25/10/2020 02:06:25;U879.TC242B_OP.F_CV;10.740349770;100.0 +25/10/2020 02:06:28;U879.TC242B_OP.F_CV;9.229816437;100.0 +25/10/2020 02:06:30;U879.TC242B_OP.F_CV;10.353841782;100.0 +25/10/2020 02:06:32;U879.TC242B_OP.F_CV;11.878376007;100.0 +25/10/2020 02:06:34;U879.TC242B_OP.F_CV;9.242816925;100.0 +25/10/2020 02:06:35;U879.TC242B_OP.F_CV;10.366842270;100.0 +25/10/2020 02:06:37;U879.TC242B_OP.F_CV;11.891376495;100.0 +25/10/2020 02:06:38;U879.TC242B_OP.F_CV;6.214746952;100.0 +25/10/2020 02:06:39;U879.TC242B_OP.F_CV;12.617893219;100.0 +25/10/2020 02:06:41;U879.TC242B_OP.F_CV;10.381841660;100.0 +25/10/2020 02:06:45;U879.TC242B_OP.F_CV;7.352771282;100.0 +25/10/2020 02:06:46;U879.TC242B_OP.F_CV;12.635891914;100.0 +25/10/2020 02:06:49;U879.TC242B_OP.F_CV;7.358771801;100.0 +25/10/2020 02:06:50;U879.TC242B_OP.F_CV;6.559898376;100.0 +25/10/2020 02:06:52;U879.TC242B_OP.F_CV;10.320378304;100.0 +25/10/2020 02:06:53;U879.TC242B_OP.F_CV;10.721742630;100.0 +25/10/2020 02:06:55;U879.TC242B_OP.F_CV;9.204352379;100.0 +25/10/2020 02:06:59;U879.TC242B_OP.F_CV;10.726742744;100.0 +25/10/2020 02:06:01;U879.TC242B_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:02;U879.TC242B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:04;U879.TC242B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:05;U879.TC242B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:07;U879.TC242B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:30;U879.TC242B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:32;U879.TC242B_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:38;U879.TC242B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:41;U879.TC242B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:48;U879.TC242B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:49;U879.TC242B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:50;U879.TC242B_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:23;U879.TC242B_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC242C_OP.F_CV;9.533679962;100.0 +25/10/2020 02:06:01;U879.TC242C_OP.F_CV;5.376691818;100.0 +25/10/2020 02:06:03;U879.TC242C_OP.F_CV;6.098352909;100.0 +25/10/2020 02:06:04;U879.TC242C_OP.F_CV;8.739661217;100.0 +25/10/2020 02:06:06;U879.TC242C_OP.F_CV;6.101353645;100.0 +25/10/2020 02:06:07;U879.TC242C_OP.F_CV;8.742662430;100.0 +25/10/2020 02:06:09;U879.TC242C_OP.F_CV;7.624743462;100.0 +25/10/2020 02:06:10;U879.TC242C_OP.F_CV;6.106353760;100.0 +25/10/2020 02:06:12;U879.TC242C_OP.F_CV;8.747662544;100.0 +25/10/2020 02:06:13;U879.TC242C_OP.F_CV;6.109354019;100.0 +25/10/2020 02:06:15;U879.TC242C_OP.F_CV;8.750662804;100.0 +25/10/2020 02:06:17;U879.TC242C_OP.F_CV;6.112353802;100.0 +25/10/2020 02:06:19;U879.TC242C_OP.F_CV;4.594819546;100.0 +25/10/2020 02:06:22;U879.TC242C_OP.F_CV;11.396368027;100.0 +25/10/2020 02:06:23;U879.TC242C_OP.F_CV;8.039291382;100.0 +25/10/2020 02:06:25;U879.TC242C_OP.F_CV;7.643743515;100.0 +25/10/2020 02:06:28;U879.TC242C_OP.F_CV;9.885687828;100.0 +25/10/2020 02:06:30;U879.TC242C_OP.F_CV;6.127354622;100.0 +25/10/2020 02:06:32;U879.TC242C_OP.F_CV;7.248273373;100.0 +25/10/2020 02:06:34;U879.TC242C_OP.F_CV;10.290342331;100.0 +25/10/2020 02:06:35;U879.TC242C_OP.F_CV;5.012222290;100.0 +25/10/2020 02:06:37;U879.TC242C_OP.F_CV;8.773663521;100.0 +25/10/2020 02:06:38;U879.TC242C_OP.F_CV;6.135354996;100.0 +25/10/2020 02:06:40;U879.TC242C_OP.F_CV;7.256273746;100.0 +25/10/2020 02:06:41;U879.TC242C_OP.F_CV;8.777664185;100.0 +25/10/2020 02:06:43;U879.TC242C_OP.F_CV;7.659745216;100.0 +25/10/2020 02:06:44;U879.TC242C_OP.F_CV;9.182424545;100.0 +25/10/2020 02:06:46;U879.TC242C_OP.F_CV;6.544611454;100.0 +25/10/2020 02:06:47;U879.TC242C_OP.F_CV;7.666744232;100.0 +25/10/2020 02:06:51;U879.TC242C_OP.F_CV;10.713812828;100.0 +25/10/2020 02:06:53;U879.TC242C_OP.F_CV;6.957372189;100.0 +25/10/2020 02:06:55;U879.TC242C_OP.F_CV;6.161354065;100.0 +25/10/2020 02:06:58;U879.TC242C_OP.F_CV;5.761738777;100.0 +25/10/2020 02:06:59;U879.TC242C_OP.F_CV;9.922689438;100.0 +25/10/2020 02:06:02;U879.TC242C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:20;U879.TC242C_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:22;U879.TC242C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:23;U879.TC242C_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:26;U879.TC242C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:28;U879.TC242C_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:50;U879.TC242C_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:51;U879.TC242C_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:57;U879.TC242C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:58;U879.TC242C_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:23;U879.TC242C_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U879.TC242D_OP.F_CV;6.767361164;100.0 +25/10/2020 02:06:03;U879.TC242D_OP.F_CV;1.087876201;100.0 +25/10/2020 02:06:04;U879.TC242D_OP.F_CV;5.967308998;100.0 +25/10/2020 02:06:06;U879.TC242D_OP.F_CV;3.326874256;100.0 +25/10/2020 02:06:07;U879.TC242D_OP.F_CV;4.445846558;100.0 +25/10/2020 02:06:10;U879.TC242D_OP.F_CV;5.964308262;100.0 +25/10/2020 02:06:12;U879.TC242D_OP.F_CV;4.844336510;100.0 +25/10/2020 02:06:13;U879.TC242D_OP.F_CV;3.323873758;100.0 +25/10/2020 02:06:15;U879.TC242D_OP.F_CV;5.963307858;100.0 +25/10/2020 02:06:17;U879.TC242D_OP.F_CV;3.322873354;100.0 +25/10/2020 02:06:18;U879.TC242D_OP.F_CV;4.441845894;100.0 +25/10/2020 02:06:24;U879.TC242D_OP.F_CV;4.441845894;100.0 +25/10/2020 02:06:25;U879.TC242D_OP.F_CV;5.957308292;100.0 +25/10/2020 02:06:28;U879.TC242D_OP.F_CV;4.435845852;100.0 +25/10/2020 02:06:30;U879.TC242D_OP.F_CV;5.955307961;100.0 +25/10/2020 02:06:32;U879.TC242D_OP.F_CV;3.314873219;100.0 +25/10/2020 02:06:34;U879.TC242D_OP.F_CV;4.432845592;100.0 +25/10/2020 02:06:43;U879.TC242D_OP.F_CV;4.432845592;100.0 +25/10/2020 02:06:44;U879.TC242D_OP.F_CV;5.947308064;100.0 +25/10/2020 02:06:46;U879.TC242D_OP.F_CV;4.827335835;100.0 +25/10/2020 02:06:52;U879.TC242D_OP.F_CV;4.827335835;100.0 +25/10/2020 02:06:53;U879.TC242D_OP.F_CV;3.306873083;100.0 +25/10/2020 02:06:55;U879.TC242D_OP.F_CV;4.826335907;100.0 +25/10/2020 02:06:01;U879.TC242D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:02;U879.TC242D_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:03;U879.TC242D_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:05;U879.TC242D_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:23;U879.TC242D_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:26;U879.TC242E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U879.TC242E_PV.F_CV;25.299999237;100.0 +25/10/2020 02:06:03;U879.TC242E_PV.F_CV;25.100000381;100.0 +25/10/2020 02:06:04;U879.TC242E_PV.F_CV;25.299999237;100.0 +25/10/2020 02:06:05;U879.TC242E_PV.F_CV;25.100000381;100.0 +25/10/2020 02:06:42;U879.TC242E_PV.F_CV;25.299999237;100.0 +25/10/2020 02:06:44;U879.TC242E_PV.F_CV;25.100000381;100.0 +25/10/2020 02:06:49;U879.TC242E_PV.F_CV;25.299999237;100.0 +25/10/2020 02:06:50;U879.TC242E_PV.F_CV;25.100000381;100.0 +25/10/2020 02:06:23;U879.TC242E_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:26;U879.TC242F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U879.TC242F_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:02;U879.TC242F_PV.F_CV;25.299999237;100.0 +25/10/2020 02:06:10;U879.TC242F_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:11;U879.TC242F_PV.F_CV;25.299999237;100.0 +25/10/2020 02:06:12;U879.TC242F_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:15;U879.TC242F_PV.F_CV;25.200000763;100.0 +25/10/2020 02:06:16;U879.TC242F_PV.F_CV;25.399999619;100.0 +25/10/2020 02:06:23;U879.TC242F_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:00;U879.TC243A_OP.F_CV;8.643033981;100.0 +25/10/2020 02:06:02;U879.TC243A_OP.F_CV;11.282594681;100.0 +25/10/2020 02:06:03;U879.TC243A_OP.F_CV;10.162569046;100.0 +25/10/2020 02:06:04;U879.TC243A_OP.F_CV;8.642034531;100.0 +25/10/2020 02:06:06;U879.TC243A_OP.F_CV;11.281595230;100.0 +25/10/2020 02:06:07;U879.TC243A_OP.F_CV;10.161569595;100.0 +25/10/2020 02:06:18;U879.TC243A_OP.F_CV;10.161569595;100.0 +25/10/2020 02:06:19;U879.TC243A_OP.F_CV;8.641035080;100.0 +25/10/2020 02:06:22;U879.TC243A_OP.F_CV;11.280595779;100.0 +25/10/2020 02:06:23;U879.TC243A_OP.F_CV;13.201495171;100.0 +25/10/2020 02:06:25;U879.TC243A_OP.F_CV;8.642035484;100.0 +25/10/2020 02:06:27;U879.TC243A_OP.F_CV;11.281596184;100.0 +25/10/2020 02:06:28;U879.TC243A_OP.F_CV;10.161571503;100.0 +25/10/2020 02:06:36;U879.TC243A_OP.F_CV;10.161571503;100.0 +25/10/2020 02:06:37;U879.TC243A_OP.F_CV;13.202495575;100.0 +25/10/2020 02:06:38;U879.TC243A_OP.F_CV;7.923627853;100.0 +25/10/2020 02:06:40;U879.TC243A_OP.F_CV;10.163572311;100.0 +25/10/2020 02:06:43;U879.TC243A_OP.F_CV;13.204496384;100.0 +25/10/2020 02:06:44;U879.TC243A_OP.F_CV;7.925628662;100.0 +25/10/2020 02:06:47;U879.TC243A_OP.F_CV;14.727177620;100.0 +25/10/2020 02:06:48;U879.TC243A_OP.F_CV;6.808496475;100.0 +25/10/2020 02:06:50;U879.TC243A_OP.F_CV;10.168573380;100.0 +25/10/2020 02:06:53;U879.TC243A_OP.F_CV;13.209498405;100.0 +25/10/2020 02:06:55;U879.TC243A_OP.F_CV;7.930629730;100.0 +25/10/2020 02:06:56;U879.TC243A_OP.F_CV;13.211498260;100.0 +25/10/2020 02:06:58;U879.TC243A_OP.F_CV;10.973554611;100.0 +25/10/2020 02:06:59;U879.TC243A_OP.F_CV;7.934629917;100.0 +25/10/2020 02:06:35;U879.TC243A_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:37;U879.TC243A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:40;U879.TC243A_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:41;U879.TC243A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:42;U879.TC243A_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:43;U879.TC243A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:45;U879.TC243A_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:50;U879.TC243A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:53;U879.TC243A_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:54;U879.TC243A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:55;U879.TC243A_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:59;U879.TC243A_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC243A_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC243B_OP.F_CV;8.393700600;100.0 +25/10/2020 02:06:02;U879.TC243B_OP.F_CV;11.033261299;100.0 +25/10/2020 02:06:03;U879.TC243B_OP.F_CV;9.913235664;100.0 +25/10/2020 02:06:06;U879.TC243B_OP.F_CV;8.392701149;100.0 +25/10/2020 02:06:07;U879.TC243B_OP.F_CV;9.511725426;100.0 +25/10/2020 02:06:10;U879.TC243B_OP.F_CV;11.030261040;100.0 +25/10/2020 02:06:12;U879.TC243B_OP.F_CV;8.389700890;100.0 +25/10/2020 02:06:14;U879.TC243B_OP.F_CV;11.029261589;100.0 +25/10/2020 02:06:15;U879.TC243B_OP.F_CV;9.909235954;100.0 +25/10/2020 02:06:31;U879.TC243B_OP.F_CV;9.909235954;100.0 +25/10/2020 02:06:32;U879.TC243B_OP.F_CV;11.429770470;100.0 +25/10/2020 02:06:34;U879.TC243B_OP.F_CV;8.790209770;100.0 +25/10/2020 02:06:35;U879.TC243B_OP.F_CV;8.389700890;100.0 +25/10/2020 02:06:37;U879.TC243B_OP.F_CV;11.029261589;100.0 +25/10/2020 02:06:38;U879.TC243B_OP.F_CV;9.909235954;100.0 +25/10/2020 02:06:39;U879.TC243B_OP.F_CV;11.429770470;100.0 +25/10/2020 02:06:41;U879.TC243B_OP.F_CV;8.790209770;100.0 +25/10/2020 02:06:43;U879.TC243B_OP.F_CV;9.910235405;100.0 +25/10/2020 02:06:45;U879.TC243B_OP.F_CV;8.389700890;100.0 +25/10/2020 02:06:46;U879.TC243B_OP.F_CV;11.029261589;100.0 +25/10/2020 02:06:49;U879.TC243B_OP.F_CV;9.909235954;100.0 +25/10/2020 02:06:52;U879.TC243B_OP.F_CV;8.388701439;100.0 +25/10/2020 02:06:53;U879.TC243B_OP.F_CV;12.548795700;100.0 +25/10/2020 02:06:55;U879.TC243B_OP.F_CV;9.909235954;100.0 +25/10/2020 02:06:32;U879.TC243B_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:50;U879.TC243B_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:53;U879.TC243B_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:23;U879.TC243B_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:12;U879.TC243C_OP.F_CV;9.586855888;100.0 +25/10/2020 02:06:13;U879.TC243C_OP.F_CV;11.107389450;100.0 +25/10/2020 02:06:15;U879.TC243C_OP.F_CV;9.988365173;100.0 +25/10/2020 02:06:17;U879.TC243C_OP.F_CV;8.468830109;100.0 +25/10/2020 02:06:19;U879.TC243C_OP.F_CV;9.588855743;100.0 +25/10/2020 02:06:27;U879.TC243C_OP.F_CV;9.588855743;100.0 +25/10/2020 02:06:28;U879.TC243C_OP.F_CV;11.109389305;100.0 +25/10/2020 02:06:30;U879.TC243C_OP.F_CV;8.469829559;100.0 +25/10/2020 02:06:32;U879.TC243C_OP.F_CV;9.589855194;100.0 +25/10/2020 02:06:49;U879.TC243C_OP.F_CV;9.589855194;100.0 +25/10/2020 02:06:50;U879.TC243C_OP.F_CV;11.110388756;100.0 +25/10/2020 02:06:51;U879.TC243C_OP.F_CV;8.470829010;100.0 +25/10/2020 02:06:53;U879.TC243C_OP.F_CV;9.590854645;100.0 +25/10/2020 02:06:33;U879.TC243C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TC243C_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TC243D_OP.F_CV;5.151894569;100.0 +25/10/2020 02:06:01;U879.TC243D_OP.F_CV;7.793455124;100.0 +25/10/2020 02:06:03;U879.TC243D_OP.F_CV;5.154894829;100.0 +25/10/2020 02:06:04;U879.TC243D_OP.F_CV;4.755458355;100.0 +25/10/2020 02:06:06;U879.TC243D_OP.F_CV;7.395892620;100.0 +25/10/2020 02:06:07;U879.TC243D_OP.F_CV;7.797455788;100.0 +25/10/2020 02:06:09;U879.TC243D_OP.F_CV;5.158895016;100.0 +25/10/2020 02:06:10;U879.TC243D_OP.F_CV;7.800455570;100.0 +25/10/2020 02:06:12;U879.TC243D_OP.F_CV;3.641433001;100.0 +25/10/2020 02:06:13;U879.TC243D_OP.F_CV;7.401893139;100.0 +25/10/2020 02:06:15;U879.TC243D_OP.F_CV;4.762459278;100.0 +25/10/2020 02:06:17;U879.TC243D_OP.F_CV;5.882431507;100.0 +25/10/2020 02:06:19;U879.TC243D_OP.F_CV;7.402894020;100.0 +25/10/2020 02:06:21;U879.TC243D_OP.F_CV;7.804456711;100.0 +25/10/2020 02:06:22;U879.TC243D_OP.F_CV;5.165896416;100.0 +25/10/2020 02:06:28;U879.TC243D_OP.F_CV;7.408894539;100.0 +25/10/2020 02:06:30;U879.TC243D_OP.F_CV;6.289922237;100.0 +25/10/2020 02:06:32;U879.TC243D_OP.F_CV;4.770460129;100.0 +25/10/2020 02:06:34;U879.TC243D_OP.F_CV;5.890431881;100.0 +25/10/2020 02:06:39;U879.TC243D_OP.F_CV;5.890431881;100.0 +25/10/2020 02:06:40;U879.TC243D_OP.F_CV;4.771460533;100.0 +25/10/2020 02:06:42;U879.TC243D_OP.F_CV;7.411894798;100.0 +25/10/2020 02:06:44;U879.TC243D_OP.F_CV;4.772460938;100.0 +25/10/2020 02:06:46;U879.TC243D_OP.F_CV;5.892432690;100.0 +25/10/2020 02:06:49;U879.TC243D_OP.F_CV;4.371970654;100.0 +25/10/2020 02:06:50;U879.TC243D_OP.F_CV;8.531867027;100.0 +25/10/2020 02:06:52;U879.TC243D_OP.F_CV;4.772460938;100.0 +25/10/2020 02:06:53;U879.TC243D_OP.F_CV;5.892432690;100.0 +25/10/2020 02:06:55;U879.TC243D_OP.F_CV;6.293923378;100.0 +25/10/2020 02:06:58;U879.TC243D_OP.F_CV;4.774461269;100.0 +25/10/2020 02:06:59;U879.TC243D_OP.F_CV;5.894433498;100.0 +25/10/2020 02:06:37;U879.TC243D_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:23;U879.TC243D_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:26;U879.TC243E_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U879.TC243E_PV.F_CV;26.299999237;100.0 +25/10/2020 02:06:26;U879.TC243E_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:34;U879.TC243E_PV.F_CV;26.299999237;100.0 +25/10/2020 02:06:36;U879.TC243E_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:23;U879.TC243E_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:26;U879.TC243F_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U879.TC243F_PV.F_CV;25.700000763;100.0 +25/10/2020 02:06:03;U879.TC243F_PV.F_CV;25.399999619;100.0 +25/10/2020 02:06:13;U879.TC243F_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:18;U879.TC243F_PV.F_CV;25.399999619;100.0 +25/10/2020 02:06:49;U879.TC243F_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:50;U879.TC243F_PV.F_CV;25.399999619;100.0 +25/10/2020 02:06:23;U879.TC243F_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:00;U879.TC250_OP.F_CV;5.993771076;100.0 +25/10/2020 02:06:06;U879.TC250_OP.F_CV;5.993771076;100.0 +25/10/2020 02:06:07;U879.TC250_OP.F_CV;7.514306068;100.0 +25/10/2020 02:06:09;U879.TC250_OP.F_CV;4.874745846;100.0 +25/10/2020 02:06:10;U879.TC250_OP.F_CV;5.994771481;100.0 +25/10/2020 02:06:13;U879.TC250_OP.F_CV;4.875746250;100.0 +25/10/2020 02:06:15;U879.TC250_OP.F_CV;4.475236893;100.0 +25/10/2020 02:06:16;U879.TC250_OP.F_CV;7.114797115;100.0 +25/10/2020 02:06:18;U879.TC250_OP.F_CV;7.515305996;100.0 +25/10/2020 02:06:19;U879.TC250_OP.F_CV;4.875746250;100.0 +25/10/2020 02:06:21;U879.TC250_OP.F_CV;4.475236893;100.0 +25/10/2020 02:06:22;U879.TC250_OP.F_CV;5.594262600;100.0 +25/10/2020 02:06:24;U879.TC250_OP.F_CV;8.634332657;100.0 +25/10/2020 02:06:25;U879.TC250_OP.F_CV;4.874746323;100.0 +25/10/2020 02:06:27;U879.TC250_OP.F_CV;5.994771481;100.0 +25/10/2020 02:06:28;U879.TC250_OP.F_CV;7.515306950;100.0 +25/10/2020 02:06:30;U879.TC250_OP.F_CV;1.834821701;100.0 +25/10/2020 02:06:31;U879.TC250_OP.F_CV;8.233716965;100.0 +25/10/2020 02:06:34;U879.TC250_OP.F_CV;4.473237514;100.0 +25/10/2020 02:06:37;U879.TC250_OP.F_CV;4.071873188;100.0 +25/10/2020 02:06:38;U879.TC250_OP.F_CV;6.710181713;100.0 +25/10/2020 02:06:40;U879.TC250_OP.F_CV;8.227716446;100.0 +25/10/2020 02:06:43;U879.TC250_OP.F_CV;4.467236996;100.0 +25/10/2020 02:06:44;U879.TC250_OP.F_CV;5.586262703;100.0 +25/10/2020 02:06:45;U879.TC250_OP.F_CV;7.105796814;100.0 +25/10/2020 02:06:47;U879.TC250_OP.F_CV;2.944847107;100.0 +25/10/2020 02:06:49;U879.TC250_OP.F_CV;8.223716736;100.0 +25/10/2020 02:06:50;U879.TC250_OP.F_CV;5.983771801;100.0 +25/10/2020 02:06:52;U879.TC250_OP.F_CV;4.463237286;100.0 +25/10/2020 02:06:53;U879.TC250_OP.F_CV;5.582262993;100.0 +25/10/2020 02:06:55;U879.TC250_OP.F_CV;7.101797104;100.0 +25/10/2020 02:06:56;U879.TC250_OP.F_CV;4.461236954;100.0 +25/10/2020 02:06:58;U879.TC250_OP.F_CV;5.580262184;100.0 +25/10/2020 02:06:59;U879.TC250_OP.F_CV;7.099797249;100.0 +25/10/2020 02:06:29;U879.TC250_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:30;U879.TC250_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:34;U879.TC250_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:23;U879.TC250_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TI101A_PV.F_CV;393.399993896;100.0 +25/10/2020 02:06:50;U879.TI101B_PV.F_CV;392.000000000;100.0 +25/10/2020 02:06:58;U879.TI101C_PV.F_CV;394.150024414;100.0 +25/10/2020 02:06:23;U879.TI101D_PV.F_CV;347.849975586;100.0 +25/10/2020 02:06:49;U879.TI101E_PV.F_CV;312.214294434;100.0 +25/10/2020 02:06:47;U879.TI101F_PV.F_CV;348.150024414;100.0 +25/10/2020 02:06:50;U879.TI102A_PV.F_CV;394.799987793;100.0 +25/10/2020 02:06:48;U879.TI102B_PV.F_CV;395.899993896;100.0 +25/10/2020 02:06:45;U879.TI102C_PV.F_CV;396.899993896;100.0 +25/10/2020 02:06:51;U879.TI102D_PV.F_CV;347.200012207;100.0 +25/10/2020 02:06:30;U879.TI102E_PV.F_CV;311.849975586;100.0 +25/10/2020 02:06:54;U879.TI102F_PV.F_CV;348.000000000;100.0 +25/10/2020 02:06:43;U879.TI103A_PV.F_CV;395.700012207;100.0 +25/10/2020 02:06:38;U879.TI103B_PV.F_CV;396.175018311;100.0 +25/10/2020 02:06:45;U879.TI103C_PV.F_CV;398.200012207;100.0 +25/10/2020 02:06:52;U879.TI103D_PV.F_CV;348.700012207;100.0 +25/10/2020 02:06:35;U879.TI103E_PV.F_CV;313.299987793;100.0 +25/10/2020 02:06:28;U879.TI103F_PV.F_CV;349.100006104;100.0 +25/10/2020 02:06:45;U879.TI104A_PV.F_CV;384.000000000;100.0 +25/10/2020 02:06:47;U879.TI104B_PV.F_CV;386.266662598;100.0 +25/10/2020 02:06:05;U879.TI104C_PV.F_CV;388.600006104;100.0 +25/10/2020 02:06:55;U879.TI104D_PV.F_CV;349.100006104;100.0 +25/10/2020 02:06:00;U879.TI104E_PV.F_CV;302.200012207;100.0 +25/10/2020 02:06:29;U879.TI104F_PV.F_CV;349.366668701;100.0 +25/10/2020 02:06:00;U879.TI1105A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:01;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:02;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:03;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:04;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:05;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:06;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:07;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:08;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:09;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:10;U879.TI1105A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:11;U879.TI1105A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:12;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:13;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:14;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:15;U879.TI1105A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:16;U879.TI1105A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:17;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:18;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:19;U879.TI1105A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:20;U879.TI1105A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:21;U879.TI1105A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:22;U879.TI1105A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:23;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:24;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:25;U879.TI1105A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:26;U879.TI1105A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:27;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:28;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:29;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:30;U879.TI1105A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:31;U879.TI1105A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:32;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:33;U879.TI1105A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:34;U879.TI1105A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:35;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:36;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:37;U879.TI1105A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:38;U879.TI1105A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:39;U879.TI1105A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:40;U879.TI1105A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:41;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:42;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:43;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:44;U879.TI1105A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:45;U879.TI1105A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:46;U879.TI1105A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:47;U879.TI1105A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:48;U879.TI1105A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:49;U879.TI1105A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:50;U879.TI1105A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:51;U879.TI1105A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:52;U879.TI1105A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:53;U879.TI1105A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:54;U879.TI1105A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:55;U879.TI1105A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:56;U879.TI1105A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:57;U879.TI1105A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:58;U879.TI1105A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:59;U879.TI1105A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:00;U879.TI1105B_PV.F_CV;71.800003052;100.0 +25/10/2020 02:06:01;U879.TI1105B_PV.F_CV;71.699996948;100.0 +25/10/2020 02:06:02;U879.TI1105B_PV.F_CV;71.800003052;100.0 +25/10/2020 02:06:03;U879.TI1105B_PV.F_CV;71.699996948;100.0 +25/10/2020 02:06:04;U879.TI1105B_PV.F_CV;71.800003052;100.0 +25/10/2020 02:06:05;U879.TI1105B_PV.F_CV;71.800003052;100.0 +25/10/2020 02:06:06;U879.TI1105B_PV.F_CV;71.800003052;100.0 +25/10/2020 02:06:07;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:08;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:09;U879.TI1105B_PV.F_CV;71.699996948;100.0 +25/10/2020 02:06:10;U879.TI1105B_PV.F_CV;71.800003052;100.0 +25/10/2020 02:06:11;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:12;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:13;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:14;U879.TI1105B_PV.F_CV;71.800003052;100.0 +25/10/2020 02:06:15;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:16;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:17;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:18;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:19;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:20;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:21;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:22;U879.TI1105B_PV.F_CV;71.800003052;100.0 +25/10/2020 02:06:23;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:24;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:25;U879.TI1105B_PV.F_CV;71.800003052;100.0 +25/10/2020 02:06:26;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:27;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:28;U879.TI1105B_PV.F_CV;71.800003052;100.0 +25/10/2020 02:06:29;U879.TI1105B_PV.F_CV;71.800003052;100.0 +25/10/2020 02:06:30;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:31;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:32;U879.TI1105B_PV.F_CV;72.000000000;100.0 +25/10/2020 02:06:33;U879.TI1105B_PV.F_CV;71.800003052;100.0 +25/10/2020 02:06:34;U879.TI1105B_PV.F_CV;71.800003052;100.0 +25/10/2020 02:06:35;U879.TI1105B_PV.F_CV;72.099998474;100.0 +25/10/2020 02:06:36;U879.TI1105B_PV.F_CV;72.099998474;100.0 +25/10/2020 02:06:37;U879.TI1105B_PV.F_CV;71.699996948;100.0 +25/10/2020 02:06:38;U879.TI1105B_PV.F_CV;71.800003052;100.0 +25/10/2020 02:06:39;U879.TI1105B_PV.F_CV;71.800003052;100.0 +25/10/2020 02:06:40;U879.TI1105B_PV.F_CV;71.800003052;100.0 +25/10/2020 02:06:41;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:42;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:43;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:44;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:45;U879.TI1105B_PV.F_CV;71.800003052;100.0 +25/10/2020 02:06:46;U879.TI1105B_PV.F_CV;71.800003052;100.0 +25/10/2020 02:06:47;U879.TI1105B_PV.F_CV;71.800003052;100.0 +25/10/2020 02:06:48;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:49;U879.TI1105B_PV.F_CV;72.000000000;100.0 +25/10/2020 02:06:50;U879.TI1105B_PV.F_CV;72.000000000;100.0 +25/10/2020 02:06:51;U879.TI1105B_PV.F_CV;72.000000000;100.0 +25/10/2020 02:06:52;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:53;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:54;U879.TI1105B_PV.F_CV;71.900001526;100.0 +25/10/2020 02:06:55;U879.TI1105B_PV.F_CV;72.099998474;100.0 +25/10/2020 02:06:56;U879.TI1105B_PV.F_CV;72.099998474;100.0 +25/10/2020 02:06:57;U879.TI1105B_PV.F_CV;72.000000000;100.0 +25/10/2020 02:06:58;U879.TI1105B_PV.F_CV;72.099998474;100.0 +25/10/2020 02:06:59;U879.TI1105B_PV.F_CV;72.000000000;100.0 +25/10/2020 02:06:00;U879.TI1105C_PV.F_CV;74.099998474;100.0 +25/10/2020 02:06:01;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:02;U879.TI1105C_PV.F_CV;74.099998474;100.0 +25/10/2020 02:06:03;U879.TI1105C_PV.F_CV;74.099998474;100.0 +25/10/2020 02:06:04;U879.TI1105C_PV.F_CV;74.099998474;100.0 +25/10/2020 02:06:05;U879.TI1105C_PV.F_CV;74.099998474;100.0 +25/10/2020 02:06:06;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:07;U879.TI1105C_PV.F_CV;74.099998474;100.0 +25/10/2020 02:06:08;U879.TI1105C_PV.F_CV;74.099998474;100.0 +25/10/2020 02:06:09;U879.TI1105C_PV.F_CV;74.099998474;100.0 +25/10/2020 02:06:10;U879.TI1105C_PV.F_CV;74.099998474;100.0 +25/10/2020 02:06:11;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:12;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:13;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:14;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:15;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:16;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:17;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:18;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:19;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:20;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:21;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:22;U879.TI1105C_PV.F_CV;74.099998474;100.0 +25/10/2020 02:06:23;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:24;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:25;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:26;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:27;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:28;U879.TI1105C_PV.F_CV;74.300003052;100.0 +25/10/2020 02:06:29;U879.TI1105C_PV.F_CV;74.300003052;100.0 +25/10/2020 02:06:30;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:31;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:32;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:33;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:34;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:35;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:36;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:37;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:38;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:39;U879.TI1105C_PV.F_CV;74.099998474;100.0 +25/10/2020 02:06:40;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:41;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:42;U879.TI1105C_PV.F_CV;74.000000000;100.0 +25/10/2020 02:06:43;U879.TI1105C_PV.F_CV;74.099998474;100.0 +25/10/2020 02:06:44;U879.TI1105C_PV.F_CV;74.099998474;100.0 +25/10/2020 02:06:45;U879.TI1105C_PV.F_CV;74.099998474;100.0 +25/10/2020 02:06:46;U879.TI1105C_PV.F_CV;74.199996948;100.0 +25/10/2020 02:06:47;U879.TI1105C_PV.F_CV;74.000000000;100.0 +25/10/2020 02:06:48;U879.TI1105C_PV.F_CV;74.000000000;100.0 +25/10/2020 02:06:49;U879.TI1105C_PV.F_CV;74.000000000;100.0 +25/10/2020 02:06:50;U879.TI1105C_PV.F_CV;74.000000000;100.0 +25/10/2020 02:06:51;U879.TI1105C_PV.F_CV;74.000000000;100.0 +25/10/2020 02:06:52;U879.TI1105C_PV.F_CV;74.000000000;100.0 +25/10/2020 02:06:53;U879.TI1105C_PV.F_CV;74.099998474;100.0 +25/10/2020 02:06:54;U879.TI1105C_PV.F_CV;73.900001526;100.0 +25/10/2020 02:06:55;U879.TI1105C_PV.F_CV;73.900001526;100.0 +25/10/2020 02:06:56;U879.TI1105C_PV.F_CV;73.900001526;100.0 +25/10/2020 02:06:57;U879.TI1105C_PV.F_CV;73.900001526;100.0 +25/10/2020 02:06:58;U879.TI1105C_PV.F_CV;73.900001526;100.0 +25/10/2020 02:06:59;U879.TI1105C_PV.F_CV;73.800003052;100.0 +25/10/2020 02:06:00;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:01;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:02;U879.TI1105D_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:03;U879.TI1105D_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:04;U879.TI1105D_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:05;U879.TI1105D_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:06;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:07;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:08;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:09;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:10;U879.TI1105D_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:11;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:12;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:13;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:14;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:15;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:16;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:17;U879.TI1105D_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:18;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:19;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:20;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:21;U879.TI1105D_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:22;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:23;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:24;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:25;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:26;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:27;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:28;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:29;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:30;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:31;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:32;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:33;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:34;U879.TI1105D_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:35;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:36;U879.TI1105D_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:37;U879.TI1105D_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:38;U879.TI1105D_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:39;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:40;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:41;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:42;U879.TI1105D_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:43;U879.TI1105D_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:44;U879.TI1105D_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:45;U879.TI1105D_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:46;U879.TI1105D_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:47;U879.TI1105D_PV.F_CV;69.300003052;100.0 +25/10/2020 02:06:48;U879.TI1105D_PV.F_CV;69.300003052;100.0 +25/10/2020 02:06:49;U879.TI1105D_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:50;U879.TI1105D_PV.F_CV;69.300003052;100.0 +25/10/2020 02:06:51;U879.TI1105D_PV.F_CV;69.300003052;100.0 +25/10/2020 02:06:52;U879.TI1105D_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:53;U879.TI1105D_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:54;U879.TI1105D_PV.F_CV;69.300003052;100.0 +25/10/2020 02:06:55;U879.TI1105D_PV.F_CV;69.300003052;100.0 +25/10/2020 02:06:56;U879.TI1105D_PV.F_CV;69.300003052;100.0 +25/10/2020 02:06:57;U879.TI1105D_PV.F_CV;69.300003052;100.0 +25/10/2020 02:06:58;U879.TI1105D_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:59;U879.TI1105D_PV.F_CV;69.300003052;100.0 +25/10/2020 02:06:00;U879.TI1105E_PV.F_CV;50.799999237;100.0 +25/10/2020 02:06:01;U879.TI1105E_PV.F_CV;50.799999237;100.0 +25/10/2020 02:06:02;U879.TI1105E_PV.F_CV;50.700000763;100.0 +25/10/2020 02:06:03;U879.TI1105E_PV.F_CV;50.799999237;100.0 +25/10/2020 02:06:04;U879.TI1105E_PV.F_CV;50.900001526;100.0 +25/10/2020 02:06:05;U879.TI1105E_PV.F_CV;50.700000763;100.0 +25/10/2020 02:06:06;U879.TI1105E_PV.F_CV;50.799999237;100.0 +25/10/2020 02:06:07;U879.TI1105E_PV.F_CV;50.799999237;100.0 +25/10/2020 02:06:08;U879.TI1105E_PV.F_CV;50.799999237;100.0 +25/10/2020 02:06:09;U879.TI1105E_PV.F_CV;50.799999237;100.0 +25/10/2020 02:06:10;U879.TI1105E_PV.F_CV;50.900001526;100.0 +25/10/2020 02:06:11;U879.TI1105E_PV.F_CV;50.700000763;100.0 +25/10/2020 02:06:12;U879.TI1105E_PV.F_CV;50.799999237;100.0 +25/10/2020 02:06:13;U879.TI1105E_PV.F_CV;50.799999237;100.0 +25/10/2020 02:06:14;U879.TI1105E_PV.F_CV;50.799999237;100.0 +25/10/2020 02:06:15;U879.TI1105E_PV.F_CV;50.900001526;100.0 +25/10/2020 02:06:16;U879.TI1105E_PV.F_CV;50.799999237;100.0 +25/10/2020 02:06:17;U879.TI1105E_PV.F_CV;50.900001526;100.0 +25/10/2020 02:06:18;U879.TI1105E_PV.F_CV;50.900001526;100.0 +25/10/2020 02:06:19;U879.TI1105E_PV.F_CV;50.900001526;100.0 +25/10/2020 02:06:20;U879.TI1105E_PV.F_CV;50.900001526;100.0 +25/10/2020 02:06:21;U879.TI1105E_PV.F_CV;50.799999237;100.0 +25/10/2020 02:06:22;U879.TI1105E_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:23;U879.TI1105E_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:24;U879.TI1105E_PV.F_CV;50.900001526;100.0 +25/10/2020 02:06:25;U879.TI1105E_PV.F_CV;50.900001526;100.0 +25/10/2020 02:06:26;U879.TI1105E_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:27;U879.TI1105E_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:28;U879.TI1105E_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:29;U879.TI1105E_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:30;U879.TI1105E_PV.F_CV;50.799999237;100.0 +25/10/2020 02:06:31;U879.TI1105E_PV.F_CV;50.799999237;100.0 +25/10/2020 02:06:32;U879.TI1105E_PV.F_CV;50.900001526;100.0 +25/10/2020 02:06:33;U879.TI1105E_PV.F_CV;50.900001526;100.0 +25/10/2020 02:06:34;U879.TI1105E_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:35;U879.TI1105E_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:36;U879.TI1105E_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:37;U879.TI1105E_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:38;U879.TI1105E_PV.F_CV;50.900001526;100.0 +25/10/2020 02:06:39;U879.TI1105E_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:40;U879.TI1105E_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:41;U879.TI1105E_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:42;U879.TI1105E_PV.F_CV;51.099998474;100.0 +25/10/2020 02:06:43;U879.TI1105E_PV.F_CV;51.099998474;100.0 +25/10/2020 02:06:44;U879.TI1105E_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:45;U879.TI1105E_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:46;U879.TI1105E_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:47;U879.TI1105E_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:48;U879.TI1105E_PV.F_CV;51.099998474;100.0 +25/10/2020 02:06:49;U879.TI1105E_PV.F_CV;51.099998474;100.0 +25/10/2020 02:06:50;U879.TI1105E_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:51;U879.TI1105E_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:52;U879.TI1105E_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:53;U879.TI1105E_PV.F_CV;51.099998474;100.0 +25/10/2020 02:06:54;U879.TI1105E_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:55;U879.TI1105E_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:56;U879.TI1105E_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:57;U879.TI1105E_PV.F_CV;50.900001526;100.0 +25/10/2020 02:06:58;U879.TI1105E_PV.F_CV;51.099998474;100.0 +25/10/2020 02:06:59;U879.TI1105E_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:00;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:01;U879.TI1105F_PV.F_CV;69.300003052;100.0 +25/10/2020 02:06:02;U879.TI1105F_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:03;U879.TI1105F_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:04;U879.TI1105F_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:05;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:06;U879.TI1105F_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:07;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:08;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:09;U879.TI1105F_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:10;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:11;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:12;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:13;U879.TI1105F_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:14;U879.TI1105F_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:15;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:16;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:17;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:18;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:19;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:20;U879.TI1105F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:21;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:22;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:23;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:24;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:25;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:26;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:27;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:28;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:29;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:30;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:31;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:32;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:33;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:34;U879.TI1105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:35;U879.TI1105F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:36;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:37;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:38;U879.TI1105F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:39;U879.TI1105F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:40;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:41;U879.TI1105F_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:42;U879.TI1105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:43;U879.TI1105F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:44;U879.TI1105F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:45;U879.TI1105F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:46;U879.TI1105F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:47;U879.TI1105F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:48;U879.TI1105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:49;U879.TI1105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:50;U879.TI1105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:51;U879.TI1105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:52;U879.TI1105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:53;U879.TI1105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:54;U879.TI1105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:55;U879.TI1105F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:56;U879.TI1105F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:57;U879.TI1105F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:58;U879.TI1105F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:59;U879.TI1105F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:00;U879.TI1106A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:01;U879.TI1106A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:02;U879.TI1106A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:03;U879.TI1106A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:04;U879.TI1106A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:05;U879.TI1106A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:06;U879.TI1106A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:07;U879.TI1106A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:08;U879.TI1106A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:09;U879.TI1106A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:10;U879.TI1106A_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:11;U879.TI1106A_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:12;U879.TI1106A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:13;U879.TI1106A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:14;U879.TI1106A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:15;U879.TI1106A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:16;U879.TI1106A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:17;U879.TI1106A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:18;U879.TI1106A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:19;U879.TI1106A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:20;U879.TI1106A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:21;U879.TI1106A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:22;U879.TI1106A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:23;U879.TI1106A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:24;U879.TI1106A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:25;U879.TI1106A_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:26;U879.TI1106A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:27;U879.TI1106A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:28;U879.TI1106A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:29;U879.TI1106A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:30;U879.TI1106A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:31;U879.TI1106A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:32;U879.TI1106A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:33;U879.TI1106A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:34;U879.TI1106A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:35;U879.TI1106A_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:36;U879.TI1106A_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:37;U879.TI1106A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:38;U879.TI1106A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:39;U879.TI1106A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:40;U879.TI1106A_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:41;U879.TI1106A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:42;U879.TI1106A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:43;U879.TI1106A_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:44;U879.TI1106A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:45;U879.TI1106A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:46;U879.TI1106A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:47;U879.TI1106A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:48;U879.TI1106A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:49;U879.TI1106A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:50;U879.TI1106A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:51;U879.TI1106A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:52;U879.TI1106A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:53;U879.TI1106A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:54;U879.TI1106A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:55;U879.TI1106A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:56;U879.TI1106A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:57;U879.TI1106A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:58;U879.TI1106A_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:59;U879.TI1106A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:00;U879.TI1106B_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:01;U879.TI1106B_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:02;U879.TI1106B_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:03;U879.TI1106B_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:04;U879.TI1106B_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:05;U879.TI1106B_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:06;U879.TI1106B_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:07;U879.TI1106B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:08;U879.TI1106B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:09;U879.TI1106B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:10;U879.TI1106B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:11;U879.TI1106B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:12;U879.TI1106B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:13;U879.TI1106B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:14;U879.TI1106B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:15;U879.TI1106B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:16;U879.TI1106B_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:17;U879.TI1106B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:18;U879.TI1106B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:19;U879.TI1106B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:20;U879.TI1106B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:21;U879.TI1106B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:22;U879.TI1106B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:23;U879.TI1106B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:24;U879.TI1106B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:25;U879.TI1106B_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:26;U879.TI1106B_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:27;U879.TI1106B_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:28;U879.TI1106B_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:29;U879.TI1106B_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:30;U879.TI1106B_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:31;U879.TI1106B_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:32;U879.TI1106B_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:33;U879.TI1106B_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:34;U879.TI1106B_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:35;U879.TI1106B_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:36;U879.TI1106B_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:37;U879.TI1106B_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:38;U879.TI1106B_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:39;U879.TI1106B_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:40;U879.TI1106B_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:41;U879.TI1106B_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:42;U879.TI1106B_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:43;U879.TI1106B_PV.F_CV;69.300003052;100.0 +25/10/2020 02:06:44;U879.TI1106B_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:45;U879.TI1106B_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:46;U879.TI1106B_PV.F_CV;69.300003052;100.0 +25/10/2020 02:06:47;U879.TI1106B_PV.F_CV;69.300003052;100.0 +25/10/2020 02:06:48;U879.TI1106B_PV.F_CV;69.400001526;100.0 +25/10/2020 02:06:49;U879.TI1106B_PV.F_CV;69.300003052;100.0 +25/10/2020 02:06:50;U879.TI1106B_PV.F_CV;69.300003052;100.0 +25/10/2020 02:06:51;U879.TI1106B_PV.F_CV;69.300003052;100.0 +25/10/2020 02:06:52;U879.TI1106B_PV.F_CV;69.300003052;100.0 +25/10/2020 02:06:53;U879.TI1106B_PV.F_CV;69.300003052;100.0 +25/10/2020 02:06:54;U879.TI1106B_PV.F_CV;69.300003052;100.0 +25/10/2020 02:06:55;U879.TI1106B_PV.F_CV;69.099998474;100.0 +25/10/2020 02:06:56;U879.TI1106B_PV.F_CV;69.099998474;100.0 +25/10/2020 02:06:57;U879.TI1106B_PV.F_CV;69.099998474;100.0 +25/10/2020 02:06:58;U879.TI1106B_PV.F_CV;69.199996948;100.0 +25/10/2020 02:06:59;U879.TI1106B_PV.F_CV;69.099998474;100.0 +25/10/2020 02:06:00;U879.TI1106C_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:01;U879.TI1106C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:02;U879.TI1106C_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:03;U879.TI1106C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:04;U879.TI1106C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:05;U879.TI1106C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:06;U879.TI1106C_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:07;U879.TI1106C_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:08;U879.TI1106C_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:09;U879.TI1106C_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:10;U879.TI1106C_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:11;U879.TI1106C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:12;U879.TI1106C_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:13;U879.TI1106C_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:14;U879.TI1106C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:15;U879.TI1106C_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:16;U879.TI1106C_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:17;U879.TI1106C_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:18;U879.TI1106C_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:19;U879.TI1106C_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:20;U879.TI1106C_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:21;U879.TI1106C_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:22;U879.TI1106C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:23;U879.TI1106C_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:24;U879.TI1106C_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:25;U879.TI1106C_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:26;U879.TI1106C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:27;U879.TI1106C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:28;U879.TI1106C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:29;U879.TI1106C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:30;U879.TI1106C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:31;U879.TI1106C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:32;U879.TI1106C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:33;U879.TI1106C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:34;U879.TI1106C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:35;U879.TI1106C_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:36;U879.TI1106C_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:37;U879.TI1106C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:38;U879.TI1106C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:39;U879.TI1106C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:40;U879.TI1106C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:41;U879.TI1106C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:42;U879.TI1106C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:43;U879.TI1106C_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:44;U879.TI1106C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:45;U879.TI1106C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:46;U879.TI1106C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:47;U879.TI1106C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:48;U879.TI1106C_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:49;U879.TI1106C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:50;U879.TI1106C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:51;U879.TI1106C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:52;U879.TI1106C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:53;U879.TI1106C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:54;U879.TI1106C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:55;U879.TI1106C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:56;U879.TI1106C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:57;U879.TI1106C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:58;U879.TI1106C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:59;U879.TI1106C_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:01;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:02;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:03;U879.TI1106D_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:04;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:05;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:06;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:07;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:08;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:09;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:10;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:11;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:12;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:13;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:14;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:15;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:16;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:17;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:18;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:19;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:20;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:21;U879.TI1106D_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:22;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:23;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:24;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:25;U879.TI1106D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:26;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:27;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:28;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:29;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:30;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:31;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:32;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:33;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:34;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:35;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:36;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:37;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:38;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:39;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:40;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:41;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:42;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:43;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:44;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:45;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:46;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:47;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:48;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:49;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:50;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:51;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:52;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:53;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:54;U879.TI1106D_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:55;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:56;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:57;U879.TI1106D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:58;U879.TI1106D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:59;U879.TI1106D_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:00;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:02;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:03;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:04;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:05;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:06;U879.TI1106E_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:07;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:08;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:09;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:10;U879.TI1106E_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:11;U879.TI1106E_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:12;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:13;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:14;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:15;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:16;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:17;U879.TI1106E_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:18;U879.TI1106E_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:19;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:20;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:21;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:22;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:23;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:24;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:25;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:26;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:27;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:28;U879.TI1106E_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:29;U879.TI1106E_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:30;U879.TI1106E_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:31;U879.TI1106E_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:32;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:33;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:34;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:35;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:36;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:37;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:38;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:39;U879.TI1106E_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:40;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:41;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:42;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:43;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:44;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:45;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:46;U879.TI1106E_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:47;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:48;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:49;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:50;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:51;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:52;U879.TI1106E_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:53;U879.TI1106E_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:54;U879.TI1106E_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:55;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:56;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:57;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:58;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:59;U879.TI1106E_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:00;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:01;U879.TI1106F_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:02;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:03;U879.TI1106F_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:04;U879.TI1106F_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:05;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:06;U879.TI1106F_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:07;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:08;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:09;U879.TI1106F_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:10;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:11;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:12;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:13;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:14;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:15;U879.TI1106F_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:16;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:17;U879.TI1106F_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:18;U879.TI1106F_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:19;U879.TI1106F_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:20;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:21;U879.TI1106F_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:22;U879.TI1106F_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:23;U879.TI1106F_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:24;U879.TI1106F_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:25;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:26;U879.TI1106F_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:27;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:28;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:29;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:30;U879.TI1106F_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:31;U879.TI1106F_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:32;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:33;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:34;U879.TI1106F_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:35;U879.TI1106F_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:36;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:37;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:38;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:39;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:40;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:41;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:42;U879.TI1106F_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:43;U879.TI1106F_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:44;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:45;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:46;U879.TI1106F_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:47;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:48;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:49;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:50;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:51;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:52;U879.TI1106F_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:53;U879.TI1106F_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:54;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:55;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:56;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:57;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:58;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:59;U879.TI1106F_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:54;U879.TI110A_PV.F_CV;396.045684814;100.0 +25/10/2020 02:06:36;U879.TI110B_PV.F_CV;397.895111084;100.0 +25/10/2020 02:06:55;U879.TI110C_PV.F_CV;398.069274902;100.0 +25/10/2020 02:06:23;U879.TI110D_PV.F_CV;349.966522217;100.0 +25/10/2020 02:06:19;U879.TI110E_PV.F_CV;315.021392822;100.0 +25/10/2020 02:06:19;U879.TI110F_PV.F_CV;349.909912109;100.0 +25/10/2020 02:06:08;U879.TI111A_PV.F_CV;395.899963379;100.0 +25/10/2020 02:06:23;U879.TI111B_PV.F_CV;398.112365723;100.0 +25/10/2020 02:06:50;U879.TI111C_PV.F_CV;398.011962891;100.0 +25/10/2020 02:06:56;U879.TI111D_PV.F_CV;349.949432373;100.0 +25/10/2020 02:06:26;U879.TI111E_PV.F_CV;315.079467773;100.0 +25/10/2020 02:06:45;U879.TI111F_PV.F_CV;349.919677734;100.0 +25/10/2020 02:06:08;U879.TI112A_PV.F_CV;396.274963379;100.0 +25/10/2020 02:06:48;U879.TI112B_PV.F_CV;398.308013916;100.0 +25/10/2020 02:06:02;U879.TI112C_PV.F_CV;397.754699707;100.0 +25/10/2020 02:06:23;U879.TI112D_PV.F_CV;349.566680908;100.0 +25/10/2020 02:06:12;U879.TI112E_PV.F_CV;314.809600830;100.0 +25/10/2020 02:06:59;U879.TI112F_PV.F_CV;349.505950928;100.0 +25/10/2020 02:06:04;U879.TI113A_PV.F_CV;395.842346191;100.0 +25/10/2020 02:06:26;U879.TI113B_PV.F_CV;398.058868408;100.0 +25/10/2020 02:06:04;U879.TI113C_PV.F_CV;397.884429932;100.0 +25/10/2020 02:06:50;U879.TI113D_PV.F_CV;349.843566895;100.0 +25/10/2020 02:06:01;U879.TI113E_PV.F_CV;314.835876465;100.0 +25/10/2020 02:06:09;U879.TI113E_PV.F_CV;315.235900879;100.0 +25/10/2020 02:06:42;U879.TI113F_PV.F_CV;350.029602051;100.0 +25/10/2020 02:06:16;U879.TI114A_PV.F_CV;385.879913330;100.0 +25/10/2020 02:06:03;U879.TI114B_PV.F_CV;387.829833984;100.0 +25/10/2020 02:06:44;U879.TI114C_PV.F_CV;387.920776367;100.0 +25/10/2020 02:06:51;U879.TI114D_PV.F_CV;349.937255859;100.0 +25/10/2020 02:06:37;U879.TI114E_PV.F_CV;305.196014404;100.0 +25/10/2020 02:06:32;U879.TI114F_PV.F_CV;349.920532227;100.0 +25/10/2020 02:06:00;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:01;U879.TI1205A_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:02;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:03;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:04;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:05;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:06;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:07;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:08;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:09;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:10;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:11;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:12;U879.TI1205A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:13;U879.TI1205A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:14;U879.TI1205A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:15;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:16;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:17;U879.TI1205A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:18;U879.TI1205A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:19;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:20;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:21;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:22;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:23;U879.TI1205A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:24;U879.TI1205A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:25;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:26;U879.TI1205A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:27;U879.TI1205A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:28;U879.TI1205A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:29;U879.TI1205A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:30;U879.TI1205A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:31;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:32;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:33;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:34;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:35;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:36;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:37;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:38;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:39;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:40;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:41;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:42;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:43;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:44;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:45;U879.TI1205A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:46;U879.TI1205A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:47;U879.TI1205A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:48;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:49;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:50;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:51;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:52;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:53;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:54;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:55;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:56;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:57;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:58;U879.TI1205A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:59;U879.TI1205A_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:00;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:01;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:02;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:03;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:04;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:05;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:06;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:07;U879.TI1205B_PV.F_CV;68.099998474;100.0 +25/10/2020 02:06:08;U879.TI1205B_PV.F_CV;68.099998474;100.0 +25/10/2020 02:06:09;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:10;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:11;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:12;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:13;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:14;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:15;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:16;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:17;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:18;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:19;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:20;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:21;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:22;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:23;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:24;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:25;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:26;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:27;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:28;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:29;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:30;U879.TI1205B_PV.F_CV;68.099998474;100.0 +25/10/2020 02:06:31;U879.TI1205B_PV.F_CV;68.099998474;100.0 +25/10/2020 02:06:32;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:33;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:34;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:35;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:36;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:37;U879.TI1205B_PV.F_CV;68.099998474;100.0 +25/10/2020 02:06:38;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:39;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:40;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:41;U879.TI1205B_PV.F_CV;68.099998474;100.0 +25/10/2020 02:06:42;U879.TI1205B_PV.F_CV;68.099998474;100.0 +25/10/2020 02:06:43;U879.TI1205B_PV.F_CV;68.099998474;100.0 +25/10/2020 02:06:44;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:45;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:46;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:47;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:48;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:49;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:50;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:51;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:52;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:53;U879.TI1205B_PV.F_CV;68.199996948;100.0 +25/10/2020 02:06:54;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:55;U879.TI1205B_PV.F_CV;68.099998474;100.0 +25/10/2020 02:06:56;U879.TI1205B_PV.F_CV;68.099998474;100.0 +25/10/2020 02:06:57;U879.TI1205B_PV.F_CV;68.000000000;100.0 +25/10/2020 02:06:58;U879.TI1205B_PV.F_CV;68.099998474;100.0 +25/10/2020 02:06:59;U879.TI1205B_PV.F_CV;68.199996948;100.0 +25/10/2020 02:06:00;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:01;U879.TI1205C_PV.F_CV;72.900001526;100.0 +25/10/2020 02:06:02;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:03;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:04;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:05;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:06;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:07;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:08;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:09;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:10;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:11;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:12;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:13;U879.TI1205C_PV.F_CV;72.900001526;100.0 +25/10/2020 02:06:14;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:15;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:16;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:17;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:18;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:19;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:20;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:21;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:22;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:23;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:24;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:25;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:26;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:27;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:28;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:29;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:30;U879.TI1205C_PV.F_CV;72.900001526;100.0 +25/10/2020 02:06:31;U879.TI1205C_PV.F_CV;72.900001526;100.0 +25/10/2020 02:06:32;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:33;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:34;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:35;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:36;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:37;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:38;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:39;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:40;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:41;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:42;U879.TI1205C_PV.F_CV;72.900001526;100.0 +25/10/2020 02:06:43;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:44;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:45;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:46;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:47;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:48;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:49;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:50;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:51;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:52;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:53;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:54;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:55;U879.TI1205C_PV.F_CV;72.900001526;100.0 +25/10/2020 02:06:56;U879.TI1205C_PV.F_CV;72.900001526;100.0 +25/10/2020 02:06:57;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:58;U879.TI1205C_PV.F_CV;72.699996948;100.0 +25/10/2020 02:06:59;U879.TI1205C_PV.F_CV;72.800003052;100.0 +25/10/2020 02:06:00;U879.TI1205D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:01;U879.TI1205D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:02;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:03;U879.TI1205D_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:04;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:05;U879.TI1205D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:06;U879.TI1205D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:07;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:08;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:09;U879.TI1205D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:10;U879.TI1205D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:11;U879.TI1205D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:12;U879.TI1205D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:13;U879.TI1205D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:14;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:15;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:16;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:17;U879.TI1205D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:18;U879.TI1205D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:19;U879.TI1205D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:20;U879.TI1205D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:21;U879.TI1205D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:22;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:23;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:24;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:25;U879.TI1205D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:26;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:27;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:28;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:29;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:30;U879.TI1205D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:31;U879.TI1205D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:32;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:33;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:34;U879.TI1205D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:35;U879.TI1205D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:36;U879.TI1205D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:37;U879.TI1205D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:38;U879.TI1205D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:39;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:40;U879.TI1205D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:41;U879.TI1205D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:42;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:43;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:44;U879.TI1205D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:45;U879.TI1205D_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:46;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:47;U879.TI1205D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:48;U879.TI1205D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:49;U879.TI1205D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:50;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:51;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:52;U879.TI1205D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:53;U879.TI1205D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:54;U879.TI1205D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:55;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:56;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:57;U879.TI1205D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:58;U879.TI1205D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:59;U879.TI1205D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:00;U879.TI1205E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:01;U879.TI1205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:02;U879.TI1205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:03;U879.TI1205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:04;U879.TI1205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:05;U879.TI1205E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:06;U879.TI1205E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:07;U879.TI1205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:08;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:09;U879.TI1205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:10;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:11;U879.TI1205E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:12;U879.TI1205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:13;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:14;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:15;U879.TI1205E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:16;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:17;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:18;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:19;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:20;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:21;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:22;U879.TI1205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:23;U879.TI1205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:24;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:25;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:26;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:27;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:28;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:29;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:30;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:31;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:32;U879.TI1205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:33;U879.TI1205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:34;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:35;U879.TI1205E_PV.F_CV;50.200000763;100.0 +25/10/2020 02:06:36;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:37;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:38;U879.TI1205E_PV.F_CV;50.200000763;100.0 +25/10/2020 02:06:39;U879.TI1205E_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:40;U879.TI1205E_PV.F_CV;50.299999237;100.0 +25/10/2020 02:06:41;U879.TI1205E_PV.F_CV;50.299999237;100.0 +25/10/2020 02:06:42;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:43;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:44;U879.TI1205E_PV.F_CV;50.200000763;100.0 +25/10/2020 02:06:45;U879.TI1205E_PV.F_CV;50.200000763;100.0 +25/10/2020 02:06:46;U879.TI1205E_PV.F_CV;50.200000763;100.0 +25/10/2020 02:06:47;U879.TI1205E_PV.F_CV;50.200000763;100.0 +25/10/2020 02:06:48;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:49;U879.TI1205E_PV.F_CV;50.200000763;100.0 +25/10/2020 02:06:50;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:51;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:52;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:53;U879.TI1205E_PV.F_CV;50.299999237;100.0 +25/10/2020 02:06:54;U879.TI1205E_PV.F_CV;50.200000763;100.0 +25/10/2020 02:06:55;U879.TI1205E_PV.F_CV;50.200000763;100.0 +25/10/2020 02:06:56;U879.TI1205E_PV.F_CV;50.200000763;100.0 +25/10/2020 02:06:57;U879.TI1205E_PV.F_CV;50.200000763;100.0 +25/10/2020 02:06:58;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:59;U879.TI1205E_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:00;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:01;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:02;U879.TI1205F_PV.F_CV;66.900001526;100.0 +25/10/2020 02:06:03;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:04;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:05;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:06;U879.TI1205F_PV.F_CV;67.099998474;100.0 +25/10/2020 02:06:07;U879.TI1205F_PV.F_CV;67.099998474;100.0 +25/10/2020 02:06:08;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:09;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:10;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:11;U879.TI1205F_PV.F_CV;67.099998474;100.0 +25/10/2020 02:06:12;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:13;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:14;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:15;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:16;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:17;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:18;U879.TI1205F_PV.F_CV;67.099998474;100.0 +25/10/2020 02:06:19;U879.TI1205F_PV.F_CV;67.099998474;100.0 +25/10/2020 02:06:20;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:21;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:22;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:23;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:24;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:25;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:26;U879.TI1205F_PV.F_CV;66.900001526;100.0 +25/10/2020 02:06:27;U879.TI1205F_PV.F_CV;66.900001526;100.0 +25/10/2020 02:06:28;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:29;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:30;U879.TI1205F_PV.F_CV;66.900001526;100.0 +25/10/2020 02:06:31;U879.TI1205F_PV.F_CV;66.900001526;100.0 +25/10/2020 02:06:32;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:33;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:34;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:35;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:36;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:37;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:38;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:39;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:40;U879.TI1205F_PV.F_CV;67.099998474;100.0 +25/10/2020 02:06:41;U879.TI1205F_PV.F_CV;67.099998474;100.0 +25/10/2020 02:06:42;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:43;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:44;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:45;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:46;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:47;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:48;U879.TI1205F_PV.F_CV;67.099998474;100.0 +25/10/2020 02:06:49;U879.TI1205F_PV.F_CV;67.099998474;100.0 +25/10/2020 02:06:50;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:51;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:52;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:53;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:54;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:55;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:56;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:57;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:58;U879.TI1205F_PV.F_CV;67.000000000;100.0 +25/10/2020 02:06:59;U879.TI1205F_PV.F_CV;67.199996948;100.0 +25/10/2020 02:06:00;U879.TI1206A_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:01;U879.TI1206A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:02;U879.TI1206A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:03;U879.TI1206A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:04;U879.TI1206A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:05;U879.TI1206A_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:06;U879.TI1206A_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:07;U879.TI1206A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:08;U879.TI1206A_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:09;U879.TI1206A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:10;U879.TI1206A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:11;U879.TI1206A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:12;U879.TI1206A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:13;U879.TI1206A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:14;U879.TI1206A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:15;U879.TI1206A_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:16;U879.TI1206A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:17;U879.TI1206A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:18;U879.TI1206A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:19;U879.TI1206A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:20;U879.TI1206A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:21;U879.TI1206A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:22;U879.TI1206A_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:23;U879.TI1206A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:24;U879.TI1206A_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:25;U879.TI1206A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:26;U879.TI1206A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:27;U879.TI1206A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:28;U879.TI1206A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:29;U879.TI1206A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:30;U879.TI1206A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:31;U879.TI1206A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:32;U879.TI1206A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:33;U879.TI1206A_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:34;U879.TI1206A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:35;U879.TI1206A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:36;U879.TI1206A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:37;U879.TI1206A_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:38;U879.TI1206A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:39;U879.TI1206A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:40;U879.TI1206A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:41;U879.TI1206A_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:42;U879.TI1206A_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:43;U879.TI1206A_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:44;U879.TI1206A_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:45;U879.TI1206A_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:46;U879.TI1206A_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:47;U879.TI1206A_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:48;U879.TI1206A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:49;U879.TI1206A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:50;U879.TI1206A_PV.F_CV;70.800003052;100.0 +25/10/2020 02:06:51;U879.TI1206A_PV.F_CV;70.800003052;100.0 +25/10/2020 02:06:52;U879.TI1206A_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:53;U879.TI1206A_PV.F_CV;70.800003052;100.0 +25/10/2020 02:06:54;U879.TI1206A_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:55;U879.TI1206A_PV.F_CV;70.800003052;100.0 +25/10/2020 02:06:56;U879.TI1206A_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:57;U879.TI1206A_PV.F_CV;70.800003052;100.0 +25/10/2020 02:06:58;U879.TI1206A_PV.F_CV;70.800003052;100.0 +25/10/2020 02:06:59;U879.TI1206A_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:00;U879.TI1206B_PV.F_CV;69.300003052;100.0 +25/10/2020 02:06:01;U879.TI1206B_PV.F_CV;69.099998474;100.0 +25/10/2020 02:06:02;U879.TI1206B_PV.F_CV;69.099998474;100.0 +25/10/2020 02:06:03;U879.TI1206B_PV.F_CV;69.099998474;100.0 +25/10/2020 02:06:04;U879.TI1206B_PV.F_CV;69.199996948;100.0 +25/10/2020 02:06:05;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:06;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:07;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:08;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:09;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:10;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:11;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:12;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:13;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:14;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:15;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:16;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:17;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:18;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:19;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:20;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:21;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:22;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:23;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:24;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:25;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:26;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:27;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:28;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:29;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:30;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:31;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:32;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:33;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:34;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:35;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:36;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:37;U879.TI1206B_PV.F_CV;68.800003052;100.0 +25/10/2020 02:06:38;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:39;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:40;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:41;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:42;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:43;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:44;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:45;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:46;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:47;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:48;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:49;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:50;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:51;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:52;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:53;U879.TI1206B_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:54;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:55;U879.TI1206B_PV.F_CV;69.099998474;100.0 +25/10/2020 02:06:56;U879.TI1206B_PV.F_CV;69.099998474;100.0 +25/10/2020 02:06:57;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:58;U879.TI1206B_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:59;U879.TI1206B_PV.F_CV;69.099998474;100.0 +25/10/2020 02:06:00;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:01;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:02;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:03;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:04;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:05;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:06;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:07;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:08;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:09;U879.TI1206C_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:10;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:11;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:12;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:13;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:14;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:15;U879.TI1206C_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:16;U879.TI1206C_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:17;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:18;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:19;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:20;U879.TI1206C_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:21;U879.TI1206C_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:22;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:23;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:24;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:25;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:26;U879.TI1206C_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:27;U879.TI1206C_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:28;U879.TI1206C_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:29;U879.TI1206C_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:30;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:31;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:32;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:33;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:34;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:35;U879.TI1206C_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:36;U879.TI1206C_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:37;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:38;U879.TI1206C_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:39;U879.TI1206C_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:40;U879.TI1206C_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:41;U879.TI1206C_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:42;U879.TI1206C_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:43;U879.TI1206C_PV.F_CV;70.800003052;100.0 +25/10/2020 02:06:44;U879.TI1206C_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:45;U879.TI1206C_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:46;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:47;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:48;U879.TI1206C_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:49;U879.TI1206C_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:50;U879.TI1206C_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:51;U879.TI1206C_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:52;U879.TI1206C_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:53;U879.TI1206C_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:54;U879.TI1206C_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:55;U879.TI1206C_PV.F_CV;70.800003052;100.0 +25/10/2020 02:06:56;U879.TI1206C_PV.F_CV;70.800003052;100.0 +25/10/2020 02:06:57;U879.TI1206C_PV.F_CV;70.800003052;100.0 +25/10/2020 02:06:58;U879.TI1206C_PV.F_CV;70.699996948;100.0 +25/10/2020 02:06:59;U879.TI1206C_PV.F_CV;70.800003052;100.0 +25/10/2020 02:06:00;U879.TI1206D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:01;U879.TI1206D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:02;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:03;U879.TI1206D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:04;U879.TI1206D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:05;U879.TI1206D_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:06;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:07;U879.TI1206D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:08;U879.TI1206D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:09;U879.TI1206D_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:10;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:11;U879.TI1206D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:12;U879.TI1206D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:13;U879.TI1206D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:14;U879.TI1206D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:15;U879.TI1206D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:16;U879.TI1206D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:17;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:18;U879.TI1206D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:19;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:20;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:21;U879.TI1206D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:22;U879.TI1206D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:23;U879.TI1206D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:24;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:25;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:26;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:27;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:28;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:29;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:30;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:31;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:32;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:33;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:34;U879.TI1206D_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:35;U879.TI1206D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:36;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:37;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:38;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:39;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:40;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:41;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:42;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:43;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:44;U879.TI1206D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:45;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:46;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:47;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:48;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:49;U879.TI1206D_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:50;U879.TI1206D_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:51;U879.TI1206D_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:52;U879.TI1206D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:53;U879.TI1206D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:54;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:55;U879.TI1206D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:56;U879.TI1206D_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:57;U879.TI1206D_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:58;U879.TI1206D_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:59;U879.TI1206D_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:00;U879.TI1206E_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:01;U879.TI1206E_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:02;U879.TI1206E_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:03;U879.TI1206E_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:04;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:05;U879.TI1206E_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:06;U879.TI1206E_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:07;U879.TI1206E_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:08;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:09;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:10;U879.TI1206E_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:11;U879.TI1206E_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:12;U879.TI1206E_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:13;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:14;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:15;U879.TI1206E_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:16;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:17;U879.TI1206E_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:18;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:19;U879.TI1206E_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:20;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:21;U879.TI1206E_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:22;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:23;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:24;U879.TI1206E_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:25;U879.TI1206E_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:26;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:27;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:28;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:29;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:30;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:31;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:32;U879.TI1206E_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:33;U879.TI1206E_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:34;U879.TI1206E_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:35;U879.TI1206E_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:36;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:37;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:38;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:39;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:40;U879.TI1206E_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:41;U879.TI1206E_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:42;U879.TI1206E_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:43;U879.TI1206E_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:44;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:45;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:46;U879.TI1206E_PV.F_CV;70.599998474;100.0 +25/10/2020 02:06:47;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:48;U879.TI1206E_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:49;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:50;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:51;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:52;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:53;U879.TI1206E_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:54;U879.TI1206E_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:55;U879.TI1206E_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:56;U879.TI1206E_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:57;U879.TI1206E_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:58;U879.TI1206E_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:59;U879.TI1206E_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:00;U879.TI1206F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:01;U879.TI1206F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:02;U879.TI1206F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:03;U879.TI1206F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:04;U879.TI1206F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:05;U879.TI1206F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:06;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:07;U879.TI1206F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:08;U879.TI1206F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:09;U879.TI1206F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:10;U879.TI1206F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:11;U879.TI1206F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:12;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:13;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:14;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:15;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:16;U879.TI1206F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:17;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:18;U879.TI1206F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:19;U879.TI1206F_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:20;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:21;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:22;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:23;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:24;U879.TI1206F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:25;U879.TI1206F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:26;U879.TI1206F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:27;U879.TI1206F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:28;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:29;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:30;U879.TI1206F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:31;U879.TI1206F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:32;U879.TI1206F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:33;U879.TI1206F_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:34;U879.TI1206F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:35;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:36;U879.TI1206F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:37;U879.TI1206F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:38;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:39;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:40;U879.TI1206F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:41;U879.TI1206F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:42;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:43;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:44;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:45;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:46;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:47;U879.TI1206F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:48;U879.TI1206F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:49;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:50;U879.TI1206F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:51;U879.TI1206F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:52;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:53;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:54;U879.TI1206F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:55;U879.TI1206F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:56;U879.TI1206F_PV.F_CV;69.800003052;100.0 +25/10/2020 02:06:57;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:58;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:59;U879.TI1206F_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:00;U879.TI144A_PV.F_CV;24.849998474;100.0 +25/10/2020 02:06:03;U879.TI144A_PV.F_CV;24.899999619;100.0 +25/10/2020 02:06:05;U879.TI144A_PV.F_CV;25.100000381;100.0 +25/10/2020 02:06:09;U879.TI144A_PV.F_CV;24.849998474;100.0 +25/10/2020 02:06:12;U879.TI144A_PV.F_CV;24.950000763;100.0 +25/10/2020 02:06:14;U879.TI144A_PV.F_CV;24.799999237;100.0 +25/10/2020 02:06:19;U879.TI144A_PV.F_CV;25.100000381;100.0 +25/10/2020 02:06:22;U879.TI144A_PV.F_CV;24.899999619;100.0 +25/10/2020 02:06:24;U879.TI144A_PV.F_CV;24.966667175;100.0 +25/10/2020 02:06:26;U879.TI144A_PV.F_CV;24.899999619;100.0 +25/10/2020 02:06:27;U879.TI144A_PV.F_CV;25.000000000;100.0 +25/10/2020 02:06:28;U879.TI144A_PV.F_CV;24.799999237;100.0 +25/10/2020 02:06:29;U879.TI144A_PV.F_CV;24.899999619;100.0 +25/10/2020 02:06:30;U879.TI144A_PV.F_CV;24.799999237;100.0 +25/10/2020 02:06:31;U879.TI144A_PV.F_CV;24.899999619;100.0 +25/10/2020 02:06:35;U879.TI144A_PV.F_CV;25.033332825;100.0 +25/10/2020 02:06:36;U879.TI144A_PV.F_CV;25.100000381;100.0 +25/10/2020 02:06:37;U879.TI144A_PV.F_CV;24.899999619;100.0 +25/10/2020 02:06:38;U879.TI144A_PV.F_CV;25.000000000;100.0 +25/10/2020 02:06:40;U879.TI144A_PV.F_CV;24.899999619;100.0 +25/10/2020 02:06:42;U879.TI144A_PV.F_CV;24.950000763;100.0 +25/10/2020 02:06:48;U879.TI144A_PV.F_CV;24.849998474;100.0 +25/10/2020 02:06:51;U879.TI144A_PV.F_CV;25.000000000;100.0 +25/10/2020 02:06:53;U879.TI144A_PV.F_CV;24.899999619;100.0 +25/10/2020 02:06:54;U879.TI144A_PV.F_CV;25.100000381;100.0 +25/10/2020 02:06:55;U879.TI144A_PV.F_CV;24.799999237;100.0 +25/10/2020 02:06:58;U879.TI144A_PV.F_CV;24.966667175;100.0 +25/10/2020 02:06:03;U879.TI144B_PV.F_CV;25.399999619;100.0 +25/10/2020 02:06:08;U879.TI144B_PV.F_CV;25.575000763;100.0 +25/10/2020 02:06:11;U879.TI144B_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:15;U879.TI144B_PV.F_CV;25.557142258;100.0 +25/10/2020 02:06:19;U879.TI144B_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:21;U879.TI144B_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:24;U879.TI144B_PV.F_CV;25.399999619;100.0 +25/10/2020 02:06:26;U879.TI144B_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:29;U879.TI144B_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:34;U879.TI144B_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:35;U879.TI144B_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:38;U879.TI144B_PV.F_CV;25.440000534;100.0 +25/10/2020 02:06:41;U879.TI144B_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:43;U879.TI144B_PV.F_CV;25.399999619;100.0 +25/10/2020 02:06:45;U879.TI144B_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:46;U879.TI144B_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:49;U879.TI144B_PV.F_CV;25.440000534;100.0 +25/10/2020 02:06:53;U879.TI144B_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:54;U879.TI144B_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:57;U879.TI144B_PV.F_CV;25.433332443;100.0 +25/10/2020 02:06:59;U879.TI144B_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:01;U879.TI144C_PV.F_CV;26.000000000;100.0 +25/10/2020 02:06:02;U879.TI144C_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:03;U879.TI144C_PV.F_CV;26.000000000;100.0 +25/10/2020 02:06:04;U879.TI144C_PV.F_CV;25.799999237;100.0 +25/10/2020 02:06:06;U879.TI144C_PV.F_CV;25.950000763;100.0 +25/10/2020 02:06:09;U879.TI144C_PV.F_CV;25.799999237;100.0 +25/10/2020 02:06:12;U879.TI144C_PV.F_CV;25.875000000;100.0 +25/10/2020 02:06:14;U879.TI144C_PV.F_CV;25.799999237;100.0 +25/10/2020 02:06:18;U879.TI144C_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:19;U879.TI144C_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:20;U879.TI144C_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:21;U879.TI144C_PV.F_CV;25.799999237;100.0 +25/10/2020 02:06:23;U879.TI144C_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:24;U879.TI144C_PV.F_CV;25.799999237;100.0 +25/10/2020 02:06:32;U879.TI144C_PV.F_CV;25.966667175;100.0 +25/10/2020 02:06:34;U879.TI144C_PV.F_CV;25.799999237;100.0 +25/10/2020 02:06:35;U879.TI144C_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:37;U879.TI144C_PV.F_CV;25.700000763;100.0 +25/10/2020 02:06:40;U879.TI144C_PV.F_CV;25.950000763;100.0 +25/10/2020 02:06:42;U879.TI144C_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:43;U879.TI144C_PV.F_CV;26.000000000;100.0 +25/10/2020 02:06:44;U879.TI144C_PV.F_CV;25.799999237;100.0 +25/10/2020 02:06:46;U879.TI144C_PV.F_CV;26.000000000;100.0 +25/10/2020 02:06:47;U879.TI144C_PV.F_CV;25.799999237;100.0 +25/10/2020 02:06:51;U879.TI144C_PV.F_CV;25.950000763;100.0 +25/10/2020 02:06:54;U879.TI144C_PV.F_CV;25.799999237;100.0 +25/10/2020 02:06:55;U879.TI144C_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:56;U879.TI144C_PV.F_CV;25.700000763;100.0 +25/10/2020 02:06:57;U879.TI144C_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:58;U879.TI144C_PV.F_CV;25.950000763;100.0 +25/10/2020 02:06:01;U879.TI144D_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:02;U879.TI144D_PV.F_CV;26.150001526;100.0 +25/10/2020 02:06:04;U879.TI144D_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:06;U879.TI144D_PV.F_CV;26.166667938;100.0 +25/10/2020 02:06:08;U879.TI144D_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:09;U879.TI144D_PV.F_CV;26.200000763;100.0 +25/10/2020 02:06:11;U879.TI144D_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:12;U879.TI144D_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:13;U879.TI144D_PV.F_CV;26.200000763;100.0 +25/10/2020 02:06:16;U879.TI144D_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:18;U879.TI144D_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:19;U879.TI144D_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:20;U879.TI144D_PV.F_CV;26.150001526;100.0 +25/10/2020 02:06:22;U879.TI144D_PV.F_CV;26.049999237;100.0 +25/10/2020 02:06:23;U879.TI144D_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:24;U879.TI144D_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:25;U879.TI144D_PV.F_CV;26.200000763;100.0 +25/10/2020 02:06:29;U879.TI144D_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:31;U879.TI144D_PV.F_CV;26.166667938;100.0 +25/10/2020 02:06:33;U879.TI144D_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:34;U879.TI144D_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:37;U879.TI144D_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:40;U879.TI144D_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:41;U879.TI144D_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:43;U879.TI144D_PV.F_CV;26.166667938;100.0 +25/10/2020 02:06:45;U879.TI144D_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:46;U879.TI144D_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:47;U879.TI144D_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:48;U879.TI144D_PV.F_CV;26.150001526;100.0 +25/10/2020 02:06:50;U879.TI144D_PV.F_CV;26.049999237;100.0 +25/10/2020 02:06:51;U879.TI144D_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:52;U879.TI144D_PV.F_CV;26.200000763;100.0 +25/10/2020 02:06:54;U879.TI144D_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:55;U879.TI144D_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:57;U879.TI144D_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:58;U879.TI144D_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:59;U879.TI144D_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:00;U879.TI144E_PV.F_CV;25.799999237;100.0 +25/10/2020 02:06:03;U879.TI144E_PV.F_CV;25.875000000;100.0 +25/10/2020 02:06:05;U879.TI144E_PV.F_CV;25.799999237;100.0 +25/10/2020 02:06:06;U879.TI144E_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:08;U879.TI144E_PV.F_CV;25.833332062;100.0 +25/10/2020 02:06:10;U879.TI144E_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:12;U879.TI144E_PV.F_CV;25.833332062;100.0 +25/10/2020 02:06:15;U879.TI144E_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:16;U879.TI144E_PV.F_CV;25.799999237;100.0 +25/10/2020 02:06:18;U879.TI144E_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:20;U879.TI144E_PV.F_CV;25.833332062;100.0 +25/10/2020 02:06:24;U879.TI144E_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:29;U879.TI144E_PV.F_CV;25.799999237;100.0 +25/10/2020 02:06:31;U879.TI144E_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:33;U879.TI144E_PV.F_CV;25.833332062;100.0 +25/10/2020 02:06:38;U879.TI144E_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:40;U879.TI144E_PV.F_CV;25.700000763;100.0 +25/10/2020 02:06:41;U879.TI144E_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:43;U879.TI144E_PV.F_CV;25.950000763;100.0 +25/10/2020 02:06:46;U879.TI144E_PV.F_CV;25.799999237;100.0 +25/10/2020 02:06:50;U879.TI144E_PV.F_CV;25.950000763;100.0 +25/10/2020 02:06:54;U879.TI144E_PV.F_CV;25.833332062;100.0 +25/10/2020 02:06:58;U879.TI144E_PV.F_CV;25.950000763;100.0 +25/10/2020 02:06:07;U879.TI144F_PV.F_CV;25.363157272;100.0 +25/10/2020 02:06:15;U879.TI144F_PV.F_CV;25.299999237;100.0 +25/10/2020 02:06:21;U879.TI144F_PV.F_CV;25.354545593;100.0 +25/10/2020 02:06:29;U879.TI144F_PV.F_CV;25.299999237;100.0 +25/10/2020 02:06:37;U879.TI144F_PV.F_CV;25.357141495;100.0 +25/10/2020 02:06:44;U879.TI144F_PV.F_CV;25.299999237;100.0 +25/10/2020 02:06:45;U879.TI144F_PV.F_CV;25.200000763;100.0 +25/10/2020 02:06:48;U879.TI144F_PV.F_CV;25.399999619;100.0 +25/10/2020 02:06:50;U879.TI144F_PV.F_CV;25.200000763;100.0 +25/10/2020 02:06:51;U879.TI144F_PV.F_CV;25.299999237;100.0 +25/10/2020 02:06:54;U879.TI144F_PV.F_CV;25.375000000;100.0 +25/10/2020 02:06:05;U879.TI201A_PV.F_CV;399.600006104;100.0 +25/10/2020 02:06:48;U879.TI201B_PV.F_CV;398.100006104;100.0 +25/10/2020 02:06:12;U879.TI201C_PV.F_CV;405.600006104;100.0 +25/10/2020 02:06:27;U879.TI201D_PV.F_CV;347.100006104;100.0 +25/10/2020 02:06:32;U879.TI201E_PV.F_CV;319.033325195;100.0 +25/10/2020 02:06:09;U879.TI201F_PV.F_CV;347.288879395;100.0 +25/10/2020 02:06:44;U879.TI202A_PV.F_CV;400.500000000;100.0 +25/10/2020 02:06:45;U879.TI202B_PV.F_CV;398.799987793;100.0 +25/10/2020 02:06:22;U879.TI202C_PV.F_CV;408.399993896;100.0 +25/10/2020 02:06:06;U879.TI202D_PV.F_CV;349.299987793;100.0 +25/10/2020 02:06:26;U879.TI202E_PV.F_CV;316.399993896;100.0 +25/10/2020 02:06:24;U879.TI202F_PV.F_CV;349.333312988;100.0 +25/10/2020 02:06:58;U879.TI203A_PV.F_CV;403.299987793;100.0 +25/10/2020 02:06:14;U879.TI203B_PV.F_CV;400.299987793;100.0 +25/10/2020 02:06:12;U879.TI203C_PV.F_CV;409.700012207;100.0 +25/10/2020 02:06:57;U879.TI203D_PV.F_CV;348.700012207;100.0 +25/10/2020 02:06:12;U879.TI203E_PV.F_CV;318.250000000;100.0 +25/10/2020 02:06:47;U879.TI203F_PV.F_CV;349.200012207;100.0 +25/10/2020 02:06:49;U879.TI204A_PV.F_CV;391.600006104;100.0 +25/10/2020 02:06:18;U879.TI204B_PV.F_CV;389.849975586;100.0 +25/10/2020 02:06:11;U879.TI204C_PV.F_CV;397.100006104;100.0 +25/10/2020 02:06:02;U879.TI204D_PV.F_CV;349.600006104;100.0 +25/10/2020 02:06:03;U879.TI204D_PV.F_CV;349.100006104;100.0 +25/10/2020 02:06:07;U879.TI204D_PV.F_CV;349.500000000;100.0 +25/10/2020 02:06:12;U879.TI204D_PV.F_CV;349.100006104;100.0 +25/10/2020 02:06:21;U879.TI204D_PV.F_CV;349.500000000;100.0 +25/10/2020 02:06:24;U879.TI204D_PV.F_CV;349.100006104;100.0 +25/10/2020 02:06:29;U879.TI204D_PV.F_CV;349.500000000;100.0 +25/10/2020 02:06:33;U879.TI204D_PV.F_CV;349.000000000;100.0 +25/10/2020 02:06:34;U879.TI204D_PV.F_CV;349.500000000;100.0 +25/10/2020 02:06:37;U879.TI204D_PV.F_CV;349.000000000;100.0 +25/10/2020 02:06:39;U879.TI204D_PV.F_CV;349.399993896;100.0 +25/10/2020 02:06:52;U879.TI204D_PV.F_CV;348.950012207;100.0 +25/10/2020 02:06:35;U879.TI204E_PV.F_CV;309.066680908;100.0 +25/10/2020 02:06:16;U879.TI204F_PV.F_CV;349.100006104;100.0 +25/10/2020 02:06:26;U879.TI2101A_PV.F_CV;392.899993896;100.0 +25/10/2020 02:06:21;U879.TI2101B_PV.F_CV;393.500000000;100.0 +25/10/2020 02:06:35;U879.TI2101C_PV.F_CV;394.899993896;100.0 +25/10/2020 02:06:19;U879.TI2101D_PV.F_CV;347.250000000;100.0 +25/10/2020 02:06:24;U879.TI2101E_PV.F_CV;311.750000000;100.0 +25/10/2020 02:06:55;U879.TI2101F_PV.F_CV;347.299987793;100.0 +25/10/2020 02:06:58;U879.TI2102A_PV.F_CV;392.700012207;100.0 +25/10/2020 02:06:19;U879.TI2102B_PV.F_CV;395.000000000;100.0 +25/10/2020 02:06:35;U879.TI2102C_PV.F_CV;396.600006104;100.0 +25/10/2020 02:06:49;U879.TI2102D_PV.F_CV;347.899993896;100.0 +25/10/2020 02:06:57;U879.TI2102E_PV.F_CV;311.633331299;100.0 +25/10/2020 02:06:28;U879.TI2102F_PV.F_CV;348.700012207;100.0 +25/10/2020 02:06:42;U879.TI2103A_PV.F_CV;394.799987793;100.0 +25/10/2020 02:06:50;U879.TI2103B_PV.F_CV;397.000000000;100.0 +25/10/2020 02:06:13;U879.TI2103C_PV.F_CV;397.119995117;100.0 +25/10/2020 02:06:27;U879.TI2103D_PV.F_CV;348.029998779;100.0 +25/10/2020 02:06:10;U879.TI2103E_PV.F_CV;312.200012207;100.0 +25/10/2020 02:06:57;U879.TI2103F_PV.F_CV;348.700012207;100.0 +25/10/2020 02:06:24;U879.TI2104A_PV.F_CV;382.899993896;100.0 +25/10/2020 02:06:57;U879.TI2104B_PV.F_CV;388.600006104;100.0 +25/10/2020 02:06:45;U879.TI2104C_PV.F_CV;384.600006104;100.0 +25/10/2020 02:06:57;U879.TI2104D_PV.F_CV;349.899993896;100.0 +25/10/2020 02:06:16;U879.TI2104E_PV.F_CV;301.016662598;100.0 +25/10/2020 02:06:52;U879.TI2104F_PV.F_CV;347.899993896;100.0 +25/10/2020 02:06:26;U879.TI210A_PV.F_CV;403.061462402;100.0 +25/10/2020 02:06:54;U879.TI210B_PV.F_CV;401.921630859;100.0 +25/10/2020 02:06:51;U879.TI210C_PV.F_CV;410.008911133;100.0 +25/10/2020 02:06:39;U879.TI210D_PV.F_CV;350.011535645;100.0 +25/10/2020 02:06:38;U879.TI210E_PV.F_CV;321.077270508;100.0 +25/10/2020 02:06:23;U879.TI210F_PV.F_CV;349.973297119;100.0 +25/10/2020 02:06:23;U879.TI211A_PV.F_CV;403.138458252;100.0 +25/10/2020 02:06:53;U879.TI211B_PV.F_CV;401.717956543;100.0 +25/10/2020 02:06:39;U879.TI211C_PV.F_CV;410.053344727;100.0 +25/10/2020 02:06:57;U879.TI211D_PV.F_CV;349.958770752;100.0 +25/10/2020 02:06:17;U879.TI211E_PV.F_CV;321.007598877;100.0 +25/10/2020 02:06:43;U879.TI211F_PV.F_CV;350.153442383;100.0 +25/10/2020 02:06:53;U879.TI2124A_PV.F_CV;73.733329773;100.0 +25/10/2020 02:06:02;U879.TI2124B_PV.F_CV;69.733329773;100.0 +25/10/2020 02:06:05;U879.TI2124B_PV.F_CV;69.599998474;100.0 +25/10/2020 02:06:13;U879.TI2124B_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:15;U879.TI2124B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:22;U879.TI2124B_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:31;U879.TI2124B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:33;U879.TI2124B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:39;U879.TI2124B_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:59;U879.TI2124B_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:02;U879.TI2124C_PV.F_CV;72.199996948;100.0 +25/10/2020 02:06:05;U879.TI2124C_PV.F_CV;72.349998474;100.0 +25/10/2020 02:06:09;U879.TI2124C_PV.F_CV;72.199996948;100.0 +25/10/2020 02:06:11;U879.TI2124C_PV.F_CV;72.400001526;100.0 +25/10/2020 02:06:12;U879.TI2124C_PV.F_CV;72.199996948;100.0 +25/10/2020 02:06:34;U879.TI2124C_PV.F_CV;72.000000000;100.0 +25/10/2020 02:06:48;U879.TI2124C_PV.F_CV;72.333335876;100.0 +25/10/2020 02:06:50;U879.TI2124C_PV.F_CV;72.199996948;100.0 +25/10/2020 02:06:54;U879.TI2124C_PV.F_CV;72.333335876;100.0 +25/10/2020 02:06:57;U879.TI2124C_PV.F_CV;72.199996948;100.0 +25/10/2020 02:06:08;U879.TI2124D_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:09;U879.TI2124D_PV.F_CV;25.799999237;100.0 +25/10/2020 02:06:11;U879.TI2124D_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:12;U879.TI2124D_PV.F_CV;25.799999237;100.0 +25/10/2020 02:06:20;U879.TI2124D_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:21;U879.TI2124D_PV.F_CV;25.700000763;100.0 +25/10/2020 02:06:30;U879.TI2124D_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:32;U879.TI2124D_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:43;U879.TI2124D_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:44;U879.TI2124D_PV.F_CV;25.700000763;100.0 +25/10/2020 02:06:46;U879.TI2124D_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:56;U879.TI2124D_PV.F_CV;26.100000381;100.0 +25/10/2020 02:06:57;U879.TI2124D_PV.F_CV;25.899999619;100.0 +25/10/2020 02:06:03;U879.TI2124E_PV.F_CV;49.000000000;100.0 +25/10/2020 02:06:07;U879.TI2124E_PV.F_CV;48.849998474;100.0 +25/10/2020 02:06:19;U879.TI2124E_PV.F_CV;49.000000000;100.0 +25/10/2020 02:06:21;U879.TI2124E_PV.F_CV;48.799999237;100.0 +25/10/2020 02:06:37;U879.TI2124E_PV.F_CV;49.000000000;100.0 +25/10/2020 02:06:38;U879.TI2124E_PV.F_CV;48.799999237;100.0 +25/10/2020 02:06:35;U879.TI2124F_PV.F_CV;48.549999237;100.0 +25/10/2020 02:06:40;U879.TI2124F_PV.F_CV;48.700000763;100.0 +25/10/2020 02:06:45;U879.TI2124F_PV.F_CV;48.566665649;100.0 +25/10/2020 02:06:48;U879.TI2124F_PV.F_CV;48.799999237;100.0 +25/10/2020 02:06:55;U879.TI2124F_PV.F_CV;48.659999847;100.0 +25/10/2020 02:06:52;U879.TI212A_PV.F_CV;403.817962646;100.0 +25/10/2020 02:06:30;U879.TI212B_PV.F_CV;401.492797852;100.0 +25/10/2020 02:06:46;U879.TI212C_PV.F_CV;410.139068604;100.0 +25/10/2020 02:06:07;U879.TI212D_PV.F_CV;349.650970459;100.0 +25/10/2020 02:06:56;U879.TI212E_PV.F_CV;320.686737061;100.0 +25/10/2020 02:06:54;U879.TI212F_PV.F_CV;349.514038086;100.0 +25/10/2020 02:06:16;U879.TI213A_PV.F_CV;403.078613281;100.0 +25/10/2020 02:06:38;U879.TI213B_PV.F_CV;401.988128662;100.0 +25/10/2020 02:06:06;U879.TI213C_PV.F_CV;410.018157959;100.0 +25/10/2020 02:06:23;U879.TI213D_PV.F_CV;349.967956543;100.0 +25/10/2020 02:06:59;U879.TI213E_PV.F_CV;320.917663574;100.0 +25/10/2020 02:06:43;U879.TI213F_PV.F_CV;349.933807373;100.0 +25/10/2020 02:06:12;U879.TI2140A_PV.F_CV;29.500000000;100.0 +25/10/2020 02:06:51;U879.TI2140A_PV.F_CV;30.200000763;100.0 +25/10/2020 02:06:56;U879.TI2140A_PV.F_CV;30.399999619;100.0 +25/10/2020 02:06:02;U879.TI2140B_PV.F_CV;35.299999237;100.0 +25/10/2020 02:06:08;U879.TI2140B_PV.F_CV;35.099998474;100.0 +25/10/2020 02:06:10;U879.TI2140B_PV.F_CV;35.400001526;100.0 +25/10/2020 02:06:12;U879.TI2140B_PV.F_CV;35.200000763;100.0 +25/10/2020 02:06:13;U879.TI2140B_PV.F_CV;35.400001526;100.0 +25/10/2020 02:06:00;U879.TI2140C_PV.F_CV;34.900001526;100.0 +25/10/2020 02:06:01;U879.TI2140C_PV.F_CV;34.700000763;100.0 +25/10/2020 02:06:03;U879.TI2140C_PV.F_CV;34.900001526;100.0 +25/10/2020 02:06:19;U879.TI2140C_PV.F_CV;35.099998474;100.0 +25/10/2020 02:06:20;U879.TI2140C_PV.F_CV;34.900001526;100.0 +25/10/2020 02:06:43;U879.TI2140C_PV.F_CV;35.299999237;100.0 +25/10/2020 02:06:44;U879.TI2140C_PV.F_CV;35.099998474;100.0 +25/10/2020 02:06:01;U879.TI2140D_PV.F_CV;35.200000763;100.0 +25/10/2020 02:06:04;U879.TI2140D_PV.F_CV;35.000000000;100.0 +25/10/2020 02:06:11;U879.TI2140D_PV.F_CV;35.200000763;100.0 +25/10/2020 02:06:13;U879.TI2140D_PV.F_CV;35.000000000;100.0 +25/10/2020 02:06:38;U879.TI2140D_PV.F_CV;34.799999237;100.0 +25/10/2020 02:06:39;U879.TI2140D_PV.F_CV;35.000000000;100.0 +25/10/2020 02:06:53;U879.TI2140D_PV.F_CV;34.799999237;100.0 +25/10/2020 02:06:55;U879.TI2140D_PV.F_CV;35.000000000;100.0 +25/10/2020 02:06:57;U879.TI2140D_PV.F_CV;34.799999237;100.0 +25/10/2020 02:06:58;U879.TI2140D_PV.F_CV;35.000000000;100.0 +25/10/2020 02:06:59;U879.TI2140D_PV.F_CV;34.799999237;100.0 +25/10/2020 02:06:36;U879.TI2140E_PV.F_CV;34.957141876;100.0 +25/10/2020 02:06:06;U879.TI2140F_PV.F_CV;34.250000000;100.0 +25/10/2020 02:06:09;U879.TI2140F_PV.F_CV;34.000000000;100.0 +25/10/2020 02:06:11;U879.TI2140F_PV.F_CV;34.299999237;100.0 +25/10/2020 02:06:12;U879.TI2140F_PV.F_CV;34.000000000;100.0 +25/10/2020 02:06:14;U879.TI2140F_PV.F_CV;34.200000763;100.0 +25/10/2020 02:06:45;U879.TI2140F_PV.F_CV;34.400001526;100.0 +25/10/2020 02:06:46;U879.TI2140F_PV.F_CV;34.200000763;100.0 +25/10/2020 02:06:00;U879.TI2141A_PV.F_CV;50.200000763;100.0 +25/10/2020 02:06:01;U879.TI2141A_PV.F_CV;50.400001526;100.0 +25/10/2020 02:06:12;U879.TI2141A_PV.F_CV;50.599998474;100.0 +25/10/2020 02:06:15;U879.TI2141A_PV.F_CV;50.400001526;100.0 +25/10/2020 02:06:17;U879.TI2141A_PV.F_CV;50.599998474;100.0 +25/10/2020 02:06:21;U879.TI2141A_PV.F_CV;50.400001526;100.0 +25/10/2020 02:06:22;U879.TI2141A_PV.F_CV;50.550003052;100.0 +25/10/2020 02:06:56;U879.TI2141A_PV.F_CV;50.400001526;100.0 +25/10/2020 02:06:04;U879.TI2141B_PV.F_CV;50.066665649;100.0 +25/10/2020 02:06:23;U879.TI2141B_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:28;U879.TI2141B_PV.F_CV;50.066665649;100.0 +25/10/2020 02:06:31;U879.TI2141B_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:36;U879.TI2141B_PV.F_CV;49.950000763;100.0 +25/10/2020 02:06:58;U879.TI2141B_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:00;U879.TI2141C_PV.F_CV;51.500000000;100.0 +25/10/2020 02:06:12;U879.TI2141C_PV.F_CV;51.299999237;100.0 +25/10/2020 02:06:14;U879.TI2141C_PV.F_CV;51.450000763;100.0 +25/10/2020 02:06:17;U879.TI2141C_PV.F_CV;51.299999237;100.0 +25/10/2020 02:06:37;U879.TI2141C_PV.F_CV;51.466667175;100.0 +25/10/2020 02:06:39;U879.TI2141C_PV.F_CV;51.299999237;100.0 +25/10/2020 02:06:40;U879.TI2141C_PV.F_CV;51.500000000;100.0 +25/10/2020 02:06:46;U879.TI2141C_PV.F_CV;51.299999237;100.0 +25/10/2020 02:06:47;U879.TI2141C_PV.F_CV;51.599998474;100.0 +25/10/2020 02:06:52;U879.TI2141C_PV.F_CV;51.400001526;100.0 +25/10/2020 02:06:33;U879.TI2141D_PV.F_CV;50.299999237;100.0 +25/10/2020 02:06:38;U879.TI2141D_PV.F_CV;50.500000000;100.0 +25/10/2020 02:06:44;U879.TI2141D_PV.F_CV;50.299999237;100.0 +25/10/2020 02:06:45;U879.TI2141D_PV.F_CV;50.500000000;100.0 +25/10/2020 02:06:59;U879.TI2141D_PV.F_CV;50.700000763;100.0 +25/10/2020 02:06:00;U879.TI2141E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:02;U879.TI2141E_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:27;U879.TI2141E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:33;U879.TI2141E_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:43;U879.TI2141E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:45;U879.TI2141E_PV.F_CV;49.699996948;100.0 +25/10/2020 02:06:48;U879.TI2141E_PV.F_CV;49.900001526;100.0 +25/10/2020 02:06:22;U879.TI2141F_PV.F_CV;44.500000000;100.0 +25/10/2020 02:06:28;U879.TI2141F_PV.F_CV;44.650001526;100.0 +25/10/2020 02:06:51;U879.TI2141F_PV.F_CV;44.299999237;100.0 +25/10/2020 02:06:53;U879.TI2141F_PV.F_CV;44.500000000;100.0 +25/10/2020 02:06:57;U879.TI2141F_PV.F_CV;44.299999237;100.0 +25/10/2020 02:06:47;U879.TI2143A_PV.F_CV;69.166664124;100.0 +25/10/2020 02:06:51;U879.TI2143A_PV.F_CV;69.300003052;100.0 +25/10/2020 02:06:53;U879.TI2143A_PV.F_CV;69.099998474;100.0 +25/10/2020 02:06:56;U879.TI2143A_PV.F_CV;69.300003052;100.0 +25/10/2020 02:06:08;U879.TI2143B_PV.F_CV;70.050003052;100.0 +25/10/2020 02:06:23;U879.TI2143B_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:24;U879.TI2143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:26;U879.TI2143B_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:45;U879.TI2143B_PV.F_CV;70.000000000;100.0 +25/10/2020 02:06:05;U879.TI2143C_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:07;U879.TI2143C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:11;U879.TI2143C_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:17;U879.TI2143C_PV.F_CV;70.199996948;100.0 +25/10/2020 02:06:49;U879.TI2143C_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:51;U879.TI2143C_PV.F_CV;70.099998474;100.0 +25/10/2020 02:06:54;U879.TI2143C_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:59;U879.TI2143C_PV.F_CV;70.149993896;100.0 +25/10/2020 02:06:35;U879.TI2143D_PV.F_CV;50.200000763;100.0 +25/10/2020 02:06:03;U879.TI2143E_PV.F_CV;25.333332062;100.0 +25/10/2020 02:06:11;U879.TI2143E_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:12;U879.TI2143E_PV.F_CV;25.299999237;100.0 +25/10/2020 02:06:50;U879.TI2143F_PV.F_CV;25.799999237;100.0 +25/10/2020 02:06:52;U879.TI2143F_PV.F_CV;25.650001526;100.0 +25/10/2020 02:06:12;U879.TI214A_PV.F_CV;393.120300293;100.0 +25/10/2020 02:06:14;U879.TI214B_PV.F_CV;391.975463867;100.0 +25/10/2020 02:06:45;U879.TI214B_PV.F_CV;392.375213623;100.0 +25/10/2020 02:06:59;U879.TI214C_PV.F_CV;399.984222412;100.0 +25/10/2020 02:06:44;U879.TI214D_PV.F_CV;349.891510010;100.0 +25/10/2020 02:06:35;U879.TI214E_PV.F_CV;311.035766602;100.0 +25/10/2020 02:06:06;U879.TI214F_PV.F_CV;350.110778809;100.0 +25/10/2020 02:06:03;U879.TI2201A_PV.F_CV;400.000000000;100.0 +25/10/2020 02:06:20;U879.TI2201B_PV.F_CV;399.200012207;100.0 +25/10/2020 02:06:11;U879.TI2201C_PV.F_CV;405.200012207;100.0 +25/10/2020 02:06:39;U879.TI2201D_PV.F_CV;346.399993896;100.0 +25/10/2020 02:06:15;U879.TI2201E_PV.F_CV;319.349975586;100.0 +25/10/2020 02:06:01;U879.TI2201F_PV.F_CV;348.200012207;100.0 +25/10/2020 02:06:03;U879.TI2201F_PV.F_CV;346.399993896;100.0 +25/10/2020 02:06:04;U879.TI2201F_PV.F_CV;347.799987793;100.0 +25/10/2020 02:06:07;U879.TI2201F_PV.F_CV;346.200012207;100.0 +25/10/2020 02:06:09;U879.TI2201F_PV.F_CV;348.299987793;100.0 +25/10/2020 02:06:11;U879.TI2201F_PV.F_CV;346.799987793;100.0 +25/10/2020 02:06:14;U879.TI2201F_PV.F_CV;346.100006104;100.0 +25/10/2020 02:06:15;U879.TI2201F_PV.F_CV;347.299987793;100.0 +25/10/2020 02:06:18;U879.TI2201F_PV.F_CV;346.600006104;100.0 +25/10/2020 02:06:19;U879.TI2201F_PV.F_CV;345.899993896;100.0 +25/10/2020 02:06:20;U879.TI2201F_PV.F_CV;347.700012207;100.0 +25/10/2020 02:06:22;U879.TI2201F_PV.F_CV;348.399993896;100.0 +25/10/2020 02:06:23;U879.TI2201F_PV.F_CV;346.000000000;100.0 +25/10/2020 02:06:24;U879.TI2201F_PV.F_CV;346.500000000;100.0 +25/10/2020 02:06:25;U879.TI2201F_PV.F_CV;345.799987793;100.0 +25/10/2020 02:06:27;U879.TI2201F_PV.F_CV;347.049987793;100.0 +25/10/2020 02:06:28;U879.TI2201F_PV.F_CV;348.200012207;100.0 +25/10/2020 02:06:31;U879.TI2201F_PV.F_CV;347.299987793;100.0 +25/10/2020 02:06:32;U879.TI2201F_PV.F_CV;346.399993896;100.0 +25/10/2020 02:06:33;U879.TI2201F_PV.F_CV;347.899993896;100.0 +25/10/2020 02:06:34;U879.TI2201F_PV.F_CV;346.500000000;100.0 +25/10/2020 02:06:36;U879.TI2201F_PV.F_CV;346.000000000;100.0 +25/10/2020 02:06:38;U879.TI2201F_PV.F_CV;346.399993896;100.0 +25/10/2020 02:06:39;U879.TI2201F_PV.F_CV;347.299987793;100.0 +25/10/2020 02:06:40;U879.TI2201F_PV.F_CV;346.799987793;100.0 +25/10/2020 02:06:42;U879.TI2201F_PV.F_CV;347.500000000;100.0 +25/10/2020 02:06:43;U879.TI2201F_PV.F_CV;346.500000000;100.0 +25/10/2020 02:06:44;U879.TI2201F_PV.F_CV;347.299987793;100.0 +25/10/2020 02:06:46;U879.TI2201F_PV.F_CV;346.399993896;100.0 +25/10/2020 02:06:49;U879.TI2201F_PV.F_CV;347.799987793;100.0 +25/10/2020 02:06:51;U879.TI2201F_PV.F_CV;346.600006104;100.0 +25/10/2020 02:06:53;U879.TI2201F_PV.F_CV;347.500000000;100.0 +25/10/2020 02:06:54;U879.TI2201F_PV.F_CV;346.399993896;100.0 +25/10/2020 02:06:57;U879.TI2201F_PV.F_CV;347.799987793;100.0 +25/10/2020 02:06:59;U879.TI2201F_PV.F_CV;346.799987793;100.0 +25/10/2020 02:06:19;U879.TI2202A_PV.F_CV;401.299987793;100.0 +25/10/2020 02:06:44;U879.TI2202B_PV.F_CV;400.116668701;100.0 +25/10/2020 02:06:53;U879.TI2202C_PV.F_CV;407.399993896;100.0 +25/10/2020 02:06:07;U879.TI2202D_PV.F_CV;349.299987793;100.0 +25/10/2020 02:06:40;U879.TI2202E_PV.F_CV;317.600006104;100.0 +25/10/2020 02:06:48;U879.TI2202F_PV.F_CV;348.399993896;100.0 +25/10/2020 02:06:52;U879.TI2203A_PV.F_CV;401.899993896;100.0 +25/10/2020 02:06:31;U879.TI2203B_PV.F_CV;399.700012207;100.0 +25/10/2020 02:06:54;U879.TI2203C_PV.F_CV;409.299987793;100.0 +25/10/2020 02:06:49;U879.TI2203D_PV.F_CV;347.700012207;100.0 +25/10/2020 02:06:00;U879.TI2203E_PV.F_CV;318.640014648;100.0 +25/10/2020 02:06:59;U879.TI2203F_PV.F_CV;347.033325195;100.0 +25/10/2020 02:06:26;U879.TI2204A_PV.F_CV;390.799987793;100.0 +25/10/2020 02:06:50;U879.TI2204B_PV.F_CV;390.119995117;100.0 +25/10/2020 02:06:53;U879.TI2204C_PV.F_CV;395.544433594;100.0 +25/10/2020 02:06:34;U879.TI2204D_PV.F_CV;347.600006104;100.0 +25/10/2020 02:06:39;U879.TI2204E_PV.F_CV;308.549987793;100.0 +25/10/2020 02:06:04;U879.TI2204F_PV.F_CV;347.650024414;100.0 +25/10/2020 02:06:04;U879.TI2240A_PV.F_CV;29.666667938;100.0 +25/10/2020 02:06:07;U879.TI2240A_PV.F_CV;29.500000000;100.0 +25/10/2020 02:06:13;U879.TI2240A_PV.F_CV;29.700000763;100.0 +25/10/2020 02:06:18;U879.TI2240A_PV.F_CV;29.500000000;100.0 +25/10/2020 02:06:19;U879.TI2240A_PV.F_CV;29.700000763;100.0 +25/10/2020 02:06:25;U879.TI2240A_PV.F_CV;29.500000000;100.0 +25/10/2020 02:06:27;U879.TI2240A_PV.F_CV;29.700000763;100.0 +25/10/2020 02:06:53;U879.TI2240A_PV.F_CV;29.500000000;100.0 +25/10/2020 02:06:59;U879.TI2240A_PV.F_CV;29.680000305;100.0 +25/10/2020 02:06:01;U879.TI2240B_PV.F_CV;34.799999237;100.0 +25/10/2020 02:06:04;U879.TI2240B_PV.F_CV;35.099998474;100.0 +25/10/2020 02:06:07;U879.TI2240B_PV.F_CV;34.900001526;100.0 +25/10/2020 02:06:26;U879.TI2240B_PV.F_CV;34.740001678;100.0 +25/10/2020 02:06:29;U879.TI2240B_PV.F_CV;35.000000000;100.0 +25/10/2020 02:06:02;U879.TI2240C_PV.F_CV;35.700000763;100.0 +25/10/2020 02:06:10;U879.TI2240C_PV.F_CV;35.544445038;100.0 +25/10/2020 02:06:42;U879.TI2240C_PV.F_CV;36.099998474;100.0 +25/10/2020 02:06:00;U879.TI2240D_PV.F_CV;34.099998474;100.0 +25/10/2020 02:06:02;U879.TI2240D_PV.F_CV;33.900001526;100.0 +25/10/2020 02:06:48;U879.TI2240D_PV.F_CV;34.099998474;100.0 +25/10/2020 02:06:01;U879.TI2240E_PV.F_CV;35.299999237;100.0 +25/10/2020 02:06:07;U879.TI2240E_PV.F_CV;35.099998474;100.0 +25/10/2020 02:06:15;U879.TI2240E_PV.F_CV;35.299999237;100.0 +25/10/2020 02:06:45;U879.TI2240E_PV.F_CV;34.974998474;100.0 +25/10/2020 02:06:01;U879.TI2240F_PV.F_CV;34.099998474;100.0 +25/10/2020 02:06:03;U879.TI2240F_PV.F_CV;33.799999237;100.0 +25/10/2020 02:06:04;U879.TI2240F_PV.F_CV;34.000000000;100.0 +25/10/2020 02:06:18;U879.TI2240F_PV.F_CV;33.833332062;100.0 +25/10/2020 02:06:42;U879.TI2240F_PV.F_CV;34.200000763;100.0 +25/10/2020 02:06:45;U879.TI2240F_PV.F_CV;34.000000000;100.0 +25/10/2020 02:06:57;U879.TI2240F_PV.F_CV;34.200000763;100.0 +25/10/2020 02:06:59;U879.TI2240F_PV.F_CV;34.049999237;100.0 +25/10/2020 02:06:01;U879.TI2241A_PV.F_CV;50.566665649;100.0 +25/10/2020 02:06:03;U879.TI2241A_PV.F_CV;50.299999237;100.0 +25/10/2020 02:06:06;U879.TI2241A_PV.F_CV;50.450000763;100.0 +25/10/2020 02:06:12;U879.TI2241A_PV.F_CV;50.299999237;100.0 +25/10/2020 02:06:14;U879.TI2241A_PV.F_CV;50.500000000;100.0 +25/10/2020 02:06:18;U879.TI2241A_PV.F_CV;50.349998474;100.0 +25/10/2020 02:06:31;U879.TI2241A_PV.F_CV;50.500000000;100.0 +25/10/2020 02:06:35;U879.TI2241A_PV.F_CV;50.200000763;100.0 +25/10/2020 02:06:38;U879.TI2241A_PV.F_CV;50.400001526;100.0 +25/10/2020 02:06:52;U879.TI2241A_PV.F_CV;50.099998474;100.0 +25/10/2020 02:06:59;U879.TI2241A_PV.F_CV;50.500000000;100.0 +25/10/2020 02:06:36;U879.TI2241B_PV.F_CV;50.800003052;100.0 +25/10/2020 02:06:36;U879.TI2241C_PV.F_CV;48.740001678;100.0 +25/10/2020 02:06:01;U879.TI2241D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:02;U879.TI2241D_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:13;U879.TI2241D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:20;U879.TI2241D_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:25;U879.TI2241D_PV.F_CV;49.950000763;100.0 +25/10/2020 02:06:44;U879.TI2241D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:52;U879.TI2241D_PV.F_CV;49.950000763;100.0 +25/10/2020 02:06:55;U879.TI2241D_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:57;U879.TI2241D_PV.F_CV;50.000000000;100.0 +25/10/2020 02:06:58;U879.TI2241D_PV.F_CV;49.700000763;100.0 +25/10/2020 02:06:13;U879.TI2241E_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:16;U879.TI2241E_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:17;U879.TI2241E_PV.F_CV;49.500000000;100.0 +25/10/2020 02:06:19;U879.TI2241E_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:46;U879.TI2241E_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:47;U879.TI2241E_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:49;U879.TI2241E_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:50;U879.TI2241E_PV.F_CV;49.799999237;100.0 +25/10/2020 02:06:51;U879.TI2241E_PV.F_CV;49.599998474;100.0 +25/10/2020 02:06:17;U879.TI2241F_PV.F_CV;49.250000000;100.0 +25/10/2020 02:06:20;U879.TI2241F_PV.F_CV;49.400001526;100.0 +25/10/2020 02:06:21;U879.TI2241F_PV.F_CV;49.200000763;100.0 +25/10/2020 02:06:23;U879.TI2241F_PV.F_CV;49.400001526;100.0 +25/10/2020 02:06:25;U879.TI2241F_PV.F_CV;49.200000763;100.0 +25/10/2020 02:06:26;U879.TI2241F_PV.F_CV;49.400001526;100.0 +25/10/2020 02:06:34;U879.TI2241F_PV.F_CV;49.200000763;100.0 +25/10/2020 02:06:37;U879.TI2241F_PV.F_CV;49.366668701;100.0 +25/10/2020 02:06:39;U879.TI2241F_PV.F_CV;49.200000763;100.0 +25/10/2020 02:06:36;U879.TI2243A_PV.F_CV;69.766662598;100.0 +25/10/2020 02:06:40;U879.TI2243A_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:07;U879.TI2243B_PV.F_CV;70.449996948;100.0 +25/10/2020 02:06:12;U879.TI2243B_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:13;U879.TI2243B_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:18;U879.TI2243B_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:37;U879.TI2243B_PV.F_CV;70.449996948;100.0 +25/10/2020 02:06:41;U879.TI2243B_PV.F_CV;70.300003052;100.0 +25/10/2020 02:06:45;U879.TI2243B_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:47;U879.TI2243B_PV.F_CV;70.350006104;100.0 +25/10/2020 02:06:08;U879.TI2243C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:10;U879.TI2243C_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:21;U879.TI2243C_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:25;U879.TI2243C_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:03;U879.TI2243D_PV.F_CV;49.500000000;100.0 +25/10/2020 02:06:42;U879.TI2243E_PV.F_CV;25.399999619;100.0 +25/10/2020 02:06:07;U879.TI2243F_PV.F_CV;25.700000763;100.0 +25/10/2020 02:06:14;U879.TI2243F_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:19;U879.TI2243F_PV.F_CV;25.700000763;100.0 +25/10/2020 02:06:21;U879.TI2243F_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:23;U879.TI2243F_PV.F_CV;25.650001526;100.0 +25/10/2020 02:06:25;U879.TI2243F_PV.F_CV;25.399999619;100.0 +25/10/2020 02:06:27;U879.TI2243F_PV.F_CV;25.533332825;100.0 +25/10/2020 02:06:30;U879.TI2243F_PV.F_CV;25.399999619;100.0 +25/10/2020 02:06:31;U879.TI2243F_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:00;U879.TI244A_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:02;U879.TI244A_PV.F_CV;24.150001526;100.0 +25/10/2020 02:06:05;U879.TI244A_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:06;U879.TI244A_PV.F_CV;24.200000763;100.0 +25/10/2020 02:06:07;U879.TI244A_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:08;U879.TI244A_PV.F_CV;24.200000763;100.0 +25/10/2020 02:06:09;U879.TI244A_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:11;U879.TI244A_PV.F_CV;24.150001526;100.0 +25/10/2020 02:06:14;U879.TI244A_PV.F_CV;24.000000000;100.0 +25/10/2020 02:06:15;U879.TI244A_PV.F_CV;24.200000763;100.0 +25/10/2020 02:06:16;U879.TI244A_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:17;U879.TI244A_PV.F_CV;24.150001526;100.0 +25/10/2020 02:06:19;U879.TI244A_PV.F_CV;24.000000000;100.0 +25/10/2020 02:06:25;U879.TI244A_PV.F_CV;24.399999619;100.0 +25/10/2020 02:06:26;U879.TI244A_PV.F_CV;24.000000000;100.0 +25/10/2020 02:06:28;U879.TI244A_PV.F_CV;24.200000763;100.0 +25/10/2020 02:06:29;U879.TI244A_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:30;U879.TI244A_PV.F_CV;24.200000763;100.0 +25/10/2020 02:06:31;U879.TI244A_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:32;U879.TI244A_PV.F_CV;24.150001526;100.0 +25/10/2020 02:06:35;U879.TI244A_PV.F_CV;24.000000000;100.0 +25/10/2020 02:06:36;U879.TI244A_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:39;U879.TI244A_PV.F_CV;23.899999619;100.0 +25/10/2020 02:06:40;U879.TI244A_PV.F_CV;24.000000000;100.0 +25/10/2020 02:06:41;U879.TI244A_PV.F_CV;24.200000763;100.0 +25/10/2020 02:06:43;U879.TI244A_PV.F_CV;24.049999237;100.0 +25/10/2020 02:06:45;U879.TI244A_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:48;U879.TI244A_PV.F_CV;23.899999619;100.0 +25/10/2020 02:06:49;U879.TI244A_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:51;U879.TI244A_PV.F_CV;24.033332825;100.0 +25/10/2020 02:06:57;U879.TI244A_PV.F_CV;24.159999847;100.0 +25/10/2020 02:06:00;U879.TI244B_PV.F_CV;24.366666794;100.0 +25/10/2020 02:06:03;U879.TI244B_PV.F_CV;24.200000763;100.0 +25/10/2020 02:06:05;U879.TI244B_PV.F_CV;24.399999619;100.0 +25/10/2020 02:06:07;U879.TI244B_PV.F_CV;24.200000763;100.0 +25/10/2020 02:06:08;U879.TI244B_PV.F_CV;24.500000000;100.0 +25/10/2020 02:06:09;U879.TI244B_PV.F_CV;24.299999237;100.0 +25/10/2020 02:06:13;U879.TI244B_PV.F_CV;24.366666794;100.0 +25/10/2020 02:06:16;U879.TI244B_PV.F_CV;24.299999237;100.0 +25/10/2020 02:06:18;U879.TI244B_PV.F_CV;24.399999619;100.0 +25/10/2020 02:06:20;U879.TI244B_PV.F_CV;24.333332062;100.0 +25/10/2020 02:06:23;U879.TI244B_PV.F_CV;24.399999619;100.0 +25/10/2020 02:06:28;U879.TI244B_PV.F_CV;24.266666412;100.0 +25/10/2020 02:06:29;U879.TI244B_PV.F_CV;24.200000763;100.0 +25/10/2020 02:06:30;U879.TI244B_PV.F_CV;24.399999619;100.0 +25/10/2020 02:06:32;U879.TI244B_PV.F_CV;24.349998474;100.0 +25/10/2020 02:06:35;U879.TI244B_PV.F_CV;24.500000000;100.0 +25/10/2020 02:06:37;U879.TI244B_PV.F_CV;24.200000763;100.0 +25/10/2020 02:06:39;U879.TI244B_PV.F_CV;24.299999237;100.0 +25/10/2020 02:06:44;U879.TI244B_PV.F_CV;24.200000763;100.0 +25/10/2020 02:06:47;U879.TI244B_PV.F_CV;24.399999619;100.0 +25/10/2020 02:06:48;U879.TI244B_PV.F_CV;24.349998474;100.0 +25/10/2020 02:06:51;U879.TI244B_PV.F_CV;24.399999619;100.0 +25/10/2020 02:06:52;U879.TI244B_PV.F_CV;24.349998474;100.0 +25/10/2020 02:06:55;U879.TI244B_PV.F_CV;24.399999619;100.0 +25/10/2020 02:06:56;U879.TI244B_PV.F_CV;24.500000000;100.0 +25/10/2020 02:06:58;U879.TI244B_PV.F_CV;24.200000763;100.0 +25/10/2020 02:06:01;U879.TI244C_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:02;U879.TI244C_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:03;U879.TI244C_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:05;U879.TI244C_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:07;U879.TI244C_PV.F_CV;25.399999619;100.0 +25/10/2020 02:06:08;U879.TI244C_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:09;U879.TI244C_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:10;U879.TI244C_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:11;U879.TI244C_PV.F_CV;25.549999237;100.0 +25/10/2020 02:06:13;U879.TI244C_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:16;U879.TI244C_PV.F_CV;25.549999237;100.0 +25/10/2020 02:06:18;U879.TI244C_PV.F_CV;25.700000763;100.0 +25/10/2020 02:06:19;U879.TI244C_PV.F_CV;25.399999619;100.0 +25/10/2020 02:06:20;U879.TI244C_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:25;U879.TI244C_PV.F_CV;25.650001526;100.0 +25/10/2020 02:06:31;U879.TI244C_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:33;U879.TI244C_PV.F_CV;25.566667557;100.0 +25/10/2020 02:06:35;U879.TI244C_PV.F_CV;25.450000763;100.0 +25/10/2020 02:06:36;U879.TI244C_PV.F_CV;25.299999237;100.0 +25/10/2020 02:06:37;U879.TI244C_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:38;U879.TI244C_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:43;U879.TI244C_PV.F_CV;25.399999619;100.0 +25/10/2020 02:06:47;U879.TI244C_PV.F_CV;25.650001526;100.0 +25/10/2020 02:06:52;U879.TI244C_PV.F_CV;25.399999619;100.0 +25/10/2020 02:06:56;U879.TI244C_PV.F_CV;25.700000763;100.0 +25/10/2020 02:06:57;U879.TI244C_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:58;U879.TI244C_PV.F_CV;25.600000381;100.0 +25/10/2020 02:06:59;U879.TI244C_PV.F_CV;25.549999237;100.0 +25/10/2020 02:06:01;U879.TI244D_PV.F_CV;25.299999237;100.0 +25/10/2020 02:06:02;U879.TI244D_PV.F_CV;25.399999619;100.0 +25/10/2020 02:06:04;U879.TI244D_PV.F_CV;25.333332062;100.0 +25/10/2020 02:06:07;U879.TI244D_PV.F_CV;25.450000763;100.0 +25/10/2020 02:06:13;U879.TI244D_PV.F_CV;25.349998474;100.0 +25/10/2020 02:06:18;U879.TI244D_PV.F_CV;25.399999619;100.0 +25/10/2020 02:06:19;U879.TI244D_PV.F_CV;25.299999237;100.0 +25/10/2020 02:06:20;U879.TI244D_PV.F_CV;25.500000000;100.0 +25/10/2020 02:06:22;U879.TI244D_PV.F_CV;25.349998474;100.0 +25/10/2020 02:06:25;U879.TI244D_PV.F_CV;25.450000763;100.0 +25/10/2020 02:06:30;U879.TI244D_PV.F_CV;25.349998474;100.0 +25/10/2020 02:06:35;U879.TI244D_PV.F_CV;25.399999619;100.0 +25/10/2020 02:06:36;U879.TI244D_PV.F_CV;25.349998474;100.0 +25/10/2020 02:06:39;U879.TI244D_PV.F_CV;25.399999619;100.0 +25/10/2020 02:06:40;U879.TI244D_PV.F_CV;25.349998474;100.0 +25/10/2020 02:06:43;U879.TI244D_PV.F_CV;25.399999619;100.0 +25/10/2020 02:06:44;U879.TI244D_PV.F_CV;25.200000763;100.0 +25/10/2020 02:06:45;U879.TI244D_PV.F_CV;25.399999619;100.0 +25/10/2020 02:06:49;U879.TI244D_PV.F_CV;25.349998474;100.0 +25/10/2020 02:06:53;U879.TI244D_PV.F_CV;25.450000763;100.0 +25/10/2020 02:06:56;U879.TI244D_PV.F_CV;25.299999237;100.0 +25/10/2020 02:06:57;U879.TI244D_PV.F_CV;25.399999619;100.0 +25/10/2020 02:06:59;U879.TI244D_PV.F_CV;25.333332062;100.0 +25/10/2020 02:06:02;U879.TI244E_PV.F_CV;24.000000000;100.0 +25/10/2020 02:06:05;U879.TI244E_PV.F_CV;24.299999237;100.0 +25/10/2020 02:06:08;U879.TI244E_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:09;U879.TI244E_PV.F_CV;24.200000763;100.0 +25/10/2020 02:06:10;U879.TI244E_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:12;U879.TI244E_PV.F_CV;24.166667938;100.0 +25/10/2020 02:06:15;U879.TI244E_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:18;U879.TI244E_PV.F_CV;24.299999237;100.0 +25/10/2020 02:06:19;U879.TI244E_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:20;U879.TI244E_PV.F_CV;24.200000763;100.0 +25/10/2020 02:06:22;U879.TI244E_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:23;U879.TI244E_PV.F_CV;24.150001526;100.0 +25/10/2020 02:06:26;U879.TI244E_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:29;U879.TI244E_PV.F_CV;24.250000000;100.0 +25/10/2020 02:06:36;U879.TI244E_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:37;U879.TI244E_PV.F_CV;24.200000763;100.0 +25/10/2020 02:06:40;U879.TI244E_PV.F_CV;24.125000000;100.0 +25/10/2020 02:06:43;U879.TI244E_PV.F_CV;24.299999237;100.0 +25/10/2020 02:06:47;U879.TI244E_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:49;U879.TI244E_PV.F_CV;24.166667938;100.0 +25/10/2020 02:06:53;U879.TI244E_PV.F_CV;24.000000000;100.0 +25/10/2020 02:06:56;U879.TI244E_PV.F_CV;24.150001526;100.0 +25/10/2020 02:06:59;U879.TI244E_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:00;U879.TI244F_PV.F_CV;24.500000000;100.0 +25/10/2020 02:06:03;U879.TI244F_PV.F_CV;24.559999466;100.0 +25/10/2020 02:06:06;U879.TI244F_PV.F_CV;24.500000000;100.0 +25/10/2020 02:06:07;U879.TI244F_PV.F_CV;24.399999619;100.0 +25/10/2020 02:06:08;U879.TI244F_PV.F_CV;24.500000000;100.0 +25/10/2020 02:06:11;U879.TI244F_PV.F_CV;24.559999466;100.0 +25/10/2020 02:06:14;U879.TI244F_PV.F_CV;24.500000000;100.0 +25/10/2020 02:06:15;U879.TI244F_PV.F_CV;24.399999619;100.0 +25/10/2020 02:06:16;U879.TI244F_PV.F_CV;24.600000381;100.0 +25/10/2020 02:06:19;U879.TI244F_PV.F_CV;24.500000000;100.0 +25/10/2020 02:06:20;U879.TI244F_PV.F_CV;24.399999619;100.0 +25/10/2020 02:06:22;U879.TI244F_PV.F_CV;24.600000381;100.0 +25/10/2020 02:06:23;U879.TI244F_PV.F_CV;24.399999619;100.0 +25/10/2020 02:06:24;U879.TI244F_PV.F_CV;24.600000381;100.0 +25/10/2020 02:06:25;U879.TI244F_PV.F_CV;24.500000000;100.0 +25/10/2020 02:06:28;U879.TI244F_PV.F_CV;24.575000763;100.0 +25/10/2020 02:06:32;U879.TI244F_PV.F_CV;24.399999619;100.0 +25/10/2020 02:06:33;U879.TI244F_PV.F_CV;24.600000381;100.0 +25/10/2020 02:06:34;U879.TI244F_PV.F_CV;24.500000000;100.0 +25/10/2020 02:06:36;U879.TI244F_PV.F_CV;24.600000381;100.0 +25/10/2020 02:06:39;U879.TI244F_PV.F_CV;24.399999619;100.0 +25/10/2020 02:06:40;U879.TI244F_PV.F_CV;24.600000381;100.0 +25/10/2020 02:06:42;U879.TI244F_PV.F_CV;24.533332825;100.0 +25/10/2020 02:06:44;U879.TI244F_PV.F_CV;24.600000381;100.0 +25/10/2020 02:06:45;U879.TI244F_PV.F_CV;24.399999619;100.0 +25/10/2020 02:06:46;U879.TI244F_PV.F_CV;24.600000381;100.0 +25/10/2020 02:06:48;U879.TI244F_PV.F_CV;24.399999619;100.0 +25/10/2020 02:06:49;U879.TI244F_PV.F_CV;24.600000381;100.0 +25/10/2020 02:06:55;U879.TI244F_PV.F_CV;24.549999237;100.0 +25/10/2020 02:06:59;U879.TI244F_PV.F_CV;24.600000381;100.0 +25/10/2020 02:06:00;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:01;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:02;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:03;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:04;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:05;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:06;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:07;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:08;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:09;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:10;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:11;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:12;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:13;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:14;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:15;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:16;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:17;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:18;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:19;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:20;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:21;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:22;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:23;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:24;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:25;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:26;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:27;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:28;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:29;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:30;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:31;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:32;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:33;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:34;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:35;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:36;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:37;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:38;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:39;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:40;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:41;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:42;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:43;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:44;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:45;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:46;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:47;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:48;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:49;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:50;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:51;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:52;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:53;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:54;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:55;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:56;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:57;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:58;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:59;U879.U879.BILAN_GC_LAST_DATE_A_R1.F_CV;44128.000000000;100.0 +25/10/2020 02:06:00;U879.U879.FI144A_COEFA.F_CV;1.000000000;100.0 +25/10/2020 02:06:05;U879.U879.FI144A_COEFA.F_CV;1.000000000;100.0 +25/10/2020 02:06:10;U879.U879.FI144A_COEFA.F_CV;1.000000000;100.0 +25/10/2020 02:06:15;U879.U879.FI144A_COEFA.F_CV;1.000000000;100.0 +25/10/2020 02:06:20;U879.U879.FI144A_COEFA.F_CV;1.000000000;100.0 +25/10/2020 02:06:25;U879.U879.FI144A_COEFA.F_CV;1.000000000;100.0 +25/10/2020 02:06:30;U879.U879.FI144A_COEFA.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;U879.U879.FI144A_COEFA.F_CV;1.000000000;100.0 +25/10/2020 02:06:40;U879.U879.FI144A_COEFA.F_CV;1.000000000;100.0 +25/10/2020 02:06:45;U879.U879.FI144A_COEFA.F_CV;1.000000000;100.0 +25/10/2020 02:06:50;U879.U879.FI144A_COEFA.F_CV;1.000000000;100.0 +25/10/2020 02:06:55;U879.U879.FI144A_COEFA.F_CV;1.000000000;100.0 +25/10/2020 02:06:00;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:25;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;U879.U879.FI144A_RPT.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U879.WI140A_PV.F_CV;919.616638184;100.0 +25/10/2020 02:06:06;U879.WI140A_PV.F_CV;919.700012207;100.0 +25/10/2020 02:06:13;U879.WI140A_PV.F_CV;919.700012207;100.0 +25/10/2020 02:06:14;U879.WI140A_PV.F_CV;919.757141113;100.0 +25/10/2020 02:06:20;U879.WI140A_PV.F_CV;919.799987793;100.0 +25/10/2020 02:06:27;U879.WI140A_PV.F_CV;919.900024414;100.0 +25/10/2020 02:06:37;U879.WI140A_PV.F_CV;920.000000000;100.0 +25/10/2020 02:06:41;U879.WI140A_PV.F_CV;920.099975586;100.0 +25/10/2020 02:06:49;U879.WI140A_PV.F_CV;920.216674805;100.0 +25/10/2020 02:06:54;U879.WI140A_PV.F_CV;920.299987793;100.0 +25/10/2020 02:06:04;U879.WI140B_PV.F_CV;917.400024414;100.0 +25/10/2020 02:06:25;U879.WI140B_PV.F_CV;917.400024414;100.0 +25/10/2020 02:06:26;U879.WI140B_PV.F_CV;917.481506348;100.0 +25/10/2020 02:06:31;U879.WI140B_PV.F_CV;917.500000000;100.0 +25/10/2020 02:06:53;U879.WI140B_PV.F_CV;917.500000000;100.0 +25/10/2020 02:06:54;U879.WI140B_PV.F_CV;917.664306641;100.0 +25/10/2020 02:06:59;U879.WI140B_PV.F_CV;917.700012207;100.0 +25/10/2020 02:06:02;U879.WI140C_PV.F_CV;583.000000000;100.0 +25/10/2020 02:06:03;U879.WI140C_PV.F_CV;583.070800781;100.0 +25/10/2020 02:06:10;U879.WI140C_PV.F_CV;583.099975586;100.0 +25/10/2020 02:06:19;U879.WI140C_PV.F_CV;583.099975586;100.0 +25/10/2020 02:06:20;U879.WI140C_PV.F_CV;583.162475586;100.0 +25/10/2020 02:06:26;U879.WI140C_PV.F_CV;583.200012207;100.0 +25/10/2020 02:06:31;U879.WI140C_PV.F_CV;583.299987793;100.0 +25/10/2020 02:06:35;U879.WI140C_PV.F_CV;583.400024414;100.0 +25/10/2020 02:06:48;U879.WI140C_PV.F_CV;583.400024414;100.0 +25/10/2020 02:06:49;U879.WI140C_PV.F_CV;583.473693848;100.0 +25/10/2020 02:06:54;U879.WI140C_PV.F_CV;583.500000000;100.0 +25/10/2020 02:06:23;U879.WI140D_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U879.WI140E_PV.F_CV;234.600006104;100.0 +25/10/2020 02:06:35;U879.WI140F_PV.F_CV;0.899999976;100.0 +25/10/2020 02:06:10;U879.WI240A_PV.F_CV;893.500000000;100.0 +25/10/2020 02:06:14;U879.WI240A_PV.F_CV;893.592651367;100.0 +25/10/2020 02:06:18;U879.WI240A_PV.F_CV;893.598510742;100.0 +25/10/2020 02:06:02;U879.WI240B_PV.F_CV;931.299987793;100.0 +25/10/2020 02:06:03;U879.WI240B_PV.F_CV;931.345458984;100.0 +25/10/2020 02:06:09;U879.WI240B_PV.F_CV;931.400024414;100.0 +25/10/2020 02:06:07;U879.WI240C_PV.F_CV;951.299987793;100.0 +25/10/2020 02:06:34;U879.WI240C_PV.F_CV;951.299987793;100.0 +25/10/2020 02:06:35;U879.WI240C_PV.F_CV;951.384887695;100.0 +25/10/2020 02:06:40;U879.WI240C_PV.F_CV;951.400024414;100.0 +25/10/2020 02:06:52;U879.WI240C_PV.F_CV;951.700012207;100.0 +25/10/2020 02:06:23;U879.WI240D_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U879.WI240E_PV.F_CV;233.199996948;100.0 +25/10/2020 02:06:54;U879.WI240F_PV.F_CV;0.400000006;100.0 +25/10/2020 02:06:38;U881.DPY100_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.DPY100_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U881.DPY100_PV.F_CV;-0.056061920;100.0 +25/10/2020 02:06:38;U881.DPY200_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.DPY200_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U881.DPY200_PV.F_CV;0.027126737;100.0 +25/10/2020 02:06:38;U881.DPY300_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.DPY300_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.DPY300_PV.F_CV;-0.989221632;100.0 +25/10/2020 02:06:38;U881.DPY400_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.DPY400_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U881.DPY400_PV.F_CV;-0.137442127;100.0 +25/10/2020 02:06:12;U881.F100.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F101.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F103.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F104.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F105.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F106.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F110.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F200.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F201.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F203.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F204.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F205.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F206.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F210.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F300.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F301.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F303.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F304.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F305.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F306.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F310.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F400.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F401.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F403.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F404.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F405.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F406.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F410.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F701.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.F710.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;U881.FC130_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FC130_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U881.FC130_PV.F_CV;0.007198963;100.0 +25/10/2020 02:06:38;U881.FC130_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC140_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FC140_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U881.FC140_PV.F_CV;-0.024698457;100.0 +25/10/2020 02:06:06;U881.FC140_PV.F_CV;-0.026863484;100.0 +25/10/2020 02:06:08;U881.FC140_PV.F_CV;-0.023709711;100.0 +25/10/2020 02:06:09;U881.FC140_PV.F_CV;-0.013944524;100.0 +25/10/2020 02:06:10;U881.FC140_PV.F_CV;-0.022236634;100.0 +25/10/2020 02:06:12;U881.FC140_PV.F_CV;-0.019874314;100.0 +25/10/2020 02:06:17;U881.FC140_PV.F_CV;-0.022073332;100.0 +25/10/2020 02:06:21;U881.FC140_PV.F_CV;-0.019697519;100.0 +25/10/2020 02:06:23;U881.FC140_PV.F_CV;-0.025876507;100.0 +25/10/2020 02:06:25;U881.FC140_PV.F_CV;-0.018540848;100.0 +25/10/2020 02:06:28;U881.FC140_PV.F_CV;-0.021020817;100.0 +25/10/2020 02:06:29;U881.FC140_PV.F_CV;-0.015110371;100.0 +25/10/2020 02:06:34;U881.FC140_PV.F_CV;-0.026215434;100.0 +25/10/2020 02:06:36;U881.FC140_PV.F_CV;-0.021892106;100.0 +25/10/2020 02:06:37;U881.FC140_PV.F_CV;-0.024363773;100.0 +25/10/2020 02:06:39;U881.FC140_PV.F_CV;-0.019533781;100.0 +25/10/2020 02:06:40;U881.FC140_PV.F_CV;-0.024639674;100.0 +25/10/2020 02:06:42;U881.FC140_PV.F_CV;-0.020967990;100.0 +25/10/2020 02:06:47;U881.FC140_PV.F_CV;-0.026634011;100.0 +25/10/2020 02:06:48;U881.FC140_PV.F_CV;-0.023848798;100.0 +25/10/2020 02:06:49;U881.FC140_PV.F_CV;-0.026984552;100.0 +25/10/2020 02:06:50;U881.FC140_PV.F_CV;-0.022022387;100.0 +25/10/2020 02:06:56;U881.FC140_PV.F_CV;-0.016580498;100.0 +25/10/2020 02:06:57;U881.FC140_PV.F_CV;-0.020508152;100.0 +25/10/2020 02:06:58;U881.FC140_PV.F_CV;-0.017245317;100.0 +25/10/2020 02:06:38;U881.FC140_SP.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FC141_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FC141_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U881.FC141_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:38;U881.FC141_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC150_Coef_A.F_CV;1.062700033;100.0 +25/10/2020 02:06:38;U881.FC150_Coef_B.F_CV;0.042900000;100.0 +25/10/2020 02:06:48;U881.FC150_PV.F_CV;0.054946382;100.0 +25/10/2020 02:06:38;U881.FC150_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC151_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FC151_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC151_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC151_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC160_Coef_A.F_CV;0.981500030;100.0 +25/10/2020 02:06:38;U881.FC160_Coef_B.F_CV;0.021500001;100.0 +25/10/2020 02:06:25;U881.FC160_PV.F_CV;0.021500001;100.0 +25/10/2020 02:06:38;U881.FC160_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U881.FC161_Coef_A.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC161_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC161_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:36;U881.FC161_SP.F_CV;0.200000003;100.0 +25/10/2020 02:06:38;U881.FC170_Coef_A.F_CV;1.049000025;100.0 +25/10/2020 02:06:38;U881.FC170_Coef_B.F_CV;0.017600000;100.0 +25/10/2020 02:06:28;U881.FC170_PV.F_CV;0.057063974;100.0 +25/10/2020 02:06:38;U881.FC170_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC171_Coef_A.F_CV;1.050699949;100.0 +25/10/2020 02:06:38;U881.FC171_Coef_B.F_CV;-0.000300000;100.0 +25/10/2020 02:06:38;U881.FC171_PV.F_CV;-0.000300000;100.0 +25/10/2020 02:06:38;U881.FC171_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC172_Coef_A.F_CV;1.037500024;100.0 +25/10/2020 02:06:38;U881.FC172_Coef_B.F_CV;0.016400000;100.0 +25/10/2020 02:06:38;U881.FC172_PV.F_CV;0.016400000;100.0 +25/10/2020 02:06:38;U881.FC172_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC173_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FC173_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U881.FC173_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC173_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC230_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FC230_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U881.FC230_PV.F_CV;0.041853134;100.0 +25/10/2020 02:06:38;U881.FC230_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC240_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FC240_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U881.FC240_PV.F_CV;-0.022750642;100.0 +25/10/2020 02:06:38;U881.FC240_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC241_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FC241_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U881.FC241_PV.F_CV;1.361623168;100.0 +25/10/2020 02:06:38;U881.FC241_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC250_Coef_A.F_CV;1.099400043;100.0 +25/10/2020 02:06:38;U881.FC250_Coef_B.F_CV;-0.016899999;100.0 +25/10/2020 02:06:36;U881.FC250_PV.F_CV;-0.006719246;100.0 +25/10/2020 02:06:38;U881.FC250_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC251_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FC251_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC251_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC251_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC260_Coef_A.F_CV;0.978399992;100.0 +25/10/2020 02:06:38;U881.FC260_Coef_B.F_CV;0.026799999;100.0 +25/10/2020 02:06:43;U881.FC260_PV.F_CV;0.026799999;100.0 +25/10/2020 02:06:38;U881.FC260_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U881.FC261_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FC261_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;U881.FC261_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U881.FC261_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC270_Coef_A.F_CV;1.029800057;100.0 +25/10/2020 02:06:38;U881.FC270_Coef_B.F_CV;0.069899999;100.0 +25/10/2020 02:06:38;U881.FC270_PV.F_CV;0.069899999;100.0 +25/10/2020 02:06:38;U881.FC270_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC271_Coef_A.F_CV;1.031000018;100.0 +25/10/2020 02:06:38;U881.FC271_Coef_B.F_CV;0.022299999;100.0 +25/10/2020 02:06:38;U881.FC271_PV.F_CV;0.022299999;100.0 +25/10/2020 02:06:38;U881.FC271_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC272_Coef_A.F_CV;1.029999971;100.0 +25/10/2020 02:06:38;U881.FC272_Coef_B.F_CV;0.014400000;100.0 +25/10/2020 02:06:38;U881.FC272_PV.F_CV;0.014400000;100.0 +25/10/2020 02:06:38;U881.FC272_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC273_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FC273_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;U881.FC273_PV.F_CV;0.000316510;100.0 +25/10/2020 02:06:38;U881.FC273_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC330_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FC330_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U881.FC330_PV.F_CV;-0.138068110;100.0 +25/10/2020 02:06:38;U881.FC330_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC340_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FC340_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U881.FC340_PV.F_CV;-0.114268482;100.0 +25/10/2020 02:06:38;U881.FC340_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC341_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FC341_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U881.FC341_PV.F_CV;-0.198701307;100.0 +25/10/2020 02:06:38;U881.FC341_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC350_Coef_A.F_CV;1.068300009;100.0 +25/10/2020 02:06:38;U881.FC350_Coef_B.F_CV;0.142600000;100.0 +25/10/2020 02:06:38;U881.FC350_PV.F_CV;0.142600000;100.0 +25/10/2020 02:06:38;U881.FC350_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC351_Coef_A.F_CV;1.066300035;100.0 +25/10/2020 02:06:38;U881.FC351_Coef_B.F_CV;0.025699999;100.0 +25/10/2020 02:06:38;U881.FC351_PV.F_CV;0.025699999;100.0 +25/10/2020 02:06:38;U881.FC351_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC360_Coef_A.F_CV;0.985000014;100.0 +25/10/2020 02:06:38;U881.FC360_Coef_B.F_CV;0.029600000;100.0 +25/10/2020 02:06:38;U881.FC360_PV.F_CV;0.029600000;100.0 +25/10/2020 02:06:38;U881.FC360_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC370_Coef_A.F_CV;1.054600000;100.0 +25/10/2020 02:06:38;U881.FC370_Coef_B.F_CV;-0.008900000;100.0 +25/10/2020 02:06:43;U881.FC370_PV.F_CV;-0.008900000;100.0 +25/10/2020 02:06:38;U881.FC370_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC371_Coef_A.F_CV;1.034800053;100.0 +25/10/2020 02:06:38;U881.FC371_Coef_B.F_CV;0.000300000;100.0 +25/10/2020 02:06:38;U881.FC371_PV.F_CV;0.000300000;100.0 +25/10/2020 02:06:38;U881.FC371_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC372_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FC372_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC372_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC372_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC430_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FC430_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U881.FC430_PV.F_CV;-0.031614207;100.0 +25/10/2020 02:06:38;U881.FC430_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC440_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FC440_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;U881.FC440_PV.F_CV;-0.022098960;100.0 +25/10/2020 02:06:38;U881.FC440_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC441_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FC441_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U881.FC441_PV.F_CV;0.712472379;100.0 +25/10/2020 02:06:38;U881.FC441_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC450_Coef_A.F_CV;1.066400051;100.0 +25/10/2020 02:06:38;U881.FC450_Coef_B.F_CV;0.068800002;100.0 +25/10/2020 02:06:38;U881.FC450_PV.F_CV;0.068800002;100.0 +25/10/2020 02:06:38;U881.FC450_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC451_Coef_A.F_CV;1.068699956;100.0 +25/10/2020 02:06:38;U881.FC451_Coef_B.F_CV;0.008200000;100.0 +25/10/2020 02:06:38;U881.FC451_PV.F_CV;0.008200000;100.0 +25/10/2020 02:06:38;U881.FC451_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC460_Coef_A.F_CV;0.984600008;100.0 +25/10/2020 02:06:38;U881.FC460_Coef_B.F_CV;0.058300000;100.0 +25/10/2020 02:06:38;U881.FC460_PV.F_CV;0.058300000;100.0 +25/10/2020 02:06:38;U881.FC460_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC470_Coef_A.F_CV;1.044199944;100.0 +25/10/2020 02:06:38;U881.FC470_Coef_B.F_CV;0.040600002;100.0 +25/10/2020 02:06:38;U881.FC470_PV.F_CV;0.040600002;100.0 +25/10/2020 02:06:38;U881.FC470_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC471_Coef_A.F_CV;1.036200047;100.0 +25/10/2020 02:06:38;U881.FC471_Coef_B.F_CV;0.011600000;100.0 +25/10/2020 02:06:38;U881.FC471_PV.F_CV;0.011600000;100.0 +25/10/2020 02:06:36;U881.FC471_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC472_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FC472_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC472_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FC472_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FI110_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FI110_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FI110_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U881.FI111_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FI111_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U881.FI111_PV.F_CV;0.141203046;100.0 +25/10/2020 02:06:10;U881.FI111_PV.F_CV;0.164608300;100.0 +25/10/2020 02:06:11;U881.FI111_PV.F_CV;0.153020263;100.0 +25/10/2020 02:06:13;U881.FI111_PV.F_CV;0.166488558;100.0 +25/10/2020 02:06:14;U881.FI111_PV.F_CV;0.154253647;100.0 +25/10/2020 02:06:19;U881.FI111_PV.F_CV;0.175446212;100.0 +25/10/2020 02:06:20;U881.FI111_PV.F_CV;0.187218890;100.0 +25/10/2020 02:06:22;U881.FI111_PV.F_CV;0.176649198;100.0 +25/10/2020 02:06:25;U881.FI111_PV.F_CV;0.186501235;100.0 +25/10/2020 02:06:26;U881.FI111_PV.F_CV;0.177628294;100.0 +25/10/2020 02:06:29;U881.FI111_PV.F_CV;0.194916412;100.0 +25/10/2020 02:06:32;U881.FI111_PV.F_CV;0.162825495;100.0 +25/10/2020 02:06:33;U881.FI111_PV.F_CV;0.173566222;100.0 +25/10/2020 02:06:37;U881.FI111_PV.F_CV;0.150613159;100.0 +25/10/2020 02:06:38;U881.FI111_PV.F_CV;0.173895091;100.0 +25/10/2020 02:06:42;U881.FI111_PV.F_CV;0.183799207;100.0 +25/10/2020 02:06:47;U881.FI111_PV.F_CV;0.149629429;100.0 +25/10/2020 02:06:51;U881.FI111_PV.F_CV;0.139899299;100.0 +25/10/2020 02:06:55;U881.FI111_PV.F_CV;0.149380252;100.0 +25/10/2020 02:06:38;U881.FI210_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FI210_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FI210_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U881.FI211_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FI211_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U881.FI211_PV.F_CV;-0.409643084;100.0 +25/10/2020 02:06:04;U881.FI211_PV.F_CV;-0.427204847;100.0 +25/10/2020 02:06:05;U881.FI211_PV.F_CV;-0.402577162;100.0 +25/10/2020 02:06:11;U881.FI211_PV.F_CV;-0.435260177;100.0 +25/10/2020 02:06:13;U881.FI211_PV.F_CV;-0.422100961;100.0 +25/10/2020 02:06:16;U881.FI211_PV.F_CV;-0.430286407;100.0 +25/10/2020 02:06:18;U881.FI211_PV.F_CV;-0.400698811;100.0 +25/10/2020 02:06:19;U881.FI211_PV.F_CV;-0.392281204;100.0 +25/10/2020 02:06:20;U881.FI211_PV.F_CV;-0.411875606;100.0 +25/10/2020 02:06:26;U881.FI211_PV.F_CV;-0.394225210;100.0 +25/10/2020 02:06:31;U881.FI211_PV.F_CV;-0.404138803;100.0 +25/10/2020 02:06:37;U881.FI211_PV.F_CV;-0.384325325;100.0 +25/10/2020 02:06:39;U881.FI211_PV.F_CV;-0.409427047;100.0 +25/10/2020 02:06:40;U881.FI211_PV.F_CV;-0.392477870;100.0 +25/10/2020 02:06:43;U881.FI211_PV.F_CV;-0.402785838;100.0 +25/10/2020 02:06:44;U881.FI211_PV.F_CV;-0.417831391;100.0 +25/10/2020 02:06:45;U881.FI211_PV.F_CV;-0.407539219;100.0 +25/10/2020 02:06:48;U881.FI211_PV.F_CV;-0.447085232;100.0 +25/10/2020 02:06:50;U881.FI211_PV.F_CV;-0.410549015;100.0 +25/10/2020 02:06:54;U881.FI211_PV.F_CV;-0.430596143;100.0 +25/10/2020 02:06:38;U881.FI310_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FI310_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FI310_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FI311_Coef_A.F_CV;1.033400059;100.0 +25/10/2020 02:06:38;U881.FI311_Coef_B.F_CV;0.418799996;100.0 +25/10/2020 02:06:55;U881.FI311_PV.F_CV;0.088236362;100.0 +25/10/2020 02:06:38;U881.FI410_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.FI410_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FI410_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FI411_Coef_A.F_CV;1.031700015;100.0 +25/10/2020 02:06:38;U881.FI411_Coef_B.F_CV;0.626900017;100.0 +25/10/2020 02:06:30;U881.FI411_PV.F_CV;-0.066388369;100.0 +25/10/2020 02:06:38;U881.FQ110_Coef_A.F_CV;1.031299949;100.0 +25/10/2020 02:06:38;U881.FQ110_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FQ110_PV.F_CV;203.372344971;100.0 +25/10/2020 02:06:38;U881.FQ210_Coef_A.F_CV;1.012699962;100.0 +25/10/2020 02:06:38;U881.FQ210_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FQ210_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FQ310_Coef_A.F_CV;1.010699987;100.0 +25/10/2020 02:06:38;U881.FQ310_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FQ310_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FQ410_Coef_A.F_CV;1.025500059;100.0 +25/10/2020 02:06:38;U881.FQ410_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.FQ410_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U881.HEV700.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.HEV800.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;U881.LI740_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.LI740_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;U881.LI740_PV.F_CV;-1.252652407;100.0 +25/10/2020 02:06:12;U881.P740.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;U881.PC101_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.PC101_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U881.PC101_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U881.PC101_PV.F_CV;0.009042245;100.0 +25/10/2020 02:06:38;U881.PC101_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.PC111_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.PC111_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U881.PC111_PV.F_CV;0.992076695;100.0 +25/10/2020 02:06:46;U881.PC111_PV.F_CV;0.992083728;100.0 +25/10/2020 02:06:47;U881.PC111_PV.F_CV;0.992083848;100.0 +25/10/2020 02:06:48;U881.PC111_PV.F_CV;0.992084026;100.0 +25/10/2020 02:06:50;U881.PC111_PV.F_CV;0.992084265;100.0 +25/10/2020 02:06:51;U881.PC111_PV.F_CV;0.992084444;100.0 +25/10/2020 02:06:53;U881.PC111_PV.F_CV;0.992084682;100.0 +25/10/2020 02:06:54;U881.PC111_PV.F_CV;0.992084861;100.0 +25/10/2020 02:06:55;U881.PC111_PV.F_CV;0.992084980;100.0 +25/10/2020 02:06:43;U881.PC111_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.PC201_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.PC201_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.PC201_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U881.PC201_PV.F_CV;0.019892940;100.0 +25/10/2020 02:06:38;U881.PC201_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.PC211_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.PC211_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U881.PC211_PV.F_CV;0.997674108;100.0 +25/10/2020 02:06:28;U881.PC211_PV.F_CV;0.997532904;100.0 +25/10/2020 02:06:30;U881.PC211_PV.F_CV;0.997527421;100.0 +25/10/2020 02:06:31;U881.PC211_PV.F_CV;0.997524738;100.0 +25/10/2020 02:06:32;U881.PC211_PV.F_CV;0.997521996;100.0 +25/10/2020 02:06:33;U881.PC211_PV.F_CV;0.997519314;100.0 +25/10/2020 02:06:34;U881.PC211_PV.F_CV;0.997516572;100.0 +25/10/2020 02:06:35;U881.PC211_PV.F_CV;0.997513890;100.0 +25/10/2020 02:06:36;U881.PC211_PV.F_CV;0.997511148;100.0 +25/10/2020 02:06:36;U881.PC211_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.PC301_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.PC301_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.PC301_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.PC301_PV.F_CV;0.056061920;100.0 +25/10/2020 02:06:38;U881.PC301_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.PC311_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.PC311_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U881.PC311_PV.F_CV;0.968370080;100.0 +25/10/2020 02:06:27;U881.PC311_PV.F_CV;0.968311489;100.0 +25/10/2020 02:06:30;U881.PC311_PV.F_CV;0.968308091;100.0 +25/10/2020 02:06:31;U881.PC311_PV.F_CV;0.968306899;100.0 +25/10/2020 02:06:34;U881.PC311_PV.F_CV;0.968303502;100.0 +25/10/2020 02:06:35;U881.PC311_PV.F_CV;0.968302310;100.0 +25/10/2020 02:06:36;U881.PC311_PV.F_CV;0.968301177;100.0 +25/10/2020 02:06:38;U881.PC311_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.PC401_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.PC401_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U881.PC401_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.PC401_PV.F_CV;0.010850694;100.0 +25/10/2020 02:06:38;U881.PC401_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.PC411_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.PC411_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U881.PC411_PV.F_CV;1.006833911;100.0 +25/10/2020 02:06:34;U881.PC411_PV.F_CV;1.006743312;100.0 +25/10/2020 02:06:37;U881.PC411_PV.F_CV;1.006737947;100.0 +25/10/2020 02:06:38;U881.PC411_PV.F_CV;1.006736279;100.0 +25/10/2020 02:06:43;U881.PC411_PV.F_CV;1.006727338;100.0 +25/10/2020 02:06:31;U881.PC411_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.PI100_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.PI100_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U881.PI100_PV.F_CV;0.066912614;100.0 +25/10/2020 02:06:15;U881.PI101_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:15;U881.PI101_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.PI101_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;U881.PI200_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.PI200_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U881.PI200_PV.F_CV;-0.009042245;100.0 +25/10/2020 02:06:15;U881.PI201_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:15;U881.PI201_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.PI201_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;U881.PI300_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.PI300_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.PI300_PV.F_CV;1.043475151;100.0 +25/10/2020 02:06:15;U881.PI301_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:15;U881.PI301_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.PI301_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;U881.PI400_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.PI400_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U881.PI400_PV.F_CV;0.150101274;100.0 +25/10/2020 02:06:15;U881.PI401_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:15;U881.PI401_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;U881.PI401_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;U881.PI730A_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.PI730A_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U881.PI730A_PV.F_CV;-0.007233796;100.0 +25/10/2020 02:06:38;U881.PI730C_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.PI730C_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U881.PI730C_PV.F_CV;21.073856354;100.0 +25/10/2020 02:06:22;U881.PI730C_PV.F_CV;21.073856354;100.0 +25/10/2020 02:06:23;U881.PI730C_PV.F_CV;21.090059280;100.0 +25/10/2020 02:06:32;U881.PI730C_PV.F_CV;21.099174500;100.0 +25/10/2020 02:06:54;U881.PI730C_PV.F_CV;21.099174500;100.0 +25/10/2020 02:06:55;U881.PI730C_PV.F_CV;21.117959976;100.0 +25/10/2020 02:06:56;U881.PI730C_PV.F_CV;21.118776321;100.0 +25/10/2020 02:06:57;U881.PI730C_PV.F_CV;21.119594574;100.0 +25/10/2020 02:06:38;U881.PI731_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.PI731_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;U881.PI731_PV.F_CV;-0.007957176;100.0 +25/10/2020 02:06:28;U881.PI731_PV.F_CV;-0.007643711;100.0 +25/10/2020 02:06:29;U881.PI731_PV.F_CV;-0.007637683;100.0 +25/10/2020 02:06:30;U881.PI731_PV.F_CV;-0.007631655;100.0 +25/10/2020 02:06:32;U881.PI731_PV.F_CV;-0.007619599;100.0 +25/10/2020 02:06:33;U881.PI731_PV.F_CV;-0.007613570;100.0 +25/10/2020 02:06:34;U881.PI731_PV.F_CV;-0.007607542;100.0 +25/10/2020 02:06:35;U881.PI731_PV.F_CV;-0.007601514;100.0 +25/10/2020 02:06:36;U881.PI731_PV.F_CV;-0.007595486;100.0 +25/10/2020 02:06:38;U881.PI732_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.PI732_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U881.PI732_PV.F_CV;-0.083188660;100.0 +25/10/2020 02:06:27;U881.PI732_PV.F_CV;-0.086263016;100.0 +25/10/2020 02:06:32;U881.PI732_PV.F_CV;-0.086564429;100.0 +25/10/2020 02:06:33;U881.PI732_PV.F_CV;-0.086624704;100.0 +25/10/2020 02:06:36;U881.PI732_PV.F_CV;-0.086805552;100.0 +25/10/2020 02:06:38;U881.TC100_Coef_A.F_CV;0.997900009;100.0 +25/10/2020 02:06:18;U881.TC100_Coef_B.F_CV;0.195600003;100.0 +25/10/2020 02:06:44;U881.TC100_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:01;U881.TC100_SP.F_CV;23.290199280;100.0 +25/10/2020 02:06:02;U881.TC100_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U881.TC100_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U881.TC100_SP.F_CV;23.290199280;100.0 +25/10/2020 02:06:09;U881.TC100_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U881.TC100_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:15;U881.TC100_SP.F_CV;23.290199280;100.0 +25/10/2020 02:06:16;U881.TC100_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U881.TC100_SP.F_CV;23.290199280;100.0 +25/10/2020 02:06:19;U881.TC100_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U881.TC100_SP.F_CV;23.290199280;100.0 +25/10/2020 02:06:22;U881.TC100_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U881.TC100_SP.F_CV;23.290199280;100.0 +25/10/2020 02:06:24;U881.TC100_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U881.TC100_SP.F_CV;23.290199280;100.0 +25/10/2020 02:06:27;U881.TC100_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:29;U881.TC100_SP.F_CV;23.290199280;100.0 +25/10/2020 02:06:30;U881.TC100_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U881.TC100_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC100_SP.F_CV;23.290199280;100.0 +25/10/2020 02:06:39;U881.TC100_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;U881.TC100_SP.F_CV;23.290199280;100.0 +25/10/2020 02:06:42;U881.TC100_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;U881.TC100_SP.F_CV;23.290199280;100.0 +25/10/2020 02:06:44;U881.TC100_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;U881.TC100_SP.F_CV;23.290199280;100.0 +25/10/2020 02:06:47;U881.TC100_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U881.TC100_SP.F_CV;23.290199280;100.0 +25/10/2020 02:06:50;U881.TC100_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U881.TC100_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;U881.TC100_SP.F_CV;23.290199280;100.0 +25/10/2020 02:06:59;U881.TC100_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC101_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TC101_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC101_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U881.TC101_PV.F_CV;21.100000381;100.0 +25/10/2020 02:06:07;U881.TC101_PV.F_CV;21.022222519;100.0 +25/10/2020 02:06:10;U881.TC101_PV.F_CV;21.100000381;100.0 +25/10/2020 02:06:25;U881.TC101_PV.F_CV;21.024999619;100.0 +25/10/2020 02:06:32;U881.TC101_PV.F_CV;21.100000381;100.0 +25/10/2020 02:06:35;U881.TC101_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:36;U881.TC101_PV.F_CV;21.100000381;100.0 +25/10/2020 02:06:40;U881.TC101_PV.F_CV;21.020000458;100.0 +25/10/2020 02:06:44;U881.TC101_PV.F_CV;21.100000381;100.0 +25/10/2020 02:06:47;U881.TC101_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:48;U881.TC101_PV.F_CV;21.100000381;100.0 +25/10/2020 02:06:49;U881.TC101_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:50;U881.TC101_PV.F_CV;21.100000381;100.0 +25/10/2020 02:06:53;U881.TC101_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:54;U881.TC101_PV.F_CV;21.100000381;100.0 +25/10/2020 02:06:56;U881.TC101_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:58;U881.TC101_PV.F_CV;21.100000381;100.0 +25/10/2020 02:06:44;U881.TC101_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC103_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TC103_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC103_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U881.TC103_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:07;U881.TC103_PV.F_CV;20.622222900;100.0 +25/10/2020 02:06:10;U881.TC103_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:22;U881.TC103_PV.F_CV;20.620000839;100.0 +25/10/2020 02:06:26;U881.TC103_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:29;U881.TC103_PV.F_CV;20.625000000;100.0 +25/10/2020 02:06:32;U881.TC103_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:36;U881.TC103_PV.F_CV;20.620000839;100.0 +25/10/2020 02:06:38;U881.TC103_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:39;U881.TC103_PV.F_CV;20.600000381;100.0 +25/10/2020 02:06:40;U881.TC103_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:41;U881.TC103_PV.F_CV;20.600000381;100.0 +25/10/2020 02:06:43;U881.TC103_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:48;U881.TC103_PV.F_CV;20.616666794;100.0 +25/10/2020 02:06:50;U881.TC103_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:52;U881.TC103_PV.F_CV;20.600000381;100.0 +25/10/2020 02:06:55;U881.TC103_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:56;U881.TC103_PV.F_CV;20.600000381;100.0 +25/10/2020 02:06:57;U881.TC103_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:44;U881.TC103_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC104_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TC104_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC104_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U881.TC104_PV.F_CV;20.299999237;100.0 +25/10/2020 02:06:59;U881.TC104_PV.F_CV;20.220832825;100.0 +25/10/2020 02:06:44;U881.TC104_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC105_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TC105_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC105_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U881.TC105_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:44;U881.TC105_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC106_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TC106_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC106_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U881.TC106_PV.F_CV;20.299999237;100.0 +25/10/2020 02:06:17;U881.TC106_PV.F_CV;20.222726822;100.0 +25/10/2020 02:06:24;U881.TC106_PV.F_CV;20.299999237;100.0 +25/10/2020 02:06:29;U881.TC106_PV.F_CV;20.216667175;100.0 +25/10/2020 02:06:31;U881.TC106_PV.F_CV;20.299999237;100.0 +25/10/2020 02:06:38;U881.TC106_PV.F_CV;20.212501526;100.0 +25/10/2020 02:06:40;U881.TC106_PV.F_CV;20.299999237;100.0 +25/10/2020 02:06:42;U881.TC106_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:44;U881.TC106_PV.F_CV;20.299999237;100.0 +25/10/2020 02:06:49;U881.TC106_PV.F_CV;20.216667175;100.0 +25/10/2020 02:06:51;U881.TC106_PV.F_CV;20.299999237;100.0 +25/10/2020 02:06:54;U881.TC106_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:55;U881.TC106_PV.F_CV;20.299999237;100.0 +25/10/2020 02:06:56;U881.TC106_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:57;U881.TC106_PV.F_CV;20.299999237;100.0 +25/10/2020 02:06:59;U881.TC106_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:44;U881.TC106_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U881.TC200_Coef_A.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC200_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U881.TC200_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:44;U881.TC200_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC201_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TC201_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC201_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U881.TC201_PV.F_CV;21.100000381;100.0 +25/10/2020 02:06:16;U881.TC201_PV.F_CV;21.175001144;100.0 +25/10/2020 02:06:22;U881.TC201_PV.F_CV;21.100000381;100.0 +25/10/2020 02:06:46;U881.TC201_PV.F_CV;21.177419662;100.0 +25/10/2020 02:06:54;U881.TC201_PV.F_CV;21.100000381;100.0 +25/10/2020 02:06:38;U881.TC201_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC203_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TC203_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC203_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U881.TC203_PV.F_CV;20.424999237;100.0 +25/10/2020 02:06:27;U881.TC203_PV.F_CV;20.500000000;100.0 +25/10/2020 02:06:28;U881.TC203_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:30;U881.TC203_PV.F_CV;20.500000000;100.0 +25/10/2020 02:06:32;U881.TC203_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:34;U881.TC203_PV.F_CV;20.500000000;100.0 +25/10/2020 02:06:37;U881.TC203_PV.F_CV;20.424999237;100.0 +25/10/2020 02:06:39;U881.TC203_PV.F_CV;20.500000000;100.0 +25/10/2020 02:06:40;U881.TC203_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:52;U881.TC203_PV.F_CV;20.324998856;100.0 +25/10/2020 02:06:57;U881.TC203_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:58;U881.TC203_PV.F_CV;20.299999237;100.0 +25/10/2020 02:06:44;U881.TC203_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC204_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TC204_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC204_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;U881.TC204_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:44;U881.TC204_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC205_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TC205_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC205_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U881.TC205_PV.F_CV;22.500000000;100.0 +25/10/2020 02:06:44;U881.TC205_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC206_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TC206_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC206_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:36;U881.TC206_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:44;U881.TC206_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U881.TC300_Coef_A.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC300_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U881.TC300_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:44;U881.TC300_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC301_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TC301_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC301_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U881.TC301_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:09;U881.TC301_PV.F_CV;20.620000839;100.0 +25/10/2020 02:06:12;U881.TC301_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:13;U881.TC301_PV.F_CV;20.600000381;100.0 +25/10/2020 02:06:14;U881.TC301_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:17;U881.TC301_PV.F_CV;20.625000000;100.0 +25/10/2020 02:06:19;U881.TC301_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:23;U881.TC301_PV.F_CV;20.620000839;100.0 +25/10/2020 02:06:25;U881.TC301_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:45;U881.TC301_PV.F_CV;20.623077393;100.0 +25/10/2020 02:06:52;U881.TC301_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:56;U881.TC301_PV.F_CV;20.620000839;100.0 +25/10/2020 02:06:58;U881.TC301_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:38;U881.TC301_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC303_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TC303_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC303_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U881.TC303_PV.F_CV;20.176668167;100.0 +25/10/2020 02:06:38;U881.TC303_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC304_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TC304_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC304_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U881.TC304_PV.F_CV;20.100000381;100.0 +25/10/2020 02:06:38;U881.TC304_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC305_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TC305_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC305_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U881.TC305_PV.F_CV;22.100000381;100.0 +25/10/2020 02:06:38;U881.TC305_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC306_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TC306_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC306_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;U881.TC306_PV.F_CV;19.799999237;100.0 +25/10/2020 02:06:38;U881.TC306_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U881.TC400_Coef_A.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC400_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;U881.TC400_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:00;U881.TC400_SP.F_CV;10.000000000;100.0 +25/10/2020 02:06:01;U881.TC400_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;U881.TC400_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U881.TC400_SP.F_CV;10.000000000;100.0 +25/10/2020 02:06:13;U881.TC400_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;U881.TC400_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;U881.TC400_SP.F_CV;10.000000000;100.0 +25/10/2020 02:06:22;U881.TC400_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;U881.TC400_SP.F_CV;10.000000000;100.0 +25/10/2020 02:06:24;U881.TC400_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;U881.TC400_SP.F_CV;10.000000000;100.0 +25/10/2020 02:06:27;U881.TC400_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;U881.TC400_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC400_SP.F_CV;10.000000000;100.0 +25/10/2020 02:06:39;U881.TC400_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U881.TC400_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;U881.TC400_SP.F_CV;10.000000000;100.0 +25/10/2020 02:06:53;U881.TC400_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;U881.TC400_SP.F_CV;10.000000000;100.0 +25/10/2020 02:06:58;U881.TC400_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC401_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TC401_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC401_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U881.TC401_PV.F_CV;20.882692337;100.0 +25/10/2020 02:06:40;U881.TC401_PV.F_CV;20.799999237;100.0 +25/10/2020 02:06:52;U881.TC401_PV.F_CV;20.879999161;100.0 +25/10/2020 02:06:56;U881.TC401_PV.F_CV;20.799999237;100.0 +25/10/2020 02:06:59;U881.TC401_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:38;U881.TC401_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC403_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TC403_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC403_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;U881.TC403_PV.F_CV;21.019565582;100.0 +25/10/2020 02:06:26;U881.TC403_PV.F_CV;21.100000381;100.0 +25/10/2020 02:06:29;U881.TC403_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:50;U881.TC403_PV.F_CV;20.922222137;100.0 +25/10/2020 02:06:58;U881.TC403_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:59;U881.TC403_PV.F_CV;20.899999619;100.0 +25/10/2020 02:06:44;U881.TC403_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC404_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TC404_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC404_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC404_PV.F_CV;20.299999237;100.0 +25/10/2020 02:06:44;U881.TC404_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC405_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TC405_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC405_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;U881.TC405_PV.F_CV;22.500000000;100.0 +25/10/2020 02:06:44;U881.TC405_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC406_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TC406_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TC406_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;U881.TC406_PV.F_CV;20.000000000;100.0 +25/10/2020 02:06:44;U881.TC406_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;U881.TI100B_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TI100B_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U881.TI100B_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:45;U881.TI100B_PV.F_CV;19.500000000;100.0 +25/10/2020 02:06:48;U881.TI100B_PV.F_CV;19.399999619;100.0 +25/10/2020 02:06:12;U881.TI100B_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:40;U881.TI1101_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:39;U881.TI1103_PV.F_CV;20.813333511;100.0 +25/10/2020 02:06:01;U881.TI1104_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:01;U881.TI1106_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:02;U881.TI1106_PV.F_CV;20.486665726;100.0 +25/10/2020 02:06:38;U881.TI110_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TI110_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U881.TI110_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:11;U881.TI110_PV.F_CV;20.799999237;100.0 +25/10/2020 02:06:12;U881.TI110_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;U881.TI1201_PV.F_CV;21.100000381;100.0 +25/10/2020 02:06:16;U881.TI1203_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:17;U881.TI1203_PV.F_CV;20.313333511;100.0 +25/10/2020 02:06:51;U881.TI1204_PV.F_CV;20.500000000;100.0 +25/10/2020 02:06:39;U881.TI1206_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:01;U881.TI1301_PV.F_CV;20.700000763;100.0 +25/10/2020 02:06:38;U881.TI1303_PV.F_CV;20.185001373;100.0 +25/10/2020 02:06:03;U881.TI1304_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:48;U881.TI1306_PV.F_CV;19.899999619;100.0 +25/10/2020 02:06:37;U881.TI1401_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:45;U881.TI1403_PV.F_CV;21.399999619;100.0 +25/10/2020 02:06:46;U881.TI1403_PV.F_CV;21.313333511;100.0 +25/10/2020 02:06:48;U881.TI1404_PV.F_CV;20.500000000;100.0 +25/10/2020 02:06:31;U881.TI1406_PV.F_CV;20.100000381;100.0 +25/10/2020 02:06:38;U881.TI200B_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TI200B_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U881.TI200B_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:22;U881.TI200B_PV.F_CV;20.221876144;100.0 +25/10/2020 02:06:30;U881.TI200B_PV.F_CV;20.299999237;100.0 +25/10/2020 02:06:31;U881.TI200B_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:49;U881.TI200B_PV.F_CV;20.125000000;100.0 +25/10/2020 02:06:56;U881.TI200B_PV.F_CV;20.200000763;100.0 +25/10/2020 02:06:57;U881.TI200B_PV.F_CV;20.100000381;100.0 +25/10/2020 02:06:12;U881.TI200B_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:16;U881.TI2100_PV.F_CV;20.000000000;100.0 +25/10/2020 02:06:57;U881.TI2100_PV.F_CV;19.839023590;100.0 +25/10/2020 02:06:38;U881.TI210_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TI210_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U881.TI210_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:39;U881.TI210_PV.F_CV;20.500000000;100.0 +25/10/2020 02:06:12;U881.TI210_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;U881.TI2200_PV.F_CV;20.468965530;100.0 +25/10/2020 02:06:03;U881.TI2300_PV.F_CV;19.600000381;100.0 +25/10/2020 02:06:40;U881.TI2300_PV.F_CV;19.448648453;100.0 +25/10/2020 02:06:23;U881.TI2400_PV.F_CV;20.069231033;100.0 +25/10/2020 02:06:38;U881.TI300B_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TI300B_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U881.TI300B_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;U881.TI300B_PV.F_CV;19.500000000;100.0 +25/10/2020 02:06:09;U881.TI300B_PV.F_CV;19.600000381;100.0 +25/10/2020 02:06:10;U881.TI300B_PV.F_CV;19.500000000;100.0 +25/10/2020 02:06:13;U881.TI300B_PV.F_CV;19.600000381;100.0 +25/10/2020 02:06:14;U881.TI300B_PV.F_CV;19.500000000;100.0 +25/10/2020 02:06:17;U881.TI300B_PV.F_CV;19.575000763;100.0 +25/10/2020 02:06:29;U881.TI300B_PV.F_CV;19.500000000;100.0 +25/10/2020 02:06:49;U881.TI300B_PV.F_CV;19.576923370;100.0 +25/10/2020 02:06:56;U881.TI300B_PV.F_CV;19.500000000;100.0 +25/10/2020 02:06:57;U881.TI300B_PV.F_CV;19.600000381;100.0 +25/10/2020 02:06:12;U881.TI300B_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;U881.TI300D_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TI300D_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U881.TI300D_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:14;U881.TI300D_PV.F_CV;20.000000000;100.0 +25/10/2020 02:06:12;U881.TI300D_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;U881.TI300F_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TI300F_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U881.TI300F_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;U881.TI300F_PV.F_CV;20.500000000;100.0 +25/10/2020 02:06:46;U881.TI300F_PV.F_CV;20.424999237;100.0 +25/10/2020 02:06:51;U881.TI300F_PV.F_CV;20.500000000;100.0 +25/10/2020 02:06:12;U881.TI300F_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;U881.TI310_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TI310_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U881.TI310_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:16;U881.TI310_PV.F_CV;20.000000000;100.0 +25/10/2020 02:06:12;U881.TI310_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;U881.TI400B_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TI400B_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U881.TI400B_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:04;U881.TI400B_PV.F_CV;20.382692337;100.0 +25/10/2020 02:06:12;U881.TI400B_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;U881.TI400D_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TI400D_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U881.TI400D_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:24;U881.TI400D_PV.F_CV;20.426086426;100.0 +25/10/2020 02:06:12;U881.TI400D_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;U881.TI400F_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TI400F_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U881.TI400F_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:15;U881.TI400F_PV.F_CV;20.413793564;100.0 +25/10/2020 02:06:25;U881.TI400F_PV.F_CV;20.500000000;100.0 +25/10/2020 02:06:26;U881.TI400F_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:28;U881.TI400F_PV.F_CV;20.500000000;100.0 +25/10/2020 02:06:30;U881.TI400F_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:48;U881.TI400F_PV.F_CV;20.324998856;100.0 +25/10/2020 02:06:55;U881.TI400F_PV.F_CV;20.399999619;100.0 +25/10/2020 02:06:57;U881.TI400F_PV.F_CV;20.299999237;100.0 +25/10/2020 02:06:12;U881.TI400F_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;U881.TI410_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TI410_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;U881.TI410_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:31;U881.TI410_PV.F_CV;20.100000381;100.0 +25/10/2020 02:06:12;U881.TI410_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;U881.TI702_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TI702_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U881.TI702_PV.F_CV;27.450000763;100.0 +25/10/2020 02:06:29;U881.TI702_PV.F_CV;28.260000229;100.0 +25/10/2020 02:06:45;U881.TI702_PV.F_CV;28.642858505;100.0 +25/10/2020 02:06:38;U881.TI703_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TI703_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:30;U881.TI703_PV.F_CV;27.274999619;100.0 +25/10/2020 02:06:33;U881.TI703_PV.F_CV;27.200000763;100.0 +25/10/2020 02:06:36;U881.TI703_PV.F_CV;27.399999619;100.0 +25/10/2020 02:06:52;U881.TI703_PV.F_CV;27.566667557;100.0 +25/10/2020 02:06:38;U881.TI732_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TI732_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:40;U881.TI732_PV.F_CV;21.075000763;100.0 +25/10/2020 02:06:42;U881.TI732_PV.F_CV;21.000000000;100.0 +25/10/2020 02:06:56;U881.TI732_PV.F_CV;21.359998703;100.0 +25/10/2020 02:06:38;U881.TI734_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;U881.TI734_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U881.TI734_PV.F_CV;6.182352543;100.0 +25/10/2020 02:06:07;U881.TI734_PV.F_CV;6.099999905;100.0 +25/10/2020 02:06:23;U881.TI734_PV.F_CV;6.199999809;100.0 +25/10/2020 02:06:24;U881.TI734_PV.F_CV;6.099999905;100.0 +25/10/2020 02:06:28;U881.TI734_PV.F_CV;6.199999809;100.0 +25/10/2020 02:06:29;U881.TI734_PV.F_CV;6.099999905;100.0 +25/10/2020 02:06:49;U892.AI01_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:09;U892.AI02_PV.F_CV;31.786449432;100.0 +25/10/2020 02:06:16;U892.AI02_PV.F_CV;31.843910217;100.0 +25/10/2020 02:06:33;U892.AI02_PV.F_CV;31.791429520;100.0 +25/10/2020 02:06:35;U892.AI02_PV.F_CV;31.773403168;100.0 +25/10/2020 02:06:39;U892.AI02_PV.F_CV;31.793973923;100.0 +25/10/2020 02:06:42;U892.AI02_PV.F_CV;31.773941040;100.0 +25/10/2020 02:06:36;U892.C2H4_PV.F_CV;36.748992920;100.0 +25/10/2020 02:06:49;U892.FC01_COEFA.F_CV;0.994199991;100.0 +25/10/2020 02:06:49;U892.FC01_COEFB.F_CV;2.135799885;100.0 +25/10/2020 02:06:49;U892.FC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U892.FC01_PV.F_CV;170.072311401;100.0 +25/10/2020 02:06:37;U892.FC01_PV.F_CV;170.800109863;100.0 +25/10/2020 02:06:51;U892.FC01_PV.F_CV;169.665954590;100.0 +25/10/2020 02:06:34;U892.FC01_SP.F_CV;171.338760376;100.0 +25/10/2020 02:06:50;U892.FC01_SP.F_CV;170.199890137;100.0 +25/10/2020 02:06:49;U892.FC02_COEFA.F_CV;0.963400006;100.0 +25/10/2020 02:06:49;U892.FC02_COEFB.F_CV;0.064999998;100.0 +25/10/2020 02:06:49;U892.FC02_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;U892.FC02_PV.F_CV;0.061567511;100.0 +25/10/2020 02:06:49;U892.FC02_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U892.FC04_COEFA.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U892.FC04_COEFB.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U892.FC04_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U892.FC04_PV.F_CV;3.347103357;100.0 +25/10/2020 02:06:06;U892.FC04_PV.F_CV;5.516436100;100.0 +25/10/2020 02:06:11;U892.FC04_PV.F_CV;4.268419743;100.0 +25/10/2020 02:06:15;U892.FC04_PV.F_CV;-1.231982470;100.0 +25/10/2020 02:06:17;U892.FC04_PV.F_CV;-2.888053417;100.0 +25/10/2020 02:06:20;U892.FC04_PV.F_CV;-0.346653640;100.0 +25/10/2020 02:06:22;U892.FC04_PV.F_CV;4.434099197;100.0 +25/10/2020 02:06:23;U892.FC04_PV.F_CV;5.213664055;100.0 +25/10/2020 02:06:25;U892.FC04_PV.F_CV;3.541800022;100.0 +25/10/2020 02:06:28;U892.FC04_PV.F_CV;-2.575500488;100.0 +25/10/2020 02:06:29;U892.FC04_PV.F_CV;-3.406974554;100.0 +25/10/2020 02:06:33;U892.FC04_PV.F_CV;0.040161684;100.0 +25/10/2020 02:06:36;U892.FC04_PV.F_CV;5.393937111;100.0 +25/10/2020 02:06:37;U892.FC04_PV.F_CV;6.166989803;100.0 +25/10/2020 02:06:39;U892.FC04_PV.F_CV;4.558808327;100.0 +25/10/2020 02:06:43;U892.FC04_PV.F_CV;-2.462701082;100.0 +25/10/2020 02:06:44;U892.FC04_PV.F_CV;-3.185162544;100.0 +25/10/2020 02:06:47;U892.FC04_PV.F_CV;-1.288497686;100.0 +25/10/2020 02:06:50;U892.FC04_PV.F_CV;4.953525543;100.0 +25/10/2020 02:06:51;U892.FC04_PV.F_CV;6.063889980;100.0 +25/10/2020 02:06:54;U892.FC04_PV.F_CV;2.734098911;100.0 +25/10/2020 02:06:57;U892.FC04_PV.F_CV;-0.648179650;100.0 +25/10/2020 02:06:57;U892.FC04_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U892.FC05_COEFA.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U892.FC05_COEFB.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U892.FC05_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;U892.FC05_PV.F_CV;140.533355713;100.0 +25/10/2020 02:06:09;U892.FC05_PV.F_CV;141.254196167;100.0 +25/10/2020 02:06:10;U892.FC05_PV.F_CV;140.725372314;100.0 +25/10/2020 02:06:15;U892.FC05_PV.F_CV;141.267837524;100.0 +25/10/2020 02:06:17;U892.FC05_PV.F_CV;140.572525024;100.0 +25/10/2020 02:06:23;U892.FC05_PV.F_CV;141.086990356;100.0 +25/10/2020 02:06:25;U892.FC05_PV.F_CV;140.575973511;100.0 +25/10/2020 02:06:35;U892.FC05_PV.F_CV;141.141006470;100.0 +25/10/2020 02:06:40;U892.FC05_PV.F_CV;140.112762451;100.0 +25/10/2020 02:06:41;U892.FC05_PV.F_CV;140.754898071;100.0 +25/10/2020 02:06:57;U892.FC05_PV.F_CV;140.211395264;100.0 +25/10/2020 02:06:58;U892.FC05_PV.F_CV;140.743469238;100.0 +25/10/2020 02:06:57;U892.FC05_SP.F_CV;140.000000000;100.0 +25/10/2020 02:06:49;U892.FC06_COEFA.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U892.FC06_COEFB.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U892.FC06_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;U892.FC06_PV.F_CV;10.977233887;100.0 +25/10/2020 02:06:55;U892.FC06_PV.F_CV;10.925031662;100.0 +25/10/2020 02:06:16;U892.FC06_SP.F_CV;11.000000000;100.0 +25/10/2020 02:06:49;U892.FC07_COEFA.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U892.FC07_COEFB.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U892.FC07_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;U892.FC07_PV.F_CV;10.862220764;100.0 +25/10/2020 02:06:03;U892.FC07_PV.F_CV;10.982462883;100.0 +25/10/2020 02:06:05;U892.FC07_PV.F_CV;10.843284607;100.0 +25/10/2020 02:06:08;U892.FC07_PV.F_CV;11.126533508;100.0 +25/10/2020 02:06:12;U892.FC07_PV.F_CV;11.042097092;100.0 +25/10/2020 02:06:13;U892.FC07_PV.F_CV;11.096494675;100.0 +25/10/2020 02:06:24;U892.FC07_PV.F_CV;10.848905563;100.0 +25/10/2020 02:06:25;U892.FC07_PV.F_CV;10.978475571;100.0 +25/10/2020 02:06:29;U892.FC07_PV.F_CV;11.104021072;100.0 +25/10/2020 02:06:31;U892.FC07_PV.F_CV;10.986994743;100.0 +25/10/2020 02:06:35;U892.FC07_PV.F_CV;11.304670334;100.0 +25/10/2020 02:06:38;U892.FC07_PV.F_CV;10.922687531;100.0 +25/10/2020 02:06:42;U892.FC07_PV.F_CV;10.860589981;100.0 +25/10/2020 02:06:44;U892.FC07_PV.F_CV;10.991796494;100.0 +25/10/2020 02:06:45;U892.FC07_PV.F_CV;11.178045273;100.0 +25/10/2020 02:06:47;U892.FC07_PV.F_CV;11.088057518;100.0 +25/10/2020 02:06:48;U892.FC07_PV.F_CV;10.915882111;100.0 +25/10/2020 02:06:51;U892.FC07_PV.F_CV;10.841870308;100.0 +25/10/2020 02:06:55;U892.FC07_PV.F_CV;11.010176659;100.0 +25/10/2020 02:06:56;U892.FC07_PV.F_CV;11.074221611;100.0 +25/10/2020 02:06:20;U892.FC07_SP.F_CV;11.000000000;100.0 +25/10/2020 02:06:49;U892.FC08_COEFA.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U892.FC08_COEFB.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U892.FC08_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;U892.FC08_PV.F_CV;9.963600159;100.0 +25/10/2020 02:06:29;U892.FC08_PV.F_CV;10.021212578;100.0 +25/10/2020 02:06:36;U892.FC08_PV.F_CV;9.969128609;100.0 +25/10/2020 02:06:45;U892.FC08_PV.F_CV;10.023470879;100.0 +25/10/2020 02:06:49;U892.FC08_PV.F_CV;9.965046883;100.0 +25/10/2020 02:06:54;U892.FC08_PV.F_CV;10.029687881;100.0 +25/10/2020 02:06:59;U892.FC08_SP.F_CV;10.000000000;100.0 +25/10/2020 02:06:49;U892.FC11_COEFA.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U892.FC11_COEFB.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;U892.FC11_PV.F_CV;-0.820042491;100.0 +25/10/2020 02:06:45;U892.FC11_PV.F_CV;-0.694117963;100.0 +25/10/2020 02:06:49;U892.FC11_PV.F_CV;-0.747957885;100.0 +25/10/2020 02:06:58;U892.FC11_PV.F_CV;-0.688968956;100.0 +25/10/2020 02:06:49;U892.FC11_SP.F_CV;30.000000000;100.0 +25/10/2020 02:06:49;U892.FC13_COEFA.F_CV;1.000000000;100.0 +25/10/2020 02:06:49;U892.FC13_COEFB.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U892.FC13_PV.F_CV;0.275839806;100.0 +25/10/2020 02:06:02;U892.FC13_PV.F_CV;0.211913973;100.0 +25/10/2020 02:06:05;U892.FC13_PV.F_CV;0.368223757;100.0 +25/10/2020 02:06:09;U892.FC13_PV.F_CV;0.245516375;100.0 +25/10/2020 02:06:12;U892.FC13_PV.F_CV;0.454834998;100.0 +25/10/2020 02:06:15;U892.FC13_PV.F_CV;0.231815666;100.0 +25/10/2020 02:06:20;U892.FC13_PV.F_CV;0.358774245;100.0 +25/10/2020 02:06:21;U892.FC13_PV.F_CV;0.450255215;100.0 +25/10/2020 02:06:25;U892.FC13_PV.F_CV;0.232583851;100.0 +25/10/2020 02:06:27;U892.FC13_PV.F_CV;0.321604967;100.0 +25/10/2020 02:06:29;U892.FC13_PV.F_CV;0.232751191;100.0 +25/10/2020 02:06:33;U892.FC13_PV.F_CV;0.444486231;100.0 +25/10/2020 02:06:37;U892.FC13_PV.F_CV;0.254821450;100.0 +25/10/2020 02:06:45;U892.FC13_PV.F_CV;0.362379640;100.0 +25/10/2020 02:06:46;U892.FC13_PV.F_CV;0.505121648;100.0 +25/10/2020 02:06:48;U892.FC13_PV.F_CV;0.283728898;100.0 +25/10/2020 02:06:52;U892.FC13_PV.F_CV;0.408954263;100.0 +25/10/2020 02:06:49;U892.FC13_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U892.FI09_PV.F_CV;101.787467957;100.0 +25/10/2020 02:06:07;U892.FI09_PV.F_CV;99.966262817;100.0 +25/10/2020 02:06:09;U892.FI09_PV.F_CV;99.368438721;100.0 +25/10/2020 02:06:15;U892.FI09_PV.F_CV;101.160667419;100.0 +25/10/2020 02:06:16;U892.FI09_PV.F_CV;100.470008850;100.0 +25/10/2020 02:06:20;U892.FI09_PV.F_CV;102.000556946;100.0 +25/10/2020 02:06:21;U892.FI09_PV.F_CV;102.978393555;100.0 +25/10/2020 02:06:23;U892.FI09_PV.F_CV;104.172363281;100.0 +25/10/2020 02:06:26;U892.FI09_PV.F_CV;107.861473083;100.0 +25/10/2020 02:06:28;U892.FI09_PV.F_CV;109.992286682;100.0 +25/10/2020 02:06:30;U892.FI09_PV.F_CV;110.952911377;100.0 +25/10/2020 02:06:31;U892.FI09_PV.F_CV;110.581993103;100.0 +25/10/2020 02:06:37;U892.FI09_PV.F_CV;111.022148132;100.0 +25/10/2020 02:06:39;U892.FI09_PV.F_CV;110.695144653;100.0 +25/10/2020 02:06:43;U892.FI09_PV.F_CV;108.461425781;100.0 +25/10/2020 02:06:45;U892.FI09_PV.F_CV;107.254066467;100.0 +25/10/2020 02:06:46;U892.FI09_PV.F_CV;105.676757813;100.0 +25/10/2020 02:06:49;U892.FI09_PV.F_CV;103.384162903;100.0 +25/10/2020 02:06:51;U892.FI09_PV.F_CV;102.647674561;100.0 +25/10/2020 02:06:54;U892.FI09_PV.F_CV;102.918846130;100.0 +25/10/2020 02:06:55;U892.FI09_PV.F_CV;103.488067627;100.0 +25/10/2020 02:06:56;U892.FI09_PV.F_CV;103.207389832;100.0 +25/10/2020 02:06:58;U892.FI09_PV.F_CV;104.427162170;100.0 +25/10/2020 02:06:11;U892.FI10_PV.F_CV;0.123068877;100.0 +25/10/2020 02:06:02;U892.FQ01_PV.F_CV;19957.882812500;100.0 +25/10/2020 02:06:32;U892.FQ02_PV.F_CV;5.456258774;100.0 +25/10/2020 02:06:32;U892.FQ04_PV.F_CV;127.201713562;100.0 +25/10/2020 02:06:32;U892.FQ05_PV.F_CV;12255.534179688;100.0 +25/10/2020 02:06:32;U892.FQ06_PV.F_CV;1054.049560547;100.0 +25/10/2020 02:06:36;U892.FQ07_PV.F_CV;1060.263427734;100.0 +25/10/2020 02:06:32;U892.FQ08_PV.F_CV;883.925354004;100.0 +25/10/2020 02:06:49;U892.FQ09_COEFA.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U892.FQ09_PV.F_CV;8464.681640625;100.0 +25/10/2020 02:06:49;U892.FQ10_COEFA.F_CV;1.000000000;100.0 +25/10/2020 02:06:32;U892.FQ10_PV.F_CV;2.149999619;100.0 +25/10/2020 02:06:23;U892.LC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;U892.LC01_OP.F_CV;0.980176628;100.0 +25/10/2020 02:06:25;U892.LC01_OP.F_CV;5.602101326;100.0 +25/10/2020 02:06:26;U892.LC01_OP.F_CV;6.752046585;100.0 +25/10/2020 02:06:27;U892.LC01_OP.F_CV;5.920643330;100.0 +25/10/2020 02:06:28;U892.LC01_OP.F_CV;7.653966427;100.0 +25/10/2020 02:06:29;U892.LC01_OP.F_CV;8.329007149;100.0 +25/10/2020 02:06:30;U892.LC01_OP.F_CV;7.711897373;100.0 +25/10/2020 02:06:31;U892.LC01_OP.F_CV;6.417191505;100.0 +25/10/2020 02:06:32;U892.LC01_OP.F_CV;4.084659100;100.0 +25/10/2020 02:06:33;U892.LC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:53;U892.LC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;U892.LC01_OP.F_CV;0.492683411;100.0 +25/10/2020 02:06:55;U892.LC01_OP.F_CV;1.268636346;100.0 +25/10/2020 02:06:56;U892.LC01_OP.F_CV;1.472041130;100.0 +25/10/2020 02:06:57;U892.LC01_OP.F_CV;2.581616879;100.0 +25/10/2020 02:06:58;U892.LC01_OP.F_CV;5.780289173;100.0 +25/10/2020 02:06:59;U892.LC01_OP.F_CV;6.097905159;100.0 +25/10/2020 02:06:00;U892.LC01_PV.F_CV;76.020606995;100.0 +25/10/2020 02:06:01;U892.LC01_PV.F_CV;75.949134827;100.0 +25/10/2020 02:06:04;U892.LC01_PV.F_CV;76.076438904;100.0 +25/10/2020 02:06:11;U892.LC01_PV.F_CV;75.736175537;100.0 +25/10/2020 02:06:15;U892.LC01_PV.F_CV;76.132797241;100.0 +25/10/2020 02:06:17;U892.LC01_PV.F_CV;76.079948425;100.0 +25/10/2020 02:06:22;U892.LC01_PV.F_CV;76.229629517;100.0 +25/10/2020 02:06:25;U892.LC01_PV.F_CV;76.383049011;100.0 +25/10/2020 02:06:32;U892.LC01_PV.F_CV;76.332366943;100.0 +25/10/2020 02:06:34;U892.LC01_PV.F_CV;76.097198486;100.0 +25/10/2020 02:06:42;U892.LC01_PV.F_CV;76.047019958;100.0 +25/10/2020 02:06:47;U892.LC01_PV.F_CV;76.099739075;100.0 +25/10/2020 02:06:50;U892.LC01_PV.F_CV;76.048767090;100.0 +25/10/2020 02:06:58;U892.LC01_PV.F_CV;76.380348206;100.0 +25/10/2020 02:06:56;U892.LC01_SP.F_CV;76.400001526;100.0 +25/10/2020 02:06:00;U892.LC05_OP.F_CV;4.364980698;100.0 +25/10/2020 02:06:01;U892.LC05_OP.F_CV;4.192758083;100.0 +25/10/2020 02:06:02;U892.LC05_OP.F_CV;5.691248417;100.0 +25/10/2020 02:06:04;U892.LC05_OP.F_CV;4.237886429;100.0 +25/10/2020 02:06:05;U892.LC05_OP.F_CV;4.141169548;100.0 +25/10/2020 02:06:06;U892.LC05_OP.F_CV;3.689846754;100.0 +25/10/2020 02:06:07;U892.LC05_OP.F_CV;4.733421803;100.0 +25/10/2020 02:06:08;U892.LC05_OP.F_CV;3.883773088;100.0 +25/10/2020 02:06:10;U892.LC05_OP.F_CV;3.765453100;100.0 +25/10/2020 02:06:12;U892.LC05_OP.F_CV;3.232315540;100.0 +25/10/2020 02:06:14;U892.LC05_OP.F_CV;4.805016994;100.0 +25/10/2020 02:06:15;U892.LC05_OP.F_CV;4.386943340;100.0 +25/10/2020 02:06:17;U892.LC05_OP.F_CV;4.651879311;100.0 +25/10/2020 02:06:18;U892.LC05_OP.F_CV;4.002595425;100.0 +25/10/2020 02:06:19;U892.LC05_OP.F_CV;4.236544609;100.0 +25/10/2020 02:06:21;U892.LC05_OP.F_CV;3.523291826;100.0 +25/10/2020 02:06:23;U892.LC05_OP.F_CV;4.616275311;100.0 +25/10/2020 02:06:24;U892.LC05_OP.F_CV;4.246342182;100.0 +25/10/2020 02:06:25;U892.LC05_OP.F_CV;3.213151217;100.0 +25/10/2020 02:06:26;U892.LC05_OP.F_CV;4.034008503;100.0 +25/10/2020 02:06:27;U892.LC05_OP.F_CV;4.366160870;100.0 +25/10/2020 02:06:28;U892.LC05_OP.F_CV;3.565439939;100.0 +25/10/2020 02:06:29;U892.LC05_OP.F_CV;3.685750961;100.0 +25/10/2020 02:06:31;U892.LC05_OP.F_CV;4.111304760;100.0 +25/10/2020 02:06:32;U892.LC05_OP.F_CV;3.974187613;100.0 +25/10/2020 02:06:33;U892.LC05_OP.F_CV;5.115242004;100.0 +25/10/2020 02:06:34;U892.LC05_OP.F_CV;5.282289505;100.0 +25/10/2020 02:06:35;U892.LC05_OP.F_CV;4.487244129;100.0 +25/10/2020 02:06:36;U892.LC05_OP.F_CV;4.369520664;100.0 +25/10/2020 02:06:37;U892.LC05_OP.F_CV;3.770515680;100.0 +25/10/2020 02:06:38;U892.LC05_OP.F_CV;4.917448521;100.0 +25/10/2020 02:06:39;U892.LC05_OP.F_CV;4.114021301;100.0 +25/10/2020 02:06:40;U892.LC05_OP.F_CV;3.894040108;100.0 +25/10/2020 02:06:41;U892.LC05_OP.F_CV;4.736366272;100.0 +25/10/2020 02:06:42;U892.LC05_OP.F_CV;4.406911850;100.0 +25/10/2020 02:06:43;U892.LC05_OP.F_CV;3.908605814;100.0 +25/10/2020 02:06:44;U892.LC05_OP.F_CV;4.028810501;100.0 +25/10/2020 02:06:47;U892.LC05_OP.F_CV;3.542185307;100.0 +25/10/2020 02:06:48;U892.LC05_OP.F_CV;4.493163586;100.0 +25/10/2020 02:06:49;U892.LC05_OP.F_CV;4.669906616;100.0 +25/10/2020 02:06:50;U892.LC05_OP.F_CV;4.385115623;100.0 +25/10/2020 02:06:51;U892.LC05_OP.F_CV;3.975243807;100.0 +25/10/2020 02:06:52;U892.LC05_OP.F_CV;4.030075550;100.0 +25/10/2020 02:06:53;U892.LC05_OP.F_CV;4.774751663;100.0 +25/10/2020 02:06:55;U892.LC05_OP.F_CV;3.845503569;100.0 +25/10/2020 02:06:56;U892.LC05_OP.F_CV;4.557854652;100.0 +25/10/2020 02:06:57;U892.LC05_OP.F_CV;3.689325094;100.0 +25/10/2020 02:06:58;U892.LC05_OP.F_CV;4.289964676;100.0 +25/10/2020 02:06:59;U892.LC05_OP.F_CV;2.992972612;100.0 +25/10/2020 02:06:01;U892.LC05_PV.F_CV;39.995815277;100.0 +25/10/2020 02:06:02;U892.LC05_PV.F_CV;40.056072235;100.0 +25/10/2020 02:06:12;U892.LC05_PV.F_CV;39.951782227;100.0 +25/10/2020 02:06:14;U892.LC05_PV.F_CV;40.013576508;100.0 +25/10/2020 02:06:25;U892.LC05_PV.F_CV;39.950111389;100.0 +25/10/2020 02:06:33;U892.LC05_PV.F_CV;40.024204254;100.0 +25/10/2020 02:06:45;U892.LC05_PV.F_CV;39.973163605;100.0 +25/10/2020 02:06:53;U892.LC05_PV.F_CV;40.024028778;100.0 +25/10/2020 02:06:57;U892.LC05_PV.F_CV;39.970920563;100.0 +25/10/2020 02:06:46;U892.LC05_SP.F_CV;40.000000000;100.0 +25/10/2020 02:06:49;U892.LC06_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U892.LC06_PV.F_CV;-0.604253411;100.0 +25/10/2020 02:06:49;U892.LC06_SP.F_CV;40.000000000;100.0 +25/10/2020 02:06:29;U892.LC07_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;U892.LC07_PV.F_CV;45.410762787;100.0 +25/10/2020 02:06:03;U892.LC07_PV.F_CV;45.958202362;100.0 +25/10/2020 02:06:06;U892.LC07_PV.F_CV;46.411422729;100.0 +25/10/2020 02:06:08;U892.LC07_PV.F_CV;46.208034515;100.0 +25/10/2020 02:06:11;U892.LC07_PV.F_CV;45.216785431;100.0 +25/10/2020 02:06:13;U892.LC07_PV.F_CV;44.719947815;100.0 +25/10/2020 02:06:16;U892.LC07_PV.F_CV;44.364643097;100.0 +25/10/2020 02:06:19;U892.LC07_PV.F_CV;44.186222076;100.0 +25/10/2020 02:06:22;U892.LC07_PV.F_CV;44.490291595;100.0 +25/10/2020 02:06:32;U892.LC07_PV.F_CV;44.290843964;100.0 +25/10/2020 02:06:33;U892.LC07_PV.F_CV;44.227645874;100.0 +25/10/2020 02:06:37;U892.LC07_PV.F_CV;44.357433319;100.0 +25/10/2020 02:06:38;U892.LC07_PV.F_CV;44.267814636;100.0 +25/10/2020 02:06:43;U892.LC07_PV.F_CV;44.145717621;100.0 +25/10/2020 02:06:46;U892.LC07_PV.F_CV;43.997871399;100.0 +25/10/2020 02:06:51;U892.LC07_PV.F_CV;44.105865479;100.0 +25/10/2020 02:06:58;U892.LC07_PV.F_CV;43.748310089;100.0 +25/10/2020 02:06:49;U892.LC07_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:00;U892.LI01_PV.F_CV;75.940269470;100.0 +25/10/2020 02:06:04;U892.LI01_PV.F_CV;76.125503540;100.0 +25/10/2020 02:06:06;U892.LI01_PV.F_CV;76.009971619;100.0 +25/10/2020 02:06:08;U892.LI01_PV.F_CV;75.798385620;100.0 +25/10/2020 02:06:10;U892.LI01_PV.F_CV;75.719596863;100.0 +25/10/2020 02:06:13;U892.LI01_PV.F_CV;76.091186523;100.0 +25/10/2020 02:06:15;U892.LI01_PV.F_CV;76.184577942;100.0 +25/10/2020 02:06:16;U892.LI01_PV.F_CV;76.042617798;100.0 +25/10/2020 02:06:24;U892.LI01_PV.F_CV;76.324386597;100.0 +25/10/2020 02:06:25;U892.LI01_PV.F_CV;76.447433472;100.0 +25/10/2020 02:06:26;U892.LI01_PV.F_CV;76.374465942;100.0 +25/10/2020 02:06:28;U892.LI01_PV.F_CV;76.442794800;100.0 +25/10/2020 02:06:31;U892.LI01_PV.F_CV;76.337524414;100.0 +25/10/2020 02:06:34;U892.LI01_PV.F_CV;76.018798828;100.0 +25/10/2020 02:06:35;U892.LI01_PV.F_CV;76.128631592;100.0 +25/10/2020 02:06:41;U892.LI01_PV.F_CV;76.078384399;100.0 +25/10/2020 02:06:42;U892.LI01_PV.F_CV;76.002105713;100.0 +25/10/2020 02:06:44;U892.LI01_PV.F_CV;76.088058472;100.0 +25/10/2020 02:06:50;U892.LI01_PV.F_CV;76.020370483;100.0 +25/10/2020 02:06:53;U892.LI01_PV.F_CV;76.288253784;100.0 +25/10/2020 02:06:57;U892.LI01_PV.F_CV;76.370231628;100.0 +25/10/2020 02:06:04;U892.LI100_PV.F_CV;47.268360138;100.0 +25/10/2020 02:06:32;U892.PC01_OP.F_CV;17.118247986;100.0 +25/10/2020 02:06:50;U892.PC01_OP.F_CV;17.011337280;100.0 +25/10/2020 02:06:07;U892.PC01_PV.F_CV;24.980609894;100.0 +25/10/2020 02:06:32;U892.PC01_SP.F_CV;25.000000000;100.0 +25/10/2020 02:06:00;U892.PC04_OP.F_CV;16.396345139;100.0 +25/10/2020 02:06:01;U892.PC04_OP.F_CV;16.797828674;100.0 +25/10/2020 02:06:02;U892.PC04_OP.F_CV;17.517869949;100.0 +25/10/2020 02:06:03;U892.PC04_OP.F_CV;16.407285690;100.0 +25/10/2020 02:06:04;U892.PC04_OP.F_CV;16.579681396;100.0 +25/10/2020 02:06:05;U892.PC04_OP.F_CV;17.126783371;100.0 +25/10/2020 02:06:06;U892.PC04_OP.F_CV;16.534755707;100.0 +25/10/2020 02:06:07;U892.PC04_OP.F_CV;16.355358124;100.0 +25/10/2020 02:06:08;U892.PC04_OP.F_CV;17.220546722;100.0 +25/10/2020 02:06:09;U892.PC04_OP.F_CV;16.313907623;100.0 +25/10/2020 02:06:10;U892.PC04_OP.F_CV;14.740254402;100.0 +25/10/2020 02:06:11;U892.PC04_OP.F_CV;14.316560745;100.0 +25/10/2020 02:06:12;U892.PC04_OP.F_CV;15.075306892;100.0 +25/10/2020 02:06:14;U892.PC04_OP.F_CV;14.574687004;100.0 +25/10/2020 02:06:15;U892.PC04_OP.F_CV;15.292016029;100.0 +25/10/2020 02:06:16;U892.PC04_OP.F_CV;13.764185905;100.0 +25/10/2020 02:06:17;U892.PC04_OP.F_CV;12.889754295;100.0 +25/10/2020 02:06:18;U892.PC04_OP.F_CV;14.082232475;100.0 +25/10/2020 02:06:19;U892.PC04_OP.F_CV;14.365373611;100.0 +25/10/2020 02:06:21;U892.PC04_OP.F_CV;11.922163010;100.0 +25/10/2020 02:06:22;U892.PC04_OP.F_CV;11.585834503;100.0 +25/10/2020 02:06:23;U892.PC04_OP.F_CV;10.807610512;100.0 +25/10/2020 02:06:25;U892.PC04_OP.F_CV;12.012836456;100.0 +25/10/2020 02:06:27;U892.PC04_OP.F_CV;11.573606491;100.0 +25/10/2020 02:06:28;U892.PC04_OP.F_CV;11.831209183;100.0 +25/10/2020 02:06:29;U892.PC04_OP.F_CV;12.812976837;100.0 +25/10/2020 02:06:30;U892.PC04_OP.F_CV;11.910501480;100.0 +25/10/2020 02:06:31;U892.PC04_OP.F_CV;12.226137161;100.0 +25/10/2020 02:06:32;U892.PC04_OP.F_CV;13.138063431;100.0 +25/10/2020 02:06:33;U892.PC04_OP.F_CV;12.401670456;100.0 +25/10/2020 02:06:34;U892.PC04_OP.F_CV;11.335761070;100.0 +25/10/2020 02:06:35;U892.PC04_OP.F_CV;11.654054642;100.0 +25/10/2020 02:06:36;U892.PC04_OP.F_CV;10.124361038;100.0 +25/10/2020 02:06:37;U892.PC04_OP.F_CV;9.733284950;100.0 +25/10/2020 02:06:38;U892.PC04_OP.F_CV;10.938873291;100.0 +25/10/2020 02:06:39;U892.PC04_OP.F_CV;11.005960464;100.0 +25/10/2020 02:06:40;U892.PC04_OP.F_CV;9.354579926;100.0 +25/10/2020 02:06:41;U892.PC04_OP.F_CV;8.459185600;100.0 +25/10/2020 02:06:42;U892.PC04_OP.F_CV;9.223038673;100.0 +25/10/2020 02:06:43;U892.PC04_OP.F_CV;8.752860069;100.0 +25/10/2020 02:06:44;U892.PC04_OP.F_CV;7.889173508;100.0 +25/10/2020 02:06:45;U892.PC04_OP.F_CV;8.483221054;100.0 +25/10/2020 02:06:46;U892.PC04_OP.F_CV;8.166985512;100.0 +25/10/2020 02:06:47;U892.PC04_OP.F_CV;6.620450497;100.0 +25/10/2020 02:06:48;U892.PC04_OP.F_CV;6.462557793;100.0 +25/10/2020 02:06:49;U892.PC04_OP.F_CV;7.035778522;100.0 +25/10/2020 02:06:50;U892.PC04_OP.F_CV;6.935737610;100.0 +25/10/2020 02:06:51;U892.PC04_OP.F_CV;6.077960014;100.0 +25/10/2020 02:06:53;U892.PC04_OP.F_CV;5.363685131;100.0 +25/10/2020 02:06:54;U892.PC04_OP.F_CV;5.067726612;100.0 +25/10/2020 02:06:56;U892.PC04_OP.F_CV;4.951864243;100.0 +25/10/2020 02:06:57;U892.PC04_OP.F_CV;4.307297707;100.0 +25/10/2020 02:06:58;U892.PC04_OP.F_CV;4.020554543;100.0 +25/10/2020 02:06:59;U892.PC04_OP.F_CV;4.416564941;100.0 +25/10/2020 02:06:00;U892.PC04_PV.F_CV;13.989355087;100.0 +25/10/2020 02:06:17;U892.PC04_PV.F_CV;13.743989944;100.0 +25/10/2020 02:06:18;U892.PC04_PV.F_CV;13.810729980;100.0 +25/10/2020 02:06:23;U892.PC04_PV.F_CV;13.622289658;100.0 +25/10/2020 02:06:32;U892.PC04_PV.F_CV;13.830358505;100.0 +25/10/2020 02:06:36;U892.PC04_PV.F_CV;13.673326492;100.0 +25/10/2020 02:06:38;U892.PC04_PV.F_CV;13.745954514;100.0 +25/10/2020 02:06:40;U892.PC04_PV.F_CV;13.649770737;100.0 +25/10/2020 02:06:47;U892.PC04_PV.F_CV;13.545736313;100.0 +25/10/2020 02:06:48;U892.PC04_SP.F_CV;14.000000000;100.0 +25/10/2020 02:06:00;U892.PC07_OP.F_CV;44.336582184;100.0 +25/10/2020 02:06:03;U892.PC07_OP.F_CV;44.426059723;100.0 +25/10/2020 02:06:05;U892.PC07_OP.F_CV;44.360935211;100.0 +25/10/2020 02:06:07;U892.PC07_OP.F_CV;44.418388367;100.0 +25/10/2020 02:06:08;U892.PC07_OP.F_CV;44.348842621;100.0 +25/10/2020 02:06:11;U892.PC07_OP.F_CV;44.629657745;100.0 +25/10/2020 02:06:15;U892.PC07_OP.F_CV;44.564243317;100.0 +25/10/2020 02:06:17;U892.PC07_OP.F_CV;44.710819244;100.0 +25/10/2020 02:06:19;U892.PC07_OP.F_CV;44.509666443;100.0 +25/10/2020 02:06:23;U892.PC07_OP.F_CV;44.723777771;100.0 +25/10/2020 02:06:26;U892.PC07_OP.F_CV;44.645599365;100.0 +25/10/2020 02:06:28;U892.PC07_OP.F_CV;44.777679443;100.0 +25/10/2020 02:06:29;U892.PC07_OP.F_CV;44.726970673;100.0 +25/10/2020 02:06:31;U892.PC07_OP.F_CV;44.845623016;100.0 +25/10/2020 02:06:32;U892.PC07_OP.F_CV;44.794605255;100.0 +25/10/2020 02:06:33;U892.PC07_OP.F_CV;44.862518311;100.0 +25/10/2020 02:06:38;U892.PC07_OP.F_CV;44.718566895;100.0 +25/10/2020 02:06:39;U892.PC07_OP.F_CV;44.618450165;100.0 +25/10/2020 02:06:41;U892.PC07_OP.F_CV;44.718826294;100.0 +25/10/2020 02:06:42;U892.PC07_OP.F_CV;44.605014801;100.0 +25/10/2020 02:06:44;U892.PC07_OP.F_CV;44.682712555;100.0 +25/10/2020 02:06:49;U892.PC07_OP.F_CV;44.374748230;100.0 +25/10/2020 02:06:52;U892.PC07_OP.F_CV;44.120803833;100.0 +25/10/2020 02:06:59;U892.PC07_OP.F_CV;43.109146118;100.0 +25/10/2020 02:06:35;U892.PC07_PV.F_CV;2.473990440;100.0 +25/10/2020 02:06:51;U892.PC07_PV.F_CV;2.408429146;100.0 +25/10/2020 02:06:35;U892.PC07_SP.F_CV;2.299999952;100.0 +25/10/2020 02:06:00;U892.PC08_OP.F_CV;86.555358887;100.0 +25/10/2020 02:06:01;U892.PC08_OP.F_CV;86.184509277;100.0 +25/10/2020 02:06:05;U892.PC08_OP.F_CV;85.258346558;100.0 +25/10/2020 02:06:06;U892.PC08_OP.F_CV;85.085258484;100.0 +25/10/2020 02:06:07;U892.PC08_OP.F_CV;85.025527954;100.0 +25/10/2020 02:06:09;U892.PC08_OP.F_CV;85.208023071;100.0 +25/10/2020 02:06:10;U892.PC08_OP.F_CV;85.558158875;100.0 +25/10/2020 02:06:14;U892.PC08_OP.F_CV;87.659629822;100.0 +25/10/2020 02:06:17;U892.PC08_OP.F_CV;89.416999817;100.0 +25/10/2020 02:06:18;U892.PC08_OP.F_CV;90.111045837;100.0 +25/10/2020 02:06:20;U892.PC08_OP.F_CV;91.120429993;100.0 +25/10/2020 02:06:22;U892.PC08_OP.F_CV;91.691390991;100.0 +25/10/2020 02:06:23;U892.PC08_OP.F_CV;91.897682190;100.0 +25/10/2020 02:06:26;U892.PC08_OP.F_CV;91.759742737;100.0 +25/10/2020 02:06:27;U892.PC08_OP.F_CV;91.485893250;100.0 +25/10/2020 02:06:29;U892.PC08_OP.F_CV;90.743728638;100.0 +25/10/2020 02:06:30;U892.PC08_OP.F_CV;90.524131775;100.0 +25/10/2020 02:06:31;U892.PC08_OP.F_CV;90.054351807;100.0 +25/10/2020 02:06:32;U892.PC08_OP.F_CV;89.464355469;100.0 +25/10/2020 02:06:35;U892.PC08_OP.F_CV;87.307319641;100.0 +25/10/2020 02:06:36;U892.PC08_OP.F_CV;86.677558899;100.0 +25/10/2020 02:06:38;U892.PC08_OP.F_CV;85.711471558;100.0 +25/10/2020 02:06:40;U892.PC08_OP.F_CV;85.030075073;100.0 +25/10/2020 02:06:42;U892.PC08_OP.F_CV;84.583747864;100.0 +25/10/2020 02:06:45;U892.PC08_OP.F_CV;84.863853455;100.0 +25/10/2020 02:06:47;U892.PC08_OP.F_CV;85.508224487;100.0 +25/10/2020 02:06:49;U892.PC08_OP.F_CV;86.417877197;100.0 +25/10/2020 02:06:50;U892.PC08_OP.F_CV;87.125602722;100.0 +25/10/2020 02:06:52;U892.PC08_OP.F_CV;88.356071472;100.0 +25/10/2020 02:06:53;U892.PC08_OP.F_CV;88.870780945;100.0 +25/10/2020 02:06:54;U892.PC08_OP.F_CV;89.256286621;100.0 +25/10/2020 02:06:55;U892.PC08_OP.F_CV;89.510093689;100.0 +25/10/2020 02:06:56;U892.PC08_OP.F_CV;89.604499817;100.0 +25/10/2020 02:06:57;U892.PC08_OP.F_CV;89.420547485;100.0 +25/10/2020 02:06:58;U892.PC08_OP.F_CV;89.119987488;100.0 +25/10/2020 02:06:59;U892.PC08_OP.F_CV;88.463760376;100.0 +25/10/2020 02:06:00;U892.PC08_PV.F_CV;1.011497974;100.0 +25/10/2020 02:06:19;U892.PC08_PV.F_CV;1.013248086;100.0 +25/10/2020 02:06:37;U892.PC08_PV.F_CV;1.009718299;100.0 +25/10/2020 02:06:55;U892.PC08_PV.F_CV;1.011249304;100.0 +25/10/2020 02:06:49;U892.PC08_SP.F_CV;1.000000000;100.0 +25/10/2020 02:06:09;U892.PC125_OP.F_CV;53.556526184;100.0 +25/10/2020 02:06:25;U892.PC125_OP.F_CV;53.609241486;100.0 +25/10/2020 02:06:20;U892.PC125_PV.F_CV;90.056823730;100.0 +25/10/2020 02:06:49;U892.PC125_SP.F_CV;90.000000000;100.0 +25/10/2020 02:06:32;U892.PDC09_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:49;U892.PDC09_PV.F_CV;-0.380695969;100.0 +25/10/2020 02:06:32;U892.PDC09_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U892.PDC14_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:49;U892.PDC14_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:32;U892.PDC14_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;U892.PI10_PV.F_CV;-0.004753531;100.0 +25/10/2020 02:06:49;U892.PI11_PV.F_CV;0.020153388;100.0 +25/10/2020 02:06:12;U892.PI120_PV.F_CV;7.893332958;100.0 +25/10/2020 02:06:09;U892.PI124_PV.F_CV;7.799561977;100.0 +25/10/2020 02:06:46;U892.PI126_PV.F_CV;93.432327271;100.0 +25/10/2020 02:06:57;U892.PI17_PV.F_CV;-0.006139383;100.0 +25/10/2020 02:06:46;U892.PI55_PV.F_CV;0.995864987;100.0 +25/10/2020 02:06:46;U892.PI65_PV.F_CV;0.994129360;100.0 +25/10/2020 02:06:49;U892.PR06_PV.F_CV;102.499984741;100.0 +25/10/2020 02:06:49;U892.SC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:14;U892.SC01_PV.F_CV;1001.683593750;100.0 +25/10/2020 02:06:49;U892.SC01_SP.F_CV;1000.000000000;100.0 +25/10/2020 02:06:49;U892.SC10_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U892.SC10_PV.F_CV;-0.661934793;100.0 +25/10/2020 02:06:49;U892.SC10_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:32;U892.TC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U892.TC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U892.TC01_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:49;U892.TC02_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:18;U892.TC02_PV.F_CV;23.077327728;100.0 +25/10/2020 02:06:28;U892.TC02_PV.F_CV;22.934825897;100.0 +25/10/2020 02:06:46;U892.TC02_PV.F_CV;23.068017960;100.0 +25/10/2020 02:06:49;U892.TC02_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:49;U892.TC05_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;U892.TC05_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:49;U892.TC05_SP.F_CV;25.000000000;100.0 +25/10/2020 02:06:00;U892.TC06_OP.F_CV;8.171519279;100.0 +25/10/2020 02:06:01;U892.TC06_OP.F_CV;8.933232307;100.0 +25/10/2020 02:06:02;U892.TC06_OP.F_CV;9.463268280;100.0 +25/10/2020 02:06:03;U892.TC06_OP.F_CV;9.610417366;100.0 +25/10/2020 02:06:04;U892.TC06_OP.F_CV;9.168860435;100.0 +25/10/2020 02:06:05;U892.TC06_OP.F_CV;8.964930534;100.0 +25/10/2020 02:06:07;U892.TC06_OP.F_CV;9.501993179;100.0 +25/10/2020 02:06:08;U892.TC06_OP.F_CV;9.581422806;100.0 +25/10/2020 02:06:09;U892.TC06_OP.F_CV;9.202011108;100.0 +25/10/2020 02:06:11;U892.TC06_OP.F_CV;8.703577042;100.0 +25/10/2020 02:06:12;U892.TC06_OP.F_CV;8.275424004;100.0 +25/10/2020 02:06:13;U892.TC06_OP.F_CV;8.175930023;100.0 +25/10/2020 02:06:14;U892.TC06_OP.F_CV;9.032226563;100.0 +25/10/2020 02:06:15;U892.TC06_OP.F_CV;10.035440445;100.0 +25/10/2020 02:06:16;U892.TC06_OP.F_CV;10.305729866;100.0 +25/10/2020 02:06:17;U892.TC06_OP.F_CV;9.280661583;100.0 +25/10/2020 02:06:18;U892.TC06_OP.F_CV;8.958457947;100.0 +25/10/2020 02:06:19;U892.TC06_OP.F_CV;8.865461349;100.0 +25/10/2020 02:06:22;U892.TC06_OP.F_CV;9.793131828;100.0 +25/10/2020 02:06:23;U892.TC06_OP.F_CV;10.184955597;100.0 +25/10/2020 02:06:24;U892.TC06_OP.F_CV;10.263481140;100.0 +25/10/2020 02:06:26;U892.TC06_OP.F_CV;10.195237160;100.0 +25/10/2020 02:06:27;U892.TC06_OP.F_CV;9.371697426;100.0 +25/10/2020 02:06:28;U892.TC06_OP.F_CV;8.821739197;100.0 +25/10/2020 02:06:29;U892.TC06_OP.F_CV;8.668471336;100.0 +25/10/2020 02:06:30;U892.TC06_OP.F_CV;9.173068047;100.0 +25/10/2020 02:06:31;U892.TC06_OP.F_CV;9.329749107;100.0 +25/10/2020 02:06:33;U892.TC06_OP.F_CV;8.774094582;100.0 +25/10/2020 02:06:34;U892.TC06_OP.F_CV;8.694231033;100.0 +25/10/2020 02:06:35;U892.TC06_OP.F_CV;7.758662701;100.0 +25/10/2020 02:06:36;U892.TC06_OP.F_CV;7.397716999;100.0 +25/10/2020 02:06:39;U892.TC06_OP.F_CV;7.494339466;100.0 +25/10/2020 02:06:40;U892.TC06_OP.F_CV;7.964797020;100.0 +25/10/2020 02:06:41;U892.TC06_OP.F_CV;8.295237541;100.0 +25/10/2020 02:06:42;U892.TC06_OP.F_CV;8.423276901;100.0 +25/10/2020 02:06:43;U892.TC06_OP.F_CV;9.013373375;100.0 +25/10/2020 02:06:44;U892.TC06_OP.F_CV;9.191907883;100.0 +25/10/2020 02:06:48;U892.TC06_OP.F_CV;8.283143997;100.0 +25/10/2020 02:06:49;U892.TC06_OP.F_CV;7.889634609;100.0 +25/10/2020 02:06:50;U892.TC06_OP.F_CV;7.967562675;100.0 +25/10/2020 02:06:51;U892.TC06_OP.F_CV;8.401179314;100.0 +25/10/2020 02:06:52;U892.TC06_OP.F_CV;8.553927422;100.0 +25/10/2020 02:06:53;U892.TC06_OP.F_CV;9.383146286;100.0 +25/10/2020 02:06:54;U892.TC06_OP.F_CV;9.908802986;100.0 +25/10/2020 02:06:55;U892.TC06_OP.F_CV;10.030156136;100.0 +25/10/2020 02:06:56;U892.TC06_OP.F_CV;8.963184357;100.0 +25/10/2020 02:06:57;U892.TC06_OP.F_CV;8.633579254;100.0 +25/10/2020 02:06:58;U892.TC06_OP.F_CV;8.543780327;100.0 +25/10/2020 02:06:02;U892.TC06_PV.F_CV;49.920677185;100.0 +25/10/2020 02:06:11;U892.TC06_PV.F_CV;50.045425415;100.0 +25/10/2020 02:06:23;U892.TC06_PV.F_CV;49.813705444;100.0 +25/10/2020 02:06:36;U892.TC06_PV.F_CV;50.185894012;100.0 +25/10/2020 02:06:42;U892.TC06_PV.F_CV;50.053997040;100.0 +25/10/2020 02:06:48;U892.TC06_PV.F_CV;50.158123016;100.0 +25/10/2020 02:06:53;U892.TC06_PV.F_CV;49.953712463;100.0 +25/10/2020 02:06:56;U892.TC06_PV.F_CV;50.068332672;100.0 +25/10/2020 02:06:48;U892.TC06_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:00;U892.TC07_OP.F_CV;15.036592484;100.0 +25/10/2020 02:06:01;U892.TC07_OP.F_CV;15.153115273;100.0 +25/10/2020 02:06:02;U892.TC07_OP.F_CV;15.497947693;100.0 +25/10/2020 02:06:04;U892.TC07_OP.F_CV;15.704317093;100.0 +25/10/2020 02:06:08;U892.TC07_OP.F_CV;15.864298820;100.0 +25/10/2020 02:06:10;U892.TC07_OP.F_CV;15.777391434;100.0 +25/10/2020 02:06:13;U892.TC07_OP.F_CV;15.841221809;100.0 +25/10/2020 02:06:14;U892.TC07_OP.F_CV;15.955153465;100.0 +25/10/2020 02:06:15;U892.TC07_OP.F_CV;16.205898285;100.0 +25/10/2020 02:06:19;U892.TC07_OP.F_CV;16.458042145;100.0 +25/10/2020 02:06:20;U892.TC07_OP.F_CV;16.091442108;100.0 +25/10/2020 02:06:21;U892.TC07_OP.F_CV;15.993731499;100.0 +25/10/2020 02:06:24;U892.TC07_OP.F_CV;16.220510483;100.0 +25/10/2020 02:06:26;U892.TC07_OP.F_CV;16.474552155;100.0 +25/10/2020 02:06:28;U892.TC07_OP.F_CV;16.423109055;100.0 +25/10/2020 02:06:32;U892.TC07_OP.F_CV;16.704648972;100.0 +25/10/2020 02:06:33;U892.TC07_OP.F_CV;16.477788925;100.0 +25/10/2020 02:06:34;U892.TC07_OP.F_CV;16.425865173;100.0 +25/10/2020 02:06:36;U892.TC07_OP.F_CV;16.773569107;100.0 +25/10/2020 02:06:38;U892.TC07_OP.F_CV;16.915967941;100.0 +25/10/2020 02:06:43;U892.TC07_OP.F_CV;17.004840851;100.0 +25/10/2020 02:06:47;U892.TC07_OP.F_CV;17.243909836;100.0 +25/10/2020 02:06:49;U892.TC07_OP.F_CV;17.157827377;100.0 +25/10/2020 02:06:53;U892.TC07_OP.F_CV;17.449203491;100.0 +25/10/2020 02:06:55;U892.TC07_OP.F_CV;17.528573990;100.0 +25/10/2020 02:06:56;U892.TC07_OP.F_CV;17.467247009;100.0 +25/10/2020 02:06:02;U892.TC07_PV.F_CV;47.348487854;100.0 +25/10/2020 02:06:15;U892.TC07_PV.F_CV;47.233501434;100.0 +25/10/2020 02:06:20;U892.TC07_PV.F_CV;47.449771881;100.0 +25/10/2020 02:06:25;U892.TC07_PV.F_CV;47.321933746;100.0 +25/10/2020 02:06:33;U892.TC07_PV.F_CV;47.467319489;100.0 +25/10/2020 02:06:49;U892.TC07_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:00;U892.TC08_OP.F_CV;9.966206551;100.0 +25/10/2020 02:06:01;U892.TC08_OP.F_CV;9.859065056;100.0 +25/10/2020 02:06:04;U892.TC08_OP.F_CV;9.973452568;100.0 +25/10/2020 02:06:05;U892.TC08_OP.F_CV;10.412542343;100.0 +25/10/2020 02:06:06;U892.TC08_OP.F_CV;10.546566963;100.0 +25/10/2020 02:06:07;U892.TC08_OP.F_CV;9.374562263;100.0 +25/10/2020 02:06:08;U892.TC08_OP.F_CV;8.547402382;100.0 +25/10/2020 02:06:09;U892.TC08_OP.F_CV;8.296771049;100.0 +25/10/2020 02:06:10;U892.TC08_OP.F_CV;9.342425346;100.0 +25/10/2020 02:06:13;U892.TC08_OP.F_CV;10.477632523;100.0 +25/10/2020 02:06:14;U892.TC08_OP.F_CV;10.593375206;100.0 +25/10/2020 02:06:17;U892.TC08_OP.F_CV;10.446250916;100.0 +25/10/2020 02:06:18;U892.TC08_OP.F_CV;9.993659019;100.0 +25/10/2020 02:06:19;U892.TC08_OP.F_CV;9.846357346;100.0 +25/10/2020 02:06:20;U892.TC08_OP.F_CV;9.396859169;100.0 +25/10/2020 02:06:21;U892.TC08_OP.F_CV;9.105994225;100.0 +25/10/2020 02:06:22;U892.TC08_OP.F_CV;9.021511078;100.0 +25/10/2020 02:06:23;U892.TC08_OP.F_CV;9.558341980;100.0 +25/10/2020 02:06:24;U892.TC08_OP.F_CV;9.734486580;100.0 +25/10/2020 02:06:26;U892.TC08_OP.F_CV;9.133193970;100.0 +25/10/2020 02:06:30;U892.TC08_OP.F_CV;8.763600349;100.0 +25/10/2020 02:06:31;U892.TC08_OP.F_CV;8.427065849;100.0 +25/10/2020 02:06:32;U892.TC08_OP.F_CV;8.335418701;100.0 +25/10/2020 02:06:35;U892.TC08_OP.F_CV;8.688662529;100.0 +25/10/2020 02:06:36;U892.TC08_OP.F_CV;9.592939377;100.0 +25/10/2020 02:06:37;U892.TC08_OP.F_CV;9.885755539;100.0 +25/10/2020 02:06:38;U892.TC08_OP.F_CV;9.384984016;100.0 +25/10/2020 02:06:39;U892.TC08_OP.F_CV;8.713482857;100.0 +25/10/2020 02:06:40;U892.TC08_OP.F_CV;8.509927750;100.0 +25/10/2020 02:06:41;U892.TC08_OP.F_CV;7.905230522;100.0 +25/10/2020 02:06:42;U892.TC08_OP.F_CV;7.732613564;100.0 +25/10/2020 02:06:43;U892.TC08_OP.F_CV;7.865744591;100.0 +25/10/2020 02:06:44;U892.TC08_OP.F_CV;8.319669724;100.0 +25/10/2020 02:06:45;U892.TC08_OP.F_CV;8.482096672;100.0 +25/10/2020 02:06:46;U892.TC08_OP.F_CV;7.575483799;100.0 +25/10/2020 02:06:47;U892.TC08_OP.F_CV;7.173744202;100.0 +25/10/2020 02:06:48;U892.TC08_OP.F_CV;7.568517208;100.0 +25/10/2020 02:06:49;U892.TC08_OP.F_CV;8.887765884;100.0 +25/10/2020 02:06:50;U892.TC08_OP.F_CV;9.320444107;100.0 +25/10/2020 02:06:52;U892.TC08_OP.F_CV;8.831223488;100.0 +25/10/2020 02:06:53;U892.TC08_OP.F_CV;8.766260147;100.0 +25/10/2020 02:06:58;U892.TC08_OP.F_CV;8.766260147;100.0 +25/10/2020 02:06:59;U892.TC08_OP.F_CV;9.783905029;100.0 +25/10/2020 02:06:07;U892.TC08_PV.F_CV;85.003486633;100.0 +25/10/2020 02:06:12;U892.TC08_PV.F_CV;84.845108032;100.0 +25/10/2020 02:06:31;U892.TC08_PV.F_CV;85.089225769;100.0 +25/10/2020 02:06:35;U892.TC08_PV.F_CV;84.981796265;100.0 +25/10/2020 02:06:46;U892.TC08_PV.F_CV;85.259429932;100.0 +25/10/2020 02:06:49;U892.TC08_SP.F_CV;85.000000000;100.0 +25/10/2020 02:06:00;U892.TC09_OP.F_CV;17.257770538;100.0 +25/10/2020 02:06:01;U892.TC09_OP.F_CV;17.141016006;100.0 +25/10/2020 02:06:03;U892.TC09_OP.F_CV;17.738727570;100.0 +25/10/2020 02:06:04;U892.TC09_OP.F_CV;17.840766907;100.0 +25/10/2020 02:06:05;U892.TC09_OP.F_CV;16.757677078;100.0 +25/10/2020 02:06:06;U892.TC09_OP.F_CV;16.414300919;100.0 +25/10/2020 02:06:07;U892.TC09_OP.F_CV;16.609746933;100.0 +25/10/2020 02:06:08;U892.TC09_OP.F_CV;16.936746597;100.0 +25/10/2020 02:06:09;U892.TC09_OP.F_CV;17.044664383;100.0 +25/10/2020 02:06:12;U892.TC09_OP.F_CV;16.933401108;100.0 +25/10/2020 02:06:13;U892.TC09_OP.F_CV;16.495220184;100.0 +25/10/2020 02:06:14;U892.TC09_OP.F_CV;16.362159729;100.0 +25/10/2020 02:06:19;U892.TC09_OP.F_CV;17.087631226;100.0 +25/10/2020 02:06:21;U892.TC09_OP.F_CV;17.811452866;100.0 +25/10/2020 02:06:22;U892.TC09_OP.F_CV;17.921049118;100.0 +25/10/2020 02:06:25;U892.TC09_OP.F_CV;17.768922806;100.0 +25/10/2020 02:06:26;U892.TC09_OP.F_CV;17.315481186;100.0 +25/10/2020 02:06:27;U892.TC09_OP.F_CV;17.167201996;100.0 +25/10/2020 02:06:29;U892.TC09_OP.F_CV;17.103485107;100.0 +25/10/2020 02:06:33;U892.TC09_OP.F_CV;17.394046783;100.0 +25/10/2020 02:06:34;U892.TC09_OP.F_CV;17.743564606;100.0 +25/10/2020 02:06:35;U892.TC09_OP.F_CV;17.848365784;100.0 +25/10/2020 02:06:36;U892.TC09_OP.F_CV;16.900180817;100.0 +25/10/2020 02:06:37;U892.TC09_OP.F_CV;16.462957382;100.0 +25/10/2020 02:06:39;U892.TC09_OP.F_CV;16.901887894;100.0 +25/10/2020 02:06:40;U892.TC09_OP.F_CV;17.035190582;100.0 +25/10/2020 02:06:42;U892.TC09_OP.F_CV;17.093177795;100.0 +25/10/2020 02:06:44;U892.TC09_OP.F_CV;17.653131485;100.0 +25/10/2020 02:06:45;U892.TC09_OP.F_CV;17.825002670;100.0 +25/10/2020 02:06:46;U892.TC09_OP.F_CV;17.278230667;100.0 +25/10/2020 02:06:47;U892.TC09_OP.F_CV;16.585424423;100.0 +25/10/2020 02:06:48;U892.TC09_OP.F_CV;16.368770599;100.0 +25/10/2020 02:06:49;U892.TC09_OP.F_CV;17.280788422;100.0 +25/10/2020 02:06:50;U892.TC09_OP.F_CV;17.706792831;100.0 +25/10/2020 02:06:51;U892.TC09_OP.F_CV;18.001098633;100.0 +25/10/2020 02:06:52;U892.TC09_OP.F_CV;18.473993301;100.0 +25/10/2020 02:06:53;U892.TC09_OP.F_CV;18.609569550;100.0 +25/10/2020 02:06:55;U892.TC09_OP.F_CV;17.946516037;100.0 +25/10/2020 02:06:56;U892.TC09_OP.F_CV;17.844539642;100.0 +25/10/2020 02:06:57;U892.TC09_OP.F_CV;18.357236862;100.0 +25/10/2020 02:06:58;U892.TC09_OP.F_CV;18.507505417;100.0 +25/10/2020 02:06:59;U892.TC09_OP.F_CV;18.242877960;100.0 +25/10/2020 02:06:15;U892.TC09_PV.F_CV;80.198204041;100.0 +25/10/2020 02:06:20;U892.TC09_PV.F_CV;80.034561157;100.0 +25/10/2020 02:06:36;U892.TC09_PV.F_CV;80.159210205;100.0 +25/10/2020 02:06:43;U892.TC09_PV.F_CV;80.051338196;100.0 +25/10/2020 02:06:47;U892.TC09_PV.F_CV;80.179107666;100.0 +25/10/2020 02:06:52;U892.TC09_PV.F_CV;79.914817810;100.0 +25/10/2020 02:06:49;U892.TC09_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:01;U892.TC10_OP.F_CV;8.628663063;100.0 +25/10/2020 02:06:02;U892.TC10_OP.F_CV;8.453808784;100.0 +25/10/2020 02:06:03;U892.TC10_OP.F_CV;8.050319672;100.0 +25/10/2020 02:06:04;U892.TC10_OP.F_CV;7.945637703;100.0 +25/10/2020 02:06:05;U892.TC10_OP.F_CV;8.643465042;100.0 +25/10/2020 02:06:06;U892.TC10_OP.F_CV;9.097218513;100.0 +25/10/2020 02:06:07;U892.TC10_OP.F_CV;9.184657097;100.0 +25/10/2020 02:06:08;U892.TC10_OP.F_CV;8.671607018;100.0 +25/10/2020 02:06:09;U892.TC10_OP.F_CV;8.499800682;100.0 +25/10/2020 02:06:10;U892.TC10_OP.F_CV;8.440151215;100.0 +25/10/2020 02:06:15;U892.TC10_OP.F_CV;7.647069931;100.0 +25/10/2020 02:06:16;U892.TC10_OP.F_CV;7.297364712;100.0 +25/10/2020 02:06:18;U892.TC10_OP.F_CV;8.010124207;100.0 +25/10/2020 02:06:19;U892.TC10_OP.F_CV;8.516723633;100.0 +25/10/2020 02:06:20;U892.TC10_OP.F_CV;8.651166916;100.0 +25/10/2020 02:06:23;U892.TC10_OP.F_CV;8.358780861;100.0 +25/10/2020 02:06:24;U892.TC10_OP.F_CV;8.041769981;100.0 +25/10/2020 02:06:25;U892.TC10_OP.F_CV;7.961910725;100.0 +25/10/2020 02:06:28;U892.TC10_OP.F_CV;8.285626411;100.0 +25/10/2020 02:06:29;U892.TC10_OP.F_CV;9.061251640;100.0 +25/10/2020 02:06:30;U892.TC10_OP.F_CV;9.243391991;100.0 +25/10/2020 02:06:32;U892.TC10_OP.F_CV;8.610775948;100.0 +25/10/2020 02:06:33;U892.TC10_OP.F_CV;8.511464119;100.0 +25/10/2020 02:06:34;U892.TC10_OP.F_CV;8.958466530;100.0 +25/10/2020 02:06:35;U892.TC10_OP.F_CV;9.054046631;100.0 +25/10/2020 02:06:37;U892.TC10_OP.F_CV;8.446808815;100.0 +25/10/2020 02:06:38;U892.TC10_OP.F_CV;8.344053268;100.0 +25/10/2020 02:06:39;U892.TC10_OP.F_CV;7.887672424;100.0 +25/10/2020 02:06:40;U892.TC10_OP.F_CV;7.721994400;100.0 +25/10/2020 02:06:43;U892.TC10_OP.F_CV;7.790812969;100.0 +25/10/2020 02:06:44;U892.TC10_OP.F_CV;8.189099312;100.0 +25/10/2020 02:06:45;U892.TC10_OP.F_CV;8.447520256;100.0 +25/10/2020 02:06:46;U892.TC10_OP.F_CV;8.515064240;100.0 +25/10/2020 02:06:47;U892.TC10_OP.F_CV;8.034390450;100.0 +25/10/2020 02:06:48;U892.TC10_OP.F_CV;7.907345295;100.0 +25/10/2020 02:06:50;U892.TC10_OP.F_CV;8.460816383;100.0 +25/10/2020 02:06:51;U892.TC10_OP.F_CV;8.541168213;100.0 +25/10/2020 02:06:54;U892.TC10_OP.F_CV;8.257105827;100.0 +25/10/2020 02:06:55;U892.TC10_OP.F_CV;7.950169086;100.0 +25/10/2020 02:06:56;U892.TC10_OP.F_CV;7.879628658;100.0 +25/10/2020 02:06:15;U892.TC10_PV.F_CV;50.145977020;100.0 +25/10/2020 02:06:34;U892.TC10_PV.F_CV;49.915958405;100.0 +25/10/2020 02:06:51;U892.TC10_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:49;U892.TC11_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;U892.TC11_PV.F_CV;50.013233185;100.0 +25/10/2020 02:06:44;U892.TC11_PV.F_CV;49.885147095;100.0 +25/10/2020 02:06:05;U892.TC11_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:03;U892.TC16_OP.F_CV;18.000000000;100.0 +25/10/2020 02:06:04;U892.TC16_OP.F_CV;17.402000427;100.0 +25/10/2020 02:06:05;U892.TC16_OP.F_CV;16.998882294;100.0 +25/10/2020 02:06:06;U892.TC16_OP.F_CV;17.233232498;100.0 +25/10/2020 02:06:07;U892.TC16_OP.F_CV;18.000000000;100.0 +25/10/2020 02:06:11;U892.TC16_OP.F_CV;18.000000000;100.0 +25/10/2020 02:06:12;U892.TC16_OP.F_CV;16.823167801;100.0 +25/10/2020 02:06:13;U892.TC16_OP.F_CV;16.354122162;100.0 +25/10/2020 02:06:14;U892.TC16_OP.F_CV;16.551361084;100.0 +25/10/2020 02:06:15;U892.TC16_OP.F_CV;16.915243149;100.0 +25/10/2020 02:06:17;U892.TC16_OP.F_CV;17.155445099;100.0 +25/10/2020 02:06:18;U892.TC16_OP.F_CV;17.216539383;100.0 +25/10/2020 02:06:19;U892.TC16_OP.F_CV;17.106925964;100.0 +25/10/2020 02:06:20;U892.TC16_OP.F_CV;16.725978851;100.0 +25/10/2020 02:06:21;U892.TC16_OP.F_CV;16.650484085;100.0 +25/10/2020 02:06:26;U892.TC16_OP.F_CV;16.908288956;100.0 +25/10/2020 02:06:27;U892.TC16_OP.F_CV;17.548513412;100.0 +25/10/2020 02:06:28;U892.TC16_OP.F_CV;18.000000000;100.0 +25/10/2020 02:06:30;U892.TC16_OP.F_CV;17.605823517;100.0 +25/10/2020 02:06:31;U892.TC16_OP.F_CV;17.218536377;100.0 +25/10/2020 02:06:32;U892.TC16_OP.F_CV;17.128454208;100.0 +25/10/2020 02:06:39;U892.TC16_OP.F_CV;17.393983841;100.0 +25/10/2020 02:06:41;U892.TC16_OP.F_CV;16.847158432;100.0 +25/10/2020 02:06:42;U892.TC16_OP.F_CV;16.794528961;100.0 +25/10/2020 02:06:43;U892.TC16_OP.F_CV;17.774574280;100.0 +25/10/2020 02:06:44;U892.TC16_OP.F_CV;18.000000000;100.0 +25/10/2020 02:06:46;U892.TC16_OP.F_CV;17.230001450;100.0 +25/10/2020 02:06:47;U892.TC16_OP.F_CV;17.007509232;100.0 +25/10/2020 02:06:52;U892.TC16_OP.F_CV;17.849454880;100.0 +25/10/2020 02:06:55;U892.TC16_OP.F_CV;17.998620987;100.0 +25/10/2020 02:06:56;U892.TC16_OP.F_CV;17.065999985;100.0 +25/10/2020 02:06:57;U892.TC16_OP.F_CV;16.675624847;100.0 +25/10/2020 02:06:58;U892.TC16_OP.F_CV;16.759777069;100.0 +25/10/2020 02:06:59;U892.TC16_OP.F_CV;17.211486816;100.0 +25/10/2020 02:06:12;U892.TC16_PV.F_CV;48.937206268;100.0 +25/10/2020 02:06:28;U892.TC16_PV.F_CV;48.821472168;100.0 +25/10/2020 02:06:40;U892.TC16_PV.F_CV;49.067230225;100.0 +25/10/2020 02:06:43;U892.TC16_PV.F_CV;48.940792084;100.0 +25/10/2020 02:06:57;U892.TC16_PV.F_CV;49.186275482;100.0 +25/10/2020 02:06:37;U892.TC16_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:49;U892.TC17_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;U892.TC17_PV.F_CV;30.658924103;100.0 +25/10/2020 02:06:23;U892.TC17_PV.F_CV;30.532819748;100.0 +25/10/2020 02:06:49;U892.TC17_SP.F_CV;45.000000000;100.0 +25/10/2020 02:06:00;U892.TC21_OP.F_CV;17.652555466;100.0 +25/10/2020 02:06:01;U892.TC21_OP.F_CV;17.737041473;100.0 +25/10/2020 02:06:04;U892.TC21_OP.F_CV;18.297342300;100.0 +25/10/2020 02:06:05;U892.TC21_OP.F_CV;18.015180588;100.0 +25/10/2020 02:06:06;U892.TC21_OP.F_CV;17.096649170;100.0 +25/10/2020 02:06:07;U892.TC21_OP.F_CV;16.490152359;100.0 +25/10/2020 02:06:08;U892.TC21_OP.F_CV;16.732561111;100.0 +25/10/2020 02:06:09;U892.TC21_OP.F_CV;17.147012711;100.0 +25/10/2020 02:06:10;U892.TC21_OP.F_CV;17.448997498;100.0 +25/10/2020 02:06:11;U892.TC21_OP.F_CV;17.884807587;100.0 +25/10/2020 02:06:12;U892.TC21_OP.F_CV;18.136217117;100.0 +25/10/2020 02:06:13;U892.TC21_OP.F_CV;18.057552338;100.0 +25/10/2020 02:06:15;U892.TC21_OP.F_CV;17.523221970;100.0 +25/10/2020 02:06:16;U892.TC21_OP.F_CV;16.837137222;100.0 +25/10/2020 02:06:17;U892.TC21_OP.F_CV;16.275785446;100.0 +25/10/2020 02:06:19;U892.TC21_OP.F_CV;16.758710861;100.0 +25/10/2020 02:06:22;U892.TC21_OP.F_CV;17.875333786;100.0 +25/10/2020 02:06:23;U892.TC21_OP.F_CV;18.040031433;100.0 +25/10/2020 02:06:26;U892.TC21_OP.F_CV;18.280504227;100.0 +25/10/2020 02:06:27;U892.TC21_OP.F_CV;18.549325943;100.0 +25/10/2020 02:06:28;U892.TC21_OP.F_CV;18.691448212;100.0 +25/10/2020 02:06:31;U892.TC21_OP.F_CV;18.576154709;100.0 +25/10/2020 02:06:32;U892.TC21_OP.F_CV;18.220714569;100.0 +25/10/2020 02:06:33;U892.TC21_OP.F_CV;17.990247726;100.0 +25/10/2020 02:06:35;U892.TC21_OP.F_CV;17.796913147;100.0 +25/10/2020 02:06:38;U892.TC21_OP.F_CV;18.315504074;100.0 +25/10/2020 02:06:40;U892.TC21_OP.F_CV;17.881479263;100.0 +25/10/2020 02:06:41;U892.TC21_OP.F_CV;17.752759933;100.0 +25/10/2020 02:06:43;U892.TC21_OP.F_CV;18.166353226;100.0 +25/10/2020 02:06:47;U892.TC21_OP.F_CV;18.536157608;100.0 +25/10/2020 02:06:48;U892.TC21_OP.F_CV;18.780563354;100.0 +25/10/2020 02:06:51;U892.TC21_OP.F_CV;18.281618118;100.0 +25/10/2020 02:06:52;U892.TC21_OP.F_CV;17.618677139;100.0 +25/10/2020 02:06:53;U892.TC21_OP.F_CV;16.619741440;100.0 +25/10/2020 02:06:54;U892.TC21_OP.F_CV;16.306636810;100.0 +25/10/2020 02:06:55;U892.TC21_OP.F_CV;17.348808289;100.0 +25/10/2020 02:06:56;U892.TC21_OP.F_CV;18.172224045;100.0 +25/10/2020 02:06:57;U892.TC21_OP.F_CV;18.368324280;100.0 +25/10/2020 02:06:59;U892.TC21_OP.F_CV;18.103769302;100.0 +25/10/2020 02:06:47;U892.TC21_PV.F_CV;74.645690918;100.0 +25/10/2020 02:06:52;U892.TC21_PV.F_CV;74.834968567;100.0 +25/10/2020 02:06:56;U892.TC21_PV.F_CV;74.665153503;100.0 +25/10/2020 02:06:41;U892.TC21_SP.F_CV;75.000000000;100.0 +25/10/2020 02:06:02;U892.TC23_OP.F_CV;15.942001343;100.0 +25/10/2020 02:06:04;U892.TC23_OP.F_CV;15.780257225;100.0 +25/10/2020 02:06:05;U892.TC23_OP.F_CV;15.396254539;100.0 +25/10/2020 02:06:06;U892.TC23_OP.F_CV;15.308763504;100.0 +25/10/2020 02:06:07;U892.TC23_OP.F_CV;15.667846680;100.0 +25/10/2020 02:06:08;U892.TC23_OP.F_CV;15.917221069;100.0 +25/10/2020 02:06:09;U892.TC23_OP.F_CV;15.985004425;100.0 +25/10/2020 02:06:10;U892.TC23_OP.F_CV;15.507364273;100.0 +25/10/2020 02:06:11;U892.TC23_OP.F_CV;15.383822441;100.0 +25/10/2020 02:06:13;U892.TC23_OP.F_CV;14.844278336;100.0 +25/10/2020 02:06:16;U892.TC23_OP.F_CV;16.111501694;100.0 +25/10/2020 02:06:17;U892.TC23_OP.F_CV;16.057975769;100.0 +25/10/2020 02:06:18;U892.TC23_OP.F_CV;15.679678917;100.0 +25/10/2020 02:06:19;U892.TC23_OP.F_CV;15.570354462;100.0 +25/10/2020 02:06:20;U892.TC23_OP.F_CV;15.901351929;100.0 +25/10/2020 02:06:21;U892.TC23_OP.F_CV;16.122955322;100.0 +25/10/2020 02:06:26;U892.TC23_OP.F_CV;16.067237854;100.0 +25/10/2020 02:06:29;U892.TC23_OP.F_CV;16.589086533;100.0 +25/10/2020 02:06:30;U892.TC23_OP.F_CV;16.440092087;100.0 +25/10/2020 02:06:31;U892.TC23_OP.F_CV;16.017450333;100.0 +25/10/2020 02:06:32;U892.TC23_OP.F_CV;15.882293701;100.0 +25/10/2020 02:06:45;U892.TC23_OP.F_CV;15.829888344;100.0 +25/10/2020 02:06:46;U892.TC23_OP.F_CV;15.492380142;100.0 +25/10/2020 02:06:47;U892.TC23_OP.F_CV;15.275292397;100.0 +25/10/2020 02:06:51;U892.TC23_OP.F_CV;15.611138344;100.0 +25/10/2020 02:06:52;U892.TC23_OP.F_CV;15.937125206;100.0 +25/10/2020 02:06:53;U892.TC23_OP.F_CV;16.024286270;100.0 +25/10/2020 02:06:56;U892.TC23_OP.F_CV;15.861138344;100.0 +25/10/2020 02:06:57;U892.TC23_OP.F_CV;15.466310501;100.0 +25/10/2020 02:06:59;U892.TC23_OP.F_CV;15.368536949;100.0 +25/10/2020 02:06:13;U892.TC23_PV.F_CV;90.185874939;100.0 +25/10/2020 02:06:15;U892.TC23_PV.F_CV;90.050918579;100.0 +25/10/2020 02:06:28;U892.TC23_PV.F_CV;89.920982361;100.0 +25/10/2020 02:06:45;U892.TC23_PV.F_CV;90.019989014;100.0 +25/10/2020 02:06:49;U892.TC23_SP.F_CV;90.000000000;100.0 +25/10/2020 02:06:49;U892.TC31_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;U892.TC31_PV.F_CV;30.259460449;100.0 +25/10/2020 02:06:06;U892.TC31_PV.F_CV;30.373229980;100.0 +25/10/2020 02:06:10;U892.TC31_PV.F_CV;30.145154953;100.0 +25/10/2020 02:06:13;U892.TC31_PV.F_CV;30.322946548;100.0 +25/10/2020 02:06:19;U892.TC31_PV.F_CV;30.221380234;100.0 +25/10/2020 02:06:21;U892.TC31_PV.F_CV;30.451503754;100.0 +25/10/2020 02:06:25;U892.TC31_PV.F_CV;30.173995972;100.0 +25/10/2020 02:06:34;U892.TC31_PV.F_CV;30.349670410;100.0 +25/10/2020 02:06:36;U892.TC31_PV.F_CV;30.192899704;100.0 +25/10/2020 02:06:40;U892.TC31_PV.F_CV;30.287324905;100.0 +25/10/2020 02:06:41;U892.TC31_PV.F_CV;30.177766800;100.0 +25/10/2020 02:06:48;U892.TC31_PV.F_CV;30.388732910;100.0 +25/10/2020 02:06:51;U892.TC31_PV.F_CV;30.170640945;100.0 +25/10/2020 02:06:49;U892.TC31_SP.F_CV;45.000000000;100.0 +25/10/2020 02:06:49;U892.TC41_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;U892.TC41_PV.F_CV;131.028335571;100.0 +25/10/2020 02:06:11;U892.TC41_PV.F_CV;130.922058105;100.0 +25/10/2020 02:06:15;U892.TC41_PV.F_CV;131.187057495;100.0 +25/10/2020 02:06:27;U892.TC41_PV.F_CV;130.920883179;100.0 +25/10/2020 02:06:29;U892.TC41_PV.F_CV;131.218368530;100.0 +25/10/2020 02:06:42;U892.TC41_PV.F_CV;130.962844849;100.0 +25/10/2020 02:06:53;U892.TC41_PV.F_CV;131.078552246;100.0 +25/10/2020 02:06:09;U892.TC41_SP.F_CV;135.000000000;100.0 +25/10/2020 02:06:00;U892.TC42_OP.F_CV;11.815919876;100.0 +25/10/2020 02:06:01;U892.TC42_OP.F_CV;12.297151566;100.0 +25/10/2020 02:06:02;U892.TC42_OP.F_CV;11.839230537;100.0 +25/10/2020 02:06:03;U892.TC42_OP.F_CV;11.173688889;100.0 +25/10/2020 02:06:04;U892.TC42_OP.F_CV;10.963772774;100.0 +25/10/2020 02:06:05;U892.TC42_OP.F_CV;10.425676346;100.0 +25/10/2020 02:06:06;U892.TC42_OP.F_CV;10.208073616;100.0 +25/10/2020 02:06:07;U892.TC42_OP.F_CV;10.324331284;100.0 +25/10/2020 02:06:08;U892.TC42_OP.F_CV;10.762936592;100.0 +25/10/2020 02:06:10;U892.TC42_OP.F_CV;10.962273598;100.0 +25/10/2020 02:06:25;U892.TC42_OP.F_CV;11.012643814;100.0 +25/10/2020 02:06:26;U892.TC42_OP.F_CV;10.500246048;100.0 +25/10/2020 02:06:27;U892.TC42_OP.F_CV;10.344185829;100.0 +25/10/2020 02:06:28;U892.TC42_OP.F_CV;10.895278931;100.0 +25/10/2020 02:06:29;U892.TC42_OP.F_CV;11.578556061;100.0 +25/10/2020 02:06:30;U892.TC42_OP.F_CV;11.782131195;100.0 +25/10/2020 02:06:31;U892.TC42_OP.F_CV;11.352300644;100.0 +25/10/2020 02:06:32;U892.TC42_OP.F_CV;11.144349098;100.0 +25/10/2020 02:06:33;U892.TC42_OP.F_CV;11.239424706;100.0 +25/10/2020 02:06:34;U892.TC42_OP.F_CV;11.647950172;100.0 +25/10/2020 02:06:35;U892.TC42_OP.F_CV;11.763882637;100.0 +25/10/2020 02:06:36;U892.TC42_OP.F_CV;11.390230179;100.0 +25/10/2020 02:06:37;U892.TC42_OP.F_CV;11.116989136;100.0 +25/10/2020 02:06:38;U892.TC42_OP.F_CV;11.031231880;100.0 +25/10/2020 02:06:39;U892.TC42_OP.F_CV;10.463214874;100.0 +25/10/2020 02:06:40;U892.TC42_OP.F_CV;10.300162315;100.0 +25/10/2020 02:06:42;U892.TC42_OP.F_CV;10.907211304;100.0 +25/10/2020 02:06:43;U892.TC42_OP.F_CV;11.021554947;100.0 +25/10/2020 02:06:51;U892.TC42_OP.F_CV;11.072223663;100.0 +25/10/2020 02:06:52;U892.TC42_OP.F_CV;11.624927521;100.0 +25/10/2020 02:06:53;U892.TC42_OP.F_CV;11.783591270;100.0 +25/10/2020 02:06:00;U892.TC42_PV.F_CV;99.859588623;100.0 +25/10/2020 02:06:05;U892.TC42_PV.F_CV;100.071128845;100.0 +25/10/2020 02:06:28;U892.TC42_PV.F_CV;99.963737488;100.0 +25/10/2020 02:06:39;U892.TC42_PV.F_CV;100.082344055;100.0 +25/10/2020 02:06:51;U892.TC42_PV.F_CV;99.951210022;100.0 +25/10/2020 02:06:49;U892.TC42_SP.F_CV;100.000000000;100.0 +25/10/2020 02:06:01;U892.TC91_OP.F_CV;43.876434326;100.0 +25/10/2020 02:06:10;U892.TC91_OP.F_CV;43.684036255;100.0 +25/10/2020 02:06:12;U892.TC91_OP.F_CV;43.508117676;100.0 +25/10/2020 02:06:20;U892.TC91_OP.F_CV;44.115711212;100.0 +25/10/2020 02:06:23;U892.TC91_OP.F_CV;43.970623016;100.0 +25/10/2020 02:06:26;U892.TC91_OP.F_CV;43.522117615;100.0 +25/10/2020 02:06:27;U892.TC91_OP.F_CV;43.429431915;100.0 +25/10/2020 02:06:30;U892.TC91_OP.F_CV;43.593109131;100.0 +25/10/2020 02:06:33;U892.TC91_OP.F_CV;43.394042969;100.0 +25/10/2020 02:06:35;U892.TC91_OP.F_CV;43.605648041;100.0 +25/10/2020 02:06:40;U892.TC91_OP.F_CV;43.736179352;100.0 +25/10/2020 02:06:43;U892.TC91_OP.F_CV;43.855747223;100.0 +25/10/2020 02:06:46;U892.TC91_OP.F_CV;43.532341003;100.0 +25/10/2020 02:06:48;U892.TC91_OP.F_CV;43.692909241;100.0 +25/10/2020 02:06:55;U892.TC91_OP.F_CV;43.838802338;100.0 +25/10/2020 02:06:21;U892.TC91_PV.F_CV;89.814201355;100.0 +25/10/2020 02:06:32;U892.TC91_PV.F_CV;89.904602051;100.0 +25/10/2020 02:06:58;U892.TC91_PV.F_CV;89.804466248;100.0 +25/10/2020 02:06:49;U892.TC91_SP.F_CV;90.000000000;100.0 +25/10/2020 02:06:00;U892.TI04_PV.F_CV;25.207853317;100.0 +25/10/2020 02:06:01;U892.TI04_PV.F_CV;21.014572144;100.0 +25/10/2020 02:06:02;U892.TI04_PV.F_CV;19.807783127;100.0 +25/10/2020 02:06:03;U892.TI04_PV.F_CV;21.534870148;100.0 +25/10/2020 02:06:04;U892.TI04_PV.F_CV;22.209602356;100.0 +25/10/2020 02:06:05;U892.TI04_PV.F_CV;21.057418823;100.0 +25/10/2020 02:06:06;U892.TI04_PV.F_CV;19.023584366;100.0 +25/10/2020 02:06:07;U892.TI04_PV.F_CV;23.155536652;100.0 +25/10/2020 02:06:08;U892.TI04_PV.F_CV;22.442485809;100.0 +25/10/2020 02:06:09;U892.TI04_PV.F_CV;20.891714096;100.0 +25/10/2020 02:06:10;U892.TI04_PV.F_CV;24.943683624;100.0 +25/10/2020 02:06:11;U892.TI04_PV.F_CV;18.324424744;100.0 +25/10/2020 02:06:12;U892.TI04_PV.F_CV;19.385795593;100.0 +25/10/2020 02:06:13;U892.TI04_PV.F_CV;21.481424332;100.0 +25/10/2020 02:06:14;U892.TI04_PV.F_CV;21.204601288;100.0 +25/10/2020 02:06:15;U892.TI04_PV.F_CV;23.246307373;100.0 +25/10/2020 02:06:16;U892.TI04_PV.F_CV;18.341991425;100.0 +25/10/2020 02:06:17;U892.TI04_PV.F_CV;25.049568176;100.0 +25/10/2020 02:06:18;U892.TI04_PV.F_CV;25.798067093;100.0 +25/10/2020 02:06:19;U892.TI04_PV.F_CV;21.261413574;100.0 +25/10/2020 02:06:20;U892.TI04_PV.F_CV;19.078428268;100.0 +25/10/2020 02:06:21;U892.TI04_PV.F_CV;16.826148987;100.0 +25/10/2020 02:06:22;U892.TI04_PV.F_CV;20.475576401;100.0 +25/10/2020 02:06:23;U892.TI04_PV.F_CV;22.037307739;100.0 +25/10/2020 02:06:24;U892.TI04_PV.F_CV;22.672224045;100.0 +25/10/2020 02:06:25;U892.TI04_PV.F_CV;17.818290710;100.0 +25/10/2020 02:06:26;U892.TI04_PV.F_CV;18.965705872;100.0 +25/10/2020 02:06:28;U892.TI04_PV.F_CV;19.452789307;100.0 +25/10/2020 02:06:29;U892.TI04_PV.F_CV;22.328722000;100.0 +25/10/2020 02:06:30;U892.TI04_PV.F_CV;23.914499283;100.0 +25/10/2020 02:06:31;U892.TI04_PV.F_CV;27.932910919;100.0 +25/10/2020 02:06:32;U892.TI04_PV.F_CV;20.278209686;100.0 +25/10/2020 02:06:33;U892.TI04_PV.F_CV;18.616346359;100.0 +25/10/2020 02:06:34;U892.TI04_PV.F_CV;18.812938690;100.0 +25/10/2020 02:06:35;U892.TI04_PV.F_CV;21.565935135;100.0 +25/10/2020 02:06:36;U892.TI04_PV.F_CV;21.317350388;100.0 +25/10/2020 02:06:37;U892.TI04_PV.F_CV;20.110036850;100.0 +25/10/2020 02:06:38;U892.TI04_PV.F_CV;25.315866470;100.0 +25/10/2020 02:06:39;U892.TI04_PV.F_CV;24.484367371;100.0 +25/10/2020 02:06:40;U892.TI04_PV.F_CV;24.374109268;100.0 +25/10/2020 02:06:41;U892.TI04_PV.F_CV;23.091611862;100.0 +25/10/2020 02:06:42;U892.TI04_PV.F_CV;17.910434723;100.0 +25/10/2020 02:06:43;U892.TI04_PV.F_CV;22.627098083;100.0 +25/10/2020 02:06:44;U892.TI04_PV.F_CV;20.101455688;100.0 +25/10/2020 02:06:45;U892.TI04_PV.F_CV;22.936605453;100.0 +25/10/2020 02:06:46;U892.TI04_PV.F_CV;21.585340500;100.0 +25/10/2020 02:06:47;U892.TI04_PV.F_CV;23.215932846;100.0 +25/10/2020 02:06:48;U892.TI04_PV.F_CV;23.272836685;100.0 +25/10/2020 02:06:49;U892.TI04_PV.F_CV;19.720090866;100.0 +25/10/2020 02:06:50;U892.TI04_PV.F_CV;20.780469894;100.0 +25/10/2020 02:06:51;U892.TI04_PV.F_CV;20.712991714;100.0 +25/10/2020 02:06:52;U892.TI04_PV.F_CV;15.202015877;100.0 +25/10/2020 02:06:53;U892.TI04_PV.F_CV;16.710901260;100.0 +25/10/2020 02:06:54;U892.TI04_PV.F_CV;20.865333557;100.0 +25/10/2020 02:06:55;U892.TI04_PV.F_CV;22.397697449;100.0 +25/10/2020 02:06:56;U892.TI04_PV.F_CV;22.130540848;100.0 +25/10/2020 02:06:57;U892.TI04_PV.F_CV;19.257528305;100.0 +25/10/2020 02:06:58;U892.TI04_PV.F_CV;24.580259323;100.0 +25/10/2020 02:06:59;U892.TI04_PV.F_CV;23.115707397;100.0 +25/10/2020 02:06:13;U892.TI101_PV.F_CV;27.700000763;100.0 +25/10/2020 02:06:53;U892.TI102_PV.F_CV;21.600000381;100.0 +25/10/2020 02:06:06;U892.TI105_PV.F_CV;22.399999619;100.0 +25/10/2020 02:06:06;U892.TI106_PV.F_CV;63.200000763;100.0 +25/10/2020 02:06:11;U892.TI106_PV.F_CV;63.000000000;100.0 +25/10/2020 02:06:32;U892.TI106_PV.F_CV;63.200000763;100.0 +25/10/2020 02:06:42;U892.TI106_PV.F_CV;63.000000000;100.0 +25/10/2020 02:06:01;U892.TI107_PV.F_CV;45.099998474;100.0 +25/10/2020 02:06:53;U892.TI107_PV.F_CV;47.400001526;100.0 +25/10/2020 02:06:17;U892.TI108_PV.F_CV;88.800003052;100.0 +25/10/2020 02:06:17;U892.TI109_PV.F_CV;90.000000000;100.0 +25/10/2020 02:06:32;U892.TI110_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:05;U892.TI116_PV.F_CV;106.300003052;100.0 +25/10/2020 02:06:10;U892.TI116_PV.F_CV;105.699996948;100.0 +25/10/2020 02:06:16;U892.TI116_PV.F_CV;106.000000000;100.0 +25/10/2020 02:06:18;U892.TI116_PV.F_CV;106.300003052;100.0 +25/10/2020 02:06:23;U892.TI116_PV.F_CV;105.300003052;100.0 +25/10/2020 02:06:28;U892.TI116_PV.F_CV;105.900001526;100.0 +25/10/2020 02:06:36;U892.TI116_PV.F_CV;105.199996948;100.0 +25/10/2020 02:06:44;U892.TI116_PV.F_CV;106.000000000;100.0 +25/10/2020 02:06:50;U892.TI116_PV.F_CV;105.599998474;100.0 +25/10/2020 02:06:54;U892.TI116_PV.F_CV;105.599998474;100.0 +25/10/2020 02:06:55;U892.TI116_PV.F_CV;106.300003052;100.0 +25/10/2020 02:06:11;U892.TI117_PV.F_CV;24.799999237;100.0 +25/10/2020 02:06:13;U892.TI117_PV.F_CV;25.000000000;100.0 +25/10/2020 02:06:24;U892.TI117_PV.F_CV;24.799999237;100.0 +25/10/2020 02:06:26;U892.TI117_PV.F_CV;25.100000381;100.0 +25/10/2020 02:06:29;U892.TI117_PV.F_CV;24.899999619;100.0 +25/10/2020 02:06:30;U892.TI11_PV.F_CV;50.333587646;100.0 +25/10/2020 02:06:03;U892.TI123_PV.F_CV;171.100006104;100.0 +25/10/2020 02:06:08;U892.TI123_PV.F_CV;170.800003052;100.0 +25/10/2020 02:06:21;U892.TI123_PV.F_CV;171.100006104;100.0 +25/10/2020 02:06:24;U892.TI123_PV.F_CV;170.800003052;100.0 +25/10/2020 02:06:34;U892.TI123_PV.F_CV;171.000000000;100.0 +25/10/2020 02:06:50;U892.TI123_PV.F_CV;170.800003052;100.0 +25/10/2020 02:06:58;U892.TI123_PV.F_CV;171.000000000;100.0 +25/10/2020 02:06:32;U892.TI12_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U892.TI13_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:06;U892.TI142_PV.F_CV;62.500000000;100.0 +25/10/2020 02:06:09;U892.TI142_PV.F_CV;62.299999237;100.0 +25/10/2020 02:06:37;U892.TI142_PV.F_CV;62.500000000;100.0 +25/10/2020 02:06:40;U892.TI142_PV.F_CV;62.299999237;100.0 +25/10/2020 02:06:45;U892.TI142_PV.F_CV;62.599998474;100.0 +25/10/2020 02:06:48;U892.TI142_PV.F_CV;62.299999237;100.0 +25/10/2020 02:06:53;U892.TI142_PV.F_CV;62.500000000;100.0 +25/10/2020 02:06:09;U892.TI14_PV.F_CV;49.969955444;100.0 +25/10/2020 02:06:09;U892.TI15_PV.F_CV;49.840618134;100.0 +25/10/2020 02:06:26;U892.TI15_PV.F_CV;49.979370117;100.0 +25/10/2020 02:06:33;U892.TI15_PV.F_CV;49.859985352;100.0 +25/10/2020 02:06:39;U892.TI15_PV.F_CV;49.966392517;100.0 +25/10/2020 02:06:43;U892.TI15_PV.F_CV;49.855758667;100.0 +25/10/2020 02:06:52;U892.TI15_PV.F_CV;49.966457367;100.0 +25/10/2020 02:06:17;U892.TI191_PV.F_CV;192.300003052;100.0 +25/10/2020 02:06:22;U892.TI191_PV.F_CV;192.000000000;100.0 +25/10/2020 02:06:30;U892.TI191_PV.F_CV;192.300003052;100.0 +25/10/2020 02:06:32;U892.TI191_PV.F_CV;192.000000000;100.0 +25/10/2020 02:06:38;U892.TI191_PV.F_CV;192.199996948;100.0 +25/10/2020 02:06:43;U892.TI191_PV.F_CV;192.000000000;100.0 +25/10/2020 02:06:51;U892.TI191_PV.F_CV;192.199996948;100.0 +25/10/2020 02:06:56;U892.TI191_PV.F_CV;192.000000000;100.0 +25/10/2020 02:06:01;U892.TI19_PV.F_CV;22.115955353;100.0 +25/10/2020 02:06:04;U892.TI19_PV.F_CV;22.279085159;100.0 +25/10/2020 02:06:06;U892.TI19_PV.F_CV;22.139698029;100.0 +25/10/2020 02:06:07;U892.TI19_PV.F_CV;22.113008499;100.0 +25/10/2020 02:06:08;U892.TI19_PV.F_CV;22.163303375;100.0 +25/10/2020 02:06:11;U892.TI19_PV.F_CV;22.124923706;100.0 +25/10/2020 02:06:16;U892.TI19_PV.F_CV;22.167327881;100.0 +25/10/2020 02:06:19;U892.TI19_PV.F_CV;22.277877808;100.0 +25/10/2020 02:06:32;U892.TI19_PV.F_CV;22.116781235;100.0 +25/10/2020 02:06:36;U892.TI19_PV.F_CV;22.196676254;100.0 +25/10/2020 02:06:40;U892.TI19_PV.F_CV;22.373117447;100.0 +25/10/2020 02:06:42;U892.TI19_PV.F_CV;22.239057541;100.0 +25/10/2020 02:06:43;U892.TI19_PV.F_CV;22.212799072;100.0 +25/10/2020 02:06:45;U892.TI19_PV.F_CV;22.284597397;100.0 +25/10/2020 02:06:50;U892.TI19_PV.F_CV;22.121835709;100.0 +25/10/2020 02:06:54;U892.TI19_PV.F_CV;22.121835709;100.0 +25/10/2020 02:06:55;U892.TI19_PV.F_CV;22.247652054;100.0 +25/10/2020 02:06:56;U892.TI19_PV.F_CV;22.282844543;100.0 +25/10/2020 02:06:59;U892.TI19_PV.F_CV;22.203796387;100.0 +25/10/2020 02:06:11;U892.TI201_PV.F_CV;30.100000381;100.0 +25/10/2020 02:06:30;U892.TI201_PV.F_CV;29.899999619;100.0 +25/10/2020 02:06:35;U892.TI201_PV.F_CV;30.100000381;100.0 +25/10/2020 02:06:56;U892.TI201_PV.F_CV;29.899999619;100.0 +25/10/2020 02:06:20;U892.TI202_PV.F_CV;22.600000381;100.0 +25/10/2020 02:06:23;U892.TI205_PV.F_CV;21.500000000;100.0 +25/10/2020 02:06:28;U892.TI205_PV.F_CV;21.299999237;100.0 +25/10/2020 02:06:30;U892.TI205_PV.F_CV;21.500000000;100.0 +25/10/2020 02:06:54;U892.TI205_PV.F_CV;21.299999237;100.0 +25/10/2020 02:06:01;U892.TI211_PV.F_CV;47.700000763;100.0 +25/10/2020 02:06:04;U892.TI211_PV.F_CV;47.400001526;100.0 +25/10/2020 02:06:11;U892.TI211_PV.F_CV;47.599998474;100.0 +25/10/2020 02:06:19;U892.TI211_PV.F_CV;47.400001526;100.0 +25/10/2020 02:06:22;U892.TI211_PV.F_CV;47.599998474;100.0 +25/10/2020 02:06:24;U892.TI211_PV.F_CV;47.400001526;100.0 +25/10/2020 02:06:27;U892.TI211_PV.F_CV;47.700000763;100.0 +25/10/2020 02:06:29;U892.TI211_PV.F_CV;47.400001526;100.0 +25/10/2020 02:06:37;U892.TI211_PV.F_CV;47.599998474;100.0 +25/10/2020 02:06:40;U892.TI211_PV.F_CV;47.400001526;100.0 +25/10/2020 02:06:48;U892.TI211_PV.F_CV;47.700000763;100.0 +25/10/2020 02:06:53;U892.TI211_PV.F_CV;47.500000000;100.0 +25/10/2020 02:06:56;U892.TI211_PV.F_CV;47.700000763;100.0 +25/10/2020 02:06:32;U892.TI217A_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;U892.TI217B_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;U892.TI21A_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:01;U892.TI21B_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:09;U892.TI222_PV.F_CV;19.299999237;100.0 +25/10/2020 02:06:02;U892.TI22_PV.F_CV;55.693111420;100.0 +25/10/2020 02:06:14;U892.TI22_PV.F_CV;55.601150513;100.0 +25/10/2020 02:06:19;U892.TI22_PV.F_CV;55.734466553;100.0 +25/10/2020 02:06:22;U892.TI22_PV.F_CV;55.625000000;100.0 +25/10/2020 02:06:32;U892.TI22_PV.F_CV;55.758060455;100.0 +25/10/2020 02:06:48;U892.TI22_PV.F_CV;55.426109314;100.0 +25/10/2020 02:06:50;U892.TI22_PV.F_CV;55.624160767;100.0 +25/10/2020 02:06:53;U892.TI22_PV.F_CV;55.530887604;100.0 +25/10/2020 02:06:02;U892.TI291_PV.F_CV;196.100006104;100.0 +25/10/2020 02:06:09;U892.TI291_PV.F_CV;196.000000000;100.0 +25/10/2020 02:06:15;U892.TI291_PV.F_CV;196.199996948;100.0 +25/10/2020 02:06:20;U892.TI291_PV.F_CV;195.899993896;100.0 +25/10/2020 02:06:30;U892.TI291_PV.F_CV;196.199996948;100.0 +25/10/2020 02:06:35;U892.TI291_PV.F_CV;195.899993896;100.0 +25/10/2020 02:06:40;U892.TI291_PV.F_CV;196.199996948;100.0 +25/10/2020 02:06:46;U892.TI291_PV.F_CV;195.899993896;100.0 +25/10/2020 02:06:51;U892.TI291_PV.F_CV;196.000000000;100.0 +25/10/2020 02:06:53;U892.TI291_PV.F_CV;195.899993896;100.0 +25/10/2020 02:06:04;U892.TI35_PV.F_CV;156.777877808;100.0 +25/10/2020 02:06:41;U892.TI35_PV.F_CV;156.524856567;100.0 +25/10/2020 02:06:43;U892.TI35_PV.F_CV;156.669113159;100.0 +25/10/2020 02:06:53;U892.TI35_PV.F_CV;156.526229858;100.0 +25/10/2020 02:06:56;U892.TI35_PV.F_CV;156.667358398;100.0 +25/10/2020 02:06:19;U892.TI51_PV.F_CV;29.032491684;100.0 +25/10/2020 02:06:56;U892.TI51_PV.F_CV;28.922065735;100.0 +25/10/2020 02:06:08;U892.TI52_PV.F_CV;69.791252136;100.0 +25/10/2020 02:06:28;U892.TI52_PV.F_CV;70.482254028;100.0 +25/10/2020 02:06:30;U892.TI52_PV.F_CV;70.363639832;100.0 +25/10/2020 02:06:35;U892.TI52_PV.F_CV;70.457023621;100.0 +25/10/2020 02:06:41;U892.TI52_PV.F_CV;70.333503723;100.0 +25/10/2020 02:06:46;U892.TI52_PV.F_CV;70.754730225;100.0 +25/10/2020 02:06:48;U892.TI52_PV.F_CV;70.618026733;100.0 +25/10/2020 02:06:51;U892.TI52_PV.F_CV;70.725509644;100.0 +25/10/2020 02:06:56;U892.TI52_PV.F_CV;70.272460938;100.0 +25/10/2020 02:06:16;U892.TI53_PV.F_CV;40.159145355;100.0 +25/10/2020 02:06:32;U892.TI53_PV.F_CV;40.388671875;100.0 +25/10/2020 02:06:34;U892.TI53_PV.F_CV;40.240730286;100.0 +25/10/2020 02:06:42;U892.TI53_PV.F_CV;40.366451263;100.0 +25/10/2020 02:06:44;U892.TI53_PV.F_CV;40.261932373;100.0 +25/10/2020 02:06:52;U892.TI53_PV.F_CV;40.373718262;100.0 +25/10/2020 02:06:55;U892.TI53_PV.F_CV;40.232631683;100.0 +25/10/2020 02:06:57;U892.TI53_PV.F_CV;40.337966919;100.0 +25/10/2020 02:06:00;U892.TI54_PV.F_CV;24.244762421;100.0 +25/10/2020 02:06:08;U892.TI54_PV.F_CV;24.438230515;100.0 +25/10/2020 02:06:19;U892.TI54_PV.F_CV;24.211330414;100.0 +25/10/2020 02:06:21;U892.TI54_PV.F_CV;24.367418289;100.0 +25/10/2020 02:06:34;U892.TI54_PV.F_CV;24.649665833;100.0 +25/10/2020 02:06:37;U892.TI54_PV.F_CV;24.519704819;100.0 +25/10/2020 02:06:47;U892.TI54_PV.F_CV;24.666446686;100.0 +25/10/2020 02:06:51;U892.TI54_PV.F_CV;24.470651627;100.0 +25/10/2020 02:06:55;U892.TI54_PV.F_CV;24.573972702;100.0 +25/10/2020 02:06:01;U892.TI55_PV.F_CV;21.026802063;100.0 +25/10/2020 02:06:06;U892.TI55_PV.F_CV;21.182401657;100.0 +25/10/2020 02:06:12;U892.TI55_PV.F_CV;21.182401657;100.0 +25/10/2020 02:06:14;U892.TI55_PV.F_CV;21.026842117;100.0 +25/10/2020 02:06:19;U892.TI55_PV.F_CV;21.182586670;100.0 +25/10/2020 02:06:21;U892.TI55_PV.F_CV;21.119476318;100.0 +25/10/2020 02:06:24;U892.TI55_PV.F_CV;21.183908463;100.0 +25/10/2020 02:06:25;U892.TI55_PV.F_CV;21.154727936;100.0 +25/10/2020 02:06:26;U892.TI55_PV.F_CV;21.050701141;100.0 +25/10/2020 02:06:27;U892.TI55_PV.F_CV;21.016613007;100.0 +25/10/2020 02:06:29;U892.TI55_PV.F_CV;21.159843445;100.0 +25/10/2020 02:06:30;U892.TI55_PV.F_CV;21.186843872;100.0 +25/10/2020 02:06:31;U892.TI55_PV.F_CV;21.128458023;100.0 +25/10/2020 02:06:34;U892.TI55_PV.F_CV;21.174787521;100.0 +25/10/2020 02:06:37;U892.TI55_PV.F_CV;21.025955200;100.0 +25/10/2020 02:06:48;U892.TI55_PV.F_CV;21.000911713;100.0 +25/10/2020 02:06:49;U892.TI55_PV.F_CV;21.118082047;100.0 +25/10/2020 02:06:50;U892.TI55_PV.F_CV;21.173156738;100.0 +25/10/2020 02:06:51;U892.TI55_PV.F_CV;21.131204605;100.0 +25/10/2020 02:06:52;U892.TI55_PV.F_CV;20.975759506;100.0 +25/10/2020 02:06:53;U892.TI55_PV.F_CV;20.924825668;100.0 +25/10/2020 02:06:55;U892.TI55_PV.F_CV;20.985889435;100.0 +25/10/2020 02:06:59;U892.TI55_PV.F_CV;20.985889435;100.0 +25/10/2020 02:06:09;U892.TI61_PV.F_CV;22.173894882;100.0 +25/10/2020 02:06:11;U892.TI61_PV.F_CV;21.975839615;100.0 +25/10/2020 02:06:22;U892.TI61_PV.F_CV;22.088705063;100.0 +25/10/2020 02:06:26;U892.TI61_PV.F_CV;21.943080902;100.0 +25/10/2020 02:06:32;U892.TI61_PV.F_CV;22.066497803;100.0 +25/10/2020 02:06:34;U892.TI61_PV.F_CV;21.961938858;100.0 +25/10/2020 02:06:37;U892.TI61_PV.F_CV;22.060237885;100.0 +25/10/2020 02:06:40;U892.TI61_PV.F_CV;21.925443649;100.0 +25/10/2020 02:06:50;U892.TI61_PV.F_CV;22.177871704;100.0 +25/10/2020 02:06:01;U892.TI62_PV.F_CV;31.326217651;100.0 +25/10/2020 02:06:08;U892.TI62_PV.F_CV;31.435817719;100.0 +25/10/2020 02:06:35;U892.TI62_PV.F_CV;31.216825485;100.0 +25/10/2020 02:06:42;U892.TI62_PV.F_CV;31.415834427;100.0 +25/10/2020 02:06:51;U892.TI62_PV.F_CV;31.309175491;100.0 +25/10/2020 02:06:04;U892.TI63_PV.F_CV;32.078948975;100.0 +25/10/2020 02:06:07;U892.TI63_PV.F_CV;31.932815552;100.0 +25/10/2020 02:06:14;U892.TI63_PV.F_CV;32.036628723;100.0 +25/10/2020 02:06:24;U892.TI63_PV.F_CV;31.941080093;100.0 +25/10/2020 02:06:50;U892.TI63_PV.F_CV;32.058914185;100.0 +25/10/2020 02:06:58;U892.TI63_PV.F_CV;31.867332458;100.0 +25/10/2020 02:06:49;U892.TI64_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;U892.TI64_PV.F_CV;18.948644638;100.0 +25/10/2020 02:06:24;U892.TI64_PV.F_CV;18.728366852;100.0 +25/10/2020 02:06:38;U892.TI64_PV.F_CV;19.085803986;100.0 +25/10/2020 02:06:45;U892.TI64_PV.F_CV;18.717796326;100.0 +25/10/2020 02:06:48;U892.TI64_PV.F_CV;19.146940231;100.0 +25/10/2020 02:06:53;U892.TI64_PV.F_CV;18.754226685;100.0 +25/10/2020 02:06:55;U892.TI64_PV.F_CV;18.927181244;100.0 +25/10/2020 02:06:49;U892.TI64_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:06;U892.TI65_PV.F_CV;20.735998154;100.0 +25/10/2020 02:06:07;U892.TI65_PV.F_CV;20.779027939;100.0 +25/10/2020 02:06:10;U892.TI65_PV.F_CV;20.712684631;100.0 +25/10/2020 02:06:11;U892.TI65_PV.F_CV;20.744157791;100.0 +25/10/2020 02:06:12;U892.TI65_PV.F_CV;20.848932266;100.0 +25/10/2020 02:06:13;U892.TI65_PV.F_CV;20.883266449;100.0 +25/10/2020 02:06:15;U892.TI65_PV.F_CV;20.731758118;100.0 +25/10/2020 02:06:17;U892.TI65_PV.F_CV;20.703411102;100.0 +25/10/2020 02:06:19;U892.TI65_PV.F_CV;20.772365570;100.0 +25/10/2020 02:06:20;U892.TI65_PV.F_CV;20.866540909;100.0 +25/10/2020 02:06:22;U892.TI65_PV.F_CV;20.829174042;100.0 +25/10/2020 02:06:24;U892.TI65_PV.F_CV;20.731130600;100.0 +25/10/2020 02:06:25;U892.TI65_PV.F_CV;20.642969131;100.0 +25/10/2020 02:06:26;U892.TI65_PV.F_CV;20.614080429;100.0 +25/10/2020 02:06:27;U892.TI65_PV.F_CV;20.663656235;100.0 +25/10/2020 02:06:30;U892.TI65_PV.F_CV;20.624937057;100.0 +25/10/2020 02:06:33;U892.TI65_PV.F_CV;20.684099197;100.0 +25/10/2020 02:06:39;U892.TI65_PV.F_CV;20.684099197;100.0 +25/10/2020 02:06:40;U892.TI65_PV.F_CV;20.818073273;100.0 +25/10/2020 02:06:41;U892.TI65_PV.F_CV;20.873153687;100.0 +25/10/2020 02:06:43;U892.TI65_PV.F_CV;20.823331833;100.0 +25/10/2020 02:06:46;U892.TI65_PV.F_CV;20.634374619;100.0 +25/10/2020 02:06:48;U892.TI65_PV.F_CV;20.603691101;100.0 +25/10/2020 02:06:50;U892.TI65_PV.F_CV;20.672395706;100.0 +25/10/2020 02:06:51;U892.TI65_PV.F_CV;20.758186340;100.0 +25/10/2020 02:06:52;U892.TI65_PV.F_CV;20.786298752;100.0 +25/10/2020 02:06:55;U892.TI65_PV.F_CV;20.703916550;100.0 +25/10/2020 02:06:01;U892.TI71_PV.F_CV;18.239410400;100.0 +25/10/2020 02:06:02;U892.TI71_PV.F_CV;18.053905487;100.0 +25/10/2020 02:06:03;U892.TI71_PV.F_CV;18.288125992;100.0 +25/10/2020 02:06:04;U892.TI71_PV.F_CV;18.263692856;100.0 +25/10/2020 02:06:05;U892.TI71_PV.F_CV;18.315942764;100.0 +25/10/2020 02:06:06;U892.TI71_PV.F_CV;18.135015488;100.0 +25/10/2020 02:06:07;U892.TI71_PV.F_CV;18.165170670;100.0 +25/10/2020 02:06:08;U892.TI71_PV.F_CV;18.262506485;100.0 +25/10/2020 02:06:09;U892.TI71_PV.F_CV;18.462146759;100.0 +25/10/2020 02:06:10;U892.TI71_PV.F_CV;18.309131622;100.0 +25/10/2020 02:06:11;U892.TI71_PV.F_CV;18.470481873;100.0 +25/10/2020 02:06:12;U892.TI71_PV.F_CV;18.323638916;100.0 +25/10/2020 02:06:13;U892.TI71_PV.F_CV;18.261985779;100.0 +25/10/2020 02:06:15;U892.TI71_PV.F_CV;18.474025726;100.0 +25/10/2020 02:06:17;U892.TI71_PV.F_CV;18.349676132;100.0 +25/10/2020 02:06:18;U892.TI71_PV.F_CV;18.628244400;100.0 +25/10/2020 02:06:19;U892.TI71_PV.F_CV;18.605705261;100.0 +25/10/2020 02:06:20;U892.TI71_PV.F_CV;18.548494339;100.0 +25/10/2020 02:06:21;U892.TI71_PV.F_CV;18.350067139;100.0 +25/10/2020 02:06:22;U892.TI71_PV.F_CV;18.269300461;100.0 +25/10/2020 02:06:24;U892.TI71_PV.F_CV;18.499517441;100.0 +25/10/2020 02:06:25;U892.TI71_PV.F_CV;18.568899155;100.0 +25/10/2020 02:06:26;U892.TI71_PV.F_CV;18.586608887;100.0 +25/10/2020 02:06:28;U892.TI71_PV.F_CV;18.409173965;100.0 +25/10/2020 02:06:29;U892.TI71_PV.F_CV;18.370719910;100.0 +25/10/2020 02:06:30;U892.TI71_PV.F_CV;18.509700775;100.0 +25/10/2020 02:06:31;U892.TI71_PV.F_CV;18.606826782;100.0 +25/10/2020 02:06:32;U892.TI71_PV.F_CV;18.429693222;100.0 +25/10/2020 02:06:34;U892.TI71_PV.F_CV;18.335248947;100.0 +25/10/2020 02:06:35;U892.TI71_PV.F_CV;18.355743408;100.0 +25/10/2020 02:06:36;U892.TI71_PV.F_CV;18.222106934;100.0 +25/10/2020 02:06:39;U892.TI71_PV.F_CV;18.513483047;100.0 +25/10/2020 02:06:40;U892.TI71_PV.F_CV;18.480962753;100.0 +25/10/2020 02:06:41;U892.TI71_PV.F_CV;18.352481842;100.0 +25/10/2020 02:06:42;U892.TI71_PV.F_CV;18.518924713;100.0 +25/10/2020 02:06:43;U892.TI71_PV.F_CV;18.477048874;100.0 +25/10/2020 02:06:45;U892.TI71_PV.F_CV;18.145195007;100.0 +25/10/2020 02:06:46;U892.TI71_PV.F_CV;18.245784760;100.0 +25/10/2020 02:06:47;U892.TI71_PV.F_CV;18.471643448;100.0 +25/10/2020 02:06:49;U892.TI71_PV.F_CV;18.406911850;100.0 +25/10/2020 02:06:52;U892.TI71_PV.F_CV;18.237606049;100.0 +25/10/2020 02:06:53;U892.TI71_PV.F_CV;18.146274567;100.0 +25/10/2020 02:06:54;U892.TI71_PV.F_CV;18.377531052;100.0 +25/10/2020 02:06:55;U892.TI71_PV.F_CV;18.224155426;100.0 +25/10/2020 02:06:56;U892.TI71_PV.F_CV;18.155370712;100.0 +25/10/2020 02:06:57;U892.TI71_PV.F_CV;18.174495697;100.0 +25/10/2020 02:06:58;U892.TI71_PV.F_CV;18.384986877;100.0 +25/10/2020 02:06:59;U892.TI71_PV.F_CV;18.428873062;100.0 +25/10/2020 02:06:00;U892.TI72_PV.F_CV;21.001409531;100.0 +25/10/2020 02:06:01;U892.TI72_PV.F_CV;20.958827972;100.0 +25/10/2020 02:06:02;U892.TI72_PV.F_CV;20.867723465;100.0 +25/10/2020 02:06:03;U892.TI72_PV.F_CV;20.831888199;100.0 +25/10/2020 02:06:04;U892.TI72_PV.F_CV;20.856880188;100.0 +25/10/2020 02:06:05;U892.TI72_PV.F_CV;20.641933441;100.0 +25/10/2020 02:06:06;U892.TI72_PV.F_CV;20.840364456;100.0 +25/10/2020 02:06:07;U892.TI72_PV.F_CV;21.113513947;100.0 +25/10/2020 02:06:08;U892.TI72_PV.F_CV;21.061738968;100.0 +25/10/2020 02:06:09;U892.TI72_PV.F_CV;20.866214752;100.0 +25/10/2020 02:06:10;U892.TI72_PV.F_CV;21.093185425;100.0 +25/10/2020 02:06:11;U892.TI72_PV.F_CV;20.708774567;100.0 +25/10/2020 02:06:13;U892.TI72_PV.F_CV;21.003326416;100.0 +25/10/2020 02:06:15;U892.TI72_PV.F_CV;21.158292770;100.0 +25/10/2020 02:06:16;U892.TI72_PV.F_CV;20.751295090;100.0 +25/10/2020 02:06:17;U892.TI72_PV.F_CV;21.147527695;100.0 +25/10/2020 02:06:18;U892.TI72_PV.F_CV;21.130006790;100.0 +25/10/2020 02:06:19;U892.TI72_PV.F_CV;20.948808670;100.0 +25/10/2020 02:06:21;U892.TI72_PV.F_CV;20.657157898;100.0 +25/10/2020 02:06:22;U892.TI72_PV.F_CV;20.856107712;100.0 +25/10/2020 02:06:23;U892.TI72_PV.F_CV;20.985393524;100.0 +25/10/2020 02:06:24;U892.TI72_PV.F_CV;20.668214798;100.0 +25/10/2020 02:06:25;U892.TI72_PV.F_CV;20.517648697;100.0 +25/10/2020 02:06:26;U892.TI72_PV.F_CV;20.823797226;100.0 +25/10/2020 02:06:27;U892.TI72_PV.F_CV;20.745174408;100.0 +25/10/2020 02:06:28;U892.TI72_PV.F_CV;20.767763138;100.0 +25/10/2020 02:06:29;U892.TI72_PV.F_CV;20.877628326;100.0 +25/10/2020 02:06:30;U892.TI72_PV.F_CV;20.946653366;100.0 +25/10/2020 02:06:31;U892.TI72_PV.F_CV;20.810743332;100.0 +25/10/2020 02:06:32;U892.TI72_PV.F_CV;20.634561539;100.0 +25/10/2020 02:06:35;U892.TI72_PV.F_CV;20.832983017;100.0 +25/10/2020 02:06:36;U892.TI72_PV.F_CV;20.758199692;100.0 +25/10/2020 02:06:37;U892.TI72_PV.F_CV;20.720159531;100.0 +25/10/2020 02:06:38;U892.TI72_PV.F_CV;20.914796829;100.0 +25/10/2020 02:06:39;U892.TI72_PV.F_CV;20.762832642;100.0 +25/10/2020 02:06:40;U892.TI72_PV.F_CV;20.863245010;100.0 +25/10/2020 02:06:41;U892.TI72_PV.F_CV;21.049139023;100.0 +25/10/2020 02:06:42;U892.TI72_PV.F_CV;20.772293091;100.0 +25/10/2020 02:06:43;U892.TI72_PV.F_CV;20.862152100;100.0 +25/10/2020 02:06:44;U892.TI72_PV.F_CV;20.729293823;100.0 +25/10/2020 02:06:45;U892.TI72_PV.F_CV;20.835838318;100.0 +25/10/2020 02:06:46;U892.TI72_PV.F_CV;20.798719406;100.0 +25/10/2020 02:06:47;U892.TI72_PV.F_CV;20.835515976;100.0 +25/10/2020 02:06:48;U892.TI72_PV.F_CV;20.785909653;100.0 +25/10/2020 02:06:49;U892.TI72_PV.F_CV;20.643062592;100.0 +25/10/2020 02:06:50;U892.TI72_PV.F_CV;20.669662476;100.0 +25/10/2020 02:06:52;U892.TI72_PV.F_CV;20.397586823;100.0 +25/10/2020 02:06:53;U892.TI72_PV.F_CV;20.494569778;100.0 +25/10/2020 02:06:54;U892.TI72_PV.F_CV;20.739788055;100.0 +25/10/2020 02:06:55;U892.TI72_PV.F_CV;20.724046707;100.0 +25/10/2020 02:06:57;U892.TI72_PV.F_CV;20.570997238;100.0 +25/10/2020 02:06:58;U892.TI72_PV.F_CV;20.899135590;100.0 +25/10/2020 02:06:00;U892.TI73_PV.F_CV;20.296073914;100.0 +25/10/2020 02:06:02;U892.TI73_PV.F_CV;20.527770996;100.0 +25/10/2020 02:06:03;U892.TI73_PV.F_CV;20.189483643;100.0 +25/10/2020 02:06:05;U892.TI73_PV.F_CV;20.305187225;100.0 +25/10/2020 02:06:06;U892.TI73_PV.F_CV;20.427106857;100.0 +25/10/2020 02:06:07;U892.TI73_PV.F_CV;20.379058838;100.0 +25/10/2020 02:06:09;U892.TI73_PV.F_CV;20.193796158;100.0 +25/10/2020 02:06:10;U892.TI73_PV.F_CV;20.425870895;100.0 +25/10/2020 02:06:11;U892.TI73_PV.F_CV;20.271934509;100.0 +25/10/2020 02:06:12;U892.TI73_PV.F_CV;20.506324768;100.0 +25/10/2020 02:06:13;U892.TI73_PV.F_CV;20.545465469;100.0 +25/10/2020 02:06:14;U892.TI73_PV.F_CV;20.315603256;100.0 +25/10/2020 02:06:15;U892.TI73_PV.F_CV;20.465465546;100.0 +25/10/2020 02:06:16;U892.TI73_PV.F_CV;20.380300522;100.0 +25/10/2020 02:06:17;U892.TI73_PV.F_CV;20.458953857;100.0 +25/10/2020 02:06:18;U892.TI73_PV.F_CV;20.232278824;100.0 +25/10/2020 02:06:19;U892.TI73_PV.F_CV;20.264848709;100.0 +25/10/2020 02:06:20;U892.TI73_PV.F_CV;20.375106812;100.0 +25/10/2020 02:06:22;U892.TI73_PV.F_CV;20.310464859;100.0 +25/10/2020 02:06:23;U892.TI73_PV.F_CV;20.402660370;100.0 +25/10/2020 02:06:24;U892.TI73_PV.F_CV;20.231418610;100.0 +25/10/2020 02:06:25;U892.TI73_PV.F_CV;20.115608215;100.0 +25/10/2020 02:06:26;U892.TI73_PV.F_CV;20.308698654;100.0 +25/10/2020 02:06:27;U892.TI73_PV.F_CV;20.213409424;100.0 +25/10/2020 02:06:28;U892.TI73_PV.F_CV;20.347402573;100.0 +25/10/2020 02:06:29;U892.TI73_PV.F_CV;20.570541382;100.0 +25/10/2020 02:06:30;U892.TI73_PV.F_CV;20.209707260;100.0 +25/10/2020 02:06:31;U892.TI73_PV.F_CV;19.973228455;100.0 +25/10/2020 02:06:32;U892.TI73_PV.F_CV;20.183898926;100.0 +25/10/2020 02:06:33;U892.TI73_PV.F_CV;20.137763977;100.0 +25/10/2020 02:06:34;U892.TI73_PV.F_CV;20.390613556;100.0 +25/10/2020 02:06:36;U892.TI73_PV.F_CV;20.329080582;100.0 +25/10/2020 02:06:37;U892.TI73_PV.F_CV;20.449081421;100.0 +25/10/2020 02:06:39;U892.TI73_PV.F_CV;20.211660385;100.0 +25/10/2020 02:06:40;U892.TI73_PV.F_CV;20.335083008;100.0 +25/10/2020 02:06:41;U892.TI73_PV.F_CV;20.414184570;100.0 +25/10/2020 02:06:42;U892.TI73_PV.F_CV;20.388967514;100.0 +25/10/2020 02:06:44;U892.TI73_PV.F_CV;20.504894257;100.0 +25/10/2020 02:06:46;U892.TI73_PV.F_CV;20.449523926;100.0 +25/10/2020 02:06:47;U892.TI73_PV.F_CV;20.236867905;100.0 +25/10/2020 02:06:48;U892.TI73_PV.F_CV;20.214866638;100.0 +25/10/2020 02:06:49;U892.TI73_PV.F_CV;20.332105637;100.0 +25/10/2020 02:06:50;U892.TI73_PV.F_CV;20.249689102;100.0 +25/10/2020 02:06:51;U892.TI73_PV.F_CV;20.383962631;100.0 +25/10/2020 02:06:52;U892.TI73_PV.F_CV;20.407993317;100.0 +25/10/2020 02:06:53;U892.TI73_PV.F_CV;20.486555099;100.0 +25/10/2020 02:06:54;U892.TI73_PV.F_CV;20.287689209;100.0 +25/10/2020 02:06:55;U892.TI73_PV.F_CV;20.450111389;100.0 +25/10/2020 02:06:56;U892.TI73_PV.F_CV;20.529155731;100.0 +25/10/2020 02:06:57;U892.TI73_PV.F_CV;20.429456711;100.0 +25/10/2020 02:06:59;U892.TI73_PV.F_CV;20.494903564;100.0 +25/10/2020 02:06:00;U892.TI81_PV.F_CV;7.866918564;100.0 +25/10/2020 02:06:01;U892.TI81_PV.F_CV;7.956391811;100.0 +25/10/2020 02:06:02;U892.TI81_PV.F_CV;8.339950562;100.0 +25/10/2020 02:06:03;U892.TI81_PV.F_CV;8.514786720;100.0 +25/10/2020 02:06:05;U892.TI81_PV.F_CV;8.738421440;100.0 +25/10/2020 02:06:06;U892.TI81_PV.F_CV;8.779822350;100.0 +25/10/2020 02:06:10;U892.TI81_PV.F_CV;8.529584885;100.0 +25/10/2020 02:06:12;U892.TI81_PV.F_CV;8.215176582;100.0 +25/10/2020 02:06:13;U892.TI81_PV.F_CV;7.868813038;100.0 +25/10/2020 02:06:14;U892.TI81_PV.F_CV;7.755316734;100.0 +25/10/2020 02:06:15;U892.TI81_PV.F_CV;7.045805931;100.0 +25/10/2020 02:06:16;U892.TI81_PV.F_CV;6.813313484;100.0 +25/10/2020 02:06:17;U892.TI81_PV.F_CV;6.657130718;100.0 +25/10/2020 02:06:18;U892.TI81_PV.F_CV;6.417024612;100.0 +25/10/2020 02:06:19;U892.TI81_PV.F_CV;6.338346481;100.0 +25/10/2020 02:06:20;U892.TI81_PV.F_CV;5.958325386;100.0 +25/10/2020 02:06:21;U892.TI81_PV.F_CV;5.784647465;100.0 +25/10/2020 02:06:22;U892.TI81_PV.F_CV;5.727737427;100.0 +25/10/2020 02:06:23;U892.TI81_PV.F_CV;5.776320934;100.0 +25/10/2020 02:06:26;U892.TI81_PV.F_CV;6.145646095;100.0 +25/10/2020 02:06:27;U892.TI81_PV.F_CV;6.182188988;100.0 +25/10/2020 02:06:28;U892.TI81_PV.F_CV;6.463091373;100.0 +25/10/2020 02:06:29;U892.TI81_PV.F_CV;6.555138111;100.0 +25/10/2020 02:06:30;U892.TI81_PV.F_CV;6.926899433;100.0 +25/10/2020 02:06:31;U892.TI81_PV.F_CV;7.177742481;100.0 +25/10/2020 02:06:32;U892.TI81_PV.F_CV;7.259939194;100.0 +25/10/2020 02:06:33;U892.TI81_PV.F_CV;7.690265179;100.0 +25/10/2020 02:06:36;U892.TI81_PV.F_CV;8.129705429;100.0 +25/10/2020 02:06:37;U892.TI81_PV.F_CV;8.176965714;100.0 +25/10/2020 02:06:38;U892.TI81_PV.F_CV;8.369572639;100.0 +25/10/2020 02:06:39;U892.TI81_PV.F_CV;8.457262039;100.0 +25/10/2020 02:06:40;U892.TI81_PV.F_CV;8.385995865;100.0 +25/10/2020 02:06:41;U892.TI81_PV.F_CV;8.126482964;100.0 +25/10/2020 02:06:42;U892.TI81_PV.F_CV;8.041446686;100.0 +25/10/2020 02:06:43;U892.TI81_PV.F_CV;7.769580841;100.0 +25/10/2020 02:06:44;U892.TI81_PV.F_CV;7.588336468;100.0 +25/10/2020 02:06:45;U892.TI81_PV.F_CV;7.528945923;100.0 +25/10/2020 02:06:46;U892.TI81_PV.F_CV;7.307788849;100.0 +25/10/2020 02:06:47;U892.TI81_PV.F_CV;7.235320091;100.0 +25/10/2020 02:06:49;U892.TI81_PV.F_CV;6.571564674;100.0 +25/10/2020 02:06:50;U892.TI81_PV.F_CV;6.456218243;100.0 +25/10/2020 02:06:51;U892.TI81_PV.F_CV;6.064181805;100.0 +25/10/2020 02:06:52;U892.TI81_PV.F_CV;5.886567116;100.0 +25/10/2020 02:06:53;U892.TI81_PV.F_CV;5.768366337;100.0 +25/10/2020 02:06:54;U892.TI81_PV.F_CV;5.587938309;100.0 +25/10/2020 02:06:55;U892.TI81_PV.F_CV;5.528815269;100.0 +25/10/2020 02:06:57;U892.TI81_PV.F_CV;5.835985184;100.0 +25/10/2020 02:06:58;U892.TI81_PV.F_CV;5.879024029;100.0 +25/10/2020 02:06:59;U892.TI81_PV.F_CV;6.229286671;100.0 +25/10/2020 02:06:26;U892.TRZ01_PV.F_CV;155.830596924;100.0 +25/10/2020 02:06:03;U892.TRZ02_PV.F_CV;10.230479240;100.0 +25/10/2020 02:06:06;U892.TRZ02_PV.F_CV;10.482379913;100.0 +25/10/2020 02:06:09;U892.TRZ02_PV.F_CV;10.573300362;100.0 +25/10/2020 02:06:14;U892.TRZ02_PV.F_CV;10.476081848;100.0 +25/10/2020 02:06:17;U892.TRZ02_PV.F_CV;10.154504776;100.0 +25/10/2020 02:06:22;U892.TRZ02_PV.F_CV;9.329058647;100.0 +25/10/2020 02:06:24;U892.TRZ02_PV.F_CV;9.090112686;100.0 +25/10/2020 02:06:25;U892.TRZ02_PV.F_CV;9.033361435;100.0 +25/10/2020 02:06:29;U892.TRZ02_PV.F_CV;9.121891022;100.0 +25/10/2020 02:06:32;U892.TRZ02_PV.F_CV;9.455657959;100.0 +25/10/2020 02:06:37;U892.TRZ02_PV.F_CV;10.367697716;100.0 +25/10/2020 02:06:39;U892.TRZ02_PV.F_CV;10.539896965;100.0 +25/10/2020 02:06:45;U892.TRZ02_PV.F_CV;10.445637703;100.0 +25/10/2020 02:06:49;U892.TRZ02_PV.F_CV;10.016135216;100.0 +25/10/2020 02:06:55;U892.TRZ02_PV.F_CV;9.274721146;100.0 +25/10/2020 02:06:57;U892.TRZ02_PV.F_CV;9.156586647;100.0 +25/10/2020 02:06:49;U892.TRZ02_SP.F_CV;10.000000000;100.0 +25/10/2020 02:06:01;U892.TRZ03_PV.F_CV;44.000000000;100.0 +25/10/2020 02:06:06;U892.TRZ03_PV.F_CV;44.000000000;100.0 +25/10/2020 02:06:07;U892.TRZ03_PV.F_CV;43.000000000;100.0 +25/10/2020 02:06:11;U892.TRZ03_PV.F_CV;42.000000000;100.0 +25/10/2020 02:06:23;U892.TRZ03_PV.F_CV;42.000000000;100.0 +25/10/2020 02:06:24;U892.TRZ03_PV.F_CV;43.000000000;100.0 +25/10/2020 02:06:28;U892.TRZ03_PV.F_CV;44.000000000;100.0 +25/10/2020 02:06:33;U892.TRZ03_PV.F_CV;44.000000000;100.0 +25/10/2020 02:06:34;U892.TRZ03_PV.F_CV;45.000000000;100.0 +25/10/2020 02:06:41;U892.TRZ03_PV.F_CV;45.000000000;100.0 +25/10/2020 02:06:42;U892.TRZ03_PV.F_CV;44.000000000;100.0 +25/10/2020 02:06:46;U892.TRZ03_PV.F_CV;43.000000000;100.0 +25/10/2020 02:06:49;U892.TRZ03_PV.F_CV;42.000000000;100.0 +25/10/2020 02:06:24;U892.WI03_PV.F_CV;4500.131835938;100.0 +25/10/2020 02:06:13;U892.WI04_PV.F_CV;1610.868896484;100.0 +25/10/2020 02:06:49;U892.WI05_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;U958.PI05_PV.F_CV;0.996064842;100.0 +25/10/2020 02:06:04;U958.PI13_PV.F_CV;165.740737915;100.0 +25/10/2020 02:06:05;U958.PI13_PV.F_CV;165.625000000;100.0 +25/10/2020 02:06:06;U958.PI13_PV.F_CV;165.740737915;100.0 +25/10/2020 02:06:11;U958.PI13_PV.F_CV;165.509262085;100.0 +25/10/2020 02:06:13;U958.PI13_PV.F_CV;165.740737915;100.0 +25/10/2020 02:06:14;U958.PI13_PV.F_CV;165.567123413;100.0 +25/10/2020 02:06:19;U958.PI13_PV.F_CV;165.451385498;100.0 +25/10/2020 02:06:20;U958.PI13_PV.F_CV;165.277770996;100.0 +25/10/2020 02:06:24;U958.PI13_PV.F_CV;165.625000000;100.0 +25/10/2020 02:06:28;U958.PI13_PV.F_CV;165.219909668;100.0 +25/10/2020 02:06:34;U958.PI13_PV.F_CV;165.798614502;100.0 +25/10/2020 02:06:36;U958.PI13_PV.F_CV;165.219909668;100.0 +25/10/2020 02:06:38;U958.PI13_PV.F_CV;165.625000000;100.0 +25/10/2020 02:06:40;U958.PI13_PV.F_CV;165.740737915;100.0 +25/10/2020 02:06:43;U958.PI13_PV.F_CV;165.625000000;100.0 +25/10/2020 02:06:47;U958.PI13_PV.F_CV;165.798614502;100.0 +25/10/2020 02:06:52;U958.PI13_PV.F_CV;165.567123413;100.0 +25/10/2020 02:06:53;U958.PI13_PV.F_CV;165.798614502;100.0 +25/10/2020 02:06:56;U958.PI13_PV.F_CV;165.509262085;100.0 +25/10/2020 02:06:58;U958.PI13_PV.F_CV;165.740737915;100.0 +25/10/2020 02:06:00;U958.TC22_PV.F_CV;109.900001526;100.0 +25/10/2020 02:06:01;U958.TC22_PV.F_CV;110.300003052;100.0 +25/10/2020 02:06:02;U958.TC22_PV.F_CV;109.900001526;100.0 +25/10/2020 02:06:03;U958.TC22_PV.F_CV;110.300003052;100.0 +25/10/2020 02:06:04;U958.TC22_PV.F_CV;109.900001526;100.0 +25/10/2020 02:06:07;U958.TC22_PV.F_CV;110.300003052;100.0 +25/10/2020 02:06:09;U958.TC22_PV.F_CV;109.900001526;100.0 +25/10/2020 02:06:16;U958.TC22_PV.F_CV;110.300003052;100.0 +25/10/2020 02:06:23;U958.TC22_PV.F_CV;109.900001526;100.0 +25/10/2020 02:06:25;U958.TC22_PV.F_CV;110.300003052;100.0 +25/10/2020 02:06:28;U958.TC22_PV.F_CV;109.900001526;100.0 +25/10/2020 02:06:29;U958.TC22_PV.F_CV;110.300003052;100.0 +25/10/2020 02:06:30;U958.TC22_PV.F_CV;109.900001526;100.0 +25/10/2020 02:06:35;U958.TC22_PV.F_CV;110.300003052;100.0 +25/10/2020 02:06:38;U958.TC22_PV.F_CV;109.900001526;100.0 +25/10/2020 02:06:41;U958.TC22_PV.F_CV;110.300003052;100.0 +25/10/2020 02:06:48;U958.TC22_PV.F_CV;109.900001526;100.0 +25/10/2020 02:06:49;U958.TC22_PV.F_CV;110.300003052;100.0 +25/10/2020 02:06:53;U958.TC22_PV.F_CV;109.900001526;100.0 +25/10/2020 02:06:55;U958.TC22_PV.F_CV;110.300003052;100.0 +25/10/2020 02:06:57;U958.TC22_PV.F_CV;109.900001526;100.0 +25/10/2020 02:06:59;U958.TC22_PV.F_CV;110.300003052;100.0 +25/10/2020 02:06:30;U958.TC23_PV.F_CV;103.500000000;100.0 +25/10/2020 02:06:06;U958.TC32_PV.F_CV;143.800003052;100.0 +25/10/2020 02:06:59;U958.TC33_PV.F_CV;100.099998474;100.0 +25/10/2020 02:06:23;U958.TI110_PV.F_CV;53.000000000;100.0 +25/10/2020 02:06:58;U958.TI111_PV.F_CV;53.000000000;100.0 +25/10/2020 02:06:27;U958.TI12_PV.F_CV;13.399999619;100.0 +25/10/2020 02:06:20;U958.TI20_PV.F_CV;119.000000000;100.0 +25/10/2020 02:06:12;U958.TI21_PV.F_CV;111.000000000;100.0 +25/10/2020 02:06:02;U958.TI30_PV.F_CV;157.000000000;100.0 +25/10/2020 02:06:03;U958.TI30_PV.F_CV;158.000000000;100.0 +25/10/2020 02:06:06;U958.TI30_PV.F_CV;157.000000000;100.0 +25/10/2020 02:06:53;U958.TI30_PV.F_CV;157.000000000;100.0 +25/10/2020 02:06:54;U958.TI30_PV.F_CV;158.000000000;100.0 +25/10/2020 02:06:58;U958.TI30_PV.F_CV;157.000000000;100.0 +25/10/2020 02:06:03;U958.TI31_PV.F_CV;117.000000000;100.0 +25/10/2020 02:06:22;U958.TI31_PV.F_CV;117.000000000;100.0 +25/10/2020 02:06:23;U958.TI31_PV.F_CV;118.000000000;100.0 +25/10/2020 02:06:30;U958.TI31_PV.F_CV;118.000000000;100.0 +25/10/2020 02:06:31;U958.TI31_PV.F_CV;117.000000000;100.0 +25/10/2020 02:06:35;U958.TI31_PV.F_CV;118.000000000;100.0 +25/10/2020 02:06:57;U958.TI31_PV.F_CV;118.000000000;100.0 +25/10/2020 02:06:58;U958.TI31_PV.F_CV;117.000000000;100.0 +25/10/2020 02:06:44;U987.FC08_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;U987.FC08_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;U987.FI02_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;U987.FQ02_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;U987.LI07_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;U987.LI08_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;U987.PC36_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;U987.PC36_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;U987.TI15_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;UCHP.U755_PC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;UCHP.U755_PC01_PV.F_CV;-0.036168981;100.0 +25/10/2020 02:06:27;UCHP.U755_PI17_PV.F_CV;0.002170139;100.0 +25/10/2020 02:06:38;UCHP.U755_TC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;UCHP.U755_TC01_PV.F_CV;9.078413963;100.0 +25/10/2020 02:06:14;UCHP.U755_TC01_PV.F_CV;9.223090172;100.0 +25/10/2020 02:06:34;UCHP.U755_TC01_PV.F_CV;9.097284317;100.0 +25/10/2020 02:06:51;UCHP.U755_TC01_PV.F_CV;9.223090172;100.0 +25/10/2020 02:06:59;UCHP.U755_TC01_PV.F_CV;9.085648537;100.0 +25/10/2020 02:06:38;UCHP.U755_TI15_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;UCHP.U775_PC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;UCHP.U775_PC01_PV.F_CV;0.390625000;100.0 +25/10/2020 02:06:49;UCHP.U775_PI02_PV.F_CV;46.486183167;100.0 +25/10/2020 02:06:38;UCHP.U775_TC01_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:02;UCHP.U775_TC01_PV.F_CV;11.250814438;100.0 +25/10/2020 02:06:06;UCHP.U775_TC01_PV.F_CV;11.390969276;100.0 +25/10/2020 02:06:17;UCHP.U775_TC01_PV.F_CV;11.094835281;100.0 +25/10/2020 02:06:18;UCHP.U775_TC01_PV.F_CV;11.311848640;100.0 +25/10/2020 02:06:37;UCHP.U775_TC01_PV.F_CV;11.035558701;100.0 +25/10/2020 02:06:00;UCHP.U775_TI02A_PV.F_CV;14.000000000;100.0 +25/10/2020 02:06:07;UCHP.U775_TI02A_PV.F_CV;14.000000000;100.0 +25/10/2020 02:06:08;UCHP.U775_TI02A_PV.F_CV;15.000000000;100.0 +25/10/2020 02:06:12;UCHP.U775_TI02A_PV.F_CV;14.000000000;100.0 +25/10/2020 02:06:16;UCHP.U775_TI02A_PV.F_CV;14.000000000;100.0 +25/10/2020 02:06:17;UCHP.U775_TI02A_PV.F_CV;15.000000000;100.0 +25/10/2020 02:06:18;UCHP.U775_TI02A_PV.F_CV;14.000000000;100.0 +25/10/2020 02:06:23;UCHP.U775_TI02A_PV.F_CV;14.000000000;100.0 +25/10/2020 02:06:24;UCHP.U775_TI02A_PV.F_CV;15.000000000;100.0 +25/10/2020 02:06:35;UCHP.U775_TI02A_PV.F_CV;15.000000000;100.0 +25/10/2020 02:06:36;UCHP.U775_TI02A_PV.F_CV;14.000000000;100.0 +25/10/2020 02:06:40;UCHP.U775_TI02A_PV.F_CV;15.000000000;100.0 +25/10/2020 02:06:44;UCHP.U775_TI02A_PV.F_CV;14.000000000;100.0 +25/10/2020 02:06:48;UCHP.U775_TI02A_PV.F_CV;15.000000000;100.0 +25/10/2020 02:06:55;UCHP.U775_TI02A_PV.F_CV;15.000000000;100.0 +25/10/2020 02:06:56;UCHP.U775_TI02A_PV.F_CV;14.000000000;100.0 +25/10/2020 02:06:38;UCHP.U784_PC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;UCHP.U784_PC01_PV.F_CV;7.725694656;100.0 +25/10/2020 02:06:38;UCHP.U784_TC01_OP.F_CV;20.130630493;100.0 +25/10/2020 02:06:10;UCHP.U784_TC01_PV.F_CV;14.060691833;100.0 +25/10/2020 02:06:12;UCHP.U784_TC01_PV.F_CV;13.934100151;100.0 +25/10/2020 02:06:13;UCHP.U784_TC01_PV.F_CV;14.105902672;100.0 +25/10/2020 02:06:33;UCHP.U784_TC01_PV.F_CV;13.976727486;100.0 +25/10/2020 02:06:36;UCHP.U784_TC01_PV.F_CV;14.123987198;100.0 +25/10/2020 02:06:38;UCHP.U784_TC01_PV.F_CV;13.970269203;100.0 +25/10/2020 02:06:39;UCHP.U784_TC01_PV.F_CV;14.114945412;100.0 +25/10/2020 02:06:41;UCHP.U784_TC01_PV.F_CV;13.961226463;100.0 +25/10/2020 02:06:43;UCHP.U784_TC01_PV.F_CV;14.105902672;100.0 +25/10/2020 02:06:44;UCHP.U784_TC01_PV.F_CV;13.970269203;100.0 +25/10/2020 02:06:53;UCHP.U784_TC01_PV.F_CV;14.105902672;100.0 +25/10/2020 02:06:24;UCHP.U784_TI201_PV.F_CV;14.000000000;100.0 +25/10/2020 02:06:54;UCHP.U784_TI201_PV.F_CV;14.000000000;100.0 +25/10/2020 02:06:55;UCHP.U784_TI201_PV.F_CV;15.000000000;100.0 +25/10/2020 02:06:56;UCHP.U784_TI201_PV.F_CV;14.000000000;100.0 +25/10/2020 02:06:53;UCHP.U786_F01.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;UCHP.U786_F11.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;UCHP.U786_F12.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;UCHP.U786_F23.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;UCHP.U786_F24.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;UCHP.U786_F25.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;UCHP.U786_HEV01.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;UCHP.U786_HEV02.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;UCHP.U786_HEV03.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;UCHP.U786_HEV04.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;UCHP.U786_HEV05.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;UCHP.U786_HEV06.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;UCHP.U786_HEV07.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;UCHP.U786_HEV15.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;UCHP.U786_N786.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;UCHP.U786_PC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;UCHP.U786_PC01_PV.F_CV;6.828021049;100.0 +25/10/2020 02:06:20;UCHP.U786_PI02_PV.F_CV;-3.982807636;100.0 +25/10/2020 02:06:53;UCHP.U786_PR786.F_CV;0.000000000;0.0 +25/10/2020 02:06:01;UCHP.U786_TC01_OP.F_CV;77.376853943;100.0 +25/10/2020 02:06:06;UCHP.U786_TC01_OP.F_CV;77.319335938;100.0 +25/10/2020 02:06:13;UCHP.U786_TC01_OP.F_CV;77.449798584;100.0 +25/10/2020 02:06:14;UCHP.U786_TC01_OP.F_CV;77.515388489;100.0 +25/10/2020 02:06:16;UCHP.U786_TC01_OP.F_CV;77.292121887;100.0 +25/10/2020 02:06:18;UCHP.U786_TC01_OP.F_CV;77.365844727;100.0 +25/10/2020 02:06:20;UCHP.U786_TC01_OP.F_CV;77.291046143;100.0 +25/10/2020 02:06:26;UCHP.U786_TC01_OP.F_CV;77.411010742;100.0 +25/10/2020 02:06:31;UCHP.U786_TC01_OP.F_CV;77.136245728;100.0 +25/10/2020 02:06:32;UCHP.U786_TC01_OP.F_CV;77.328376770;100.0 +25/10/2020 02:06:36;UCHP.U786_TC01_OP.F_CV;77.391014099;100.0 +25/10/2020 02:06:48;UCHP.U786_TC01_OP.F_CV;77.278427124;100.0 +25/10/2020 02:06:51;UCHP.U786_TC01_OP.F_CV;77.344009399;100.0 +25/10/2020 02:06:57;UCHP.U786_TC01_OP.F_CV;77.170303345;100.0 +25/10/2020 02:06:58;UCHP.U786_TC01_OP.F_CV;77.402992249;100.0 +25/10/2020 02:06:43;UCHP.U786_TC01_PV.F_CV;75.107055664;100.0 +25/10/2020 02:06:38;UCHP.U786_TC02_PV.F_CV;80.027488708;100.0 +25/10/2020 02:06:00;UCHP.U786_TC11_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;UCHP.U786_TC11_OP.F_CV;0.133584976;100.0 +25/10/2020 02:06:02;UCHP.U786_TC11_OP.F_CV;1.355911255;100.0 +25/10/2020 02:06:04;UCHP.U786_TC11_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;UCHP.U786_TC11_OP.F_CV;2.124209404;100.0 +25/10/2020 02:06:07;UCHP.U786_TC11_OP.F_CV;1.430083275;100.0 +25/10/2020 02:06:08;UCHP.U786_TC11_OP.F_CV;0.301990509;100.0 +25/10/2020 02:06:09;UCHP.U786_TC11_OP.F_CV;3.550361633;100.0 +25/10/2020 02:06:10;UCHP.U786_TC11_OP.F_CV;2.423137665;100.0 +25/10/2020 02:06:11;UCHP.U786_TC11_OP.F_CV;0.282266617;100.0 +25/10/2020 02:06:12;UCHP.U786_TC11_OP.F_CV;2.011396408;100.0 +25/10/2020 02:06:13;UCHP.U786_TC11_OP.F_CV;1.823297501;100.0 +25/10/2020 02:06:14;UCHP.U786_TC11_OP.F_CV;3.841855049;100.0 +25/10/2020 02:06:15;UCHP.U786_TC11_OP.F_CV;4.740301132;100.0 +25/10/2020 02:06:16;UCHP.U786_TC11_OP.F_CV;4.444379807;100.0 +25/10/2020 02:06:17;UCHP.U786_TC11_OP.F_CV;1.617137909;100.0 +25/10/2020 02:06:18;UCHP.U786_TC11_OP.F_CV;3.237421989;100.0 +25/10/2020 02:06:19;UCHP.U786_TC11_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:20;UCHP.U786_TC11_OP.F_CV;3.621095657;100.0 +25/10/2020 02:06:21;UCHP.U786_TC11_OP.F_CV;0.828908920;100.0 +25/10/2020 02:06:22;UCHP.U786_TC11_OP.F_CV;2.883658409;100.0 +25/10/2020 02:06:23;UCHP.U786_TC11_OP.F_CV;2.623122215;100.0 +25/10/2020 02:06:24;UCHP.U786_TC11_OP.F_CV;0.372776985;100.0 +25/10/2020 02:06:25;UCHP.U786_TC11_OP.F_CV;1.631547928;100.0 +25/10/2020 02:06:27;UCHP.U786_TC11_OP.F_CV;4.403087616;100.0 +25/10/2020 02:06:28;UCHP.U786_TC11_OP.F_CV;2.442756653;100.0 +25/10/2020 02:06:29;UCHP.U786_TC11_OP.F_CV;5.111768723;100.0 +25/10/2020 02:06:30;UCHP.U786_TC11_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;UCHP.U786_TC11_OP.F_CV;0.071976662;100.0 +25/10/2020 02:06:32;UCHP.U786_TC11_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;UCHP.U786_TC11_OP.F_CV;2.154047012;100.0 +25/10/2020 02:06:34;UCHP.U786_TC11_OP.F_CV;3.376284599;100.0 +25/10/2020 02:06:37;UCHP.U786_TC11_OP.F_CV;2.596443176;100.0 +25/10/2020 02:06:38;UCHP.U786_TC11_OP.F_CV;4.434219360;100.0 +25/10/2020 02:06:39;UCHP.U786_TC11_OP.F_CV;2.329499245;100.0 +25/10/2020 02:06:40;UCHP.U786_TC11_OP.F_CV;6.011714935;100.0 +25/10/2020 02:06:41;UCHP.U786_TC11_OP.F_CV;3.582054138;100.0 +25/10/2020 02:06:42;UCHP.U786_TC11_OP.F_CV;6.361370087;100.0 +25/10/2020 02:06:43;UCHP.U786_TC11_OP.F_CV;5.342436790;100.0 +25/10/2020 02:06:44;UCHP.U786_TC11_OP.F_CV;3.527687073;100.0 +25/10/2020 02:06:46;UCHP.U786_TC11_OP.F_CV;5.829625130;100.0 +25/10/2020 02:06:47;UCHP.U786_TC11_OP.F_CV;4.122667313;100.0 +25/10/2020 02:06:48;UCHP.U786_TC11_OP.F_CV;7.263271332;100.0 +25/10/2020 02:06:49;UCHP.U786_TC11_OP.F_CV;8.125457764;100.0 +25/10/2020 02:06:50;UCHP.U786_TC11_OP.F_CV;5.226682663;100.0 +25/10/2020 02:06:51;UCHP.U786_TC11_OP.F_CV;2.614253998;100.0 +25/10/2020 02:06:52;UCHP.U786_TC11_OP.F_CV;4.452604294;100.0 +25/10/2020 02:06:53;UCHP.U786_TC11_OP.F_CV;5.458276749;100.0 +25/10/2020 02:06:54;UCHP.U786_TC11_OP.F_CV;5.669187546;100.0 +25/10/2020 02:06:55;UCHP.U786_TC11_OP.F_CV;5.264973640;100.0 +25/10/2020 02:06:56;UCHP.U786_TC11_OP.F_CV;6.016813278;100.0 +25/10/2020 02:06:57;UCHP.U786_TC11_OP.F_CV;3.659061432;100.0 +25/10/2020 02:06:58;UCHP.U786_TC11_OP.F_CV;0.722105980;100.0 +25/10/2020 02:06:59;UCHP.U786_TC11_OP.F_CV;6.104684830;100.0 +25/10/2020 02:06:36;UCHP.U786_TC11_PV.F_CV;77.790435791;100.0 +25/10/2020 02:06:51;UCHP.U786_TC11_PV.F_CV;77.688423157;100.0 +25/10/2020 02:06:00;UCHP.U786_TC12_OP.F_CV;15.675130844;100.0 +25/10/2020 02:06:01;UCHP.U786_TC12_OP.F_CV;17.042915344;100.0 +25/10/2020 02:06:02;UCHP.U786_TC12_OP.F_CV;18.518728256;100.0 +25/10/2020 02:06:03;UCHP.U786_TC12_OP.F_CV;17.969913483;100.0 +25/10/2020 02:06:04;UCHP.U786_TC12_OP.F_CV;16.552824020;100.0 +25/10/2020 02:06:05;UCHP.U786_TC12_OP.F_CV;16.147537231;100.0 +25/10/2020 02:06:06;UCHP.U786_TC12_OP.F_CV;17.623113632;100.0 +25/10/2020 02:06:07;UCHP.U786_TC12_OP.F_CV;18.267711639;100.0 +25/10/2020 02:06:08;UCHP.U786_TC12_OP.F_CV;16.706056595;100.0 +25/10/2020 02:06:09;UCHP.U786_TC12_OP.F_CV;20.642011642;100.0 +25/10/2020 02:06:10;UCHP.U786_TC12_OP.F_CV;19.370399475;100.0 +25/10/2020 02:06:11;UCHP.U786_TC12_OP.F_CV;16.036256790;100.0 +25/10/2020 02:06:12;UCHP.U786_TC12_OP.F_CV;18.886869431;100.0 +25/10/2020 02:06:13;UCHP.U786_TC12_OP.F_CV;18.265401840;100.0 +25/10/2020 02:06:14;UCHP.U786_TC12_OP.F_CV;20.428892136;100.0 +25/10/2020 02:06:15;UCHP.U786_TC12_OP.F_CV;24.329746246;100.0 +25/10/2020 02:06:16;UCHP.U786_TC12_OP.F_CV;21.828048706;100.0 +25/10/2020 02:06:17;UCHP.U786_TC12_OP.F_CV;18.277729034;100.0 +25/10/2020 02:06:18;UCHP.U786_TC12_OP.F_CV;19.681312561;100.0 +25/10/2020 02:06:19;UCHP.U786_TC12_OP.F_CV;16.092929840;100.0 +25/10/2020 02:06:20;UCHP.U786_TC12_OP.F_CV;21.005441666;100.0 +25/10/2020 02:06:21;UCHP.U786_TC12_OP.F_CV;18.322183609;100.0 +25/10/2020 02:06:22;UCHP.U786_TC12_OP.F_CV;20.015693665;100.0 +25/10/2020 02:06:23;UCHP.U786_TC12_OP.F_CV;20.298006058;100.0 +25/10/2020 02:06:24;UCHP.U786_TC12_OP.F_CV;17.469560623;100.0 +25/10/2020 02:06:25;UCHP.U786_TC12_OP.F_CV;19.596769333;100.0 +25/10/2020 02:06:26;UCHP.U786_TC12_OP.F_CV;19.047626495;100.0 +25/10/2020 02:06:27;UCHP.U786_TC12_OP.F_CV;21.320068359;100.0 +25/10/2020 02:06:28;UCHP.U786_TC12_OP.F_CV;18.962228775;100.0 +25/10/2020 02:06:29;UCHP.U786_TC12_OP.F_CV;22.029668808;100.0 +25/10/2020 02:06:30;UCHP.U786_TC12_OP.F_CV;19.853065491;100.0 +25/10/2020 02:06:31;UCHP.U786_TC12_OP.F_CV;18.002710342;100.0 +25/10/2020 02:06:32;UCHP.U786_TC12_OP.F_CV;16.547857285;100.0 +25/10/2020 02:06:33;UCHP.U786_TC12_OP.F_CV;21.061553955;100.0 +25/10/2020 02:06:34;UCHP.U786_TC12_OP.F_CV;22.465087891;100.0 +25/10/2020 02:06:35;UCHP.U786_TC12_OP.F_CV;21.663358688;100.0 +25/10/2020 02:06:36;UCHP.U786_TC12_OP.F_CV;22.849668503;100.0 +25/10/2020 02:06:37;UCHP.U786_TC12_OP.F_CV;21.722938538;100.0 +25/10/2020 02:06:38;UCHP.U786_TC12_OP.F_CV;22.801673889;100.0 +25/10/2020 02:06:39;UCHP.U786_TC12_OP.F_CV;21.782518387;100.0 +25/10/2020 02:06:40;UCHP.U786_TC12_OP.F_CV;24.235345840;100.0 +25/10/2020 02:06:41;UCHP.U786_TC12_OP.F_CV;22.204008102;100.0 +25/10/2020 02:06:42;UCHP.U786_TC12_OP.F_CV;25.164604187;100.0 +25/10/2020 02:06:43;UCHP.U786_TC12_OP.F_CV;24.037609100;100.0 +25/10/2020 02:06:44;UCHP.U786_TC12_OP.F_CV;23.453210831;100.0 +25/10/2020 02:06:45;UCHP.U786_TC12_OP.F_CV;23.663404465;100.0 +25/10/2020 02:06:46;UCHP.U786_TC12_OP.F_CV;24.381740570;100.0 +25/10/2020 02:06:47;UCHP.U786_TC12_OP.F_CV;23.941177368;100.0 +25/10/2020 02:06:48;UCHP.U786_TC12_OP.F_CV;25.960943222;100.0 +25/10/2020 02:06:49;UCHP.U786_TC12_OP.F_CV;27.474586487;100.0 +25/10/2020 02:06:50;UCHP.U786_TC12_OP.F_CV;24.648788452;100.0 +25/10/2020 02:06:51;UCHP.U786_TC12_OP.F_CV;21.566684723;100.0 +25/10/2020 02:06:52;UCHP.U786_TC12_OP.F_CV;24.237325668;100.0 +25/10/2020 02:06:53;UCHP.U786_TC12_OP.F_CV;24.411701202;100.0 +25/10/2020 02:06:54;UCHP.U786_TC12_OP.F_CV;24.731616974;100.0 +25/10/2020 02:06:55;UCHP.U786_TC12_OP.F_CV;24.074583054;100.0 +25/10/2020 02:06:56;UCHP.U786_TC12_OP.F_CV;24.754600525;100.0 +25/10/2020 02:06:57;UCHP.U786_TC12_OP.F_CV;23.301418304;100.0 +25/10/2020 02:06:58;UCHP.U786_TC12_OP.F_CV;19.460676193;100.0 +25/10/2020 02:06:59;UCHP.U786_TC12_OP.F_CV;25.386375427;100.0 +25/10/2020 02:06:36;UCHP.U786_TC12_PV.F_CV;77.356903076;100.0 +25/10/2020 02:06:38;UCHP.U786_TC23_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:06;UCHP.U786_TC23_PV.F_CV;13.802083015;100.0 +25/10/2020 02:06:35;UCHP.U786_TC23_PV.F_CV;13.700810432;100.0 +25/10/2020 02:06:41;UCHP.U786_TC23_PV.F_CV;13.818617821;100.0 +25/10/2020 02:06:38;UCHP.U786_TC24_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;UCHP.U786_TC24_PV.F_CV;14.207176208;100.0 +25/10/2020 02:06:05;UCHP.U786_TC24_PV.F_CV;14.337384224;100.0 +25/10/2020 02:06:09;UCHP.U786_TC24_PV.F_CV;14.214409828;100.0 +25/10/2020 02:06:10;UCHP.U786_TC24_PV.F_CV;14.337384224;100.0 +25/10/2020 02:06:11;UCHP.U786_TC24_PV.F_CV;14.221643448;100.0 +25/10/2020 02:06:28;UCHP.U786_TC24_PV.F_CV;14.322916985;100.0 +25/10/2020 02:06:30;UCHP.U786_TC24_PV.F_CV;14.214409828;100.0 +25/10/2020 02:06:32;UCHP.U786_TC24_PV.F_CV;14.330150604;100.0 +25/10/2020 02:06:33;UCHP.U786_TC24_PV.F_CV;14.214409828;100.0 +25/10/2020 02:06:40;UCHP.U786_TC24_PV.F_CV;14.496527672;100.0 +25/10/2020 02:06:43;UCHP.U786_TC24_PV.F_CV;14.250578880;100.0 +25/10/2020 02:06:38;UCHP.U786_TC25_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:28;UCHP.U786_TC25_PV.F_CV;14.460358620;100.0 +25/10/2020 02:06:53;UCHP.U786_TI21_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:03;UCHP.U786_TI21_PV.F_CV;11.125578880;100.0 +25/10/2020 02:06:05;UCHP.U786_TI21_PV.F_CV;11.263020515;100.0 +25/10/2020 02:06:06;UCHP.U786_TI21_PV.F_CV;11.147279739;100.0 +25/10/2020 02:06:09;UCHP.U786_TI21_PV.F_CV;11.263020515;100.0 +25/10/2020 02:06:10;UCHP.U786_TI21_PV.F_CV;11.161747932;100.0 +25/10/2020 02:06:20;UCHP.U786_TI21_PV.F_CV;11.270255089;100.0 +25/10/2020 02:06:14;UCHP.U786_TI22_PV.F_CV;13.679108620;100.0 +25/10/2020 02:06:44;UEME01.U009_DP_CALCUL_IN_PV.F_CV;0.115745544;100.0 +25/10/2020 02:06:56;UEME01.U009_DP_CALCUL_IN_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:51;UEME01.U009_FC01_PV.F_CV;49.872985840;100.0 +25/10/2020 02:06:49;UEME01.U009_FC01_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:47;UEME01.U009_FC02_PV.F_CV;-0.000723380;100.0 +25/10/2020 02:06:47;UEME01.U009_FC02_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;UEME01.U009_FC03_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;UEME01.U009_FC03_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;UEME01.U009_FC10_OP.F_CV;50.000000000;100.0 +25/10/2020 02:06:47;UEME01.U009_FC10_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;UEME01.U009_FC10_SP.F_CV;0.007500000;100.0 +25/10/2020 02:06:03;UEME01.U009_FC11_PV.F_CV;-4.559205055;100.0 +25/10/2020 02:06:47;UEME01.U009_FC11_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;UEME01.U009_FI05_PV.F_CV;39.028495789;100.0 +25/10/2020 02:06:09;UEME01.U009_FI05_PV.F_CV;50.179500580;100.0 +25/10/2020 02:06:18;UEME01.U009_FI05_PV.F_CV;50.179500580;100.0 +25/10/2020 02:06:19;UEME01.U009_FI05_PV.F_CV;44.603996277;100.0 +25/10/2020 02:06:56;UEME01.U009_FI05_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;UEME01.U009_FI10_B_in_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;UEME01.U009_FI10_B_in_PV.F_CV;0.064087033;100.0 +25/10/2020 02:06:47;UEME01.U009_FI10_B_in_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;UEME01.U009_LC01_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:29;UEME01.U009_LC01_PV.F_CV;54.915363312;100.0 +25/10/2020 02:06:47;UEME01.U009_LC01_SP.F_CV;40.000000000;100.0 +25/10/2020 02:06:47;UEME01.U009_LI03_PV.F_CV;0.014467592;100.0 +25/10/2020 02:06:56;UEME01.U009_LI03_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UEME01.U009_LI07_PV.F_CV;20.103925705;100.0 +25/10/2020 02:06:56;UEME01.U009_LI07_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;UEME01.U009_LI10_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:56;UEME01.U009_LI10_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;UEME01.U009_PC01_OP.F_CV;0.538610041;100.0 +25/10/2020 02:06:02;UEME01.U009_PC01_OP.F_CV;0.817768216;100.0 +25/10/2020 02:06:03;UEME01.U009_PC01_OP.F_CV;0.607384324;100.0 +25/10/2020 02:06:05;UEME01.U009_PC01_OP.F_CV;0.747721910;100.0 +25/10/2020 02:06:08;UEME01.U009_PC01_OP.F_CV;0.482467055;100.0 +25/10/2020 02:06:09;UEME01.U009_PC01_OP.F_CV;0.765514672;100.0 +25/10/2020 02:06:11;UEME01.U009_PC01_OP.F_CV;0.692392647;100.0 +25/10/2020 02:06:12;UEME01.U009_PC01_OP.F_CV;0.892131448;100.0 +25/10/2020 02:06:14;UEME01.U009_PC01_OP.F_CV;0.742793918;100.0 +25/10/2020 02:06:15;UEME01.U009_PC01_OP.F_CV;0.805501461;100.0 +25/10/2020 02:06:21;UEME01.U009_PC01_OP.F_CV;0.597509027;100.0 +25/10/2020 02:06:23;UEME01.U009_PC01_OP.F_CV;0.738301873;100.0 +25/10/2020 02:06:24;UEME01.U009_PC01_OP.F_CV;0.600574791;100.0 +25/10/2020 02:06:27;UEME01.U009_PC01_OP.F_CV;0.813833833;100.0 +25/10/2020 02:06:29;UEME01.U009_PC01_OP.F_CV;0.870274603;100.0 +25/10/2020 02:06:30;UEME01.U009_PC01_OP.F_CV;0.722610593;100.0 +25/10/2020 02:06:32;UEME01.U009_PC01_OP.F_CV;0.653078377;100.0 +25/10/2020 02:06:35;UEME01.U009_PC01_OP.F_CV;0.853327632;100.0 +25/10/2020 02:06:36;UEME01.U009_PC01_OP.F_CV;0.640279412;100.0 +25/10/2020 02:06:38;UEME01.U009_PC01_OP.F_CV;0.710994899;100.0 +25/10/2020 02:06:43;UEME01.U009_PC01_OP.F_CV;0.650159955;100.0 +25/10/2020 02:06:46;UEME01.U009_PC01_OP.F_CV;0.820994258;100.0 +25/10/2020 02:06:47;UEME01.U009_PC01_OP.F_CV;0.912494957;100.0 +25/10/2020 02:06:48;UEME01.U009_PC01_OP.F_CV;0.694761992;100.0 +25/10/2020 02:06:50;UEME01.U009_PC01_OP.F_CV;0.783180594;100.0 +25/10/2020 02:06:54;UEME01.U009_PC01_OP.F_CV;0.678824663;100.0 +25/10/2020 02:06:56;UEME01.U009_PC01_OP.F_CV;0.746731222;100.0 +25/10/2020 02:06:57;UEME01.U009_PC01_OP.F_CV;0.608732522;100.0 +25/10/2020 02:06:02;UEME01.U009_PC01_PV.F_CV;119.994209290;100.0 +25/10/2020 02:06:57;UEME01.U009_PC01_SP.F_CV;120.000000000;100.0 +25/10/2020 02:06:08;UEME01.U009_PI02_PV.F_CV;120.109954834;100.0 +25/10/2020 02:06:56;UEME01.U009_PI02_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;UEME01.U009_TC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;UEME01.U009_TC01_PV.F_CV;22.799999237;100.0 +25/10/2020 02:06:47;UEME01.U009_TC01_SP.F_CV;40.000000000;100.0 +25/10/2020 02:06:47;UEME01.U009_TC02_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;UEME01.U009_TC02_PV.F_CV;23.399999619;100.0 +25/10/2020 02:06:47;UEME01.U009_TC02_SP.F_CV;40.000000000;100.0 +25/10/2020 02:06:47;UEME01.U009_TC03_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;UEME01.U009_TC03_PV.F_CV;23.399999619;100.0 +25/10/2020 02:06:47;UEME01.U009_TC03_SP.F_CV;40.000000000;100.0 +25/10/2020 02:06:47;UEME01.U009_TC04_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;UEME01.U009_TC04_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:47;UEME01.U009_TC04_SP.F_CV;40.000000000;100.0 +25/10/2020 02:06:47;UEME01.U009_TC05_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;UEME01.U009_TC05_PV.F_CV;22.600000381;100.0 +25/10/2020 02:06:47;UEME01.U009_TC05_SP.F_CV;24.737499237;100.0 +25/10/2020 02:06:47;UEME01.U009_TC06_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;UEME01.U009_TC06_PV.F_CV;22.700000763;100.0 +25/10/2020 02:06:47;UEME01.U009_TC06_SP.F_CV;19.329170227;100.0 +25/10/2020 02:06:47;UEME01.U009_TC15_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;UEME01.U009_TC15_PV.F_CV;22.299999237;100.0 +25/10/2020 02:06:47;UEME01.U009_TC15_SP.F_CV;19.662500381;100.0 +25/10/2020 02:06:47;UEME01.U009_TC16_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;UEME01.U009_TC16_PV.F_CV;22.799999237;100.0 +25/10/2020 02:06:47;UEME01.U009_TC16_SP.F_CV;19.783330917;100.0 +25/10/2020 02:06:47;UEME01.U009_TC17_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;UEME01.U009_TC17_PV.F_CV;22.500000000;100.0 +25/10/2020 02:06:47;UEME01.U009_TC17_SP.F_CV;19.599420547;100.0 +25/10/2020 02:06:47;UEME01.U009_TC19_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;UEME01.U009_TC19_PV.F_CV;23.100000381;100.0 +25/10/2020 02:06:47;UEME01.U009_TC19_SP.F_CV;19.995830536;100.0 +25/10/2020 02:06:47;UEME01.U009_TC21_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;UEME01.U009_TC21_PV.F_CV;22.700000763;100.0 +25/10/2020 02:06:47;UEME01.U009_TC21_SP.F_CV;20.092500687;100.0 +25/10/2020 02:06:39;UEME01.U009_TI01_PV.F_CV;16.500999451;100.0 +25/10/2020 02:06:56;UEME01.U009_TI01_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UEME01.U009_TI02_PV.F_CV;25.561000824;100.0 +25/10/2020 02:06:56;UEME01.U009_TI02_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:23;UEME01.U009_TI03_PV.F_CV;25.396999359;100.0 +25/10/2020 02:06:56;UEME01.U009_TI03_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;UEME01.U009_TI04_PV.F_CV;24.100000381;100.0 +25/10/2020 02:06:56;UEME01.U009_TI04_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;UEME01.U009_TI09_PV.F_CV;22.000000000;100.0 +25/10/2020 02:06:56;UEME01.U009_TI09_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;UEME01.U009_TI10_PV.F_CV;22.600000381;100.0 +25/10/2020 02:06:56;UEME01.U009_TI10_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;UEME01.U009_TI30_PV.F_CV;23.899999619;100.0 +25/10/2020 02:06:56;UEME01.U009_TI30_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:41;UEME01.U009_WI02_in_PV.F_CV;50.474498749;100.0 +25/10/2020 02:06:56;UEME01.U009_WI02_in_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;UEME01.U009_WI06_in_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;UEME01.U009_WI06_in_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_BP_ACQ.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_DG1S.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;UEME02.U827_DPM1_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_DPM1_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;UEME02.U827_DPM1_PV.F_CV;-1.508247375;100.0 +25/10/2020 02:06:39;UEME02.U827_DPM1_PV.F_CV;-0.994646072;100.0 +25/10/2020 02:06:38;UEME02.U827_DPM2_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_DPM2_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;UEME02.U827_DPM2_PV.F_CV;-0.481048584;100.0 +25/10/2020 02:06:59;UEME02.U827_FI102_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;UEME02.U827_FI103_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_FI103_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:07;UEME02.U827_FI103_PV.F_CV;36.871143341;100.0 +25/10/2020 02:06:11;UEME02.U827_FI103_PV.F_CV;38.021896362;100.0 +25/10/2020 02:06:15;UEME02.U827_FI103_PV.F_CV;37.971237183;100.0 +25/10/2020 02:06:18;UEME02.U827_FI103_PV.F_CV;36.733539581;100.0 +25/10/2020 02:06:28;UEME02.U827_FI103_PV.F_CV;36.611293793;100.0 +25/10/2020 02:06:29;UEME02.U827_FI103_PV.F_CV;37.799049377;100.0 +25/10/2020 02:06:59;UEME02.U827_FI104_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;UEME02.U827_FI140_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_FI140_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_FI140_PV.F_CV;0.097656250;100.0 +25/10/2020 02:06:38;UEME02.U827_FI203_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_FI203_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:13;UEME02.U827_FI203_PV.F_CV;46.546276093;100.0 +25/10/2020 02:06:29;UEME02.U827_FI203_PV.F_CV;46.298671722;100.0 +25/10/2020 02:06:32;UEME02.U827_FI203_PV.F_CV;47.452419281;100.0 +25/10/2020 02:06:38;UEME02.U827_FI240_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_FI240_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;UEME02.U827_FI240_PV.F_CV;0.097656250;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC102_Coef_A.F_CV;0.957099974;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC102_Coef_B.F_CV;0.045800000;100.0 +25/10/2020 02:06:40;UEME02.U827_FIC102_PV.F_CV;-0.009587727;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC102_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC104_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC104_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;UEME02.U827_FIC104_PV.F_CV;41.438800812;100.0 +25/10/2020 02:06:02;UEME02.U827_FIC104_PV.F_CV;41.102432251;100.0 +25/10/2020 02:06:03;UEME02.U827_FIC104_PV.F_CV;41.525608063;100.0 +25/10/2020 02:06:05;UEME02.U827_FIC104_PV.F_CV;41.341144562;100.0 +25/10/2020 02:06:07;UEME02.U827_FIC104_PV.F_CV;41.840278625;100.0 +25/10/2020 02:06:09;UEME02.U827_FIC104_PV.F_CV;40.874565125;100.0 +25/10/2020 02:06:10;UEME02.U827_FIC104_PV.F_CV;41.710067749;100.0 +25/10/2020 02:06:12;UEME02.U827_FIC104_PV.F_CV;41.558158875;100.0 +25/10/2020 02:06:13;UEME02.U827_FIC104_PV.F_CV;41.851127625;100.0 +25/10/2020 02:06:15;UEME02.U827_FIC104_PV.F_CV;40.700954437;100.0 +25/10/2020 02:06:17;UEME02.U827_FIC104_PV.F_CV;41.612411499;100.0 +25/10/2020 02:06:18;UEME02.U827_FIC104_PV.F_CV;41.384548187;100.0 +25/10/2020 02:06:20;UEME02.U827_FIC104_PV.F_CV;41.786026001;100.0 +25/10/2020 02:06:21;UEME02.U827_FIC104_PV.F_CV;41.243488312;100.0 +25/10/2020 02:06:22;UEME02.U827_FIC104_PV.F_CV;41.048175812;100.0 +25/10/2020 02:06:23;UEME02.U827_FIC104_PV.F_CV;41.482204437;100.0 +25/10/2020 02:06:25;UEME02.U827_FIC104_PV.F_CV;40.885417938;100.0 +25/10/2020 02:06:26;UEME02.U827_FIC104_PV.F_CV;41.243488312;100.0 +25/10/2020 02:06:32;UEME02.U827_FIC104_PV.F_CV;40.538192749;100.0 +25/10/2020 02:06:33;UEME02.U827_FIC104_PV.F_CV;41.102432251;100.0 +25/10/2020 02:06:35;UEME02.U827_FIC104_PV.F_CV;40.766059875;100.0 +25/10/2020 02:06:37;UEME02.U827_FIC104_PV.F_CV;41.460502625;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC104_PV.F_CV;41.102432251;100.0 +25/10/2020 02:06:40;UEME02.U827_FIC104_PV.F_CV;41.666667938;100.0 +25/10/2020 02:06:42;UEME02.U827_FIC104_PV.F_CV;40.820312500;100.0 +25/10/2020 02:06:45;UEME02.U827_FIC104_PV.F_CV;41.276042938;100.0 +25/10/2020 02:06:47;UEME02.U827_FIC104_PV.F_CV;41.861980438;100.0 +25/10/2020 02:06:48;UEME02.U827_FIC104_PV.F_CV;41.417098999;100.0 +25/10/2020 02:06:52;UEME02.U827_FIC104_PV.F_CV;41.934318542;100.0 +25/10/2020 02:06:59;UEME02.U827_FIC104_PV.F_CV;41.232639313;100.0 +25/10/2020 02:06:39;UEME02.U827_FIC104_SP.F_CV;48.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC112_Coef_A.F_CV;0.982400000;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC112_Coef_B.F_CV;0.020099999;100.0 +25/10/2020 02:06:06;UEME02.U827_FIC112_PV.F_CV;3.064872026;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC112_SP.F_CV;3.099999905;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC121_Coef_A.F_CV;0.958700001;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC121_Coef_B.F_CV;0.074000001;100.0 +25/10/2020 02:06:34;UEME02.U827_FIC121_PV.F_CV;3.000586987;100.0 +25/10/2020 02:06:43;UEME02.U827_FIC121_PV.F_CV;2.989806175;100.0 +25/10/2020 02:06:46;UEME02.U827_FIC121_PV.F_CV;3.000586987;100.0 +25/10/2020 02:06:56;UEME02.U827_FIC121_PV.F_CV;2.989953279;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC121_SP.F_CV;3.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC202_Coef_A.F_CV;0.968500018;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC202_Coef_B.F_CV;0.574800014;100.0 +25/10/2020 02:06:34;UEME02.U827_FIC202_PV.F_CV;0.469711035;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC202_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC204_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC204_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;UEME02.U827_FIC204_PV.F_CV;47.417533875;100.0 +25/10/2020 02:06:02;UEME02.U827_FIC204_PV.F_CV;46.006942749;100.0 +25/10/2020 02:06:03;UEME02.U827_FIC204_PV.F_CV;47.688800812;100.0 +25/10/2020 02:06:06;UEME02.U827_FIC204_PV.F_CV;50.817417145;100.0 +25/10/2020 02:06:07;UEME02.U827_FIC204_PV.F_CV;50.528068542;100.0 +25/10/2020 02:06:09;UEME02.U827_FIC204_PV.F_CV;50.907840729;100.0 +25/10/2020 02:06:11;UEME02.U827_FIC204_PV.F_CV;49.081306458;100.0 +25/10/2020 02:06:12;UEME02.U827_FIC204_PV.F_CV;48.683448792;100.0 +25/10/2020 02:06:13;UEME02.U827_FIC204_PV.F_CV;50.944011688;100.0 +25/10/2020 02:06:14;UEME02.U827_FIC204_PV.F_CV;51.215278625;100.0 +25/10/2020 02:06:15;UEME02.U827_FIC204_PV.F_CV;50.401473999;100.0 +25/10/2020 02:06:16;UEME02.U827_FIC204_PV.F_CV;50.889755249;100.0 +25/10/2020 02:06:17;UEME02.U827_FIC204_PV.F_CV;48.484519958;100.0 +25/10/2020 02:06:18;UEME02.U827_FIC204_PV.F_CV;47.797309875;100.0 +25/10/2020 02:06:19;UEME02.U827_FIC204_PV.F_CV;48.701534271;100.0 +25/10/2020 02:06:20;UEME02.U827_FIC204_PV.F_CV;48.050491333;100.0 +25/10/2020 02:06:21;UEME02.U827_FIC204_PV.F_CV;46.006942749;100.0 +25/10/2020 02:06:22;UEME02.U827_FIC204_PV.F_CV;46.657985687;100.0 +25/10/2020 02:06:24;UEME02.U827_FIC204_PV.F_CV;45.337818146;100.0 +25/10/2020 02:06:25;UEME02.U827_FIC204_PV.F_CV;44.867622375;100.0 +25/10/2020 02:06:26;UEME02.U827_FIC204_PV.F_CV;43.674045563;100.0 +25/10/2020 02:06:29;UEME02.U827_FIC204_PV.F_CV;44.307003021;100.0 +25/10/2020 02:06:31;UEME02.U827_FIC204_PV.F_CV;43.637874603;100.0 +25/10/2020 02:06:32;UEME02.U827_FIC204_PV.F_CV;44.343170166;100.0 +25/10/2020 02:06:34;UEME02.U827_FIC204_PV.F_CV;44.704860687;100.0 +25/10/2020 02:06:36;UEME02.U827_FIC204_PV.F_CV;46.097366333;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC204_PV.F_CV;44.379341125;100.0 +25/10/2020 02:06:39;UEME02.U827_FIC204_PV.F_CV;45.753761292;100.0 +25/10/2020 02:06:40;UEME02.U827_FIC204_PV.F_CV;48.068576813;100.0 +25/10/2020 02:06:42;UEME02.U827_FIC204_PV.F_CV;48.719619751;100.0 +25/10/2020 02:06:43;UEME02.U827_FIC204_PV.F_CV;48.285591125;100.0 +25/10/2020 02:06:44;UEME02.U827_FIC204_PV.F_CV;49.135562897;100.0 +25/10/2020 02:06:45;UEME02.U827_FIC204_PV.F_CV;48.611110687;100.0 +25/10/2020 02:06:46;UEME02.U827_FIC204_PV.F_CV;49.207901001;100.0 +25/10/2020 02:06:48;UEME02.U827_FIC204_PV.F_CV;48.122829437;100.0 +25/10/2020 02:06:49;UEME02.U827_FIC204_PV.F_CV;50.618488312;100.0 +25/10/2020 02:06:50;UEME02.U827_FIC204_PV.F_CV;51.504631042;100.0 +25/10/2020 02:06:51;UEME02.U827_FIC204_PV.F_CV;50.618488312;100.0 +25/10/2020 02:06:52;UEME02.U827_FIC204_PV.F_CV;52.951389313;100.0 +25/10/2020 02:06:53;UEME02.U827_FIC204_PV.F_CV;52.698207855;100.0 +25/10/2020 02:06:54;UEME02.U827_FIC204_PV.F_CV;51.233364105;100.0 +25/10/2020 02:06:57;UEME02.U827_FIC204_PV.F_CV;49.442996979;100.0 +25/10/2020 02:06:58;UEME02.U827_FIC204_PV.F_CV;49.696182251;100.0 +25/10/2020 02:06:59;UEME02.U827_FIC204_PV.F_CV;51.034431458;100.0 +25/10/2020 02:06:55;UEME02.U827_FIC204_SP.F_CV;48.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC212_Coef_A.F_CV;0.986199975;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC212_Coef_B.F_CV;0.000700000;100.0 +25/10/2020 02:06:04;UEME02.U827_FIC212_PV.F_CV;3.096842766;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC212_SP.F_CV;3.099999905;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC221_Coef_A.F_CV;1.011500001;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC221_Coef_B.F_CV;-0.229200006;100.0 +25/10/2020 02:06:01;UEME02.U827_FIC221_PV.F_CV;3.006669998;100.0 +25/10/2020 02:06:04;UEME02.U827_FIC221_PV.F_CV;3.022833824;100.0 +25/10/2020 02:06:08;UEME02.U827_FIC221_PV.F_CV;3.007029057;100.0 +25/10/2020 02:06:17;UEME02.U827_FIC221_PV.F_CV;3.022833824;100.0 +25/10/2020 02:06:22;UEME02.U827_FIC221_PV.F_CV;3.005455971;100.0 +25/10/2020 02:06:24;UEME02.U827_FIC221_PV.F_CV;3.022833824;100.0 +25/10/2020 02:06:29;UEME02.U827_FIC221_PV.F_CV;3.005455971;100.0 +25/10/2020 02:06:31;UEME02.U827_FIC221_PV.F_CV;3.022833824;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC221_PV.F_CV;3.006614447;100.0 +25/10/2020 02:06:41;UEME02.U827_FIC221_PV.F_CV;3.022833824;100.0 +25/10/2020 02:06:42;UEME02.U827_FIC221_PV.F_CV;3.003077984;100.0 +25/10/2020 02:06:43;UEME02.U827_FIC221_PV.F_CV;3.022833824;100.0 +25/10/2020 02:06:51;UEME02.U827_FIC221_PV.F_CV;3.038638592;100.0 +25/10/2020 02:06:38;UEME02.U827_FIC221_SP.F_CV;3.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_FQ140_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_FQ140_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;UEME02.U827_FQ140_PV.F_CV;278.750030518;100.0 +25/10/2020 02:06:38;UEME02.U827_FQ240_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_FQ240_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_FQ240_PV.F_CV;9333.900390625;100.0 +25/10/2020 02:06:39;UEME02.U827_HEV30_OUT.F_CV;1.000000000;100.0 +25/10/2020 02:06:39;UEME02.U827_HEV31_OUT.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;UEME02.U827_KAG400.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_KF101.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_KZ102.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_KZ103.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_KZ104.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_KZ105.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_KZ106.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_KZ110.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_KZ111.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_KZ117.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_KZ118.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;UEME02.U827_LC131_PV.F_CV;51.620368958;100.0 +25/10/2020 02:06:05;UEME02.U827_LC131_PV.F_CV;51.678241730;100.0 +25/10/2020 02:06:10;UEME02.U827_LC131_PV.F_CV;51.728878021;100.0 +25/10/2020 02:06:15;UEME02.U827_LC131_PV.F_CV;51.783130646;100.0 +25/10/2020 02:06:19;UEME02.U827_LC131_PV.F_CV;51.840999603;100.0 +25/10/2020 02:06:23;UEME02.U827_LC131_PV.F_CV;51.898872375;100.0 +25/10/2020 02:06:29;UEME02.U827_LC131_PV.F_CV;51.953125000;100.0 +25/10/2020 02:06:32;UEME02.U827_LC131_PV.F_CV;52.018230438;100.0 +25/10/2020 02:06:33;UEME02.U827_LC131_PV.F_CV;51.888019562;100.0 +25/10/2020 02:06:34;UEME02.U827_LC131_PV.F_CV;51.660156250;100.0 +25/10/2020 02:06:35;UEME02.U827_LC131_PV.F_CV;51.602287292;100.0 +25/10/2020 02:06:43;UEME02.U827_LC131_PV.F_CV;51.652923584;100.0 +25/10/2020 02:06:58;UEME02.U827_LC131_PV.F_CV;51.703559875;100.0 +25/10/2020 02:06:38;UEME02.U827_LC231_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_LC231_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;UEME02.U827_LC231_PV.F_CV;60.420284271;100.0 +25/10/2020 02:06:05;UEME02.U827_LC231_PV.F_CV;60.337093353;100.0 +25/10/2020 02:06:21;UEME02.U827_LC231_PV.F_CV;60.387729645;100.0 +25/10/2020 02:06:26;UEME02.U827_LC231_PV.F_CV;60.330463409;100.0 +25/10/2020 02:06:58;UEME02.U827_LC231_PV.F_CV;60.384117126;100.0 +25/10/2020 02:06:38;UEME02.U827_LI103_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_LI103_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;UEME02.U827_LI103_PV.F_CV;42.635993958;100.0 +25/10/2020 02:06:07;UEME02.U827_LI105_PV.F_CV;59.030525208;100.0 +25/10/2020 02:06:17;UEME02.U827_LI105_PV.F_CV;58.933738708;100.0 +25/10/2020 02:06:18;UEME02.U827_LI105_PV.F_CV;59.013309479;100.0 +25/10/2020 02:06:19;UEME02.U827_LI105_PV.F_CV;59.092880249;100.0 +25/10/2020 02:06:20;UEME02.U827_LI105_PV.F_CV;58.951824188;100.0 +25/10/2020 02:06:21;UEME02.U827_LI105_PV.F_CV;59.002460480;100.0 +25/10/2020 02:06:23;UEME02.U827_LI105_PV.F_CV;59.063945770;100.0 +25/10/2020 02:06:24;UEME02.U827_LI105_PV.F_CV;59.161602020;100.0 +25/10/2020 02:06:25;UEME02.U827_LI105_PV.F_CV;59.038627625;100.0 +25/10/2020 02:06:26;UEME02.U827_LI105_PV.F_CV;59.197772980;100.0 +25/10/2020 02:06:27;UEME02.U827_LI105_PV.F_CV;58.991607666;100.0 +25/10/2020 02:06:28;UEME02.U827_LI105_PV.F_CV;59.096500397;100.0 +25/10/2020 02:06:29;UEME02.U827_LI105_PV.F_CV;59.208621979;100.0 +25/10/2020 02:06:30;UEME02.U827_LI105_PV.F_CV;59.331596375;100.0 +25/10/2020 02:06:31;UEME02.U827_LI105_PV.F_CV;59.197772980;100.0 +25/10/2020 02:06:32;UEME02.U827_LI105_PV.F_CV;59.053096771;100.0 +25/10/2020 02:06:33;UEME02.U827_LI105_PV.F_CV;59.185112000;100.0 +25/10/2020 02:06:34;UEME02.U827_LI105_PV.F_CV;59.317131042;100.0 +25/10/2020 02:06:36;UEME02.U827_LI105_PV.F_CV;59.367767334;100.0 +25/10/2020 02:06:38;UEME02.U827_LI203_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_LI203_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;UEME02.U827_LI203_PV.F_CV;42.473236084;100.0 +25/10/2020 02:06:38;UEME02.U827_LI205_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_LI205_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;UEME02.U827_LI205_PV.F_CV;52.007377625;100.0 +25/10/2020 02:06:14;UEME02.U827_LI205_PV.F_CV;51.954330444;100.0 +25/10/2020 02:06:29;UEME02.U827_LI205_PV.F_CV;52.098834991;100.0 +25/10/2020 02:06:32;UEME02.U827_LI205_PV.F_CV;52.010993958;100.0 +25/10/2020 02:06:34;UEME02.U827_LI205_PV.F_CV;52.224391937;100.0 +25/10/2020 02:06:35;UEME02.U827_LI205_PV.F_CV;52.054397583;100.0 +25/10/2020 02:06:36;UEME02.U827_LI205_PV.F_CV;52.242477417;100.0 +25/10/2020 02:06:38;UEME02.U827_LI205_PV.F_CV;52.150848389;100.0 +25/10/2020 02:06:41;UEME02.U827_LI205_PV.F_CV;52.224391937;100.0 +25/10/2020 02:06:44;UEME02.U827_LI205_PV.F_CV;52.003761292;100.0 +25/10/2020 02:06:45;UEME02.U827_LI205_PV.F_CV;52.155670166;100.0 +25/10/2020 02:06:46;UEME02.U827_LI205_PV.F_CV;52.206306458;100.0 +25/10/2020 02:06:48;UEME02.U827_LI205_PV.F_CV;51.992912292;100.0 +25/10/2020 02:06:50;UEME02.U827_LI205_PV.F_CV;52.076099396;100.0 +25/10/2020 02:06:51;UEME02.U827_LI205_PV.F_CV;52.010993958;100.0 +25/10/2020 02:06:53;UEME02.U827_LI205_PV.F_CV;52.173755646;100.0 +25/10/2020 02:06:54;UEME02.U827_LI205_PV.F_CV;51.971210480;100.0 +25/10/2020 02:06:55;UEME02.U827_LI205_PV.F_CV;52.213542938;100.0 +25/10/2020 02:06:57;UEME02.U827_LI205_PV.F_CV;52.267795563;100.0 +25/10/2020 02:06:58;UEME02.U827_LI205_PV.F_CV;52.148437500;100.0 +25/10/2020 02:06:07;UEME02.U827_Num_Flacon.F_CV;4.000000000;100.0 +25/10/2020 02:06:59;UEME02.U827_P105.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;UEME02.U827_PI102_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_PI102_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:12;UEME02.U827_PI102_PV.F_CV;31.066877365;100.0 +25/10/2020 02:06:44;UEME02.U827_PI102_PV.F_CV;31.016710281;100.0 +25/10/2020 02:06:38;UEME02.U827_PI122_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_PI122_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:21;UEME02.U827_PI122_PV.F_CV;0.570461035;100.0 +25/10/2020 02:06:38;UEME02.U827_PI140_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_PI140_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_PI140_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:38;UEME02.U827_PI202_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_PI202_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;UEME02.U827_PI202_PV.F_CV;60.387729645;100.0 +25/10/2020 02:06:38;UEME02.U827_PI222_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_PI222_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;UEME02.U827_PI222_PV.F_CV;0.358796299;100.0 +25/10/2020 02:06:38;UEME02.U827_PI240_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_PI240_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;UEME02.U827_PI240_PV.F_CV;0.997287333;100.0 +25/10/2020 02:06:38;UEME02.U827_PIC101_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_PIC101_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;UEME02.U827_PIC101_OP.F_CV;17.017898560;100.0 +25/10/2020 02:06:06;UEME02.U827_PIC101_OP.F_CV;17.699909210;100.0 +25/10/2020 02:06:08;UEME02.U827_PIC101_OP.F_CV;17.634027481;100.0 +25/10/2020 02:06:11;UEME02.U827_PIC101_OP.F_CV;17.744789124;100.0 +25/10/2020 02:06:15;UEME02.U827_PIC101_OP.F_CV;18.169696808;100.0 +25/10/2020 02:06:20;UEME02.U827_PIC101_OP.F_CV;18.434215546;100.0 +25/10/2020 02:06:24;UEME02.U827_PIC101_OP.F_CV;18.824104309;100.0 +25/10/2020 02:06:27;UEME02.U827_PIC101_OP.F_CV;19.072481155;100.0 +25/10/2020 02:06:28;UEME02.U827_PIC101_OP.F_CV;18.928266525;100.0 +25/10/2020 02:06:29;UEME02.U827_PIC101_OP.F_CV;18.662237167;100.0 +25/10/2020 02:06:30;UEME02.U827_PIC101_OP.F_CV;15.074316978;100.0 +25/10/2020 02:06:31;UEME02.U827_PIC101_OP.F_CV;12.214830399;100.0 +25/10/2020 02:06:33;UEME02.U827_PIC101_OP.F_CV;12.871813774;100.0 +25/10/2020 02:06:36;UEME02.U827_PIC101_OP.F_CV;14.545170784;100.0 +25/10/2020 02:06:39;UEME02.U827_PIC101_OP.F_CV;15.945058823;100.0 +25/10/2020 02:06:43;UEME02.U827_PIC101_OP.F_CV;17.513202667;100.0 +25/10/2020 02:06:45;UEME02.U827_PIC101_OP.F_CV;18.053668976;100.0 +25/10/2020 02:06:50;UEME02.U827_PIC101_OP.F_CV;19.168468475;100.0 +25/10/2020 02:06:53;UEME02.U827_PIC101_OP.F_CV;19.418828964;100.0 +25/10/2020 02:06:55;UEME02.U827_PIC101_OP.F_CV;19.357337952;100.0 +25/10/2020 02:06:02;UEME02.U827_PIC101_PV.F_CV;30.291521072;100.0 +25/10/2020 02:06:28;UEME02.U827_PIC101_PV.F_CV;30.291521072;100.0 +25/10/2020 02:06:29;UEME02.U827_PIC101_PV.F_CV;30.074508667;100.0 +25/10/2020 02:06:30;UEME02.U827_PIC101_PV.F_CV;29.741752625;100.0 +25/10/2020 02:06:31;UEME02.U827_PIC101_PV.F_CV;29.615161896;100.0 +25/10/2020 02:06:40;UEME02.U827_PIC101_PV.F_CV;30.099826813;100.0 +25/10/2020 02:06:47;UEME02.U827_PIC101_PV.F_CV;30.280672073;100.0 +25/10/2020 02:06:58;UEME02.U827_PIC101_PV.F_CV;30.230033875;100.0 +25/10/2020 02:06:38;UEME02.U827_PIC101_SP.F_CV;30.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_PIC201_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_PIC201_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;UEME02.U827_PIC201_OP.F_CV;0.052903235;100.0 +25/10/2020 02:06:08;UEME02.U827_PIC201_OP.F_CV;0.241591573;100.0 +25/10/2020 02:06:13;UEME02.U827_PIC201_OP.F_CV;0.080755472;100.0 +25/10/2020 02:06:20;UEME02.U827_PIC201_OP.F_CV;0.277196884;100.0 +25/10/2020 02:06:29;UEME02.U827_PIC201_OP.F_CV;0.105519466;100.0 +25/10/2020 02:06:31;UEME02.U827_PIC201_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:54;UEME02.U827_PIC201_OP.F_CV;0.050984737;100.0 +25/10/2020 02:06:59;UEME02.U827_PIC201_OP.F_CV;0.133781791;100.0 +25/10/2020 02:06:59;UEME02.U827_PIC201_PV.F_CV;59.913917542;100.0 +25/10/2020 02:06:38;UEME02.U827_PIC201_SP.F_CV;60.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC01_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC01_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;UEME02.U827_TC01_OP.F_CV;13.000000000;100.0 +25/10/2020 02:06:30;UEME02.U827_TC01_PV.F_CV;36.457893372;100.0 +25/10/2020 02:06:39;UEME02.U827_TC01_PV.F_CV;36.200000763;100.0 +25/10/2020 02:06:44;UEME02.U827_TC01_SP.F_CV;40.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC102_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC102_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;UEME02.U827_TC102_OP.F_CV;11.351143837;100.0 +25/10/2020 02:06:24;UEME02.U827_TC102_OP.F_CV;11.057926178;100.0 +25/10/2020 02:06:41;UEME02.U827_TC102_OP.F_CV;11.210551262;100.0 +25/10/2020 02:06:49;UEME02.U827_TC102_OP.F_CV;11.483617783;100.0 +25/10/2020 02:06:51;UEME02.U827_TC102_OP.F_CV;11.601770401;100.0 +25/10/2020 02:06:22;UEME02.U827_TC102_PV.F_CV;150.288177490;100.0 +25/10/2020 02:06:50;UEME02.U827_TC102_PV.F_CV;149.742202759;100.0 +25/10/2020 02:06:15;UEME02.U827_TC102_SP.F_CV;150.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC103_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC103_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;UEME02.U827_TC103_OP.F_CV;7.793626308;100.0 +25/10/2020 02:06:35;UEME02.U827_TC103_PV.F_CV;159.997161865;100.0 +25/10/2020 02:06:34;UEME02.U827_TC103_SP.F_CV;160.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC104_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC104_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:42;UEME02.U827_TC104_OP.F_CV;7.879841805;100.0 +25/10/2020 02:06:17;UEME02.U827_TC104_PV.F_CV;159.991699219;100.0 +25/10/2020 02:06:41;UEME02.U827_TC104_SP.F_CV;160.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC105_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC105_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;UEME02.U827_TC105_OP.F_CV;7.470139027;100.0 +25/10/2020 02:06:45;UEME02.U827_TC105_PV.F_CV;160.102920532;100.0 +25/10/2020 02:06:53;UEME02.U827_TC105_SP.F_CV;160.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC106_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC106_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:10;UEME02.U827_TC106_OP.F_CV;7.638839245;100.0 +25/10/2020 02:06:54;UEME02.U827_TC106_PV.F_CV;160.028015137;100.0 +25/10/2020 02:06:58;UEME02.U827_TC106_SP.F_CV;160.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC110_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC110_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;UEME02.U827_TC110_OP.F_CV;6.604101658;100.0 +25/10/2020 02:06:17;UEME02.U827_TC110_PV.F_CV;80.011665344;100.0 +25/10/2020 02:06:40;UEME02.U827_TC110_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC111_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC111_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;UEME02.U827_TC111_OP.F_CV;10.742583275;100.0 +25/10/2020 02:06:48;UEME02.U827_TC111_PV.F_CV;99.993331909;100.0 +25/10/2020 02:06:38;UEME02.U827_TC111_SP.F_CV;100.000000000;100.0 +25/10/2020 02:06:59;UEME02.U827_TC117_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_TC117_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_TC117_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_TC117_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_TC117_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_TC118_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_TC118_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_TC118_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_TC118_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_TC118_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;UEME02.U827_TC202_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC202_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;UEME02.U827_TC202_OP.F_CV;10.968091011;100.0 +25/10/2020 02:06:49;UEME02.U827_TC202_PV.F_CV;150.014343262;100.0 +25/10/2020 02:06:59;UEME02.U827_TC202_SP.F_CV;150.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC203_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC203_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;UEME02.U827_TC203_OP.F_CV;6.776087284;100.0 +25/10/2020 02:06:02;UEME02.U827_TC203_PV.F_CV;160.031723022;100.0 +25/10/2020 02:06:45;UEME02.U827_TC203_SP.F_CV;160.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC204_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC204_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;UEME02.U827_TC204_OP.F_CV;8.027469635;100.0 +25/10/2020 02:06:45;UEME02.U827_TC204_PV.F_CV;160.060012817;100.0 +25/10/2020 02:06:05;UEME02.U827_TC204_SP.F_CV;160.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC205_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC205_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;UEME02.U827_TC205_OP.F_CV;8.554625511;100.0 +25/10/2020 02:06:03;UEME02.U827_TC205_PV.F_CV;159.988296509;100.0 +25/10/2020 02:06:34;UEME02.U827_TC205_SP.F_CV;160.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC206_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC206_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:34;UEME02.U827_TC206_OP.F_CV;7.426734447;100.0 +25/10/2020 02:06:50;UEME02.U827_TC206_PV.F_CV;160.019775391;100.0 +25/10/2020 02:06:34;UEME02.U827_TC206_SP.F_CV;160.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC210_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC210_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;UEME02.U827_TC210_OP.F_CV;5.907740116;100.0 +25/10/2020 02:06:18;UEME02.U827_TC210_PV.F_CV;80.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC210_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC211_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC211_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;UEME02.U827_TC211_OP.F_CV;7.870477200;100.0 +25/10/2020 02:06:38;UEME02.U827_TC211_PV.F_CV;100.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TC211_SP.F_CV;100.000000000;100.0 +25/10/2020 02:06:59;UEME02.U827_TC217_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_TC217_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_TC217_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_TC217_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_TC217_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_TC218_Coef_A.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_TC218_Coef_B.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_TC218_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_TC218_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UEME02.U827_TC218_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;UEME02.U827_TI02_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TI02_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;UEME02.U827_TI02_PV.F_CV;21.100000381;100.0 +25/10/2020 02:06:38;UEME02.U827_TI102_Coef_A.F_CV;0.981299996;100.0 +25/10/2020 02:06:38;UEME02.U827_TI102_Coef_B.F_CV;4.117300034;100.0 +25/10/2020 02:06:22;UEME02.U827_TI102_PV.F_CV;150.288177490;100.0 +25/10/2020 02:06:50;UEME02.U827_TI102_PV.F_CV;149.742202759;100.0 +25/10/2020 02:06:38;UEME02.U827_TI103_Coef_A.F_CV;0.996299982;100.0 +25/10/2020 02:06:38;UEME02.U827_TI103_Coef_B.F_CV;1.685099959;100.0 +25/10/2020 02:06:15;UEME02.U827_TI103_PV.F_CV;159.997161865;100.0 +25/10/2020 02:06:38;UEME02.U827_TI104_Coef_A.F_CV;0.998499990;100.0 +25/10/2020 02:06:38;UEME02.U827_TI104_Coef_B.F_CV;1.429900050;100.0 +25/10/2020 02:06:17;UEME02.U827_TI104_PV.F_CV;159.991699219;100.0 +25/10/2020 02:06:38;UEME02.U827_TI105_Coef_A.F_CV;0.999599993;100.0 +25/10/2020 02:06:38;UEME02.U827_TI105_Coef_B.F_CV;0.966600001;100.0 +25/10/2020 02:06:36;UEME02.U827_TI105_PV.F_CV;160.102920532;100.0 +25/10/2020 02:06:38;UEME02.U827_TI106_Coef_A.F_CV;0.998899996;100.0 +25/10/2020 02:06:38;UEME02.U827_TI106_Coef_B.F_CV;1.402699947;100.0 +25/10/2020 02:06:55;UEME02.U827_TI106_PV.F_CV;160.028015137;100.0 +25/10/2020 02:06:16;UEME02.U827_TI110_PV.F_CV;80.011665344;100.0 +25/10/2020 02:06:03;UEME02.U827_TI111_PV.F_CV;100.000000000;100.0 +25/10/2020 02:06:53;UEME02.U827_TI112_PV.F_CV;152.100006104;100.0 +25/10/2020 02:06:36;UEME02.U827_TI113_PV.F_CV;159.800003052;100.0 +25/10/2020 02:06:34;UEME02.U827_TI114_PV.F_CV;160.899993896;100.0 +25/10/2020 02:06:34;UEME02.U827_TI115_PV.F_CV;160.199996948;100.0 +25/10/2020 02:06:34;UEME02.U827_TI116_PV.F_CV;159.000000000;100.0 +25/10/2020 02:06:05;UEME02.U827_TI117_PV.F_CV;159.990005493;100.0 +25/10/2020 02:06:04;UEME02.U827_TI118_PV.F_CV;137.339996338;100.0 +25/10/2020 02:06:09;UEME02.U827_TI118_PV.F_CV;137.066665649;100.0 +25/10/2020 02:06:17;UEME02.U827_TI118_PV.F_CV;136.800003052;100.0 +25/10/2020 02:06:19;UEME02.U827_TI118_PV.F_CV;136.466674805;100.0 +25/10/2020 02:06:29;UEME02.U827_TI118_PV.F_CV;136.800003052;100.0 +25/10/2020 02:06:38;UEME02.U827_TI118_PV.F_CV;136.544448853;100.0 +25/10/2020 02:06:48;UEME02.U827_TI118_PV.F_CV;136.800003052;100.0 +25/10/2020 02:06:53;UEME02.U827_TI118_PV.F_CV;137.100006104;100.0 +25/10/2020 02:06:58;UEME02.U827_TI118_PV.F_CV;136.800003052;100.0 +25/10/2020 02:06:34;UEME02.U827_TI11A_PV.F_CV;95.599998474;100.0 +25/10/2020 02:06:10;UEME02.U827_TI11B_PV.F_CV;87.605262756;100.0 +25/10/2020 02:06:57;UEME02.U827_TI11B_PV.F_CV;86.800003052;100.0 +25/10/2020 02:06:39;UEME02.U827_TI120_PV.F_CV;94.599998474;100.0 +25/10/2020 02:06:38;UEME02.U827_TI121_PV.F_CV;114.900001526;100.0 +25/10/2020 02:06:58;UEME02.U827_TI122_PV.F_CV;159.300003052;100.0 +25/10/2020 02:06:47;UEME02.U827_TI123_PV.F_CV;158.300003052;100.0 +25/10/2020 02:06:17;UEME02.U827_TI124_PV.F_CV;158.000000000;100.0 +25/10/2020 02:06:14;UEME02.U827_TI125_PV.F_CV;157.800003052;100.0 +25/10/2020 02:06:04;UEME02.U827_TI126_PV.F_CV;159.100006104;100.0 +25/10/2020 02:06:25;UEME02.U827_TI127_PV.F_CV;185.199996948;100.0 +25/10/2020 02:06:38;UEME02.U827_TI128_PV.F_CV;82.599998474;100.0 +25/10/2020 02:06:38;UEME02.U827_TI130_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TI130_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME02.U827_TI130_PV.F_CV;24.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TI140_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TI140_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;UEME02.U827_TI140_PV.F_CV;22.700000763;100.0 +25/10/2020 02:06:38;UEME02.U827_TI155_PV.F_CV;23.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TI202_Coef_A.F_CV;0.979099989;100.0 +25/10/2020 02:06:38;UEME02.U827_TI202_Coef_B.F_CV;4.618000031;100.0 +25/10/2020 02:06:49;UEME02.U827_TI202_PV.F_CV;150.014343262;100.0 +25/10/2020 02:06:38;UEME02.U827_TI203_Coef_A.F_CV;0.998700023;100.0 +25/10/2020 02:06:38;UEME02.U827_TI203_Coef_B.F_CV;1.338299990;100.0 +25/10/2020 02:06:53;UEME02.U827_TI203_PV.F_CV;160.031723022;100.0 +25/10/2020 02:06:38;UEME02.U827_TI204_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TI204_Coef_B.F_CV;1.460000038;100.0 +25/10/2020 02:06:44;UEME02.U827_TI204_PV.F_CV;160.060012817;100.0 +25/10/2020 02:06:38;UEME02.U827_TI205_Coef_A.F_CV;1.001399994;100.0 +25/10/2020 02:06:38;UEME02.U827_TI205_Coef_B.F_CV;0.765699983;100.0 +25/10/2020 02:06:42;UEME02.U827_TI205_PV.F_CV;159.988296509;100.0 +25/10/2020 02:06:38;UEME02.U827_TI206_Coef_A.F_CV;1.001299977;100.0 +25/10/2020 02:06:38;UEME02.U827_TI206_Coef_B.F_CV;1.213600039;100.0 +25/10/2020 02:06:50;UEME02.U827_TI206_PV.F_CV;160.019775391;100.0 +25/10/2020 02:06:18;UEME02.U827_TI210_PV.F_CV;80.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TI211_PV.F_CV;100.000000000;100.0 +25/10/2020 02:06:08;UEME02.U827_TI212_PV.F_CV;155.399993896;100.0 +25/10/2020 02:06:34;UEME02.U827_TI213_PV.F_CV;158.899993896;100.0 +25/10/2020 02:06:04;UEME02.U827_TI214_PV.F_CV;159.600006104;100.0 +25/10/2020 02:06:43;UEME02.U827_TI215_PV.F_CV;161.100006104;100.0 +25/10/2020 02:06:46;UEME02.U827_TI216_PV.F_CV;159.413330078;100.0 +25/10/2020 02:06:52;UEME02.U827_TI217_PV.F_CV;160.000000000;100.0 +25/10/2020 02:06:33;UEME02.U827_TI218_PV.F_CV;118.798339844;100.0 +25/10/2020 02:06:55;UEME02.U827_TI220_PV.F_CV;89.300003052;100.0 +25/10/2020 02:06:38;UEME02.U827_TI221_PV.F_CV;94.599998474;100.0 +25/10/2020 02:06:50;UEME02.U827_TI222_PV.F_CV;166.000000000;100.0 +25/10/2020 02:06:07;UEME02.U827_TI223_PV.F_CV;154.500000000;100.0 +25/10/2020 02:06:34;UEME02.U827_TI224_PV.F_CV;157.500000000;100.0 +25/10/2020 02:06:37;UEME02.U827_TI225_PV.F_CV;154.399993896;100.0 +25/10/2020 02:06:58;UEME02.U827_TI226_PV.F_CV;156.399993896;100.0 +25/10/2020 02:06:35;UEME02.U827_TI227_PV.F_CV;159.199996948;100.0 +25/10/2020 02:06:38;UEME02.U827_TI228_PV.F_CV;77.199996948;100.0 +25/10/2020 02:06:38;UEME02.U827_TI230_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TI230_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;UEME02.U827_TI230_PV.F_CV;23.899999619;100.0 +25/10/2020 02:06:38;UEME02.U827_TI240_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TI240_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:01;UEME02.U827_TI240_PV.F_CV;22.899999619;100.0 +25/10/2020 02:06:09;UEME02.U827_TI255_PV.F_CV;22.500000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TIC145_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TIC145_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TIC145_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TIC145_PV.F_CV;22.899999619;100.0 +25/10/2020 02:06:38;UEME02.U827_TIC145_SP.F_CV;15.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TIC245_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TIC245_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_TIC245_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:31;UEME02.U827_TIC245_PV.F_CV;22.399999619;100.0 +25/10/2020 02:06:38;UEME02.U827_TIC245_SP.F_CV;15.000000000;100.0 +25/10/2020 02:06:33;UEME02.U827_Volume_Seringue.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;UEME02.U827_WI103_PV.F_CV;2587.016601563;100.0 +25/10/2020 02:06:23;UEME02.U827_WI103_PV.F_CV;2585.266601563;100.0 +25/10/2020 02:06:25;UEME02.U827_WI103_PV.F_CV;2585.199951172;100.0 +25/10/2020 02:06:27;UEME02.U827_WI103_PV.F_CV;2585.133300781;100.0 +25/10/2020 02:06:29;UEME02.U827_WI103_PV.F_CV;2585.066650391;100.0 +25/10/2020 02:06:31;UEME02.U827_WI103_PV.F_CV;2585.000000000;100.0 +25/10/2020 02:06:27;UEME02.U827_WI104_PV.F_CV;140.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_WI203_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_WI203_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;UEME02.U827_WI203_PV.F_CV;2489.149902344;100.0 +25/10/2020 02:06:38;UEME02.U827_WI204_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:38;UEME02.U827_WI204_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;UEME02.U827_WI204_PV.F_CV;139.000000000;100.0 +25/10/2020 02:06:57;UEME03.U005_Codeur.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_DPY01_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_DPY01_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U005_DPY01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_DPY01_PV.F_CV;0.042915344;100.0 +25/10/2020 02:06:35;UEME03.U005_DPY01_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U005_F01.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_F01_1.F_CV;1.000000000;100.0 +25/10/2020 02:06:35;UEME03.U005_F01_2.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U005_F01_3.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U005_F01_4.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_FC01_Coef_A.F_CV;0.944400012;100.0 +25/10/2020 02:06:27;UEME03.U005_FC01_Coef_B.F_CV;-0.490799993;100.0 +25/10/2020 02:06:27;UEME03.U005_FC01_PV.F_CV;79.996025085;100.0 +25/10/2020 02:06:27;UEME03.U005_FC01_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_FC02_Coef_A.F_CV;1.044700027;100.0 +25/10/2020 02:06:27;UEME03.U005_FC02_Coef_B.F_CV;-1.001899958;100.0 +25/10/2020 02:06:27;UEME03.U005_FC02_PV.F_CV;-1.001899958;100.0 +25/10/2020 02:06:27;UEME03.U005_FC02_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_FC10_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_FC10_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;UEME03.U005_FC10_OP.F_CV;40.381816864;100.0 +25/10/2020 02:06:02;UEME03.U005_FC10_OP.F_CV;40.275539398;100.0 +25/10/2020 02:06:06;UEME03.U005_FC10_OP.F_CV;40.720466614;100.0 +25/10/2020 02:06:08;UEME03.U005_FC10_OP.F_CV;40.773277283;100.0 +25/10/2020 02:06:12;UEME03.U005_FC10_OP.F_CV;41.086132050;100.0 +25/10/2020 02:06:16;UEME03.U005_FC10_OP.F_CV;41.212375641;100.0 +25/10/2020 02:06:18;UEME03.U005_FC10_OP.F_CV;41.126056671;100.0 +25/10/2020 02:06:20;UEME03.U005_FC10_OP.F_CV;40.681972504;100.0 +25/10/2020 02:06:25;UEME03.U005_FC10_OP.F_CV;40.328605652;100.0 +25/10/2020 02:06:29;UEME03.U005_FC10_OP.F_CV;40.209960938;100.0 +25/10/2020 02:06:31;UEME03.U005_FC10_OP.F_CV;39.809074402;100.0 +25/10/2020 02:06:35;UEME03.U005_FC10_OP.F_CV;40.181549072;100.0 +25/10/2020 02:06:37;UEME03.U005_FC10_OP.F_CV;39.940814972;100.0 +25/10/2020 02:06:51;UEME03.U005_FC10_OP.F_CV;40.940128326;100.0 +25/10/2020 02:06:52;UEME03.U005_FC10_OP.F_CV;41.023094177;100.0 +25/10/2020 02:06:56;UEME03.U005_FC10_OP.F_CV;40.829864502;100.0 +25/10/2020 02:06:58;UEME03.U005_FC10_OP.F_CV;40.567531586;100.0 +25/10/2020 02:06:59;UEME03.U005_FC10_OP.F_CV;40.658679962;100.0 +25/10/2020 02:06:04;UEME03.U005_FC10_PV.F_CV;315.749359131;100.0 +25/10/2020 02:06:27;UEME03.U005_FC10_SP.F_CV;316.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_FI05_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_FI05_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U005_FI05_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;UEME03.U005_FI05_PV.F_CV;67.500000000;100.0 +25/10/2020 02:06:35;UEME03.U005_FI05_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_FQ05_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_FQ05_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U005_FQ05_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UEME03.U005_FQ05_PV.F_CV;30829.677734375;100.0 +25/10/2020 02:06:35;UEME03.U005_FQ05_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U005_HEV01B.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U005_HEV11.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U005_HEV12.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U005_HEV14.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_LC01_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_LC01_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;UEME03.U005_LC01_OP.F_CV;10.974439621;100.0 +25/10/2020 02:06:03;UEME03.U005_LC01_OP.F_CV;11.029001236;100.0 +25/10/2020 02:06:07;UEME03.U005_LC01_OP.F_CV;10.837480545;100.0 +25/10/2020 02:06:09;UEME03.U005_LC01_OP.F_CV;10.628946304;100.0 +25/10/2020 02:06:10;UEME03.U005_LC01_OP.F_CV;10.708351135;100.0 +25/10/2020 02:06:11;UEME03.U005_LC01_OP.F_CV;10.544803619;100.0 +25/10/2020 02:06:13;UEME03.U005_LC01_OP.F_CV;10.460073471;100.0 +25/10/2020 02:06:17;UEME03.U005_LC01_OP.F_CV;10.631190300;100.0 +25/10/2020 02:06:18;UEME03.U005_LC01_OP.F_CV;10.508567810;100.0 +25/10/2020 02:06:20;UEME03.U005_LC01_OP.F_CV;10.748682022;100.0 +25/10/2020 02:06:23;UEME03.U005_LC01_OP.F_CV;11.307140350;100.0 +25/10/2020 02:06:25;UEME03.U005_LC01_OP.F_CV;11.593721390;100.0 +25/10/2020 02:06:26;UEME03.U005_LC01_OP.F_CV;11.853854179;100.0 +25/10/2020 02:06:27;UEME03.U005_LC01_OP.F_CV;11.944122314;100.0 +25/10/2020 02:06:30;UEME03.U005_LC01_OP.F_CV;11.721715927;100.0 +25/10/2020 02:06:31;UEME03.U005_LC01_OP.F_CV;11.613874435;100.0 +25/10/2020 02:06:33;UEME03.U005_LC01_OP.F_CV;11.735871315;100.0 +25/10/2020 02:06:34;UEME03.U005_LC01_OP.F_CV;11.630365372;100.0 +25/10/2020 02:06:36;UEME03.U005_LC01_OP.F_CV;11.571295738;100.0 +25/10/2020 02:06:39;UEME03.U005_LC01_OP.F_CV;11.908749580;100.0 +25/10/2020 02:06:40;UEME03.U005_LC01_OP.F_CV;12.127601624;100.0 +25/10/2020 02:06:41;UEME03.U005_LC01_OP.F_CV;12.180286407;100.0 +25/10/2020 02:06:43;UEME03.U005_LC01_OP.F_CV;12.094872475;100.0 +25/10/2020 02:06:47;UEME03.U005_LC01_OP.F_CV;11.608874321;100.0 +25/10/2020 02:06:50;UEME03.U005_LC01_OP.F_CV;11.774909019;100.0 +25/10/2020 02:06:54;UEME03.U005_LC01_OP.F_CV;11.371944427;100.0 +25/10/2020 02:06:56;UEME03.U005_LC01_OP.F_CV;11.535349846;100.0 +25/10/2020 02:06:02;UEME03.U005_LC01_PV.F_CV;49.903247833;100.0 +25/10/2020 02:06:13;UEME03.U005_LC01_PV.F_CV;49.757667542;100.0 +25/10/2020 02:06:22;UEME03.U005_LC01_PV.F_CV;50.028934479;100.0 +25/10/2020 02:06:26;UEME03.U005_LC01_PV.F_CV;50.253181458;100.0 +25/10/2020 02:06:29;UEME03.U005_LC01_PV.F_CV;50.183738708;100.0 +25/10/2020 02:06:41;UEME03.U005_LC01_PV.F_CV;50.339988708;100.0 +25/10/2020 02:06:46;UEME03.U005_LC01_PV.F_CV;50.141059875;100.0 +25/10/2020 02:06:54;UEME03.U005_LC01_PV.F_CV;50.036167145;100.0 +25/10/2020 02:06:56;UEME03.U005_LC01_PV.F_CV;50.090423584;100.0 +25/10/2020 02:06:58;UEME03.U005_LC01_PV.F_CV;50.010852814;100.0 +25/10/2020 02:06:27;UEME03.U005_LC01_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:35;UEME03.U005_LEV07.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_LI03_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_LI03_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U005_LI03_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:02;UEME03.U005_LI03_PV.F_CV;35.763889313;100.0 +25/10/2020 02:06:03;UEME03.U005_LI03_PV.F_CV;35.282840729;100.0 +25/10/2020 02:06:04;UEME03.U005_LI03_PV.F_CV;35.753036499;100.0 +25/10/2020 02:06:08;UEME03.U005_LI03_PV.F_CV;35.622829437;100.0 +25/10/2020 02:06:10;UEME03.U005_LI03_PV.F_CV;35.763889313;100.0 +25/10/2020 02:06:12;UEME03.U005_LI03_PV.F_CV;35.308158875;100.0 +25/10/2020 02:06:13;UEME03.U005_LI03_PV.F_CV;35.362411499;100.0 +25/10/2020 02:06:14;UEME03.U005_LI03_PV.F_CV;35.756656647;100.0 +25/10/2020 02:06:15;UEME03.U005_LI03_PV.F_CV;35.058593750;100.0 +25/10/2020 02:06:16;UEME03.U005_LI03_PV.F_CV;35.713253021;100.0 +25/10/2020 02:06:17;UEME03.U005_LI03_PV.F_CV;35.036891937;100.0 +25/10/2020 02:06:18;UEME03.U005_LI03_PV.F_CV;35.170719147;100.0 +25/10/2020 02:06:19;UEME03.U005_LI03_PV.F_CV;35.029659271;100.0 +25/10/2020 02:06:21;UEME03.U005_LI03_PV.F_CV;35.756656647;100.0 +25/10/2020 02:06:22;UEME03.U005_LI03_PV.F_CV;35.033275604;100.0 +25/10/2020 02:06:25;UEME03.U005_LI03_PV.F_CV;35.304542542;100.0 +25/10/2020 02:06:26;UEME03.U005_LI03_PV.F_CV;35.036891937;100.0 +25/10/2020 02:06:28;UEME03.U005_LI03_PV.F_CV;35.123699188;100.0 +25/10/2020 02:06:29;UEME03.U005_LI03_PV.F_CV;35.029659271;100.0 +25/10/2020 02:06:54;UEME03.U005_LI03_PV.F_CV;35.029659271;100.0 +25/10/2020 02:06:55;UEME03.U005_LI03_PV.F_CV;35.279224396;100.0 +25/10/2020 02:06:56;UEME03.U005_LI03_PV.F_CV;35.029659271;100.0 +25/10/2020 02:06:35;UEME03.U005_LI03_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_LI07_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_LI07_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U005_LI07_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:04;UEME03.U005_LI07_PV.F_CV;9.989872932;100.0 +25/10/2020 02:06:05;UEME03.U005_LI07_PV.F_CV;9.610098839;100.0 +25/10/2020 02:06:06;UEME03.U005_LI07_PV.F_CV;9.989872932;100.0 +25/10/2020 02:06:07;UEME03.U005_LI07_PV.F_CV;9.827112198;100.0 +25/10/2020 02:06:09;UEME03.U005_LI07_PV.F_CV;9.989872932;100.0 +25/10/2020 02:06:16;UEME03.U005_LI07_PV.F_CV;9.989872932;100.0 +25/10/2020 02:06:17;UEME03.U005_LI07_PV.F_CV;9.422019958;100.0 +25/10/2020 02:06:18;UEME03.U005_LI07_PV.F_CV;9.986255646;100.0 +25/10/2020 02:06:20;UEME03.U005_LI07_PV.F_CV;9.798176765;100.0 +25/10/2020 02:06:21;UEME03.U005_LI07_PV.F_CV;9.552227974;100.0 +25/10/2020 02:06:23;UEME03.U005_LI07_PV.F_CV;9.932002068;100.0 +25/10/2020 02:06:24;UEME03.U005_LI07_PV.F_CV;9.440104485;100.0 +25/10/2020 02:06:25;UEME03.U005_LI07_PV.F_CV;9.986255646;100.0 +25/10/2020 02:06:26;UEME03.U005_LI07_PV.F_CV;9.696904182;100.0 +25/10/2020 02:06:27;UEME03.U005_LI07_PV.F_CV;9.986255646;100.0 +25/10/2020 02:06:31;UEME03.U005_LI07_PV.F_CV;9.935619354;100.0 +25/10/2020 02:06:32;UEME03.U005_LI07_PV.F_CV;9.747540474;100.0 +25/10/2020 02:06:33;UEME03.U005_LI07_PV.F_CV;9.837963104;100.0 +25/10/2020 02:06:35;UEME03.U005_LI07_PV.F_CV;9.780092239;100.0 +25/10/2020 02:06:36;UEME03.U005_LI07_PV.F_CV;9.447338104;100.0 +25/10/2020 02:06:38;UEME03.U005_LI07_PV.F_CV;9.631799698;100.0 +25/10/2020 02:06:39;UEME03.U005_LI07_PV.F_CV;9.454571724;100.0 +25/10/2020 02:06:40;UEME03.U005_LI07_PV.F_CV;9.505208015;100.0 +25/10/2020 02:06:41;UEME03.U005_LI07_PV.F_CV;9.986255646;100.0 +25/10/2020 02:06:44;UEME03.U005_LI07_PV.F_CV;9.935619354;100.0 +25/10/2020 02:06:45;UEME03.U005_LI07_PV.F_CV;9.414786339;100.0 +25/10/2020 02:06:48;UEME03.U005_LI07_PV.F_CV;9.570312500;100.0 +25/10/2020 02:06:49;UEME03.U005_LI07_PV.F_CV;9.414786339;100.0 +25/10/2020 02:06:50;UEME03.U005_LI07_PV.F_CV;9.812644958;100.0 +25/10/2020 02:06:51;UEME03.U005_LI07_PV.F_CV;9.989872932;100.0 +25/10/2020 02:06:57;UEME03.U005_LI07_PV.F_CV;9.989872932;100.0 +25/10/2020 02:06:58;UEME03.U005_LI07_PV.F_CV;9.443720818;100.0 +25/10/2020 02:06:59;UEME03.U005_LI07_PV.F_CV;9.899450302;100.0 +25/10/2020 02:06:35;UEME03.U005_LI07_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_LI10_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_LI10_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U005_LI10_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;UEME03.U005_LI10_PV.F_CV;15.418836594;100.0 +25/10/2020 02:06:01;UEME03.U005_LI10_PV.F_CV;14.890769958;100.0 +25/10/2020 02:06:02;UEME03.U005_LI10_PV.F_CV;15.418836594;100.0 +25/10/2020 02:06:03;UEME03.U005_LI10_PV.F_CV;16.156684875;100.0 +25/10/2020 02:06:04;UEME03.U005_LI10_PV.F_CV;15.480323792;100.0 +25/10/2020 02:06:05;UEME03.U005_LI10_PV.F_CV;16.160301208;100.0 +25/10/2020 02:06:07;UEME03.U005_LI10_PV.F_CV;16.090373993;100.0 +25/10/2020 02:06:09;UEME03.U005_LI10_PV.F_CV;16.142215729;100.0 +25/10/2020 02:06:11;UEME03.U005_LI10_PV.F_CV;15.418836594;100.0 +25/10/2020 02:06:12;UEME03.U005_LI10_PV.F_CV;16.156684875;100.0 +25/10/2020 02:06:14;UEME03.U005_LI10_PV.F_CV;15.426070213;100.0 +25/10/2020 02:06:15;UEME03.U005_LI10_PV.F_CV;16.156684875;100.0 +25/10/2020 02:06:16;UEME03.U005_LI10_PV.F_CV;15.979455948;100.0 +25/10/2020 02:06:17;UEME03.U005_LI10_PV.F_CV;15.549045563;100.0 +25/10/2020 02:06:19;UEME03.U005_LI10_PV.F_CV;16.160301208;100.0 +25/10/2020 02:06:20;UEME03.U005_LI10_PV.F_CV;16.055410385;100.0 +25/10/2020 02:06:22;UEME03.U005_LI10_PV.F_CV;15.473090172;100.0 +25/10/2020 02:06:23;UEME03.U005_LI10_PV.F_CV;16.019241333;100.0 +25/10/2020 02:06:24;UEME03.U005_LI10_PV.F_CV;16.156684875;100.0 +25/10/2020 02:06:38;UEME03.U005_LI10_PV.F_CV;15.972222328;100.0 +25/10/2020 02:06:39;UEME03.U005_LI10_PV.F_CV;16.156684875;100.0 +25/10/2020 02:06:43;UEME03.U005_LI10_PV.F_CV;16.156684875;100.0 +25/10/2020 02:06:44;UEME03.U005_LI10_PV.F_CV;15.827546120;100.0 +25/10/2020 02:06:45;UEME03.U005_LI10_PV.F_CV;16.160301208;100.0 +25/10/2020 02:06:46;UEME03.U005_LI10_PV.F_CV;15.422453880;100.0 +25/10/2020 02:06:47;UEME03.U005_LI10_PV.F_CV;16.156684875;100.0 +25/10/2020 02:06:53;UEME03.U005_LI10_PV.F_CV;16.156684875;100.0 +25/10/2020 02:06:54;UEME03.U005_LI10_PV.F_CV;15.874566078;100.0 +25/10/2020 02:06:55;UEME03.U005_LI10_PV.F_CV;16.160301208;100.0 +25/10/2020 02:06:57;UEME03.U005_LI10_PV.F_CV;15.494791985;100.0 +25/10/2020 02:06:58;UEME03.U005_LI10_PV.F_CV;16.149450302;100.0 +25/10/2020 02:06:35;UEME03.U005_LI10_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U005_N400.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U005_P01.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U005_P02.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U005_P10.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_PC01_Coef_A.F_CV;0.994000018;100.0 +25/10/2020 02:06:27;UEME03.U005_PC01_Coef_B.F_CV;0.070500001;100.0 +25/10/2020 02:06:27;UEME03.U005_PC01_PV.F_CV;34.861465454;100.0 +25/10/2020 02:06:27;UEME03.U005_PC01_SP.F_CV;35.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_PI02_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_PI02_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U005_PI02_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_PI02_PV.F_CV;34.906623840;100.0 +25/10/2020 02:06:35;UEME03.U005_PI02_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_TC01_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_TC01_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U005_TC01_OP.F_CV;7.291544437;100.0 +25/10/2020 02:06:36;UEME03.U005_TC01_OP.F_CV;7.128304482;100.0 +25/10/2020 02:06:26;UEME03.U005_TC01_PV.F_CV;61.881450653;100.0 +25/10/2020 02:06:27;UEME03.U005_TC01_SP.F_CV;62.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_TC02_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_TC02_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;UEME03.U005_TC02_OP.F_CV;19.209226608;100.0 +25/10/2020 02:06:30;UEME03.U005_TC02_PV.F_CV;64.858573914;100.0 +25/10/2020 02:06:13;UEME03.U005_TC02_SP.F_CV;65.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_TC03_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_TC03_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;UEME03.U005_TC03_OP.F_CV;23.103530884;100.0 +25/10/2020 02:06:05;UEME03.U005_TC03_OP.F_CV;23.344713211;100.0 +25/10/2020 02:06:26;UEME03.U005_TC03_PV.F_CV;64.960441589;100.0 +25/10/2020 02:06:27;UEME03.U005_TC03_SP.F_CV;65.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_TC04_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_TC04_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;UEME03.U005_TC04_OP.F_CV;9.115489960;100.0 +25/10/2020 02:06:13;UEME03.U005_TC04_PV.F_CV;64.953865051;100.0 +25/10/2020 02:06:19;UEME03.U005_TC04_PV.F_CV;64.652877808;100.0 +25/10/2020 02:06:23;UEME03.U005_TC04_PV.F_CV;64.953865051;100.0 +25/10/2020 02:06:27;UEME03.U005_TC04_SP.F_CV;65.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_TI01_Coef_A.F_CV;0.999800026;100.0 +25/10/2020 02:06:27;UEME03.U005_TI01_Coef_B.F_CV;-0.192800000;100.0 +25/10/2020 02:06:35;UEME03.U005_TI01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:26;UEME03.U005_TI01_PV.F_CV;61.881450653;100.0 +25/10/2020 02:06:35;UEME03.U005_TI01_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_TI02_Coef_A.F_CV;1.000800014;100.0 +25/10/2020 02:06:27;UEME03.U005_TI02_Coef_B.F_CV;-0.293500006;100.0 +25/10/2020 02:06:35;UEME03.U005_TI02_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:30;UEME03.U005_TI02_PV.F_CV;64.858573914;100.0 +25/10/2020 02:06:35;UEME03.U005_TI02_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_TI03_Coef_A.F_CV;0.999800026;100.0 +25/10/2020 02:06:27;UEME03.U005_TI03_Coef_B.F_CV;-0.326499999;100.0 +25/10/2020 02:06:35;UEME03.U005_TI03_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:26;UEME03.U005_TI03_PV.F_CV;64.960441589;100.0 +25/10/2020 02:06:35;UEME03.U005_TI03_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_TI04_Coef_A.F_CV;1.003299952;100.0 +25/10/2020 02:06:27;UEME03.U005_TI04_Coef_B.F_CV;-0.160300002;100.0 +25/10/2020 02:06:35;UEME03.U005_TI04_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:13;UEME03.U005_TI04_PV.F_CV;64.953865051;100.0 +25/10/2020 02:06:19;UEME03.U005_TI04_PV.F_CV;64.652877808;100.0 +25/10/2020 02:06:23;UEME03.U005_TI04_PV.F_CV;64.953865051;100.0 +25/10/2020 02:06:35;UEME03.U005_TI04_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_TI05_Coef_A.F_CV;0.998399973;100.0 +25/10/2020 02:06:27;UEME03.U005_TI05_Coef_B.F_CV;0.182799995;100.0 +25/10/2020 02:06:35;UEME03.U005_TI05_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_TI05_PV.F_CV;64.478096008;100.0 +25/10/2020 02:06:35;UEME03.U005_TI05_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_TI06_Coef_A.F_CV;1.001299977;100.0 +25/10/2020 02:06:27;UEME03.U005_TI06_Coef_B.F_CV;-0.460399985;100.0 +25/10/2020 02:06:35;UEME03.U005_TI06_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:14;UEME03.U005_TI06_PV.F_CV;66.526565552;100.0 +25/10/2020 02:06:35;UEME03.U005_TI06_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_TI07_Coef_A.F_CV;1.003800035;100.0 +25/10/2020 02:06:27;UEME03.U005_TI07_Coef_B.F_CV;-0.829500020;100.0 +25/10/2020 02:06:35;UEME03.U005_TI07_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:20;UEME03.U005_TI07_PV.F_CV;66.023582458;100.0 +25/10/2020 02:06:35;UEME03.U005_TI07_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_TI08_Coef_A.F_CV;1.001799941;100.0 +25/10/2020 02:06:27;UEME03.U005_TI08_Coef_B.F_CV;-0.460700005;100.0 +25/10/2020 02:06:35;UEME03.U005_TI08_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:10;UEME03.U005_TI08_PV.F_CV;63.554313660;100.0 +25/10/2020 02:06:35;UEME03.U005_TI08_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_TI11_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_TI11_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U005_TI11_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:11;UEME03.U005_TI11_PV.F_CV;88.596664429;100.0 +25/10/2020 02:06:32;UEME03.U005_TI11_PV.F_CV;88.900001526;100.0 +25/10/2020 02:06:35;UEME03.U005_TI11_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_TI12_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_TI12_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U005_TI12_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UEME03.U005_TI12_PV.F_CV;67.860000610;100.0 +25/10/2020 02:06:35;UEME03.U005_TI12_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_TI13_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_TI13_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U005_TI13_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:51;UEME03.U005_TI13_PV.F_CV;61.500000000;100.0 +25/10/2020 02:06:35;UEME03.U005_TI13_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_TI14_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_TI14_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U005_TI14_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;UEME03.U005_TI14_PV.F_CV;47.859321594;100.0 +25/10/2020 02:06:35;UEME03.U005_TI14_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:15;UEME03.U005_TI211_PV.F_CV;80.055000305;100.0 +25/10/2020 02:06:58;UEME03.U005_TI211_PV.F_CV;80.361541748;100.0 +25/10/2020 02:06:42;UEME03.U005_TI212_PV.F_CV;76.800003052;100.0 +25/10/2020 02:06:53;UEME03.U005_TI213_PV.F_CV;66.500000000;100.0 +25/10/2020 02:06:44;UEME03.U005_TI214_PV.F_CV;51.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_TI30_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_TI30_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U005_TI30_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:31;UEME03.U005_TI30_PV.F_CV;23.899999619;100.0 +25/10/2020 02:06:35;UEME03.U005_TI30_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U005_WEV06.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_WI02_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_WI02_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U005_WI02_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UEME03.U005_WI02_PV.F_CV;3661.719238281;100.0 +25/10/2020 02:06:35;UEME03.U005_WI02_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_WI06_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U005_WI06_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U005_WI06_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U005_WI06_PV.F_CV;-3.000000000;100.0 +25/10/2020 02:06:35;UEME03.U005_WI06_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:41;UEME03.U031_Codeur.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_DPY01_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_DPY01_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U031_DPY01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_DPY01_PV.F_CV;0.211166382;100.0 +25/10/2020 02:06:35;UEME03.U031_DPY01_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U031_F01.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U031_F01_1.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U031_F01_2.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U031_F01_3.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U031_F01_4.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_FC01_Coef_A.F_CV;1.003900051;100.0 +25/10/2020 02:06:27;UEME03.U031_FC01_Coef_B.F_CV;-0.535799980;100.0 +25/10/2020 02:06:27;UEME03.U031_FC01_PV.F_CV;79.999938965;100.0 +25/10/2020 02:06:27;UEME03.U031_FC01_SP.F_CV;80.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_FC02_Coef_A.F_CV;1.043799996;100.0 +25/10/2020 02:06:27;UEME03.U031_FC02_Coef_B.F_CV;0.097599998;100.0 +25/10/2020 02:06:27;UEME03.U031_FC02_PV.F_CV;0.097599998;100.0 +25/10/2020 02:06:08;UEME03.U031_FC02_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_FC10_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_FC10_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;UEME03.U031_FC10_OP.F_CV;33.253952026;100.0 +25/10/2020 02:06:01;UEME03.U031_FC10_OP.F_CV;34.698348999;100.0 +25/10/2020 02:06:02;UEME03.U031_FC10_OP.F_CV;34.863994598;100.0 +25/10/2020 02:06:03;UEME03.U031_FC10_OP.F_CV;34.681659698;100.0 +25/10/2020 02:06:04;UEME03.U031_FC10_OP.F_CV;34.326759338;100.0 +25/10/2020 02:06:05;UEME03.U031_FC10_OP.F_CV;34.468124390;100.0 +25/10/2020 02:06:06;UEME03.U031_FC10_OP.F_CV;34.292091370;100.0 +25/10/2020 02:06:07;UEME03.U031_FC10_OP.F_CV;34.826038361;100.0 +25/10/2020 02:06:08;UEME03.U031_FC10_OP.F_CV;33.595535278;100.0 +25/10/2020 02:06:09;UEME03.U031_FC10_OP.F_CV;34.655429840;100.0 +25/10/2020 02:06:10;UEME03.U031_FC10_OP.F_CV;35.433212280;100.0 +25/10/2020 02:06:12;UEME03.U031_FC10_OP.F_CV;35.831115723;100.0 +25/10/2020 02:06:13;UEME03.U031_FC10_OP.F_CV;35.271846771;100.0 +25/10/2020 02:06:14;UEME03.U031_FC10_OP.F_CV;34.368923187;100.0 +25/10/2020 02:06:15;UEME03.U031_FC10_OP.F_CV;35.507225037;100.0 +25/10/2020 02:06:17;UEME03.U031_FC10_OP.F_CV;34.219879150;100.0 +25/10/2020 02:06:19;UEME03.U031_FC10_OP.F_CV;33.634799957;100.0 +25/10/2020 02:06:20;UEME03.U031_FC10_OP.F_CV;33.833507538;100.0 +25/10/2020 02:06:21;UEME03.U031_FC10_OP.F_CV;35.188213348;100.0 +25/10/2020 02:06:23;UEME03.U031_FC10_OP.F_CV;36.596187592;100.0 +25/10/2020 02:06:24;UEME03.U031_FC10_OP.F_CV;37.068771362;100.0 +25/10/2020 02:06:25;UEME03.U031_FC10_OP.F_CV;35.592155457;100.0 +25/10/2020 02:06:26;UEME03.U031_FC10_OP.F_CV;35.396781921;100.0 +25/10/2020 02:06:27;UEME03.U031_FC10_OP.F_CV;34.908584595;100.0 +25/10/2020 02:06:28;UEME03.U031_FC10_OP.F_CV;34.619235992;100.0 +25/10/2020 02:06:29;UEME03.U031_FC10_OP.F_CV;35.873916626;100.0 +25/10/2020 02:06:30;UEME03.U031_FC10_OP.F_CV;36.694572449;100.0 +25/10/2020 02:06:31;UEME03.U031_FC10_OP.F_CV;35.755668640;100.0 +25/10/2020 02:06:32;UEME03.U031_FC10_OP.F_CV;35.878383636;100.0 +25/10/2020 02:06:33;UEME03.U031_FC10_OP.F_CV;35.009361267;100.0 +25/10/2020 02:06:34;UEME03.U031_FC10_OP.F_CV;35.287403107;100.0 +25/10/2020 02:06:35;UEME03.U031_FC10_OP.F_CV;35.693370819;100.0 +25/10/2020 02:06:36;UEME03.U031_FC10_OP.F_CV;34.646034241;100.0 +25/10/2020 02:06:37;UEME03.U031_FC10_OP.F_CV;35.959072113;100.0 +25/10/2020 02:06:39;UEME03.U031_FC10_OP.F_CV;34.451133728;100.0 +25/10/2020 02:06:41;UEME03.U031_FC10_OP.F_CV;35.038612366;100.0 +25/10/2020 02:06:42;UEME03.U031_FC10_OP.F_CV;35.437156677;100.0 +25/10/2020 02:06:43;UEME03.U031_FC10_OP.F_CV;36.094757080;100.0 +25/10/2020 02:06:45;UEME03.U031_FC10_OP.F_CV;34.429901123;100.0 +25/10/2020 02:06:46;UEME03.U031_FC10_OP.F_CV;33.723377228;100.0 +25/10/2020 02:06:47;UEME03.U031_FC10_OP.F_CV;34.015575409;100.0 +25/10/2020 02:06:48;UEME03.U031_FC10_OP.F_CV;35.169799805;100.0 +25/10/2020 02:06:49;UEME03.U031_FC10_OP.F_CV;34.198780060;100.0 +25/10/2020 02:06:50;UEME03.U031_FC10_OP.F_CV;34.022354126;100.0 +25/10/2020 02:06:51;UEME03.U031_FC10_OP.F_CV;34.811939240;100.0 +25/10/2020 02:06:52;UEME03.U031_FC10_OP.F_CV;33.598106384;100.0 +25/10/2020 02:06:53;UEME03.U031_FC10_OP.F_CV;34.825595856;100.0 +25/10/2020 02:06:54;UEME03.U031_FC10_OP.F_CV;36.200992584;100.0 +25/10/2020 02:06:56;UEME03.U031_FC10_OP.F_CV;34.016159058;100.0 +25/10/2020 02:06:57;UEME03.U031_FC10_OP.F_CV;34.630664825;100.0 +25/10/2020 02:06:58;UEME03.U031_FC10_OP.F_CV;35.117698669;100.0 +25/10/2020 02:06:59;UEME03.U031_FC10_OP.F_CV;35.440841675;100.0 +25/10/2020 02:06:01;UEME03.U031_FC10_PV.F_CV;316.221984863;100.0 +25/10/2020 02:06:15;UEME03.U031_FC10_PV.F_CV;315.713470459;100.0 +25/10/2020 02:06:27;UEME03.U031_FC10_SP.F_CV;316.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_FI05_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_FI05_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U031_FI05_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:14;UEME03.U031_FI05_PV.F_CV;72.000000000;100.0 +25/10/2020 02:06:35;UEME03.U031_FI05_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_FQ05_Coef_A.F_CV;1.003399968;100.0 +25/10/2020 02:06:27;UEME03.U031_FQ05_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U031_FQ05_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UEME03.U031_FQ05_PV.F_CV;31580.880859375;100.0 +25/10/2020 02:06:35;UEME03.U031_FQ05_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U031_HEV01B.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U031_HEV11.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U031_HEV12.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U031_HEV14.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_LC01_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_LC01_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;UEME03.U031_LC01_OP.F_CV;14.232159615;100.0 +25/10/2020 02:06:02;UEME03.U031_LC01_OP.F_CV;13.962644577;100.0 +25/10/2020 02:06:03;UEME03.U031_LC01_OP.F_CV;14.243333817;100.0 +25/10/2020 02:06:04;UEME03.U031_LC01_OP.F_CV;14.405081749;100.0 +25/10/2020 02:06:06;UEME03.U031_LC01_OP.F_CV;14.033474922;100.0 +25/10/2020 02:06:09;UEME03.U031_LC01_OP.F_CV;13.702864647;100.0 +25/10/2020 02:06:10;UEME03.U031_LC01_OP.F_CV;13.520451546;100.0 +25/10/2020 02:06:12;UEME03.U031_LC01_OP.F_CV;13.573725700;100.0 +25/10/2020 02:06:14;UEME03.U031_LC01_OP.F_CV;13.761564255;100.0 +25/10/2020 02:06:16;UEME03.U031_LC01_OP.F_CV;13.215169907;100.0 +25/10/2020 02:06:18;UEME03.U031_LC01_OP.F_CV;13.533598900;100.0 +25/10/2020 02:06:21;UEME03.U031_LC01_OP.F_CV;13.778532028;100.0 +25/10/2020 02:06:22;UEME03.U031_LC01_OP.F_CV;13.728434563;100.0 +25/10/2020 02:06:23;UEME03.U031_LC01_OP.F_CV;13.531925201;100.0 +25/10/2020 02:06:24;UEME03.U031_LC01_OP.F_CV;13.195388794;100.0 +25/10/2020 02:06:26;UEME03.U031_LC01_OP.F_CV;13.394103050;100.0 +25/10/2020 02:06:27;UEME03.U031_LC01_OP.F_CV;13.274375916;100.0 +25/10/2020 02:06:28;UEME03.U031_LC01_OP.F_CV;13.635858536;100.0 +25/10/2020 02:06:30;UEME03.U031_LC01_OP.F_CV;13.439249039;100.0 +25/10/2020 02:06:32;UEME03.U031_LC01_OP.F_CV;13.633628845;100.0 +25/10/2020 02:06:34;UEME03.U031_LC01_OP.F_CV;13.570474625;100.0 +25/10/2020 02:06:36;UEME03.U031_LC01_OP.F_CV;14.062365532;100.0 +25/10/2020 02:06:37;UEME03.U031_LC01_OP.F_CV;13.906543732;100.0 +25/10/2020 02:06:38;UEME03.U031_LC01_OP.F_CV;13.521604538;100.0 +25/10/2020 02:06:39;UEME03.U031_LC01_OP.F_CV;13.468945503;100.0 +25/10/2020 02:06:40;UEME03.U031_LC01_OP.F_CV;13.906617165;100.0 +25/10/2020 02:06:41;UEME03.U031_LC01_OP.F_CV;13.834443092;100.0 +25/10/2020 02:06:42;UEME03.U031_LC01_OP.F_CV;13.501346588;100.0 +25/10/2020 02:06:47;UEME03.U031_LC01_OP.F_CV;13.751993179;100.0 +25/10/2020 02:06:49;UEME03.U031_LC01_OP.F_CV;13.605862617;100.0 +25/10/2020 02:06:50;UEME03.U031_LC01_OP.F_CV;13.885238647;100.0 +25/10/2020 02:06:51;UEME03.U031_LC01_OP.F_CV;14.032996178;100.0 +25/10/2020 02:06:52;UEME03.U031_LC01_OP.F_CV;13.471175194;100.0 +25/10/2020 02:06:53;UEME03.U031_LC01_OP.F_CV;13.385355949;100.0 +25/10/2020 02:06:54;UEME03.U031_LC01_OP.F_CV;13.636711121;100.0 +25/10/2020 02:06:55;UEME03.U031_LC01_OP.F_CV;13.766747475;100.0 +25/10/2020 02:06:56;UEME03.U031_LC01_OP.F_CV;13.409654617;100.0 +25/10/2020 02:06:58;UEME03.U031_LC01_OP.F_CV;13.588680267;100.0 +25/10/2020 02:06:59;UEME03.U031_LC01_OP.F_CV;13.524061203;100.0 +25/10/2020 02:06:01;UEME03.U031_LC01_PV.F_CV;50.057868958;100.0 +25/10/2020 02:06:03;UEME03.U031_LC01_PV.F_CV;50.202545166;100.0 +25/10/2020 02:06:09;UEME03.U031_LC01_PV.F_CV;49.913192749;100.0 +25/10/2020 02:06:14;UEME03.U031_LC01_PV.F_CV;49.971065521;100.0 +25/10/2020 02:06:15;UEME03.U031_LC01_PV.F_CV;49.822772980;100.0 +25/10/2020 02:06:18;UEME03.U031_LC01_PV.F_CV;49.963832855;100.0 +25/10/2020 02:06:19;UEME03.U031_LC01_PV.F_CV;49.913192749;100.0 +25/10/2020 02:06:20;UEME03.U031_LC01_PV.F_CV;49.985530853;100.0 +25/10/2020 02:06:23;UEME03.U031_LC01_PV.F_CV;49.826389313;100.0 +25/10/2020 02:06:25;UEME03.U031_LC01_PV.F_CV;49.877025604;100.0 +25/10/2020 02:06:26;UEME03.U031_LC01_PV.F_CV;49.822772980;100.0 +25/10/2020 02:06:28;UEME03.U031_LC01_PV.F_CV;49.985530853;100.0 +25/10/2020 02:06:29;UEME03.U031_LC01_PV.F_CV;49.902343750;100.0 +25/10/2020 02:06:34;UEME03.U031_LC01_PV.F_CV;50.054252625;100.0 +25/10/2020 02:06:37;UEME03.U031_LC01_PV.F_CV;49.942131042;100.0 +25/10/2020 02:06:40;UEME03.U031_LC01_PV.F_CV;50.065105438;100.0 +25/10/2020 02:06:41;UEME03.U031_LC01_PV.F_CV;49.942131042;100.0 +25/10/2020 02:06:49;UEME03.U031_LC01_PV.F_CV;50.071434021;100.0 +25/10/2020 02:06:52;UEME03.U031_LC01_PV.F_CV;49.880641937;100.0 +25/10/2020 02:06:54;UEME03.U031_LC01_PV.F_CV;50.007232666;100.0 +25/10/2020 02:06:56;UEME03.U031_LC01_PV.F_CV;49.884258270;100.0 +25/10/2020 02:06:27;UEME03.U031_LC01_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:35;UEME03.U031_LEV07.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_LI03_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_LI03_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U031_LI03_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:02;UEME03.U031_LI03_PV.F_CV;66.641349792;100.0 +25/10/2020 02:06:03;UEME03.U031_LI03_PV.F_CV;67.154945374;100.0 +25/10/2020 02:06:04;UEME03.U031_LI03_PV.F_CV;66.641349792;100.0 +25/10/2020 02:06:06;UEME03.U031_LI03_PV.F_CV;66.723327637;100.0 +25/10/2020 02:06:08;UEME03.U031_LI03_PV.F_CV;66.644966125;100.0 +25/10/2020 02:06:26;UEME03.U031_LI03_PV.F_CV;66.592720032;100.0 +25/10/2020 02:06:27;UEME03.U031_LI03_PV.F_CV;67.306854248;100.0 +25/10/2020 02:06:28;UEME03.U031_LI03_PV.F_CV;66.637733459;100.0 +25/10/2020 02:06:29;UEME03.U031_LI03_PV.F_CV;66.550926208;100.0 +25/10/2020 02:06:30;UEME03.U031_LI03_PV.F_CV;66.644966125;100.0 +25/10/2020 02:06:31;UEME03.U031_LI03_PV.F_CV;65.849250793;100.0 +25/10/2020 02:06:32;UEME03.U031_LI03_PV.F_CV;66.644966125;100.0 +25/10/2020 02:06:38;UEME03.U031_LI03_PV.F_CV;66.644966125;100.0 +25/10/2020 02:06:39;UEME03.U031_LI03_PV.F_CV;65.805847168;100.0 +25/10/2020 02:06:40;UEME03.U031_LI03_PV.F_CV;66.637733459;100.0 +25/10/2020 02:06:41;UEME03.U031_LI03_PV.F_CV;66.106048584;100.0 +25/10/2020 02:06:42;UEME03.U031_LI03_PV.F_CV;66.641349792;100.0 +25/10/2020 02:06:45;UEME03.U031_LI03_PV.F_CV;65.740737915;100.0 +25/10/2020 02:06:47;UEME03.U031_LI03_PV.F_CV;66.637733459;100.0 +25/10/2020 02:06:49;UEME03.U031_LI03_PV.F_CV;65.744354248;100.0 +25/10/2020 02:06:50;UEME03.U031_LI03_PV.F_CV;66.641349792;100.0 +25/10/2020 02:06:51;UEME03.U031_LI03_PV.F_CV;66.474967957;100.0 +25/10/2020 02:06:52;UEME03.U031_LI03_PV.F_CV;66.634117126;100.0 +25/10/2020 02:06:54;UEME03.U031_LI03_PV.F_CV;66.420715332;100.0 +25/10/2020 02:06:55;UEME03.U031_LI03_PV.F_CV;66.623260498;100.0 +25/10/2020 02:06:57;UEME03.U031_LI03_PV.F_CV;65.762443542;100.0 +25/10/2020 02:06:58;UEME03.U031_LI03_PV.F_CV;66.276039124;100.0 +25/10/2020 02:06:59;UEME03.U031_LI03_PV.F_CV;65.921585083;100.0 +25/10/2020 02:06:35;UEME03.U031_LI03_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_LI07_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_LI07_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U031_LI07_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;UEME03.U031_LI07_PV.F_CV;9.823494911;100.0 +25/10/2020 02:06:01;UEME03.U031_LI07_PV.F_CV;10.192419052;100.0 +25/10/2020 02:06:02;UEME03.U031_LI07_PV.F_CV;9.946470261;100.0 +25/10/2020 02:06:04;UEME03.U031_LI07_PV.F_CV;9.827112198;100.0 +25/10/2020 02:06:08;UEME03.U031_LI07_PV.F_CV;10.123698235;100.0 +25/10/2020 02:06:09;UEME03.U031_LI07_PV.F_CV;9.823494911;100.0 +25/10/2020 02:06:16;UEME03.U031_LI07_PV.F_CV;9.823494911;100.0 +25/10/2020 02:06:17;UEME03.U031_LI07_PV.F_CV;10.228588104;100.0 +25/10/2020 02:06:18;UEME03.U031_LI07_PV.F_CV;9.827112198;100.0 +25/10/2020 02:06:27;UEME03.U031_LI07_PV.F_CV;9.827112198;100.0 +25/10/2020 02:06:28;UEME03.U031_LI07_PV.F_CV;10.177951813;100.0 +25/10/2020 02:06:29;UEME03.U031_LI07_PV.F_CV;9.827112198;100.0 +25/10/2020 02:06:40;UEME03.U031_LI07_PV.F_CV;9.827112198;100.0 +25/10/2020 02:06:41;UEME03.U031_LI07_PV.F_CV;10.036891937;100.0 +25/10/2020 02:06:42;UEME03.U031_LI07_PV.F_CV;9.827112198;100.0 +25/10/2020 02:06:44;UEME03.U031_LI07_PV.F_CV;10.062211037;100.0 +25/10/2020 02:06:45;UEME03.U031_LI07_PV.F_CV;9.848814011;100.0 +25/10/2020 02:06:50;UEME03.U031_LI07_PV.F_CV;9.848814011;100.0 +25/10/2020 02:06:51;UEME03.U031_LI07_PV.F_CV;10.224970818;100.0 +25/10/2020 02:06:52;UEME03.U031_LI07_PV.F_CV;9.823494911;100.0 +25/10/2020 02:06:35;UEME03.U031_LI07_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_LI10_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_LI10_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U031_LI10_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;UEME03.U031_LI10_PV.F_CV;38.809318542;100.0 +25/10/2020 02:06:02;UEME03.U031_LI10_PV.F_CV;39.547164917;100.0 +25/10/2020 02:06:06;UEME03.U031_LI10_PV.F_CV;40.093315125;100.0 +25/10/2020 02:06:07;UEME03.U031_LI10_PV.F_CV;39.623119354;100.0 +25/10/2020 02:06:08;UEME03.U031_LI10_PV.F_CV;40.288627625;100.0 +25/10/2020 02:06:09;UEME03.U031_LI10_PV.F_CV;39.554397583;100.0 +25/10/2020 02:06:10;UEME03.U031_LI10_PV.F_CV;40.176506042;100.0 +25/10/2020 02:06:12;UEME03.U031_LI10_PV.F_CV;39.709926605;100.0 +25/10/2020 02:06:13;UEME03.U031_LI10_PV.F_CV;39.558013916;100.0 +25/10/2020 02:06:14;UEME03.U031_LI10_PV.F_CV;40.295864105;100.0 +25/10/2020 02:06:15;UEME03.U031_LI10_PV.F_CV;40.086082458;100.0 +25/10/2020 02:06:16;UEME03.U031_LI10_PV.F_CV;39.579715729;100.0 +25/10/2020 02:06:17;UEME03.U031_LI10_PV.F_CV;40.285011292;100.0 +25/10/2020 02:06:20;UEME03.U031_LI10_PV.F_CV;40.530960083;100.0 +25/10/2020 02:06:21;UEME03.U031_LI10_PV.F_CV;41.004776001;100.0 +25/10/2020 02:06:22;UEME03.U031_LI10_PV.F_CV;40.650318146;100.0 +25/10/2020 02:06:23;UEME03.U031_LI10_PV.F_CV;41.030094147;100.0 +25/10/2020 02:06:24;UEME03.U031_LI10_PV.F_CV;40.295864105;100.0 +25/10/2020 02:06:25;UEME03.U031_LI10_PV.F_CV;40.393520355;100.0 +25/10/2020 02:06:26;UEME03.U031_LI10_PV.F_CV;41.044559479;100.0 +25/10/2020 02:06:39;UEME03.U031_LI10_PV.F_CV;41.044559479;100.0 +25/10/2020 02:06:40;UEME03.U031_LI10_PV.F_CV;41.796875000;100.0 +25/10/2020 02:06:42;UEME03.U031_LI10_PV.F_CV;41.055412292;100.0 +25/10/2020 02:06:43;UEME03.U031_LI10_PV.F_CV;41.796875000;100.0 +25/10/2020 02:06:53;UEME03.U031_LI10_PV.F_CV;41.849483490;100.0 +25/10/2020 02:06:55;UEME03.U031_LI10_PV.F_CV;42.487701416;100.0 +25/10/2020 02:06:57;UEME03.U031_LI10_PV.F_CV;42.538337708;100.0 +25/10/2020 02:06:58;UEME03.U031_LI10_PV.F_CV;41.796875000;100.0 +25/10/2020 02:06:59;UEME03.U031_LI10_PV.F_CV;41.999420166;100.0 +25/10/2020 02:06:35;UEME03.U031_LI10_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U031_N400.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U031_P01.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U031_P02.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U031_P10.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_PC01_Coef_A.F_CV;0.994700015;100.0 +25/10/2020 02:06:27;UEME03.U031_PC01_Coef_B.F_CV;0.056499999;100.0 +25/10/2020 02:06:27;UEME03.U031_PC01_PV.F_CV;34.873203278;100.0 +25/10/2020 02:06:27;UEME03.U031_PC01_SP.F_CV;35.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_PI02_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_PI02_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U031_PI02_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_PI02_PV.F_CV;35.078517914;100.0 +25/10/2020 02:06:35;UEME03.U031_PI02_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_TC01_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_TC01_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;UEME03.U031_TC01_OP.F_CV;7.203012943;100.0 +25/10/2020 02:06:24;UEME03.U031_TC01_PV.F_CV;61.778415680;100.0 +25/10/2020 02:06:27;UEME03.U031_TC01_SP.F_CV;62.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_TC02_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_TC02_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;UEME03.U031_TC02_OP.F_CV;9.371096611;100.0 +25/10/2020 02:06:22;UEME03.U031_TC02_PV.F_CV;64.904693604;100.0 +25/10/2020 02:06:27;UEME03.U031_TC02_SP.F_CV;65.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_TC03_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_TC03_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;UEME03.U031_TC03_OP.F_CV;14.964191437;100.0 +25/10/2020 02:06:16;UEME03.U031_TC03_PV.F_CV;64.737030029;100.0 +25/10/2020 02:06:42;UEME03.U031_TC03_SP.F_CV;65.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_TC04_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_TC04_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;UEME03.U031_TC04_OP.F_CV;11.562700272;100.0 +25/10/2020 02:06:07;UEME03.U031_TC04_PV.F_CV;64.725128174;100.0 +25/10/2020 02:06:27;UEME03.U031_TC04_SP.F_CV;65.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_TI01_Coef_A.F_CV;1.003000021;100.0 +25/10/2020 02:06:27;UEME03.U031_TI01_Coef_B.F_CV;-0.023100000;100.0 +25/10/2020 02:06:35;UEME03.U031_TI01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:24;UEME03.U031_TI01_PV.F_CV;61.778415680;100.0 +25/10/2020 02:06:35;UEME03.U031_TI01_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_TI02_Coef_A.F_CV;1.003000021;100.0 +25/10/2020 02:06:27;UEME03.U031_TI02_Coef_B.F_CV;0.010600000;100.0 +25/10/2020 02:06:35;UEME03.U031_TI02_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:22;UEME03.U031_TI02_PV.F_CV;64.904693604;100.0 +25/10/2020 02:06:35;UEME03.U031_TI02_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_TI03_Coef_A.F_CV;0.999899983;100.0 +25/10/2020 02:06:27;UEME03.U031_TI03_Coef_B.F_CV;0.043499999;100.0 +25/10/2020 02:06:35;UEME03.U031_TI03_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:16;UEME03.U031_TI03_PV.F_CV;64.737030029;100.0 +25/10/2020 02:06:35;UEME03.U031_TI03_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_TI04_Coef_A.F_CV;0.999000013;100.0 +25/10/2020 02:06:27;UEME03.U031_TI04_Coef_B.F_CV;-0.023399999;100.0 +25/10/2020 02:06:35;UEME03.U031_TI04_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:07;UEME03.U031_TI04_PV.F_CV;64.725128174;100.0 +25/10/2020 02:06:35;UEME03.U031_TI04_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_TI05_Coef_A.F_CV;1.004999995;100.0 +25/10/2020 02:06:27;UEME03.U031_TI05_Coef_B.F_CV;-0.391200006;100.0 +25/10/2020 02:06:35;UEME03.U031_TI05_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:15;UEME03.U031_TI05_PV.F_CV;64.129798889;100.0 +25/10/2020 02:06:35;UEME03.U031_TI05_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_TI06_Coef_A.F_CV;0.998000026;100.0 +25/10/2020 02:06:27;UEME03.U031_TI06_Coef_B.F_CV;-0.090000004;100.0 +25/10/2020 02:06:35;UEME03.U031_TI06_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:05;UEME03.U031_TI06_PV.F_CV;64.580406189;100.0 +25/10/2020 02:06:35;UEME03.U031_TI06_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_TI07_Coef_A.F_CV;1.003000021;100.0 +25/10/2020 02:06:27;UEME03.U031_TI07_Coef_B.F_CV;-0.624899983;100.0 +25/10/2020 02:06:35;UEME03.U031_TI07_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U031_TI07_PV.F_CV;64.570098877;100.0 +25/10/2020 02:06:35;UEME03.U031_TI07_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_TI08_Coef_A.F_CV;0.999000013;100.0 +25/10/2020 02:06:27;UEME03.U031_TI08_Coef_B.F_CV;-0.223199993;100.0 +25/10/2020 02:06:35;UEME03.U031_TI08_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_TI08_PV.F_CV;63.514659882;100.0 +25/10/2020 02:06:35;UEME03.U031_TI08_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_TI11_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_TI11_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U031_TI11_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:01;UEME03.U031_TI11_PV.F_CV;68.300003052;100.0 +25/10/2020 02:06:03;UEME03.U031_TI11_PV.F_CV;69.500000000;100.0 +25/10/2020 02:06:06;UEME03.U031_TI11_PV.F_CV;68.400001526;100.0 +25/10/2020 02:06:08;UEME03.U031_TI11_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:11;UEME03.U031_TI11_PV.F_CV;68.599998474;100.0 +25/10/2020 02:06:13;UEME03.U031_TI11_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:16;UEME03.U031_TI11_PV.F_CV;68.599998474;100.0 +25/10/2020 02:06:18;UEME03.U031_TI11_PV.F_CV;69.699996948;100.0 +25/10/2020 02:06:21;UEME03.U031_TI11_PV.F_CV;68.599998474;100.0 +25/10/2020 02:06:23;UEME03.U031_TI11_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:27;UEME03.U031_TI11_PV.F_CV;69.099998474;100.0 +25/10/2020 02:06:28;UEME03.U031_TI11_PV.F_CV;70.500000000;100.0 +25/10/2020 02:06:32;UEME03.U031_TI11_PV.F_CV;69.000000000;100.0 +25/10/2020 02:06:33;UEME03.U031_TI11_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:37;UEME03.U031_TI11_PV.F_CV;68.900001526;100.0 +25/10/2020 02:06:38;UEME03.U031_TI11_PV.F_CV;70.400001526;100.0 +25/10/2020 02:06:41;UEME03.U031_TI11_PV.F_CV;69.199996948;100.0 +25/10/2020 02:06:43;UEME03.U031_TI11_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:46;UEME03.U031_TI11_PV.F_CV;68.800003052;100.0 +25/10/2020 02:06:48;UEME03.U031_TI11_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:50;UEME03.U031_TI11_PV.F_CV;69.099998474;100.0 +25/10/2020 02:06:52;UEME03.U031_TI11_PV.F_CV;69.633331299;100.0 +25/10/2020 02:06:57;UEME03.U031_TI11_PV.F_CV;68.800003052;100.0 +25/10/2020 02:06:58;UEME03.U031_TI11_PV.F_CV;69.900001526;100.0 +25/10/2020 02:06:35;UEME03.U031_TI11_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_TI12_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_TI12_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U031_TI12_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_TI12_PV.F_CV;25.100000381;100.0 +25/10/2020 02:06:35;UEME03.U031_TI12_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_TI13_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_TI13_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U031_TI13_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:01;UEME03.U031_TI13_PV.F_CV;61.084999084;100.0 +25/10/2020 02:06:29;UEME03.U031_TI13_PV.F_CV;61.400001526;100.0 +25/10/2020 02:06:35;UEME03.U031_TI13_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_TI14_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_TI14_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U031_TI14_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UEME03.U031_TI14_PV.F_CV;48.099998474;100.0 +25/10/2020 02:06:35;UEME03.U031_TI14_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UEME03.U031_TI211_PV.F_CV;72.059997559;100.0 +25/10/2020 02:06:31;UEME03.U031_TI212_PV.F_CV;61.400001526;100.0 +25/10/2020 02:06:05;UEME03.U031_TI213_PV.F_CV;63.973331451;100.0 +25/10/2020 02:06:17;UEME03.U031_TI214_PV.F_CV;54.799999237;100.0 +25/10/2020 02:06:27;UEME03.U031_TI30_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_TI30_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U031_TI30_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_TI30_PV.F_CV;23.899999619;100.0 +25/10/2020 02:06:35;UEME03.U031_TI30_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UEME03.U031_WEV06.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_WI02_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_WI02_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U031_WI02_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UEME03.U031_WI02_PV.F_CV;4128.970214844;100.0 +25/10/2020 02:06:55;UEME03.U031_WI02_PV.F_CV;4125.806640625;100.0 +25/10/2020 02:06:35;UEME03.U031_WI02_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UEME03.U031_WI06_Coef_A.F_CV;1.000000000;100.0 +25/10/2020 02:06:27;UEME03.U031_WI06_Coef_B.F_CV;0.000000000;100.0 +25/10/2020 02:06:35;UEME03.U031_WI06_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:15;UEME03.U031_WI06_PV.F_CV;68.199996948;100.0 +25/10/2020 02:06:35;UEME03.U031_WI06_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_DP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_FC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_FC02_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_FC03_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_FC03_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_FC10_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_FC10_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_FC10_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_FC11_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_FI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_FI05.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_FI10A.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_FI10B.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_FQ05.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_LC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_LC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_LI03.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_LI07.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_LI10.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_PC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_PC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_PI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_PI03.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_PI04.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC02_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC02_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC03_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC03_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC04_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC04_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC05_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC05_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC06_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC06_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC07_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC07_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC08_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC08_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC09_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC09_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC10_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC10_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC15_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC15_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC16_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC16_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC17_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC17_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:01;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:02;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:03;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:04;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:05;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:06;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:07;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:09;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:10;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:11;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:13;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:14;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:15;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:16;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:17;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:18;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:20;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:21;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:22;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:23;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:24;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:25;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:26;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:28;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:29;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:30;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:31;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:33;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:36;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:39;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:40;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:41;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:42;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:43;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:45;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:49;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:51;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:54;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:55;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:57;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:58;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UT800A.U009_TC19_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:01;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:02;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:03;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:04;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:05;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:06;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:07;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:09;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:10;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:11;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:13;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:14;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:15;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:16;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:17;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:18;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:20;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:21;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:22;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:23;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:24;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:25;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:26;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:28;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:29;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:30;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:31;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:33;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:36;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:39;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:40;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:41;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:42;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:43;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:45;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:49;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:51;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:54;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:55;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:57;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:58;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UT800A.U009_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC21_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TC21_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TI11.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TI12.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TI13.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TI14.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TI19.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TI20.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_TI30.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_VIT_P2.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_WI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U009_WI06.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U020_DP.F_CV;-0.548690796;100.0 +25/10/2020 02:06:37;UT800A.U020_FC01_PV.F_CV;11.792185783;100.0 +25/10/2020 02:06:37;UT800A.U020_FC02_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U020_FC02_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:51;UT800A.U020_FC10_OP.F_CV;25.754570007;100.0 +25/10/2020 02:06:46;UT800A.U020_FC10_PV.F_CV;20.165111542;100.0 +25/10/2020 02:06:37;UT800A.U020_FC10_SP.F_CV;19.750000000;100.0 +25/10/2020 02:06:37;UT800A.U020_FC11_PV.F_CV;10.000223160;100.0 +25/10/2020 02:06:37;UT800A.U020_FI01.F_CV;11.792185783;100.0 +25/10/2020 02:06:03;UT800A.U020_FI05.F_CV;21.599998474;100.0 +25/10/2020 02:06:21;UT800A.U020_FI05.F_CV;23.399999619;100.0 +25/10/2020 02:06:39;UT800A.U020_FI05.F_CV;22.500000000;100.0 +25/10/2020 02:06:57;UT800A.U020_FI05.F_CV;25.199998856;100.0 +25/10/2020 02:06:37;UT800A.U020_FI05B.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;UT800A.U020_FI10A.F_CV;20.163661957;100.0 +25/10/2020 02:06:16;UT800A.U020_FI10B.F_CV;20.150188446;100.0 +25/10/2020 02:06:37;UT800A.U020_FQ05.F_CV;156673.656250000;100.0 +25/10/2020 02:06:37;UT800A.U020_FQ05B.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;UT800A.U020_LC01_OP.F_CV;11.178930283;100.0 +25/10/2020 02:06:09;UT800A.U020_LC01_PV.F_CV;49.980468750;100.0 +25/10/2020 02:06:15;UT800A.U020_LC01_PV.F_CV;50.083007813;100.0 +25/10/2020 02:06:56;UT800A.U020_LC01_PV.F_CV;50.257812500;100.0 +25/10/2020 02:06:57;UT800A.U020_LC01_PV.F_CV;49.982421875;100.0 +25/10/2020 02:06:15;UT800A.U020_LI01.F_CV;50.083007813;100.0 +25/10/2020 02:06:51;UT800A.U020_LI01.F_CV;50.257812500;100.0 +25/10/2020 02:06:56;UT800A.U020_LI01.F_CV;50.197265625;100.0 +25/10/2020 02:06:58;UT800A.U020_LI01.F_CV;49.844726563;100.0 +25/10/2020 02:06:57;UT800A.U020_LI03.F_CV;55.835937500;100.0 +25/10/2020 02:06:09;UT800A.U020_LI07.F_CV;29.505859375;100.0 +25/10/2020 02:06:21;UT800A.U020_LI07.F_CV;29.353027344;100.0 +25/10/2020 02:06:39;UT800A.U020_LI07.F_CV;29.564941406;100.0 +25/10/2020 02:06:45;UT800A.U020_LI07.F_CV;29.372070313;100.0 +25/10/2020 02:06:57;UT800A.U020_LI07.F_CV;29.554687500;100.0 +25/10/2020 02:06:37;UT800A.U020_LI10.F_CV;-10.000000000;100.0 +25/10/2020 02:06:57;UT800A.U020_LT03.F_CV;55.835937500;100.0 +25/10/2020 02:06:09;UT800A.U020_LT03_AFF.F_CV;55.854492188;100.0 +25/10/2020 02:06:37;UT800A.U020_LT03_CA1.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U020_LT03_CA2.F_CV;0.000000000;0.0 +25/10/2020 02:06:15;UT800A.U020_PC01_OP.F_CV;2.145451307;100.0 +25/10/2020 02:06:02;UT800A.U020_PC01_PV.F_CV;26.996093750;100.0 +25/10/2020 02:06:03;UT800A.U020_PC01_PV.F_CV;26.997070313;100.0 +25/10/2020 02:06:08;UT800A.U020_PC01_PV.F_CV;26.997070313;100.0 +25/10/2020 02:06:09;UT800A.U020_PC01_PV.F_CV;26.996093750;100.0 +25/10/2020 02:06:14;UT800A.U020_PC01_PV.F_CV;26.996093750;100.0 +25/10/2020 02:06:15;UT800A.U020_PC01_PV.F_CV;27.000976563;100.0 +25/10/2020 02:06:20;UT800A.U020_PC01_PV.F_CV;27.000976563;100.0 +25/10/2020 02:06:21;UT800A.U020_PC01_PV.F_CV;27.009277344;100.0 +25/10/2020 02:06:27;UT800A.U020_PC01_PV.F_CV;27.009277344;100.0 +25/10/2020 02:06:28;UT800A.U020_PC01_PV.F_CV;27.006835938;100.0 +25/10/2020 02:06:38;UT800A.U020_PC01_PV.F_CV;27.006835938;100.0 +25/10/2020 02:06:39;UT800A.U020_PC01_PV.F_CV;27.010253906;100.0 +25/10/2020 02:06:44;UT800A.U020_PC01_PV.F_CV;27.010253906;100.0 +25/10/2020 02:06:45;UT800A.U020_PC01_PV.F_CV;27.009277344;100.0 +25/10/2020 02:06:50;UT800A.U020_PC01_PV.F_CV;27.009277344;100.0 +25/10/2020 02:06:51;UT800A.U020_PC01_PV.F_CV;27.012207031;100.0 +25/10/2020 02:06:56;UT800A.U020_PC01_PV.F_CV;27.012207031;100.0 +25/10/2020 02:06:57;UT800A.U020_PC01_PV.F_CV;26.987304688;100.0 +25/10/2020 02:06:37;UT800A.U020_PC01_SP.F_CV;27.000000000;100.0 +25/10/2020 02:06:37;UT800A.U020_PC101_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U020_PC101_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:10;UT800A.U020_PI01.F_CV;26.996582031;100.0 +25/10/2020 02:06:37;UT800A.U020_PI02.F_CV;26.458145142;100.0 +25/10/2020 02:06:37;UT800A.U020_PI04.F_CV;0.342117310;100.0 +25/10/2020 02:06:37;UT800A.U020_PI101.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U020_PI101_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:15;UT800A.U020_TC01_OP.F_CV;22.165594101;100.0 +25/10/2020 02:06:37;UT800A.U020_TC01_PV.F_CV;336.027038574;100.0 +25/10/2020 02:06:15;UT800A.U020_TC02_OP.F_CV;6.491286755;100.0 +25/10/2020 02:06:34;UT800A.U020_TC02_OP.F_CV;5.954161167;100.0 +25/10/2020 02:06:37;UT800A.U020_TC02_PV.F_CV;336.085235596;100.0 +25/10/2020 02:06:52;UT800A.U020_TC03_OP.F_CV;6.393627644;100.0 +25/10/2020 02:06:37;UT800A.U020_TC03_PV.F_CV;336.047943115;100.0 +25/10/2020 02:06:39;UT800A.U020_TC04_OP.F_CV;22.946866989;100.0 +25/10/2020 02:06:33;UT800A.U020_TC04_PV.F_CV;335.992187500;100.0 +25/10/2020 02:06:02;UT800A.U020_TC05_OP.F_CV;17.575609207;100.0 +25/10/2020 02:06:03;UT800A.U020_TC05_OP.F_CV;15.451520920;100.0 +25/10/2020 02:06:21;UT800A.U020_TC05_OP.F_CV;18.015075684;100.0 +25/10/2020 02:06:33;UT800A.U020_TC05_OP.F_CV;18.723106384;100.0 +25/10/2020 02:06:34;UT800A.U020_TC05_OP.F_CV;21.066926956;100.0 +25/10/2020 02:06:02;UT800A.U020_TC05_PV.F_CV;55.135742188;100.0 +25/10/2020 02:06:03;UT800A.U020_TC05_PV.F_CV;55.316406250;100.0 +25/10/2020 02:06:08;UT800A.U020_TC05_PV.F_CV;55.316406250;100.0 +25/10/2020 02:06:09;UT800A.U020_TC05_PV.F_CV;55.281250000;100.0 +25/10/2020 02:06:14;UT800A.U020_TC05_PV.F_CV;55.281250000;100.0 +25/10/2020 02:06:15;UT800A.U020_TC05_PV.F_CV;55.300781250;100.0 +25/10/2020 02:06:27;UT800A.U020_TC05_PV.F_CV;55.300781250;100.0 +25/10/2020 02:06:28;UT800A.U020_TC05_PV.F_CV;55.335937500;100.0 +25/10/2020 02:06:33;UT800A.U020_TC05_PV.F_CV;55.335937500;100.0 +25/10/2020 02:06:34;UT800A.U020_TC05_PV.F_CV;55.157226563;100.0 +25/10/2020 02:06:38;UT800A.U020_TC05_PV.F_CV;55.157226563;100.0 +25/10/2020 02:06:39;UT800A.U020_TC05_PV.F_CV;55.130859375;100.0 +25/10/2020 02:06:44;UT800A.U020_TC05_PV.F_CV;55.130859375;100.0 +25/10/2020 02:06:45;UT800A.U020_TC05_PV.F_CV;55.165039063;100.0 +25/10/2020 02:06:50;UT800A.U020_TC05_PV.F_CV;55.165039063;100.0 +25/10/2020 02:06:51;UT800A.U020_TC05_PV.F_CV;55.171875000;100.0 +25/10/2020 02:06:56;UT800A.U020_TC05_PV.F_CV;55.171875000;100.0 +25/10/2020 02:06:57;UT800A.U020_TC05_PV.F_CV;55.140625000;100.0 +25/10/2020 02:06:03;UT800A.U020_TC06_OP.F_CV;3.195287943;100.0 +25/10/2020 02:06:20;UT800A.U020_TC06_OP.F_CV;3.195287943;100.0 +25/10/2020 02:06:21;UT800A.U020_TC06_OP.F_CV;5.734427929;100.0 +25/10/2020 02:06:39;UT800A.U020_TC06_OP.F_CV;2.829065800;100.0 +25/10/2020 02:06:44;UT800A.U020_TC06_OP.F_CV;2.829065800;100.0 +25/10/2020 02:06:45;UT800A.U020_TC06_OP.F_CV;6.442457199;100.0 +25/10/2020 02:06:02;UT800A.U020_TC06_PV.F_CV;40.014648438;100.0 +25/10/2020 02:06:03;UT800A.U020_TC06_PV.F_CV;40.097656250;100.0 +25/10/2020 02:06:08;UT800A.U020_TC06_PV.F_CV;40.097656250;100.0 +25/10/2020 02:06:09;UT800A.U020_TC06_PV.F_CV;40.132812500;100.0 +25/10/2020 02:06:14;UT800A.U020_TC06_PV.F_CV;40.132812500;100.0 +25/10/2020 02:06:15;UT800A.U020_TC06_PV.F_CV;40.119140625;100.0 +25/10/2020 02:06:20;UT800A.U020_TC06_PV.F_CV;40.119140625;100.0 +25/10/2020 02:06:21;UT800A.U020_TC06_PV.F_CV;40.011718750;100.0 +25/10/2020 02:06:27;UT800A.U020_TC06_PV.F_CV;40.011718750;100.0 +25/10/2020 02:06:28;UT800A.U020_TC06_PV.F_CV;40.030273438;100.0 +25/10/2020 02:06:33;UT800A.U020_TC06_PV.F_CV;40.030273438;100.0 +25/10/2020 02:06:34;UT800A.U020_TC06_PV.F_CV;40.107421875;100.0 +25/10/2020 02:06:38;UT800A.U020_TC06_PV.F_CV;40.107421875;100.0 +25/10/2020 02:06:39;UT800A.U020_TC06_PV.F_CV;40.155273438;100.0 +25/10/2020 02:06:44;UT800A.U020_TC06_PV.F_CV;40.155273438;100.0 +25/10/2020 02:06:45;UT800A.U020_TC06_PV.F_CV;39.980468750;100.0 +25/10/2020 02:06:50;UT800A.U020_TC06_PV.F_CV;39.980468750;100.0 +25/10/2020 02:06:51;UT800A.U020_TC06_PV.F_CV;40.015625000;100.0 +25/10/2020 02:06:56;UT800A.U020_TC06_PV.F_CV;40.015625000;100.0 +25/10/2020 02:06:57;UT800A.U020_TC06_PV.F_CV;40.041992188;100.0 +25/10/2020 02:06:02;UT800A.U020_TC08_PV.F_CV;29.000000000;100.0 +25/10/2020 02:06:03;UT800A.U020_TC08_PV.F_CV;29.116699219;100.0 +25/10/2020 02:06:08;UT800A.U020_TC08_PV.F_CV;29.116699219;100.0 +25/10/2020 02:06:09;UT800A.U020_TC08_PV.F_CV;29.046386719;100.0 +25/10/2020 02:06:14;UT800A.U020_TC08_PV.F_CV;29.046386719;100.0 +25/10/2020 02:06:15;UT800A.U020_TC08_PV.F_CV;28.989257813;100.0 +25/10/2020 02:06:20;UT800A.U020_TC08_PV.F_CV;28.989257813;100.0 +25/10/2020 02:06:21;UT800A.U020_TC08_PV.F_CV;29.013671875;100.0 +25/10/2020 02:06:27;UT800A.U020_TC08_PV.F_CV;29.013671875;100.0 +25/10/2020 02:06:28;UT800A.U020_TC08_PV.F_CV;28.997070313;100.0 +25/10/2020 02:06:33;UT800A.U020_TC08_PV.F_CV;28.997070313;100.0 +25/10/2020 02:06:34;UT800A.U020_TC08_PV.F_CV;29.093261719;100.0 +25/10/2020 02:06:38;UT800A.U020_TC08_PV.F_CV;29.093261719;100.0 +25/10/2020 02:06:39;UT800A.U020_TC08_PV.F_CV;29.051269531;100.0 +25/10/2020 02:06:44;UT800A.U020_TC08_PV.F_CV;29.051269531;100.0 +25/10/2020 02:06:45;UT800A.U020_TC08_PV.F_CV;29.136230469;100.0 +25/10/2020 02:06:50;UT800A.U020_TC08_PV.F_CV;29.136230469;100.0 +25/10/2020 02:06:51;UT800A.U020_TC08_PV.F_CV;29.054199219;100.0 +25/10/2020 02:06:56;UT800A.U020_TC08_PV.F_CV;29.054199219;100.0 +25/10/2020 02:06:57;UT800A.U020_TC08_PV.F_CV;28.967285156;100.0 +25/10/2020 02:06:09;UT800A.U020_TC15_OP.F_CV;27.243873596;100.0 +25/10/2020 02:06:15;UT800A.U020_TC15_OP.F_CV;25.339517593;100.0 +25/10/2020 02:06:34;UT800A.U020_TC15_OP.F_CV;23.557237625;100.0 +25/10/2020 02:06:45;UT800A.U020_TC15_OP.F_CV;24.094362259;100.0 +25/10/2020 02:06:51;UT800A.U020_TC15_OP.F_CV;22.678304672;100.0 +25/10/2020 02:06:02;UT800A.U020_TC15_PV.F_CV;59.858398438;100.0 +25/10/2020 02:06:03;UT800A.U020_TC15_PV.F_CV;59.861328125;100.0 +25/10/2020 02:06:08;UT800A.U020_TC15_PV.F_CV;59.861328125;100.0 +25/10/2020 02:06:09;UT800A.U020_TC15_PV.F_CV;59.765625000;100.0 +25/10/2020 02:06:14;UT800A.U020_TC15_PV.F_CV;59.765625000;100.0 +25/10/2020 02:06:15;UT800A.U020_TC15_PV.F_CV;59.850585938;100.0 +25/10/2020 02:06:20;UT800A.U020_TC15_PV.F_CV;59.850585938;100.0 +25/10/2020 02:06:21;UT800A.U020_TC15_PV.F_CV;59.836914063;100.0 +25/10/2020 02:06:27;UT800A.U020_TC15_PV.F_CV;59.836914063;100.0 +25/10/2020 02:06:28;UT800A.U020_TC15_PV.F_CV;59.910156250;100.0 +25/10/2020 02:06:33;UT800A.U020_TC15_PV.F_CV;59.910156250;100.0 +25/10/2020 02:06:34;UT800A.U020_TC15_PV.F_CV;59.922851563;100.0 +25/10/2020 02:06:38;UT800A.U020_TC15_PV.F_CV;59.922851563;100.0 +25/10/2020 02:06:39;UT800A.U020_TC15_PV.F_CV;59.949218750;100.0 +25/10/2020 02:06:44;UT800A.U020_TC15_PV.F_CV;59.949218750;100.0 +25/10/2020 02:06:45;UT800A.U020_TC15_PV.F_CV;59.915039063;100.0 +25/10/2020 02:06:50;UT800A.U020_TC15_PV.F_CV;59.915039063;100.0 +25/10/2020 02:06:51;UT800A.U020_TC15_PV.F_CV;59.990234375;100.0 +25/10/2020 02:06:56;UT800A.U020_TC15_PV.F_CV;59.990234375;100.0 +25/10/2020 02:06:57;UT800A.U020_TC15_PV.F_CV;59.982421875;100.0 +25/10/2020 02:06:09;UT800A.U020_TC16_OP.F_CV;5.929746151;100.0 +25/10/2020 02:06:15;UT800A.U020_TC16_OP.F_CV;5.000000000;100.0 +25/10/2020 02:06:33;UT800A.U020_TC16_OP.F_CV;5.000000000;100.0 +25/10/2020 02:06:34;UT800A.U020_TC16_OP.F_CV;7.272560596;100.0 +25/10/2020 02:06:39;UT800A.U020_TC16_OP.F_CV;6.344798088;100.0 +25/10/2020 02:06:51;UT800A.U020_TC16_OP.F_CV;6.906338692;100.0 +25/10/2020 02:06:57;UT800A.U020_TC16_OP.F_CV;5.000000000;100.0 +25/10/2020 02:06:02;UT800A.U020_TC16_PV.F_CV;60.125000000;100.0 +25/10/2020 02:06:03;UT800A.U020_TC16_PV.F_CV;60.195312500;100.0 +25/10/2020 02:06:08;UT800A.U020_TC16_PV.F_CV;60.195312500;100.0 +25/10/2020 02:06:09;UT800A.U020_TC16_PV.F_CV;60.109375000;100.0 +25/10/2020 02:06:14;UT800A.U020_TC16_PV.F_CV;60.109375000;100.0 +25/10/2020 02:06:15;UT800A.U020_TC16_PV.F_CV;60.225585938;100.0 +25/10/2020 02:06:20;UT800A.U020_TC16_PV.F_CV;60.225585938;100.0 +25/10/2020 02:06:21;UT800A.U020_TC16_PV.F_CV;60.169921875;100.0 +25/10/2020 02:06:27;UT800A.U020_TC16_PV.F_CV;60.169921875;100.0 +25/10/2020 02:06:28;UT800A.U020_TC16_PV.F_CV;60.199218750;100.0 +25/10/2020 02:06:33;UT800A.U020_TC16_PV.F_CV;60.199218750;100.0 +25/10/2020 02:06:34;UT800A.U020_TC16_PV.F_CV;60.140625000;100.0 +25/10/2020 02:06:38;UT800A.U020_TC16_PV.F_CV;60.140625000;100.0 +25/10/2020 02:06:39;UT800A.U020_TC16_PV.F_CV;60.125976563;100.0 +25/10/2020 02:06:44;UT800A.U020_TC16_PV.F_CV;60.125976563;100.0 +25/10/2020 02:06:45;UT800A.U020_TC16_PV.F_CV;60.131835938;100.0 +25/10/2020 02:06:50;UT800A.U020_TC16_PV.F_CV;60.131835938;100.0 +25/10/2020 02:06:51;UT800A.U020_TC16_PV.F_CV;60.091796875;100.0 +25/10/2020 02:06:56;UT800A.U020_TC16_PV.F_CV;60.091796875;100.0 +25/10/2020 02:06:57;UT800A.U020_TC16_PV.F_CV;60.144531250;100.0 +25/10/2020 02:06:20;UT800A.U020_TC17_OP.F_CV;23.654895782;100.0 +25/10/2020 02:06:21;UT800A.U020_TC17_OP.F_CV;25.705739975;100.0 +25/10/2020 02:06:39;UT800A.U020_TC17_OP.F_CV;23.483993530;100.0 +25/10/2020 02:06:45;UT800A.U020_TC17_OP.F_CV;25.119785309;100.0 +25/10/2020 02:06:02;UT800A.U020_TC17_PV.F_CV;89.937500000;100.0 +25/10/2020 02:06:03;UT800A.U020_TC17_PV.F_CV;89.976562500;100.0 +25/10/2020 02:06:08;UT800A.U020_TC17_PV.F_CV;89.976562500;100.0 +25/10/2020 02:06:09;UT800A.U020_TC17_PV.F_CV;89.980468750;100.0 +25/10/2020 02:06:14;UT800A.U020_TC17_PV.F_CV;89.980468750;100.0 +25/10/2020 02:06:15;UT800A.U020_TC17_PV.F_CV;90.005859375;100.0 +25/10/2020 02:06:20;UT800A.U020_TC17_PV.F_CV;90.005859375;100.0 +25/10/2020 02:06:21;UT800A.U020_TC17_PV.F_CV;89.873046875;100.0 +25/10/2020 02:06:27;UT800A.U020_TC17_PV.F_CV;89.873046875;100.0 +25/10/2020 02:06:28;UT800A.U020_TC17_PV.F_CV;89.814453125;100.0 +25/10/2020 02:06:33;UT800A.U020_TC17_PV.F_CV;89.814453125;100.0 +25/10/2020 02:06:34;UT800A.U020_TC17_PV.F_CV;89.900390625;100.0 +25/10/2020 02:06:38;UT800A.U020_TC17_PV.F_CV;89.900390625;100.0 +25/10/2020 02:06:39;UT800A.U020_TC17_PV.F_CV;90.013671875;100.0 +25/10/2020 02:06:44;UT800A.U020_TC17_PV.F_CV;90.013671875;100.0 +25/10/2020 02:06:45;UT800A.U020_TC17_PV.F_CV;89.886718750;100.0 +25/10/2020 02:06:50;UT800A.U020_TC17_PV.F_CV;89.886718750;100.0 +25/10/2020 02:06:51;UT800A.U020_TC17_PV.F_CV;89.857421875;100.0 +25/10/2020 02:06:56;UT800A.U020_TC17_PV.F_CV;89.857421875;100.0 +25/10/2020 02:06:57;UT800A.U020_TC17_PV.F_CV;89.859375000;100.0 +25/10/2020 02:06:57;UT800A.U020_TC19_OP.F_CV;44.163333893;100.0 +25/10/2020 02:06:02;UT800A.U020_TC19_PV.F_CV;89.878906250;100.0 +25/10/2020 02:06:03;UT800A.U020_TC19_PV.F_CV;89.886718750;100.0 +25/10/2020 02:06:08;UT800A.U020_TC19_PV.F_CV;89.886718750;100.0 +25/10/2020 02:06:09;UT800A.U020_TC19_PV.F_CV;89.894531250;100.0 +25/10/2020 02:06:14;UT800A.U020_TC19_PV.F_CV;89.894531250;100.0 +25/10/2020 02:06:15;UT800A.U020_TC19_PV.F_CV;89.835937500;100.0 +25/10/2020 02:06:20;UT800A.U020_TC19_PV.F_CV;89.835937500;100.0 +25/10/2020 02:06:21;UT800A.U020_TC19_PV.F_CV;89.884765625;100.0 +25/10/2020 02:06:27;UT800A.U020_TC19_PV.F_CV;89.884765625;100.0 +25/10/2020 02:06:28;UT800A.U020_TC19_PV.F_CV;89.810546875;100.0 +25/10/2020 02:06:33;UT800A.U020_TC19_PV.F_CV;89.810546875;100.0 +25/10/2020 02:06:34;UT800A.U020_TC19_PV.F_CV;89.945312500;100.0 +25/10/2020 02:06:38;UT800A.U020_TC19_PV.F_CV;89.945312500;100.0 +25/10/2020 02:06:39;UT800A.U020_TC19_PV.F_CV;89.916015625;100.0 +25/10/2020 02:06:44;UT800A.U020_TC19_PV.F_CV;89.916015625;100.0 +25/10/2020 02:06:45;UT800A.U020_TC19_PV.F_CV;89.906250000;100.0 +25/10/2020 02:06:50;UT800A.U020_TC19_PV.F_CV;89.906250000;100.0 +25/10/2020 02:06:51;UT800A.U020_TC19_PV.F_CV;89.978515625;100.0 +25/10/2020 02:06:56;UT800A.U020_TC19_PV.F_CV;89.978515625;100.0 +25/10/2020 02:06:57;UT800A.U020_TC19_PV.F_CV;89.951171875;100.0 +25/10/2020 02:06:45;UT800A.U020_TI09.F_CV;55.390625000;100.0 +25/10/2020 02:06:09;UT800A.U020_TI10.F_CV;61.181640625;100.0 +25/10/2020 02:06:34;UT800A.U020_TI10.F_CV;61.846679688;100.0 +25/10/2020 02:06:45;UT800A.U020_TI105.F_CV;67.085937500;100.0 +25/10/2020 02:06:57;UT800A.U020_TI106.F_CV;38.488281250;100.0 +25/10/2020 02:06:37;UT800A.U020_TI108.F_CV;28.159667969;100.0 +25/10/2020 02:06:09;UT800A.U020_TI11.F_CV;335.023437500;100.0 +25/10/2020 02:06:37;UT800A.U020_TI115.F_CV;0.000000000;0.0 +25/10/2020 02:06:40;UT800A.U020_TI115A.F_CV;58.351562500;100.0 +25/10/2020 02:06:45;UT800A.U020_TI115B.F_CV;55.044921875;100.0 +25/10/2020 02:06:37;UT800A.U020_TI116.F_CV;43.822265625;100.0 +25/10/2020 02:06:37;UT800A.U020_TI117.F_CV;87.753906250;100.0 +25/10/2020 02:06:37;UT800A.U020_TI119.F_CV;91.640625000;100.0 +25/10/2020 02:06:37;UT800A.U020_TI12.F_CV;333.781250000;100.0 +25/10/2020 02:06:37;UT800A.U020_TI13.F_CV;335.421875000;100.0 +25/10/2020 02:06:37;UT800A.U020_TI14.F_CV;352.031250000;100.0 +25/10/2020 02:06:37;UT800A.U020_TI20.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U020_TI30.F_CV;25.050781250;100.0 +25/10/2020 02:06:37;UT800A.U020_VIT_P2.F_CV;0.000000000;0.0 +25/10/2020 02:06:03;UT800A.U020_WI02.F_CV;424.292205811;100.0 +25/10/2020 02:06:52;UT800A.U020_WI06.F_CV;386.299987793;100.0 +25/10/2020 02:06:37;UT800A.U034_DP.F_CV;0.749511719;100.0 +25/10/2020 02:06:37;UT800A.U034_FC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;UT800A.U034_FC10_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:37;UT800A.U034_FC10_PV.F_CV;193.634521484;100.0 +25/10/2020 02:06:37;UT800A.U034_FC10_SP.F_CV;21.700000763;100.0 +25/10/2020 02:06:37;UT800A.U034_FC11_PV.F_CV;0.045853615;100.0 +25/10/2020 02:06:37;UT800A.U034_FI01.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;UT800A.U034_FI05.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;UT800A.U034_FI10A.F_CV;193.634521484;100.0 +25/10/2020 02:06:37;UT800A.U034_FI10B.F_CV;235.521530151;100.0 +25/10/2020 02:06:37;UT800A.U034_FQ05.F_CV;5728.747558594;100.0 +25/10/2020 02:06:37;UT800A.U034_LC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:37;UT800A.U034_LC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:00;UT800A.U034_LI01.F_CV;-0.831359863;100.0 +25/10/2020 02:06:01;UT800A.U034_LI01.F_CV;-0.833038330;100.0 +25/10/2020 02:06:02;UT800A.U034_LI01.F_CV;-0.830657959;100.0 +25/10/2020 02:06:03;UT800A.U034_LI01.F_CV;-0.829971313;100.0 +25/10/2020 02:06:04;UT800A.U034_LI01.F_CV;-0.829055786;100.0 +25/10/2020 02:06:05;UT800A.U034_LI01.F_CV;-0.829055786;100.0 +25/10/2020 02:06:06;UT800A.U034_LI01.F_CV;-0.829055786;100.0 +25/10/2020 02:06:07;UT800A.U034_LI01.F_CV;-0.830734253;100.0 +25/10/2020 02:06:08;UT800A.U034_LI01.F_CV;-0.828536987;100.0 +25/10/2020 02:06:09;UT800A.U034_LI01.F_CV;-0.829589844;100.0 +25/10/2020 02:06:10;UT800A.U034_LI01.F_CV;-0.830871582;100.0 +25/10/2020 02:06:11;UT800A.U034_LI01.F_CV;-0.829833984;100.0 +25/10/2020 02:06:12;UT800A.U034_LI01.F_CV;-0.829833984;100.0 +25/10/2020 02:06:13;UT800A.U034_LI01.F_CV;-0.829696655;100.0 +25/10/2020 02:06:14;UT800A.U034_LI01.F_CV;-0.832077026;100.0 +25/10/2020 02:06:15;UT800A.U034_LI01.F_CV;-0.831970215;100.0 +25/10/2020 02:06:16;UT800A.U034_LI01.F_CV;-0.830932617;100.0 +25/10/2020 02:06:17;UT800A.U034_LI01.F_CV;-0.830657959;100.0 +25/10/2020 02:06:18;UT800A.U034_LI01.F_CV;-0.831954956;100.0 +25/10/2020 02:06:19;UT800A.U034_LI01.F_CV;-0.831954956;100.0 +25/10/2020 02:06:20;UT800A.U034_LI01.F_CV;-0.831848145;100.0 +25/10/2020 02:06:21;UT800A.U034_LI01.F_CV;-0.831405640;100.0 +25/10/2020 02:06:22;UT800A.U034_LI01.F_CV;-0.831481934;100.0 +25/10/2020 02:06:23;UT800A.U034_LI01.F_CV;-0.830810547;100.0 +25/10/2020 02:06:24;UT800A.U034_LI01.F_CV;-0.831375122;100.0 +25/10/2020 02:06:25;UT800A.U034_LI01.F_CV;-0.833358765;100.0 +25/10/2020 02:06:26;UT800A.U034_LI01.F_CV;-0.833358765;100.0 +25/10/2020 02:06:27;UT800A.U034_LI01.F_CV;-0.832885742;100.0 +25/10/2020 02:06:28;UT800A.U034_LI01.F_CV;-0.831817627;100.0 +25/10/2020 02:06:29;UT800A.U034_LI01.F_CV;-0.831298828;100.0 +25/10/2020 02:06:30;UT800A.U034_LI01.F_CV;-0.830627441;100.0 +25/10/2020 02:06:31;UT800A.U034_LI01.F_CV;-0.832382202;100.0 +25/10/2020 02:06:32;UT800A.U034_LI01.F_CV;-0.833404541;100.0 +25/10/2020 02:06:33;UT800A.U034_LI01.F_CV;-0.833404541;100.0 +25/10/2020 02:06:34;UT800A.U034_LI01.F_CV;-0.831832886;100.0 +25/10/2020 02:06:35;UT800A.U034_LI01.F_CV;-0.832000732;100.0 +25/10/2020 02:06:36;UT800A.U034_LI01.F_CV;-0.831268311;100.0 +25/10/2020 02:06:37;UT800A.U034_LI01.F_CV;-0.831268311;100.0 +25/10/2020 02:06:38;UT800A.U034_LI01.F_CV;-0.830291748;100.0 +25/10/2020 02:06:39;UT800A.U034_LI01.F_CV;-0.831115723;100.0 +25/10/2020 02:06:40;UT800A.U034_LI01.F_CV;-0.831115723;100.0 +25/10/2020 02:06:41;UT800A.U034_LI01.F_CV;-0.832992554;100.0 +25/10/2020 02:06:42;UT800A.U034_LI01.F_CV;-0.828979492;100.0 +25/10/2020 02:06:43;UT800A.U034_LI01.F_CV;-0.830230713;100.0 +25/10/2020 02:06:44;UT800A.U034_LI01.F_CV;-0.831985474;100.0 +25/10/2020 02:06:45;UT800A.U034_LI01.F_CV;-0.831985474;100.0 +25/10/2020 02:06:46;UT800A.U034_LI01.F_CV;-0.833450317;100.0 +25/10/2020 02:06:47;UT800A.U034_LI01.F_CV;-0.833450317;100.0 +25/10/2020 02:06:48;UT800A.U034_LI01.F_CV;-0.831954956;100.0 +25/10/2020 02:06:49;UT800A.U034_LI01.F_CV;-0.830444336;100.0 +25/10/2020 02:06:50;UT800A.U034_LI01.F_CV;-0.831527710;100.0 +25/10/2020 02:06:51;UT800A.U034_LI01.F_CV;-0.834075928;100.0 +25/10/2020 02:06:52;UT800A.U034_LI01.F_CV;-0.835479736;100.0 +25/10/2020 02:06:53;UT800A.U034_LI01.F_CV;-0.835525513;100.0 +25/10/2020 02:06:54;UT800A.U034_LI01.F_CV;-0.835525513;100.0 +25/10/2020 02:06:55;UT800A.U034_LI01.F_CV;-0.833755493;100.0 +25/10/2020 02:06:56;UT800A.U034_LI01.F_CV;-0.830642700;100.0 +25/10/2020 02:06:57;UT800A.U034_LI01.F_CV;-0.832733154;100.0 +25/10/2020 02:06:58;UT800A.U034_LI01.F_CV;-0.832351685;100.0 +25/10/2020 02:06:59;UT800A.U034_LI01.F_CV;-0.832534790;100.0 +25/10/2020 02:06:37;UT800A.U034_LI03.F_CV;-0.000044646;100.0 +25/10/2020 02:06:37;UT800A.U034_LI07.F_CV;0.002097905;100.0 +25/10/2020 02:06:37;UT800A.U034_LI10.F_CV;-10.000000000;100.0 +25/10/2020 02:06:37;UT800A.U034_LT03.F_CV;-0.000044646;100.0 +25/10/2020 02:06:37;UT800A.U034_PC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;UT800A.U034_PC01_PV.F_CV;4.642456055;100.0 +25/10/2020 02:06:03;UT800A.U034_PC01_PV.F_CV;4.640991211;100.0 +25/10/2020 02:06:08;UT800A.U034_PC01_PV.F_CV;4.640991211;100.0 +25/10/2020 02:06:09;UT800A.U034_PC01_PV.F_CV;4.642089844;100.0 +25/10/2020 02:06:14;UT800A.U034_PC01_PV.F_CV;4.642089844;100.0 +25/10/2020 02:06:15;UT800A.U034_PC01_PV.F_CV;4.641479492;100.0 +25/10/2020 02:06:20;UT800A.U034_PC01_PV.F_CV;4.641479492;100.0 +25/10/2020 02:06:21;UT800A.U034_PC01_PV.F_CV;4.631347656;100.0 +25/10/2020 02:06:27;UT800A.U034_PC01_PV.F_CV;4.631347656;100.0 +25/10/2020 02:06:28;UT800A.U034_PC01_PV.F_CV;4.647949219;100.0 +25/10/2020 02:06:33;UT800A.U034_PC01_PV.F_CV;4.647949219;100.0 +25/10/2020 02:06:34;UT800A.U034_PC01_PV.F_CV;4.639404297;100.0 +25/10/2020 02:06:38;UT800A.U034_PC01_PV.F_CV;4.639404297;100.0 +25/10/2020 02:06:39;UT800A.U034_PC01_PV.F_CV;4.629882813;100.0 +25/10/2020 02:06:44;UT800A.U034_PC01_PV.F_CV;4.629882813;100.0 +25/10/2020 02:06:45;UT800A.U034_PC01_PV.F_CV;4.623901367;100.0 +25/10/2020 02:06:50;UT800A.U034_PC01_PV.F_CV;4.623901367;100.0 +25/10/2020 02:06:51;UT800A.U034_PC01_PV.F_CV;4.622192383;100.0 +25/10/2020 02:06:56;UT800A.U034_PC01_PV.F_CV;4.622192383;100.0 +25/10/2020 02:06:57;UT800A.U034_PC01_PV.F_CV;4.631835938;100.0 +25/10/2020 02:06:37;UT800A.U034_PI02.F_CV;5.388671875;100.0 +25/10/2020 02:06:00;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:01;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:02;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:03;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:04;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:05;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:06;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:07;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:09;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:10;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:11;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:13;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:14;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:15;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:16;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:17;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:18;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:20;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:21;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:22;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:23;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:24;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:25;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:26;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:28;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:29;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:30;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:31;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:33;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:36;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:39;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:40;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:41;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:42;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:43;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:45;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:49;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:51;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:54;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:55;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:57;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:58;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UT800A.U034_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U034_TC01_OP.F_CV;25.000000000;100.0 +25/10/2020 02:06:37;UT800A.U034_TC01_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:37;UT800A.U034_TC02_OP.F_CV;15.000000000;100.0 +25/10/2020 02:06:37;UT800A.U034_TC02_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:37;UT800A.U034_TC03_OP.F_CV;10.000000000;100.0 +25/10/2020 02:06:37;UT800A.U034_TC03_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:37;UT800A.U034_TC04_OP.F_CV;20.000000000;100.0 +25/10/2020 02:06:37;UT800A.U034_TC04_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:37;UT800A.U034_TC05_OP.F_CV;40.000000000;100.0 +25/10/2020 02:06:02;UT800A.U034_TC05_PV.F_CV;23.690917969;100.0 +25/10/2020 02:06:03;UT800A.U034_TC05_PV.F_CV;23.747558594;100.0 +25/10/2020 02:06:08;UT800A.U034_TC05_PV.F_CV;23.747558594;100.0 +25/10/2020 02:06:09;UT800A.U034_TC05_PV.F_CV;23.776855469;100.0 +25/10/2020 02:06:14;UT800A.U034_TC05_PV.F_CV;23.776855469;100.0 +25/10/2020 02:06:15;UT800A.U034_TC05_PV.F_CV;23.805175781;100.0 +25/10/2020 02:06:20;UT800A.U034_TC05_PV.F_CV;23.805175781;100.0 +25/10/2020 02:06:21;UT800A.U034_TC05_PV.F_CV;23.738281250;100.0 +25/10/2020 02:06:27;UT800A.U034_TC05_PV.F_CV;23.738281250;100.0 +25/10/2020 02:06:28;UT800A.U034_TC05_PV.F_CV;23.673339844;100.0 +25/10/2020 02:06:33;UT800A.U034_TC05_PV.F_CV;23.673339844;100.0 +25/10/2020 02:06:34;UT800A.U034_TC05_PV.F_CV;23.676269531;100.0 +25/10/2020 02:06:38;UT800A.U034_TC05_PV.F_CV;23.676269531;100.0 +25/10/2020 02:06:39;UT800A.U034_TC05_PV.F_CV;23.726562500;100.0 +25/10/2020 02:06:44;UT800A.U034_TC05_PV.F_CV;23.726562500;100.0 +25/10/2020 02:06:45;UT800A.U034_TC05_PV.F_CV;23.783203125;100.0 +25/10/2020 02:06:50;UT800A.U034_TC05_PV.F_CV;23.783203125;100.0 +25/10/2020 02:06:51;UT800A.U034_TC05_PV.F_CV;23.768066406;100.0 +25/10/2020 02:06:56;UT800A.U034_TC05_PV.F_CV;23.768066406;100.0 +25/10/2020 02:06:57;UT800A.U034_TC05_PV.F_CV;23.812011719;100.0 +25/10/2020 02:06:37;UT800A.U034_TC06_OP.F_CV;40.000000000;100.0 +25/10/2020 02:06:02;UT800A.U034_TC06_PV.F_CV;23.679687500;100.0 +25/10/2020 02:06:03;UT800A.U034_TC06_PV.F_CV;23.665039063;100.0 +25/10/2020 02:06:08;UT800A.U034_TC06_PV.F_CV;23.665039063;100.0 +25/10/2020 02:06:09;UT800A.U034_TC06_PV.F_CV;23.706054688;100.0 +25/10/2020 02:06:14;UT800A.U034_TC06_PV.F_CV;23.706054688;100.0 +25/10/2020 02:06:15;UT800A.U034_TC06_PV.F_CV;23.730468750;100.0 +25/10/2020 02:06:20;UT800A.U034_TC06_PV.F_CV;23.730468750;100.0 +25/10/2020 02:06:21;UT800A.U034_TC06_PV.F_CV;23.697753906;100.0 +25/10/2020 02:06:27;UT800A.U034_TC06_PV.F_CV;23.697753906;100.0 +25/10/2020 02:06:28;UT800A.U034_TC06_PV.F_CV;23.751464844;100.0 +25/10/2020 02:06:33;UT800A.U034_TC06_PV.F_CV;23.751464844;100.0 +25/10/2020 02:06:34;UT800A.U034_TC06_PV.F_CV;23.617187500;100.0 +25/10/2020 02:06:38;UT800A.U034_TC06_PV.F_CV;23.617187500;100.0 +25/10/2020 02:06:39;UT800A.U034_TC06_PV.F_CV;23.765625000;100.0 +25/10/2020 02:06:44;UT800A.U034_TC06_PV.F_CV;23.765625000;100.0 +25/10/2020 02:06:45;UT800A.U034_TC06_PV.F_CV;23.711425781;100.0 +25/10/2020 02:06:50;UT800A.U034_TC06_PV.F_CV;23.711425781;100.0 +25/10/2020 02:06:51;UT800A.U034_TC06_PV.F_CV;23.672363281;100.0 +25/10/2020 02:06:56;UT800A.U034_TC06_PV.F_CV;23.672363281;100.0 +25/10/2020 02:06:57;UT800A.U034_TC06_PV.F_CV;23.727050781;100.0 +25/10/2020 02:06:37;UT800A.U034_TC15_OP.F_CV;10.000000000;100.0 +25/10/2020 02:06:02;UT800A.U034_TC15_PV.F_CV;23.774902344;100.0 +25/10/2020 02:06:03;UT800A.U034_TC15_PV.F_CV;23.709960938;100.0 +25/10/2020 02:06:08;UT800A.U034_TC15_PV.F_CV;23.709960938;100.0 +25/10/2020 02:06:09;UT800A.U034_TC15_PV.F_CV;23.785156250;100.0 +25/10/2020 02:06:14;UT800A.U034_TC15_PV.F_CV;23.785156250;100.0 +25/10/2020 02:06:15;UT800A.U034_TC15_PV.F_CV;23.811523438;100.0 +25/10/2020 02:06:20;UT800A.U034_TC15_PV.F_CV;23.811523438;100.0 +25/10/2020 02:06:21;UT800A.U034_TC15_PV.F_CV;23.781250000;100.0 +25/10/2020 02:06:27;UT800A.U034_TC15_PV.F_CV;23.781250000;100.0 +25/10/2020 02:06:28;UT800A.U034_TC15_PV.F_CV;23.854980469;100.0 +25/10/2020 02:06:33;UT800A.U034_TC15_PV.F_CV;23.854980469;100.0 +25/10/2020 02:06:34;UT800A.U034_TC15_PV.F_CV;23.788574219;100.0 +25/10/2020 02:06:38;UT800A.U034_TC15_PV.F_CV;23.788574219;100.0 +25/10/2020 02:06:39;UT800A.U034_TC15_PV.F_CV;23.805664063;100.0 +25/10/2020 02:06:44;UT800A.U034_TC15_PV.F_CV;23.805664063;100.0 +25/10/2020 02:06:45;UT800A.U034_TC15_PV.F_CV;23.842285156;100.0 +25/10/2020 02:06:50;UT800A.U034_TC15_PV.F_CV;23.842285156;100.0 +25/10/2020 02:06:51;UT800A.U034_TC15_PV.F_CV;23.827636719;100.0 +25/10/2020 02:06:56;UT800A.U034_TC15_PV.F_CV;23.827636719;100.0 +25/10/2020 02:06:57;UT800A.U034_TC15_PV.F_CV;23.934570313;100.0 +25/10/2020 02:06:37;UT800A.U034_TC16_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;UT800A.U034_TC16_PV.F_CV;23.863769531;100.0 +25/10/2020 02:06:03;UT800A.U034_TC16_PV.F_CV;23.738769531;100.0 +25/10/2020 02:06:08;UT800A.U034_TC16_PV.F_CV;23.738769531;100.0 +25/10/2020 02:06:09;UT800A.U034_TC16_PV.F_CV;23.860839844;100.0 +25/10/2020 02:06:14;UT800A.U034_TC16_PV.F_CV;23.860839844;100.0 +25/10/2020 02:06:15;UT800A.U034_TC16_PV.F_CV;23.822265625;100.0 +25/10/2020 02:06:20;UT800A.U034_TC16_PV.F_CV;23.822265625;100.0 +25/10/2020 02:06:21;UT800A.U034_TC16_PV.F_CV;23.818359375;100.0 +25/10/2020 02:06:27;UT800A.U034_TC16_PV.F_CV;23.818359375;100.0 +25/10/2020 02:06:28;UT800A.U034_TC16_PV.F_CV;23.848632813;100.0 +25/10/2020 02:06:33;UT800A.U034_TC16_PV.F_CV;23.848632813;100.0 +25/10/2020 02:06:34;UT800A.U034_TC16_PV.F_CV;23.914062500;100.0 +25/10/2020 02:06:38;UT800A.U034_TC16_PV.F_CV;23.914062500;100.0 +25/10/2020 02:06:39;UT800A.U034_TC16_PV.F_CV;23.811523438;100.0 +25/10/2020 02:06:44;UT800A.U034_TC16_PV.F_CV;23.811523438;100.0 +25/10/2020 02:06:45;UT800A.U034_TC16_PV.F_CV;23.888183594;100.0 +25/10/2020 02:06:50;UT800A.U034_TC16_PV.F_CV;23.888183594;100.0 +25/10/2020 02:06:51;UT800A.U034_TC16_PV.F_CV;23.799316406;100.0 +25/10/2020 02:06:56;UT800A.U034_TC16_PV.F_CV;23.799316406;100.0 +25/10/2020 02:06:57;UT800A.U034_TC16_PV.F_CV;23.973144531;100.0 +25/10/2020 02:06:37;UT800A.U034_TC17_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;UT800A.U034_TC17_PV.F_CV;23.829589844;100.0 +25/10/2020 02:06:03;UT800A.U034_TC17_PV.F_CV;23.769042969;100.0 +25/10/2020 02:06:08;UT800A.U034_TC17_PV.F_CV;23.769042969;100.0 +25/10/2020 02:06:09;UT800A.U034_TC17_PV.F_CV;23.849609375;100.0 +25/10/2020 02:06:14;UT800A.U034_TC17_PV.F_CV;23.849609375;100.0 +25/10/2020 02:06:15;UT800A.U034_TC17_PV.F_CV;23.910644531;100.0 +25/10/2020 02:06:20;UT800A.U034_TC17_PV.F_CV;23.910644531;100.0 +25/10/2020 02:06:21;UT800A.U034_TC17_PV.F_CV;23.954101563;100.0 +25/10/2020 02:06:27;UT800A.U034_TC17_PV.F_CV;23.954101563;100.0 +25/10/2020 02:06:28;UT800A.U034_TC17_PV.F_CV;23.860351563;100.0 +25/10/2020 02:06:33;UT800A.U034_TC17_PV.F_CV;23.860351563;100.0 +25/10/2020 02:06:34;UT800A.U034_TC17_PV.F_CV;23.962890625;100.0 +25/10/2020 02:06:38;UT800A.U034_TC17_PV.F_CV;23.962890625;100.0 +25/10/2020 02:06:39;UT800A.U034_TC17_PV.F_CV;23.911132813;100.0 +25/10/2020 02:06:44;UT800A.U034_TC17_PV.F_CV;23.911132813;100.0 +25/10/2020 02:06:45;UT800A.U034_TC17_PV.F_CV;24.015136719;100.0 +25/10/2020 02:06:50;UT800A.U034_TC17_PV.F_CV;24.015136719;100.0 +25/10/2020 02:06:51;UT800A.U034_TC17_PV.F_CV;23.988281250;100.0 +25/10/2020 02:06:56;UT800A.U034_TC17_PV.F_CV;23.988281250;100.0 +25/10/2020 02:06:57;UT800A.U034_TC17_PV.F_CV;23.866699219;100.0 +25/10/2020 02:06:37;UT800A.U034_TC19_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;UT800A.U034_TC19_PV.F_CV;24.562500000;100.0 +25/10/2020 02:06:03;UT800A.U034_TC19_PV.F_CV;24.518554688;100.0 +25/10/2020 02:06:08;UT800A.U034_TC19_PV.F_CV;24.518554688;100.0 +25/10/2020 02:06:09;UT800A.U034_TC19_PV.F_CV;24.625976563;100.0 +25/10/2020 02:06:14;UT800A.U034_TC19_PV.F_CV;24.625976563;100.0 +25/10/2020 02:06:15;UT800A.U034_TC19_PV.F_CV;24.579589844;100.0 +25/10/2020 02:06:20;UT800A.U034_TC19_PV.F_CV;24.579589844;100.0 +25/10/2020 02:06:21;UT800A.U034_TC19_PV.F_CV;24.533691406;100.0 +25/10/2020 02:06:27;UT800A.U034_TC19_PV.F_CV;24.533691406;100.0 +25/10/2020 02:06:28;UT800A.U034_TC19_PV.F_CV;24.559570313;100.0 +25/10/2020 02:06:33;UT800A.U034_TC19_PV.F_CV;24.559570313;100.0 +25/10/2020 02:06:34;UT800A.U034_TC19_PV.F_CV;24.524902344;100.0 +25/10/2020 02:06:38;UT800A.U034_TC19_PV.F_CV;24.524902344;100.0 +25/10/2020 02:06:39;UT800A.U034_TC19_PV.F_CV;24.660156250;100.0 +25/10/2020 02:06:44;UT800A.U034_TC19_PV.F_CV;24.660156250;100.0 +25/10/2020 02:06:45;UT800A.U034_TC19_PV.F_CV;24.583984375;100.0 +25/10/2020 02:06:50;UT800A.U034_TC19_PV.F_CV;24.583984375;100.0 +25/10/2020 02:06:51;UT800A.U034_TC19_PV.F_CV;24.549316406;100.0 +25/10/2020 02:06:56;UT800A.U034_TC19_PV.F_CV;24.549316406;100.0 +25/10/2020 02:06:57;UT800A.U034_TC19_PV.F_CV;24.526367188;100.0 +25/10/2020 02:06:37;UT800A.U034_TI01.F_CV;600.000000000;100.0 +25/10/2020 02:06:37;UT800A.U034_TI02.F_CV;600.000000000;100.0 +25/10/2020 02:06:37;UT800A.U034_TI03.F_CV;600.000000000;100.0 +25/10/2020 02:06:37;UT800A.U034_TI04.F_CV;600.000000000;100.0 +25/10/2020 02:06:37;UT800A.U034_TI09.F_CV;24.079589844;100.0 +25/10/2020 02:06:37;UT800A.U034_TI10.F_CV;23.711914063;100.0 +25/10/2020 02:06:27;UT800A.U034_TI105.F_CV;24.944335938;100.0 +25/10/2020 02:06:37;UT800A.U034_TI106A.F_CV;25.198730469;100.0 +25/10/2020 02:06:37;UT800A.U034_TI106B.F_CV;23.976074219;100.0 +25/10/2020 02:06:37;UT800A.U034_TI11.F_CV;24.642578125;100.0 +25/10/2020 02:06:21;UT800A.U034_TI115.F_CV;23.796875000;100.0 +25/10/2020 02:06:39;UT800A.U034_TI116A.F_CV;24.112792969;100.0 +25/10/2020 02:06:21;UT800A.U034_TI116B.F_CV;24.229492188;100.0 +25/10/2020 02:06:09;UT800A.U034_TI117.F_CV;23.936523438;100.0 +25/10/2020 02:06:37;UT800A.U034_TI119A.F_CV;24.244628906;100.0 +25/10/2020 02:06:37;UT800A.U034_TI119B.F_CV;24.436035156;100.0 +25/10/2020 02:06:37;UT800A.U034_TI12.F_CV;24.761718750;100.0 +25/10/2020 02:06:37;UT800A.U034_TI13.F_CV;24.787109375;100.0 +25/10/2020 02:06:37;UT800A.U034_TI14.F_CV;24.713378906;100.0 +25/10/2020 02:06:33;UT800A.U034_TI30.F_CV;23.804199219;100.0 +25/10/2020 02:06:37;UT800A.U034_VIT_P2.F_CV;0.000000000;0.0 +25/10/2020 02:06:02;UT800A.U034_WI02.F_CV;-1145.907470703;100.0 +25/10/2020 02:06:03;UT800A.U034_WI02.F_CV;-1145.899902344;100.0 +25/10/2020 02:06:08;UT800A.U034_WI02.F_CV;-1145.899902344;100.0 +25/10/2020 02:06:09;UT800A.U034_WI02.F_CV;-1145.896972656;100.0 +25/10/2020 02:06:14;UT800A.U034_WI02.F_CV;-1145.896972656;100.0 +25/10/2020 02:06:15;UT800A.U034_WI02.F_CV;-1145.896606445;100.0 +25/10/2020 02:06:20;UT800A.U034_WI02.F_CV;-1145.896606445;100.0 +25/10/2020 02:06:21;UT800A.U034_WI02.F_CV;-1145.905639648;100.0 +25/10/2020 02:06:27;UT800A.U034_WI02.F_CV;-1145.905639648;100.0 +25/10/2020 02:06:28;UT800A.U034_WI02.F_CV;-1145.913818359;100.0 +25/10/2020 02:06:33;UT800A.U034_WI02.F_CV;-1145.913818359;100.0 +25/10/2020 02:06:34;UT800A.U034_WI02.F_CV;-1145.927246094;100.0 +25/10/2020 02:06:38;UT800A.U034_WI02.F_CV;-1145.927246094;100.0 +25/10/2020 02:06:39;UT800A.U034_WI02.F_CV;-1145.943847656;100.0 +25/10/2020 02:06:44;UT800A.U034_WI02.F_CV;-1145.943847656;100.0 +25/10/2020 02:06:45;UT800A.U034_WI02.F_CV;-1145.963500977;100.0 +25/10/2020 02:06:50;UT800A.U034_WI02.F_CV;-1145.963500977;100.0 +25/10/2020 02:06:51;UT800A.U034_WI02.F_CV;-1145.987060547;100.0 +25/10/2020 02:06:56;UT800A.U034_WI02.F_CV;-1145.987060547;100.0 +25/10/2020 02:06:57;UT800A.U034_WI02.F_CV;-1146.015380859;100.0 +25/10/2020 02:06:45;UT800A.U034_WI06.F_CV;38.700000763;100.0 +25/10/2020 02:06:35;UT800A.U827_COEF_A_FQ140.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UT800A.U827_COEF_A_FQ240.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;UT800A.U827_CPT_Z01.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FC103_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FC103_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FC103_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FC104_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FC104_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FC203_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FC203_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FC203_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FC204_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FC204_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FI102_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FI102_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FI103.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FI103A.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FI103B.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FI112_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FI112_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FI121_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FI121_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FI140.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FI202_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FI202_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FI203.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FI203A.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FI203B.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FI212_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FI212_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FI221_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FI221_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FI240.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FQ140.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FQ240.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FY103.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_FY203.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_LC131_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_LC131_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_LC231_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_LC231_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_LI103.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_LI105.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_LI131.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_LI203.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_LI205.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_LI231.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_P103.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_P105.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_P203.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_P205.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_PC101_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_PC101_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_PC101_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_PC201_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_PC201_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_PC201_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_PI101.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_PI102.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_PI122.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_PI140.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_PI201.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_PI202.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_PI222.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_PI240.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC01_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC102_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC102_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC103_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC103_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC104_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC104_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC105_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC105_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC105_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC106_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC106_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC110_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC110_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC111_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC111_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC117_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC117_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC118_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC118_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;UT800A.U827_TC145_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;UT800A.U827_TC145_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;UT800A.U827_TC145_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC202_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC202_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC203_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC203_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC204_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC204_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC205_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC205_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC205_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC206_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC206_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC210_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC210_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC211_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC211_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC217_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC217_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC218_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TC218_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;UT800A.U827_TC245_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;UT800A.U827_TC245_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;UT800A.U827_TC245_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI102.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI103.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI104.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI105.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI106.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI110.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI111.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI112.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI113.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI114.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI115.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI116.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI117.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI118.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI11A.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI11B.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI120.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI121.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI122.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI123.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI124.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI125.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI126.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI127.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI128.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI130.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI140.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;UT800A.U827_TI155.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI202.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI203.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI204.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI205.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI206.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI210.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI211.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI212.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI213.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI214.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI215.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI216.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI217.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI218.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI220.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI221.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI222.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI223.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI224.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI225.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI226.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI227.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI228.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI230.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_TI240.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;UT800A.U827_TI255.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_WI103.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_WI104.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_WI203.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800A.U827_WI204.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_FC02_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_FC02_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_FC13_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_FC13_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_FC14_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_FC14_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_FI05.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_FQ05.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_LC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_LC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_LI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_LI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_LI07.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_LI10.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_LI13.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_LI14.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_LT13.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_LT13_AFF.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_LT13_AFF.F_TV5;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_LT13_CA1.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_LT13_CA2.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_LT14.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_LT14_AFF.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_LT14_AFF.F_TV5;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_LT14_CA1.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_LT14_CA2.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_PC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_PC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_PC01_SP_BROOKS.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_PC05_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_PC05_SP_BROOKS.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TC02_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TC02_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TC03_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TC03_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TC04_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TC04_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TC05_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TC05_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TC09_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TC09_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TC15_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TC17_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TC18_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TC18_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TC19_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TC20_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TC21_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TC21_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TI109.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TI11.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TI115.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TI118.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TI119.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TI12.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TI121A.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TI121B.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TI121C.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TI13.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TI14.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TI28.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_TI30.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_VIT_P13.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_VIT_P14.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_WI06.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_WI07.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U006_WI08.F_CV;0.000000000;0.0 +25/10/2020 02:06:26;UT800B.U011_DP.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;UT800B.U011_FC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;UT800B.U011_FC03_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:26;UT800B.U011_FC03_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;UT800B.U011_FC12_PV.F_CV;0.064872742;100.0 +25/10/2020 02:06:14;UT800B.U011_FC12_PV.F_CV;0.122468948;100.0 +25/10/2020 02:06:15;UT800B.U011_FC12_PV.F_CV;-0.063081741;100.0 +25/10/2020 02:06:37;UT800B.U011_FC12_PV.F_CV;-0.150627136;100.0 +25/10/2020 02:06:38;UT800B.U011_FC12_PV.F_CV;-0.038427353;100.0 +25/10/2020 02:06:50;UT800B.U011_FC12_PV.F_CV;-0.075551987;100.0 +25/10/2020 02:06:51;UT800B.U011_FC12_PV.F_CV;0.055547714;100.0 +25/10/2020 02:06:43;UT800B.U011_FC12_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;UT800B.U011_FI01.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;UT800B.U011_FI05.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;UT800B.U011_FQ05.F_CV;270457.250000000;100.0 +25/10/2020 02:06:26;UT800B.U011_LC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;UT800B.U011_LC01_PV.F_CV;69.341796875;100.0 +25/10/2020 02:06:21;UT800B.U011_LI03.F_CV;0.020245075;100.0 +25/10/2020 02:06:20;UT800B.U011_LI07.F_CV;0.040113449;100.0 +25/10/2020 02:06:56;UT800B.U011_LI10.F_CV;15.729248047;100.0 +25/10/2020 02:06:21;UT800B.U011_LT03.F_CV;0.020245075;100.0 +25/10/2020 02:06:22;UT800B.U011_LT03_AFF.F_CV;0.020245075;100.0 +25/10/2020 02:06:08;UT800B.U011_LT03_CA1.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U011_LT03_CA2.F_CV;0.000000000;0.0 +25/10/2020 02:06:26;UT800B.U011_PC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;UT800B.U011_PC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;UT800B.U011_PI02.F_CV;0.000000000;100.0 +25/10/2020 02:06:32;UT800B.U011_PI04.F_CV;-0.033040047;100.0 +25/10/2020 02:06:26;UT800B.U011_TC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;UT800B.U011_TC01_PV.F_CV;25.000000000;100.0 +25/10/2020 02:06:32;UT800B.U011_TC02_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;UT800B.U011_TC02_PV.F_CV;336.300476074;100.0 +25/10/2020 02:06:26;UT800B.U011_TC03_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:27;UT800B.U011_TC03_PV.F_CV;351.536987305;100.0 +25/10/2020 02:06:32;UT800B.U011_TC04_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:51;UT800B.U011_TC04_PV.F_CV;335.921875000;100.0 +25/10/2020 02:06:43;UT800B.U011_TI02.F_CV;336.300476074;100.0 +25/10/2020 02:06:38;UT800B.U011_TI04.F_CV;335.851562500;100.0 +25/10/2020 02:06:26;UT800B.U011_TI11.F_CV;25.000000000;100.0 +25/10/2020 02:06:37;UT800B.U011_TI12.F_CV;24.195800781;100.0 +25/10/2020 02:06:37;UT800B.U011_TI13.F_CV;24.420410156;100.0 +25/10/2020 02:06:37;UT800B.U011_TI14.F_CV;24.453125000;100.0 +25/10/2020 02:06:26;UT800B.U011_TI30.F_CV;23.941406250;100.0 +25/10/2020 02:06:26;UT800B.U011_VIT_P02.F_CV;0.000000000;100.0 +25/10/2020 02:06:26;UT800B.U011_VIT_P2.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;UT800B.U011_WI06.F_CV;0.000000000;100.0 +25/10/2020 02:06:08;UT800B.U017_FC02_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_FC02_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_FC13_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_FC13_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_FC14_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_FC14_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_FI05.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_FQ05.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_LC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_LC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_LI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_LI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_LI07.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_LI10.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_LI13.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_LI14.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_LT13.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_LT13_AFF.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_LT13_AFF.F_TV5;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_LT13_CA1.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_LT13_CA1.F_TV5;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_LT13_CA2.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_LT13_CA2.F_TV5;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_LT14.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_LT14_AFF.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_LT14_AFF.F_TV5;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_LT14_CA1.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_LT14_CA1.F_TV5;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_LT14_CA2.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_LT14_CA2.F_TV5;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_PC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_PC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_PC01_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_PC01_SP_BROOKS.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_PC05_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_PC05_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_PC05_SP_BROOKS.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_PDT03.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_TC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_TC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_TC02_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_TC02_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_TC03_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_TC03_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_TC04_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_TC04_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_TC15_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_TC15_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_TC18_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_TC18_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_TI11.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_TI115.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_TI118.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_TI12.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_TI13.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_TI14.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_TI28.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_TI30.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_VIT_P13.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_VIT_P14.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_WI06.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_WI07.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U017_WI08.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U846_FQT10.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855_DPC08_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855_FC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855_FC02_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855_FC03_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855_FC05_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855_FI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855_FI04.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855_LC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855_LC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855_PC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855_PC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855_PI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855_TC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855_TC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855_TC09_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855_TC09_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855_TC09_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855_TI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855_TI03.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855_TI04.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855_TI05.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855_TI06.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855_TI07.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855_TI11.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC01_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC01A_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC02_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC02_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC02_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC03_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC03_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC03_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC04_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC04_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC04_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC05_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC05_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC05_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC06_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC06_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC06_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC07_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC07_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC07_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC08_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC08_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TC08_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TI03.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TI04.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TI05.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TI06.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TI07.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TI08.F_CV;0.000000000;0.0 +25/10/2020 02:06:00;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:01;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:02;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:03;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:04;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:05;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:06;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:07;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:09;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:10;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:11;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:13;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:14;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:15;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:16;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:17;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:18;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:20;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:21;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:22;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:23;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:24;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:25;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:26;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:28;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:29;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:30;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:31;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:33;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:36;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:39;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:40;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:41;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:42;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:43;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:45;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:49;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:51;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:54;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:55;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:57;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:58;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UT800B.U855A_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TI10.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TI101.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TI102.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TI103.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TI104.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TI105.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TI106.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TI107.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800B.U855A_TI108.F_CV;0.000000000;0.0 +25/10/2020 02:06:11;UT800B.U856_FC02_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;UT800B.U856_FC03_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;UT800B.U856_FC04_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;UT800B.U856_FC05_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;UT800B.U856_FC06_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;UT800B.U856_FC07_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;UT800B.U856_FI02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;UT800B.U856_FI03_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;UT800B.U856_FI04_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:17;UT800B.U856_FI05_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;UT800B.U856_FI06_PV.F_CV;0.034481701;100.0 +25/10/2020 02:06:11;UT800B.U856_FI07_PV.F_CV;0.082062915;100.0 +25/10/2020 02:06:17;UT800B.U856_FI10_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;UT800B.U856_FQ10_PV.F_CV;314178.187500000;100.0 +25/10/2020 02:06:17;UT800B.U856_FT03_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;UT800B.U856_PI03_PV.F_CV;0.088349216;100.0 +25/10/2020 02:06:11;UT800B.U856_PI32_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:11;UT800B.U856_TC04_OP.F_CV;99.978637695;100.0 +25/10/2020 02:06:50;UT800B.U856_TC04_PV.F_CV;22.870426178;100.0 +25/10/2020 02:06:11;UT800B.U856_TC04_SP.F_CV;220.000000000;100.0 +25/10/2020 02:06:15;UT800B.U856_TC09_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:05;UT800B.U856_TC09_PV.F_CV;21.685352325;100.0 +25/10/2020 02:06:15;UT800B.U856_TC09_PV.F_CV;21.559249878;100.0 +25/10/2020 02:06:25;UT800B.U856_TC09_PV.F_CV;21.652114868;100.0 +25/10/2020 02:06:35;UT800B.U856_TC09_PV.F_CV;21.544586182;100.0 +25/10/2020 02:06:45;UT800B.U856_TC09_PV.F_CV;21.684860229;100.0 +25/10/2020 02:06:15;UT800B.U856_TC09_SP.F_CV;90.000000000;100.0 +25/10/2020 02:06:17;UT800B.U856_TI01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:50;UT800B.U856_TI02_PV.F_CV;22.198310852;100.0 +25/10/2020 02:06:38;UT800B.U856_TI03_PV.F_CV;22.102251053;100.0 +25/10/2020 02:06:32;UT800B.U856_TI05_PV.F_CV;22.284469604;100.0 +25/10/2020 02:06:51;UT800B.U856_TI06_PV.F_CV;22.056367874;100.0 +25/10/2020 02:06:05;UT800B.U856_TI19_PV.F_CV;22.995117188;100.0 +25/10/2020 02:06:30;UT800B.U856_TI19_PV.F_CV;22.815917969;100.0 +25/10/2020 02:06:35;UT800B.U856_TI19_PV.F_CV;22.910644531;100.0 +25/10/2020 02:06:19;UT800C.U005_COEF_A_FI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_COEF_A_FI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_COEF_A_FQ05.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_COEF_A_PI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_COEF_A_PI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_COEF_A_TI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_COEF_A_TI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_COEF_A_TI03.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_COEF_A_TI04.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_COEF_A_TI05.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_COEF_A_TI06.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_COEF_A_TI07.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_COEF_A_TI08.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_COEF_B_FI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_COEF_B_FI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_COEF_B_PI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_COEF_B_PI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_COEF_B_TI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_COEF_B_TI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_COEF_B_TI03.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_COEF_B_TI04.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_COEF_B_TI05.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_COEF_B_TI06.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_COEF_B_TI07.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_COEF_B_TI08.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_DP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_FC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_FC02_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_FC10_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_FC10_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_FI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_FI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_FI05.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_FI10B.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_FQ05.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_LC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_LC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_LI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_LI03.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_LI07.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_LI10.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_LT03.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_LT03_AFF.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_LT03_CA1.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_LT03_CA2.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_PC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_PC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_PI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_TC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_TC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_TC02_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_TC02_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_TC03_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_TC03_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_TC04_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_TC04_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_TI05.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_TI06.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_TI07.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_TI08.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_TI11.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_TI12.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_TI13.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_TI14.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_TI30.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_VIT_P2.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_WI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U005_WI06.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U013_AI01.F_CV;0.726445317;100.0 +25/10/2020 02:06:19;UT800C.U013_AI02.F_CV;0.721113801;100.0 +25/10/2020 02:06:59;UT800C.U013_COEF_A_FI01.F_CV;0.844100058;100.0 +25/10/2020 02:06:19;UT800C.U013_COEF_A_FI02.F_CV;1.046000004;100.0 +25/10/2020 02:06:19;UT800C.U013_COEF_A_FI04.F_CV;1.062600017;100.0 +25/10/2020 02:06:19;UT800C.U013_COEF_A_FI12.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;UT800C.U013_COEF_A_FI15.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;UT800C.U013_COEF_A_FQ05.F_CV;1.107900023;100.0 +25/10/2020 02:06:19;UT800C.U013_COEF_A_PI01.F_CV;1.062600017;100.0 +25/10/2020 02:06:59;UT800C.U013_COEF_A_PI02.F_CV;0.844100058;100.0 +25/10/2020 02:06:19;UT800C.U013_COEF_A_TI01.F_CV;1.000100017;100.0 +25/10/2020 02:06:19;UT800C.U013_COEF_A_TI02.F_CV;0.999200046;100.0 +25/10/2020 02:06:48;UT800C.U013_COEF_A_TI03.F_CV;1.002099991;100.0 +25/10/2020 02:06:19;UT800C.U013_COEF_A_TI04.F_CV;1.000399947;100.0 +25/10/2020 02:06:59;UT800C.U013_COEF_B_FI01.F_CV;0.555300057;100.0 +25/10/2020 02:06:19;UT800C.U013_COEF_B_FI02.F_CV;0.209000006;100.0 +25/10/2020 02:06:19;UT800C.U013_COEF_B_FI04.F_CV;-0.912800074;100.0 +25/10/2020 02:06:19;UT800C.U013_COEF_B_FI12.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;UT800C.U013_COEF_B_FI15.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;UT800C.U013_COEF_B_PI01.F_CV;-0.912800074;100.0 +25/10/2020 02:06:59;UT800C.U013_COEF_B_PI02.F_CV;0.555300057;100.0 +25/10/2020 02:06:48;UT800C.U013_COEF_B_TI01.F_CV;-1.413500071;100.0 +25/10/2020 02:06:48;UT800C.U013_COEF_B_TI02.F_CV;-0.770700037;100.0 +25/10/2020 02:06:48;UT800C.U013_COEF_B_TI03.F_CV;-1.727300048;100.0 +25/10/2020 02:06:48;UT800C.U013_COEF_B_TI04.F_CV;-1.325600028;100.0 +25/10/2020 02:06:19;UT800C.U013_DP.F_CV;-0.489830017;100.0 +25/10/2020 02:06:19;UT800C.U013_FC01_PV.F_CV;1.969698191;100.0 +25/10/2020 02:06:19;UT800C.U013_FC01B.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UT800C.U013_FC02_PV.F_CV;0.212294266;100.0 +25/10/2020 02:06:19;UT800C.U013_FC04_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:41;UT800C.U013_FC12_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;UT800C.U013_FC12_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;UT800C.U013_FC15_PV.F_CV;-5.000000000;100.0 +25/10/2020 02:06:19;UT800C.U013_FC15_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;UT800C.U013_FI01.F_CV;1.969698191;100.0 +25/10/2020 02:06:35;UT800C.U013_FI02.F_CV;0.212294266;100.0 +25/10/2020 02:06:53;UT800C.U013_FI05.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;UT800C.U013_FQ05.F_CV;133328.562500000;100.0 +25/10/2020 02:06:19;UT800C.U013_LC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;UT800C.U013_LC01_PV.F_CV;-0.784164429;100.0 +25/10/2020 02:06:19;UT800C.U013_LC01_SP.F_CV;40.000000000;100.0 +25/10/2020 02:06:24;UT800C.U013_LI01.F_CV;-0.784378052;100.0 +25/10/2020 02:06:19;UT800C.U013_LI03.F_CV;0.023306370;100.0 +25/10/2020 02:06:19;UT800C.U013_LI04.F_CV;-0.659744263;100.0 +25/10/2020 02:06:11;UT800C.U013_LI07.F_CV;13.431396484;100.0 +25/10/2020 02:06:29;UT800C.U013_LI07.F_CV;13.515136719;100.0 +25/10/2020 02:06:53;UT800C.U013_LI07.F_CV;13.430175781;100.0 +25/10/2020 02:06:59;UT800C.U013_LI07.F_CV;13.488769531;100.0 +25/10/2020 02:06:05;UT800C.U013_LI10.F_CV;10.476806641;100.0 +25/10/2020 02:06:34;UT800C.U013_LI10.F_CV;10.415771484;100.0 +25/10/2020 02:06:35;UT800C.U013_LI10.F_CV;10.183837891;100.0 +25/10/2020 02:06:46;UT800C.U013_LI10.F_CV;10.110107422;100.0 +25/10/2020 02:06:47;UT800C.U013_LI10.F_CV;10.405029297;100.0 +25/10/2020 02:06:19;UT800C.U013_LT03.F_CV;0.023306370;100.0 +25/10/2020 02:06:23;UT800C.U013_MI01.F_CV;1001.031250000;100.0 +25/10/2020 02:06:46;UT800C.U013_MI01.F_CV;1001.031250000;100.0 +25/10/2020 02:06:47;UT800C.U013_MI01.F_CV;378.453125000;100.0 +25/10/2020 02:06:52;UT800C.U013_MI01.F_CV;378.453125000;100.0 +25/10/2020 02:06:53;UT800C.U013_MI01.F_CV;227.777343750;100.0 +25/10/2020 02:06:58;UT800C.U013_MI01.F_CV;227.777343750;100.0 +25/10/2020 02:06:59;UT800C.U013_MI01.F_CV;846.078125000;100.0 +25/10/2020 02:06:35;UT800C.U013_PC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:04;UT800C.U013_PC01_PV.F_CV;0.351379395;100.0 +25/10/2020 02:06:05;UT800C.U013_PC01_PV.F_CV;0.341575623;100.0 +25/10/2020 02:06:10;UT800C.U013_PC01_PV.F_CV;0.341575623;100.0 +25/10/2020 02:06:11;UT800C.U013_PC01_PV.F_CV;0.351089478;100.0 +25/10/2020 02:06:16;UT800C.U013_PC01_PV.F_CV;0.351089478;100.0 +25/10/2020 02:06:17;UT800C.U013_PC01_PV.F_CV;0.353561401;100.0 +25/10/2020 02:06:22;UT800C.U013_PC01_PV.F_CV;0.353561401;100.0 +25/10/2020 02:06:23;UT800C.U013_PC01_PV.F_CV;0.341506958;100.0 +25/10/2020 02:06:28;UT800C.U013_PC01_PV.F_CV;0.341506958;100.0 +25/10/2020 02:06:29;UT800C.U013_PC01_PV.F_CV;0.341049194;100.0 +25/10/2020 02:06:34;UT800C.U013_PC01_PV.F_CV;0.341049194;100.0 +25/10/2020 02:06:35;UT800C.U013_PC01_PV.F_CV;0.340896606;100.0 +25/10/2020 02:06:40;UT800C.U013_PC01_PV.F_CV;0.340896606;100.0 +25/10/2020 02:06:41;UT800C.U013_PC01_PV.F_CV;0.356178284;100.0 +25/10/2020 02:06:46;UT800C.U013_PC01_PV.F_CV;0.356178284;100.0 +25/10/2020 02:06:47;UT800C.U013_PC01_PV.F_CV;0.344795227;100.0 +25/10/2020 02:06:52;UT800C.U013_PC01_PV.F_CV;0.344795227;100.0 +25/10/2020 02:06:53;UT800C.U013_PC01_PV.F_CV;0.351524353;100.0 +25/10/2020 02:06:58;UT800C.U013_PC01_PV.F_CV;0.351524353;100.0 +25/10/2020 02:06:59;UT800C.U013_PC01_PV.F_CV;0.357055664;100.0 +25/10/2020 02:06:19;UT800C.U013_PI02.F_CV;-0.136268616;100.0 +25/10/2020 02:06:19;UT800C.U013_PI04.F_CV;-0.007392764;100.0 +25/10/2020 02:06:19;UT800C.U013_TC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;UT800C.U013_TC01_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:19;UT800C.U013_TC02_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;UT800C.U013_TC02_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:19;UT800C.U013_TC03_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;UT800C.U013_TC03_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:19;UT800C.U013_TC04_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;UT800C.U013_TC04_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:19;UT800C.U013_TC04_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:48;UT800C.U013_TI04.F_CV;600.000000000;100.0 +25/10/2020 02:06:48;UT800C.U013_TI05.F_CV;1340.250000000;100.0 +25/10/2020 02:06:48;UT800C.U013_TI06.F_CV;1340.250000000;100.0 +25/10/2020 02:06:48;UT800C.U013_TI07.F_CV;1340.250000000;100.0 +25/10/2020 02:06:48;UT800C.U013_TI08.F_CV;1340.250000000;100.0 +25/10/2020 02:06:35;UT800C.U013_TI11.F_CV;24.768066406;100.0 +25/10/2020 02:06:05;UT800C.U013_TI12.F_CV;25.185546875;100.0 +25/10/2020 02:06:05;UT800C.U013_TI13.F_CV;25.399902344;100.0 +25/10/2020 02:06:05;UT800C.U013_TI14.F_CV;26.111816406;100.0 +25/10/2020 02:06:05;UT800C.U013_TI30.F_CV;24.500000000;100.0 +25/10/2020 02:06:19;UT800C.U013_TI31.F_CV;20.809000015;100.0 +25/10/2020 02:06:19;UT800C.U013_VIT_P02.F_CV;50.000000000;100.0 +25/10/2020 02:06:48;UT800C.U013_WI06.F_CV;450.700012207;100.0 +25/10/2020 02:06:19;UT800C.U016_COEF_A_FI01.F_CV;1.010599971;100.0 +25/10/2020 02:06:19;UT800C.U016_COEF_A_FI11.F_CV;0.966100037;100.0 +25/10/2020 02:06:19;UT800C.U016_COEF_A_PI01.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;UT800C.U016_COEF_A_PI02.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;UT800C.U016_COEF_A_TI01.F_CV;1.000000000;100.0 +25/10/2020 02:06:19;UT800C.U016_COEF_A_TI02.F_CV;0.991600037;100.0 +25/10/2020 02:06:19;UT800C.U016_COEF_A_TI03.F_CV;0.991500080;100.0 +25/10/2020 02:06:19;UT800C.U016_COEF_A_TI04.F_CV;0.992700040;100.0 +25/10/2020 02:06:19;UT800C.U016_COEF_A_TI05.F_CV;0.994600058;100.0 +25/10/2020 02:06:19;UT800C.U016_COEF_A_TI08.F_CV;1.000599980;100.0 +25/10/2020 02:06:19;UT800C.U016_COEF_B_FI01.F_CV;0.670500040;100.0 +25/10/2020 02:06:19;UT800C.U016_COEF_B_FI11.F_CV;-0.105600007;100.0 +25/10/2020 02:06:19;UT800C.U016_COEF_B_PI01.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;UT800C.U016_COEF_B_PI02.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;UT800C.U016_COEF_B_TI01.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;UT800C.U016_COEF_B_TI02.F_CV;0.414600015;100.0 +25/10/2020 02:06:19;UT800C.U016_COEF_B_TI03.F_CV;0.815200031;100.0 +25/10/2020 02:06:19;UT800C.U016_COEF_B_TI04.F_CV;0.910000026;100.0 +25/10/2020 02:06:19;UT800C.U016_COEF_B_TI05.F_CV;0.530100048;100.0 +25/10/2020 02:06:19;UT800C.U016_COEF_B_TI08.F_CV;0.461400032;100.0 +25/10/2020 02:06:48;UT800C.U016_DP.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;UT800C.U016_FC01_PV.F_CV;0.018812954;100.0 +25/10/2020 02:06:19;UT800C.U016_FC01_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;UT800C.U016_FC02_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U016_FC03_PV.F_CV;0.018825218;100.0 +25/10/2020 02:06:19;UT800C.U016_FC03_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;UT800C.U016_FC06_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;UT800C.U016_FC10_OP.F_CV;97.827079773;100.0 +25/10/2020 02:06:19;UT800C.U016_FC10_PV.F_CV;15.626875877;100.0 +25/10/2020 02:06:19;UT800C.U016_FC10_SP.F_CV;152.899993896;100.0 +25/10/2020 02:06:48;UT800C.U016_FC11_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:58;UT800C.U016_FI01.F_CV;0.018812954;100.0 +25/10/2020 02:06:19;UT800C.U016_FI05.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;UT800C.U016_FI10B.F_CV;26.582855225;100.0 +25/10/2020 02:06:48;UT800C.U016_FQ05.F_CV;350.350006104;100.0 +25/10/2020 02:06:58;UT800C.U016_LC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;UT800C.U016_LC01_PV.F_CV;0.012564659;100.0 +25/10/2020 02:06:48;UT800C.U016_LI03.F_CV;0.787704468;100.0 +25/10/2020 02:06:48;UT800C.U016_LI07.F_CV;-0.003358781;100.0 +25/10/2020 02:06:58;UT800C.U016_LI10.F_CV;56.216796875;100.0 +25/10/2020 02:06:48;UT800C.U016_LT03.F_CV;0.787704468;100.0 +25/10/2020 02:06:48;UT800C.U016_LT03_AFF.F_CV;0.787704468;100.0 +25/10/2020 02:06:19;UT800C.U016_LT03_CA1.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U016_LT03_CA2.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;UT800C.U016_PC01_OP.F_CV;0.181585133;100.0 +25/10/2020 02:06:48;UT800C.U016_PC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;UT800C.U016_PC01_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;UT800C.U016_PC20_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;UT800C.U016_PC20_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;UT800C.U016_PI02.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;UT800C.U016_PI04.F_CV;-0.014077425;100.0 +25/10/2020 02:06:48;UT800C.U016_TC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;UT800C.U016_TC01_PV.F_CV;24.060001373;100.0 +25/10/2020 02:06:48;UT800C.U016_TC01_SP.F_CV;23.994636536;100.0 +25/10/2020 02:06:19;UT800C.U016_TC03_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:19;UT800C.U016_TC03_PV.F_CV;24.131429672;100.0 +25/10/2020 02:06:19;UT800C.U016_TC03_SP.F_CV;24.144500732;100.0 +25/10/2020 02:06:48;UT800C.U016_TC05_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:48;UT800C.U016_TC05_PV.F_CV;24.065406799;100.0 +25/10/2020 02:06:48;UT800C.U016_TC05_SP.F_CV;24.060064316;100.0 +25/10/2020 02:06:19;UT800C.U016_TI01.F_CV;23.446289063;100.0 +25/10/2020 02:06:19;UT800C.U016_TI02.F_CV;24.017393112;100.0 +25/10/2020 02:06:19;UT800C.U016_TI04.F_CV;24.509407043;100.0 +25/10/2020 02:06:19;UT800C.U016_TI08.F_CV;600.000000000;100.0 +25/10/2020 02:06:19;UT800C.U016_TI11.F_CV;23.573730469;100.0 +25/10/2020 02:06:58;UT800C.U016_TI13.F_CV;23.441894531;100.0 +25/10/2020 02:06:48;UT800C.U016_TI15.F_CV;23.196289063;100.0 +25/10/2020 02:06:48;UT800C.U016_TI30.F_CV;22.507324219;100.0 +25/10/2020 02:06:19;UT800C.U016_VIT_P2.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U016_WI02.F_CV;2717.449951172;100.0 +25/10/2020 02:06:19;UT800C.U016_WI06.F_CV;6.099999905;100.0 +25/10/2020 02:06:19;UT800C.U031_COEF_A_FI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_COEF_A_FQ05.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_COEF_A_PI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_COEF_A_PI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_COEF_A_TI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_COEF_A_TI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_COEF_A_TI03.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_COEF_A_TI04.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_COEF_A_TI05.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_COEF_A_TI06.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_COEF_A_TI07.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_COEF_A_TI08.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_COEF_B_FI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_COEF_B_PI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_COEF_B_PI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_COEF_B_TI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_COEF_B_TI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_COEF_B_TI03.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_COEF_B_TI04.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_COEF_B_TI05.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_COEF_B_TI06.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_COEF_B_TI07.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_COEF_B_TI08.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_DP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_FC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_FC02_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_FC10_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_FC10_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_FI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_FI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_FI05.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_FI10B.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_FQ05.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_LC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_LC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_LI03.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_LI07.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_LI10.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_LT03.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_LT03_AFF.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_LT03_CA1.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_LT03_CA2.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_PC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_PC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_PI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_TC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_TC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_TC02_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_TC02_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_TC03_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_TC03_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_TC04_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_TC04_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_TI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_TI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_TI03.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_TI04.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_TI05.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_TI06.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_TI07.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_TI08.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_TI11.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_TI12.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_TI13.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_TI14.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_TI30.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_VIT_P2.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_WI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800C.U031_WI06.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U004_COEF_A_FQ05.F_CV;0.992400050;100.0 +25/10/2020 02:06:46;UT800D.U004_COMPTEUR_INJECTIONS.F_CV;0.000000000;0.0 +25/10/2020 02:06:16;UT800D.U004_CPT_Z01.F_CV;2024.000000000;100.0 +25/10/2020 02:06:30;UT800D.U004_DP.F_CV;-0.125000000;100.0 +25/10/2020 02:06:02;UT800D.U004_FC01_PV.F_CV;134.992568970;100.0 +25/10/2020 02:06:03;UT800D.U004_FC01_PV.F_CV;130.585784912;100.0 +25/10/2020 02:06:09;UT800D.U004_FC01_PV.F_CV;129.322952271;100.0 +25/10/2020 02:06:14;UT800D.U004_FC01_PV.F_CV;129.322952271;100.0 +25/10/2020 02:06:15;UT800D.U004_FC01_PV.F_CV;131.410186768;100.0 +25/10/2020 02:06:20;UT800D.U004_FC01_PV.F_CV;131.410186768;100.0 +25/10/2020 02:06:21;UT800D.U004_FC01_PV.F_CV;136.682586670;100.0 +25/10/2020 02:06:26;UT800D.U004_FC01_PV.F_CV;136.682586670;100.0 +25/10/2020 02:06:27;UT800D.U004_FC01_PV.F_CV;132.388214111;100.0 +25/10/2020 02:06:32;UT800D.U004_FC01_PV.F_CV;132.388214111;100.0 +25/10/2020 02:06:33;UT800D.U004_FC01_PV.F_CV;136.795013428;100.0 +25/10/2020 02:06:38;UT800D.U004_FC01_PV.F_CV;136.795013428;100.0 +25/10/2020 02:06:39;UT800D.U004_FC01_PV.F_CV;132.568084717;100.0 +25/10/2020 02:06:50;UT800D.U004_FC01_PV.F_CV;132.568084717;100.0 +25/10/2020 02:06:51;UT800D.U004_FC01_PV.F_CV;130.263519287;100.0 +25/10/2020 02:06:56;UT800D.U004_FC01_PV.F_CV;130.263519287;100.0 +25/10/2020 02:06:57;UT800D.U004_FC01_PV.F_CV;136.468994141;100.0 +25/10/2020 02:06:15;UT800D.U004_FC01_SP.F_CV;135.000000000;100.0 +25/10/2020 02:06:02;UT800D.U004_FC10_OP.F_CV;53.746757507;100.0 +25/10/2020 02:06:03;UT800D.U004_FC10_OP.F_CV;54.186222076;100.0 +25/10/2020 02:06:15;UT800D.U004_FC10_OP.F_CV;54.303413391;100.0 +25/10/2020 02:06:21;UT800D.U004_FC10_OP.F_CV;54.479202271;100.0 +25/10/2020 02:06:26;UT800D.U004_FC10_OP.F_CV;54.479202271;100.0 +25/10/2020 02:06:27;UT800D.U004_FC10_OP.F_CV;54.772178650;100.0 +25/10/2020 02:06:32;UT800D.U004_FC10_OP.F_CV;54.772178650;100.0 +25/10/2020 02:06:33;UT800D.U004_FC10_OP.F_CV;55.006561279;100.0 +25/10/2020 02:06:44;UT800D.U004_FC10_OP.F_CV;55.094455719;100.0 +25/10/2020 02:06:45;UT800D.U004_FC10_OP.F_CV;54.889369965;100.0 +25/10/2020 02:06:56;UT800D.U004_FC10_OP.F_CV;54.889369965;100.0 +25/10/2020 02:06:57;UT800D.U004_FC10_OP.F_CV;54.654987335;100.0 +25/10/2020 02:06:02;UT800D.U004_FC10_PV.F_CV;69.360687256;100.0 +25/10/2020 02:06:03;UT800D.U004_FC10_PV.F_CV;68.370956421;100.0 +25/10/2020 02:06:09;UT800D.U004_FC10_PV.F_CV;68.203750610;100.0 +25/10/2020 02:06:15;UT800D.U004_FC10_PV.F_CV;68.040191650;100.0 +25/10/2020 02:06:20;UT800D.U004_FC10_PV.F_CV;68.040191650;100.0 +25/10/2020 02:06:21;UT800D.U004_FC10_PV.F_CV;67.547225952;100.0 +25/10/2020 02:06:26;UT800D.U004_FC10_PV.F_CV;67.547225952;100.0 +25/10/2020 02:06:27;UT800D.U004_FC10_PV.F_CV;66.750167847;100.0 +25/10/2020 02:06:32;UT800D.U004_FC10_PV.F_CV;66.750167847;100.0 +25/10/2020 02:06:33;UT800D.U004_FC10_PV.F_CV;66.194282532;100.0 +25/10/2020 02:06:39;UT800D.U004_FC10_PV.F_CV;65.944976807;100.0 +25/10/2020 02:06:44;UT800D.U004_FC10_PV.F_CV;65.944976807;100.0 +25/10/2020 02:06:45;UT800D.U004_FC10_PV.F_CV;66.505500793;100.0 +25/10/2020 02:06:56;UT800D.U004_FC10_PV.F_CV;66.505500793;100.0 +25/10/2020 02:06:57;UT800D.U004_FC10_PV.F_CV;67.126220703;100.0 +25/10/2020 02:06:50;UT800D.U004_FC10_SP.F_CV;67.500000000;100.0 +25/10/2020 02:06:46;UT800D.U004_FC11_PV.F_CV;7.996654987;100.0 +25/10/2020 02:06:46;UT800D.U004_FC11_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;UT800D.U004_FI05.F_CV;135.000000000;100.0 +25/10/2020 02:06:03;UT800D.U004_FI05.F_CV;120.000000000;100.0 +25/10/2020 02:06:08;UT800D.U004_FI05.F_CV;120.000000000;100.0 +25/10/2020 02:06:09;UT800D.U004_FI05.F_CV;135.000000000;100.0 +25/10/2020 02:06:14;UT800D.U004_FI05.F_CV;135.000000000;100.0 +25/10/2020 02:06:15;UT800D.U004_FI05.F_CV;150.000000000;100.0 +25/10/2020 02:06:20;UT800D.U004_FI05.F_CV;150.000000000;100.0 +25/10/2020 02:06:21;UT800D.U004_FI05.F_CV;135.000000000;100.0 +25/10/2020 02:06:26;UT800D.U004_FI05.F_CV;135.000000000;100.0 +25/10/2020 02:06:27;UT800D.U004_FI05.F_CV;120.000000000;100.0 +25/10/2020 02:06:38;UT800D.U004_FI05.F_CV;120.000000000;100.0 +25/10/2020 02:06:39;UT800D.U004_FI05.F_CV;135.000000000;100.0 +25/10/2020 02:06:56;UT800D.U004_FI05.F_CV;135.000000000;100.0 +25/10/2020 02:06:57;UT800D.U004_FI05.F_CV;120.000000000;100.0 +25/10/2020 02:06:25;UT800D.U004_FI10A.F_CV;67.112022400;100.0 +25/10/2020 02:06:36;UT800D.U004_FI10A.F_CV;66.059860229;100.0 +25/10/2020 02:06:57;UT800D.U004_FI10A.F_CV;67.126220703;100.0 +25/10/2020 02:06:08;UT800D.U004_FI10B.F_CV;69.362968445;100.0 +25/10/2020 02:06:25;UT800D.U004_FI10B.F_CV;69.871849060;100.0 +25/10/2020 02:06:02;UT800D.U004_FQ05.F_CV;30536.894531250;100.0 +25/10/2020 02:06:03;UT800D.U004_FQ05.F_CV;30537.142578125;100.0 +25/10/2020 02:06:08;UT800D.U004_FQ05.F_CV;30537.142578125;100.0 +25/10/2020 02:06:09;UT800D.U004_FQ05.F_CV;30537.390625000;100.0 +25/10/2020 02:06:14;UT800D.U004_FQ05.F_CV;30537.390625000;100.0 +25/10/2020 02:06:15;UT800D.U004_FQ05.F_CV;30537.638671875;100.0 +25/10/2020 02:06:20;UT800D.U004_FQ05.F_CV;30537.638671875;100.0 +25/10/2020 02:06:21;UT800D.U004_FQ05.F_CV;30537.886718750;100.0 +25/10/2020 02:06:26;UT800D.U004_FQ05.F_CV;30537.886718750;100.0 +25/10/2020 02:06:27;UT800D.U004_FQ05.F_CV;30538.134765625;100.0 +25/10/2020 02:06:38;UT800D.U004_FQ05.F_CV;30538.134765625;100.0 +25/10/2020 02:06:39;UT800D.U004_FQ05.F_CV;30538.382812500;100.0 +25/10/2020 02:06:44;UT800D.U004_FQ05.F_CV;30538.382812500;100.0 +25/10/2020 02:06:45;UT800D.U004_FQ05.F_CV;30538.630859375;100.0 +25/10/2020 02:06:50;UT800D.U004_FQ05.F_CV;30538.630859375;100.0 +25/10/2020 02:06:51;UT800D.U004_FQ05.F_CV;30538.878906250;100.0 +25/10/2020 02:06:56;UT800D.U004_FQ05.F_CV;30538.878906250;100.0 +25/10/2020 02:06:57;UT800D.U004_FQ05.F_CV;30539.126953125;100.0 +25/10/2020 02:06:02;UT800D.U004_LC01_OP.F_CV;7.126071930;100.0 +25/10/2020 02:06:03;UT800D.U004_LC01_OP.F_CV;6.833094120;100.0 +25/10/2020 02:06:08;UT800D.U004_LC01_OP.F_CV;6.833094120;100.0 +25/10/2020 02:06:09;UT800D.U004_LC01_OP.F_CV;11.178930283;100.0 +25/10/2020 02:06:14;UT800D.U004_LC01_OP.F_CV;11.178930283;100.0 +25/10/2020 02:06:15;UT800D.U004_LC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:44;UT800D.U004_LC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:45;UT800D.U004_LC01_OP.F_CV;4.391613483;100.0 +25/10/2020 02:06:50;UT800D.U004_LC01_OP.F_CV;4.391613483;100.0 +25/10/2020 02:06:51;UT800D.U004_LC01_OP.F_CV;9.958189964;100.0 +25/10/2020 02:06:56;UT800D.U004_LC01_OP.F_CV;9.958189964;100.0 +25/10/2020 02:06:57;UT800D.U004_LC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;UT800D.U004_LC01_PV.F_CV;49.649414063;100.0 +25/10/2020 02:06:14;UT800D.U004_LC01_PV.F_CV;49.649414063;100.0 +25/10/2020 02:06:15;UT800D.U004_LC01_PV.F_CV;48.603515625;100.0 +25/10/2020 02:06:27;UT800D.U004_LC01_PV.F_CV;48.788085938;100.0 +25/10/2020 02:06:32;UT800D.U004_LC01_PV.F_CV;48.788085938;100.0 +25/10/2020 02:06:33;UT800D.U004_LC01_PV.F_CV;48.995117188;100.0 +25/10/2020 02:06:44;UT800D.U004_LC01_PV.F_CV;49.048828125;100.0 +25/10/2020 02:06:45;UT800D.U004_LC01_PV.F_CV;49.303710938;100.0 +25/10/2020 02:06:50;UT800D.U004_LC01_PV.F_CV;49.303710938;100.0 +25/10/2020 02:06:51;UT800D.U004_LC01_PV.F_CV;49.518554688;100.0 +25/10/2020 02:06:56;UT800D.U004_LC01_PV.F_CV;49.518554688;100.0 +25/10/2020 02:06:57;UT800D.U004_LC01_PV.F_CV;48.857421875;100.0 +25/10/2020 02:06:46;UT800D.U004_LC01_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:23;UT800D.U004_LI03.F_CV;72.804687500;100.0 +25/10/2020 02:06:33;UT800D.U004_LI07.F_CV;32.587890625;100.0 +25/10/2020 02:06:39;UT800D.U004_LI07.F_CV;32.491210938;100.0 +25/10/2020 02:06:45;UT800D.U004_LI07.F_CV;32.622070313;100.0 +25/10/2020 02:06:46;UT800D.U004_LI10.F_CV;-10.000000000;100.0 +25/10/2020 02:06:02;UT800D.U004_PC01_OP.F_CV;30.710775375;100.0 +25/10/2020 02:06:03;UT800D.U004_PC01_OP.F_CV;32.615131378;100.0 +25/10/2020 02:06:08;UT800D.U004_PC01_OP.F_CV;32.615131378;100.0 +25/10/2020 02:06:09;UT800D.U004_PC01_OP.F_CV;31.101413727;100.0 +25/10/2020 02:06:14;UT800D.U004_PC01_OP.F_CV;31.101413727;100.0 +25/10/2020 02:06:15;UT800D.U004_PC01_OP.F_CV;28.489028931;100.0 +25/10/2020 02:06:20;UT800D.U004_PC01_OP.F_CV;28.489028931;100.0 +25/10/2020 02:06:21;UT800D.U004_PC01_OP.F_CV;30.613117218;100.0 +25/10/2020 02:06:26;UT800D.U004_PC01_OP.F_CV;30.613117218;100.0 +25/10/2020 02:06:27;UT800D.U004_PC01_OP.F_CV;29.905086517;100.0 +25/10/2020 02:06:32;UT800D.U004_PC01_OP.F_CV;29.905086517;100.0 +25/10/2020 02:06:33;UT800D.U004_PC01_OP.F_CV;29.587694168;100.0 +25/10/2020 02:06:38;UT800D.U004_PC01_OP.F_CV;29.587694168;100.0 +25/10/2020 02:06:39;UT800D.U004_PC01_OP.F_CV;30.027160645;100.0 +25/10/2020 02:06:44;UT800D.U004_PC01_OP.F_CV;30.027160645;100.0 +25/10/2020 02:06:45;UT800D.U004_PC01_OP.F_CV;29.294717789;100.0 +25/10/2020 02:06:50;UT800D.U004_PC01_OP.F_CV;29.294717789;100.0 +25/10/2020 02:06:51;UT800D.U004_PC01_OP.F_CV;30.637531281;100.0 +25/10/2020 02:06:56;UT800D.U004_PC01_OP.F_CV;30.637531281;100.0 +25/10/2020 02:06:57;UT800D.U004_PC01_OP.F_CV;25.315103531;100.0 +25/10/2020 02:06:02;UT800D.U004_PC01_PV.F_CV;140.140625000;100.0 +25/10/2020 02:06:03;UT800D.U004_PC01_PV.F_CV;140.136718750;100.0 +25/10/2020 02:06:08;UT800D.U004_PC01_PV.F_CV;140.136718750;100.0 +25/10/2020 02:06:09;UT800D.U004_PC01_PV.F_CV;140.062500000;100.0 +25/10/2020 02:06:14;UT800D.U004_PC01_PV.F_CV;140.062500000;100.0 +25/10/2020 02:06:15;UT800D.U004_PC01_PV.F_CV;139.871093750;100.0 +25/10/2020 02:06:20;UT800D.U004_PC01_PV.F_CV;139.871093750;100.0 +25/10/2020 02:06:21;UT800D.U004_PC01_PV.F_CV;139.921875000;100.0 +25/10/2020 02:06:26;UT800D.U004_PC01_PV.F_CV;139.921875000;100.0 +25/10/2020 02:06:27;UT800D.U004_PC01_PV.F_CV;139.933593750;100.0 +25/10/2020 02:06:32;UT800D.U004_PC01_PV.F_CV;139.933593750;100.0 +25/10/2020 02:06:33;UT800D.U004_PC01_PV.F_CV;139.972656250;100.0 +25/10/2020 02:06:38;UT800D.U004_PC01_PV.F_CV;139.972656250;100.0 +25/10/2020 02:06:39;UT800D.U004_PC01_PV.F_CV;140.015625000;100.0 +25/10/2020 02:06:44;UT800D.U004_PC01_PV.F_CV;140.015625000;100.0 +25/10/2020 02:06:45;UT800D.U004_PC01_PV.F_CV;140.003906250;100.0 +25/10/2020 02:06:50;UT800D.U004_PC01_PV.F_CV;140.003906250;100.0 +25/10/2020 02:06:51;UT800D.U004_PC01_PV.F_CV;140.035156250;100.0 +25/10/2020 02:06:56;UT800D.U004_PC01_PV.F_CV;140.035156250;100.0 +25/10/2020 02:06:57;UT800D.U004_PC01_PV.F_CV;139.859375000;100.0 +25/10/2020 02:06:46;UT800D.U004_PC01_SP.F_CV;140.000000000;100.0 +25/10/2020 02:06:09;UT800D.U004_PI02.F_CV;139.917968750;100.0 +25/10/2020 02:06:03;UT800D.U004_PI03.F_CV;139.703125000;100.0 +25/10/2020 02:06:12;UT800D.U004_PI04.F_CV;0.491661072;100.0 +25/10/2020 02:06:45;UT800D.U004_PI10.F_CV;0.105100632;100.0 +25/10/2020 02:06:09;UT800D.U004_TC01_OP.F_CV;27.390361786;100.0 +25/10/2020 02:06:39;UT800D.U004_TC01_PV.F_CV;393.144622803;100.0 +25/10/2020 02:06:02;UT800D.U004_TC01_SP.F_CV;394.000000000;100.0 +25/10/2020 02:06:21;UT800D.U004_TC02_OP.F_CV;39.378032684;100.0 +25/10/2020 02:06:46;UT800D.U004_TC02_PV.F_CV;417.679687500;100.0 +25/10/2020 02:06:02;UT800D.U004_TC02_SP.F_CV;418.000000000;100.0 +25/10/2020 02:06:21;UT800D.U004_TC03_OP.F_CV;23.606067657;100.0 +25/10/2020 02:06:02;UT800D.U004_TC03_PV.F_CV;417.964202881;100.0 +25/10/2020 02:06:02;UT800D.U004_TC03_SP.F_CV;418.000000000;100.0 +25/10/2020 02:06:03;UT800D.U004_TC05_OP.F_CV;38.816493988;100.0 +25/10/2020 02:06:15;UT800D.U004_TC05_OP.F_CV;38.938564301;100.0 +25/10/2020 02:06:33;UT800D.U004_TC05_OP.F_CV;38.767662048;100.0 +25/10/2020 02:06:45;UT800D.U004_TC05_OP.F_CV;39.011810303;100.0 +25/10/2020 02:06:51;UT800D.U004_TC05_OP.F_CV;38.865322113;100.0 +25/10/2020 02:06:02;UT800D.U004_TC05_PV.F_CV;70.140625000;100.0 +25/10/2020 02:06:03;UT800D.U004_TC05_PV.F_CV;70.193359375;100.0 +25/10/2020 02:06:08;UT800D.U004_TC05_PV.F_CV;70.193359375;100.0 +25/10/2020 02:06:09;UT800D.U004_TC05_PV.F_CV;70.117187500;100.0 +25/10/2020 02:06:14;UT800D.U004_TC05_PV.F_CV;70.117187500;100.0 +25/10/2020 02:06:15;UT800D.U004_TC05_PV.F_CV;70.068359375;100.0 +25/10/2020 02:06:20;UT800D.U004_TC05_PV.F_CV;70.068359375;100.0 +25/10/2020 02:06:21;UT800D.U004_TC05_PV.F_CV;70.107421875;100.0 +25/10/2020 02:06:26;UT800D.U004_TC05_PV.F_CV;70.107421875;100.0 +25/10/2020 02:06:27;UT800D.U004_TC05_PV.F_CV;70.070312500;100.0 +25/10/2020 02:06:32;UT800D.U004_TC05_PV.F_CV;70.070312500;100.0 +25/10/2020 02:06:33;UT800D.U004_TC05_PV.F_CV;70.177734375;100.0 +25/10/2020 02:06:38;UT800D.U004_TC05_PV.F_CV;70.177734375;100.0 +25/10/2020 02:06:39;UT800D.U004_TC05_PV.F_CV;70.033203125;100.0 +25/10/2020 02:06:44;UT800D.U004_TC05_PV.F_CV;70.033203125;100.0 +25/10/2020 02:06:45;UT800D.U004_TC05_PV.F_CV;69.957031250;100.0 +25/10/2020 02:06:50;UT800D.U004_TC05_PV.F_CV;69.957031250;100.0 +25/10/2020 02:06:51;UT800D.U004_TC05_PV.F_CV;70.087890625;100.0 +25/10/2020 02:06:56;UT800D.U004_TC05_PV.F_CV;70.087890625;100.0 +25/10/2020 02:06:57;UT800D.U004_TC05_PV.F_CV;70.041015625;100.0 +25/10/2020 02:06:18;UT800D.U004_TC05_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:03;UT800D.U004_TC06_OP.F_CV;20.139163971;100.0 +25/10/2020 02:06:39;UT800D.U004_TC06_OP.F_CV;20.065919876;100.0 +25/10/2020 02:06:02;UT800D.U004_TC06_PV.F_CV;60.650390625;100.0 +25/10/2020 02:06:03;UT800D.U004_TC06_PV.F_CV;60.955078125;100.0 +25/10/2020 02:06:08;UT800D.U004_TC06_PV.F_CV;60.955078125;100.0 +25/10/2020 02:06:09;UT800D.U004_TC06_PV.F_CV;60.803710938;100.0 +25/10/2020 02:06:14;UT800D.U004_TC06_PV.F_CV;60.803710938;100.0 +25/10/2020 02:06:15;UT800D.U004_TC06_PV.F_CV;60.884765625;100.0 +25/10/2020 02:06:20;UT800D.U004_TC06_PV.F_CV;60.884765625;100.0 +25/10/2020 02:06:21;UT800D.U004_TC06_PV.F_CV;60.949218750;100.0 +25/10/2020 02:06:26;UT800D.U004_TC06_PV.F_CV;60.949218750;100.0 +25/10/2020 02:06:27;UT800D.U004_TC06_PV.F_CV;60.916992188;100.0 +25/10/2020 02:06:32;UT800D.U004_TC06_PV.F_CV;60.916992188;100.0 +25/10/2020 02:06:33;UT800D.U004_TC06_PV.F_CV;60.998046875;100.0 +25/10/2020 02:06:38;UT800D.U004_TC06_PV.F_CV;60.998046875;100.0 +25/10/2020 02:06:39;UT800D.U004_TC06_PV.F_CV;60.860351563;100.0 +25/10/2020 02:06:44;UT800D.U004_TC06_PV.F_CV;60.860351563;100.0 +25/10/2020 02:06:45;UT800D.U004_TC06_PV.F_CV;60.916015625;100.0 +25/10/2020 02:06:50;UT800D.U004_TC06_PV.F_CV;60.916015625;100.0 +25/10/2020 02:06:51;UT800D.U004_TC06_PV.F_CV;61.073242188;100.0 +25/10/2020 02:06:56;UT800D.U004_TC06_PV.F_CV;61.073242188;100.0 +25/10/2020 02:06:57;UT800D.U004_TC06_PV.F_CV;60.564453125;100.0 +25/10/2020 02:06:46;UT800D.U004_TC06_SP.F_CV;60.000000000;100.0 +25/10/2020 02:06:03;UT800D.U004_TC11_OP.F_CV;29.074983597;100.0 +25/10/2020 02:06:08;UT800D.U004_TC11_OP.F_CV;29.074983597;100.0 +25/10/2020 02:06:09;UT800D.U004_TC11_OP.F_CV;29.807428360;100.0 +25/10/2020 02:06:14;UT800D.U004_TC11_OP.F_CV;29.807428360;100.0 +25/10/2020 02:06:15;UT800D.U004_TC11_OP.F_CV;31.101413727;100.0 +25/10/2020 02:06:20;UT800D.U004_TC11_OP.F_CV;31.101413727;100.0 +25/10/2020 02:06:21;UT800D.U004_TC11_OP.F_CV;29.978332520;100.0 +25/10/2020 02:06:26;UT800D.U004_TC11_OP.F_CV;29.978332520;100.0 +25/10/2020 02:06:27;UT800D.U004_TC11_OP.F_CV;28.928495407;100.0 +25/10/2020 02:06:32;UT800D.U004_TC11_OP.F_CV;28.928495407;100.0 +25/10/2020 02:06:33;UT800D.U004_TC11_OP.F_CV;29.807428360;100.0 +25/10/2020 02:06:39;UT800D.U004_TC11_OP.F_CV;29.612110138;100.0 +25/10/2020 02:06:44;UT800D.U004_TC11_OP.F_CV;29.612110138;100.0 +25/10/2020 02:06:45;UT800D.U004_TC11_OP.F_CV;29.221473694;100.0 +25/10/2020 02:06:51;UT800D.U004_TC11_OP.F_CV;29.392375946;100.0 +25/10/2020 02:06:57;UT800D.U004_TC11_OP.F_CV;29.197057724;100.0 +25/10/2020 02:06:09;UT800D.U004_TC11_PV.F_CV;393.935089111;100.0 +25/10/2020 02:06:46;UT800D.U004_TC11_SP.F_CV;394.000000000;100.0 +25/10/2020 02:06:15;UT800D.U004_TC12_OP.F_CV;15.695669174;100.0 +25/10/2020 02:06:27;UT800D.U004_TC12_OP.F_CV;15.500350952;100.0 +25/10/2020 02:06:33;UT800D.U004_TC12_OP.F_CV;15.598010063;100.0 +25/10/2020 02:06:45;UT800D.U004_TC12_OP.F_CV;15.427106857;100.0 +25/10/2020 02:06:57;UT800D.U004_TC12_OP.F_CV;15.524765968;100.0 +25/10/2020 02:06:46;UT800D.U004_TC12_PV.F_CV;418.010528564;100.0 +25/10/2020 02:06:46;UT800D.U004_TC12_SP.F_CV;418.000000000;100.0 +25/10/2020 02:06:03;UT800D.U004_TC13_OP.F_CV;20.969266891;100.0 +25/10/2020 02:06:14;UT800D.U004_TC13_OP.F_CV;21.042512894;100.0 +25/10/2020 02:06:15;UT800D.U004_TC13_OP.F_CV;20.505386353;100.0 +25/10/2020 02:06:21;UT800D.U004_TC13_OP.F_CV;20.700704575;100.0 +25/10/2020 02:06:26;UT800D.U004_TC13_OP.F_CV;20.700704575;100.0 +25/10/2020 02:06:27;UT800D.U004_TC13_OP.F_CV;21.115756989;100.0 +25/10/2020 02:06:56;UT800D.U004_TC13_OP.F_CV;21.115756989;100.0 +25/10/2020 02:06:57;UT800D.U004_TC13_OP.F_CV;20.822778702;100.0 +25/10/2020 02:06:45;UT800D.U004_TC13_PV.F_CV;417.994720459;100.0 +25/10/2020 02:06:30;UT800D.U004_TC13_SP.F_CV;418.000000000;100.0 +25/10/2020 02:06:02;UT800D.U004_TC15_OP.F_CV;26.218450546;100.0 +25/10/2020 02:06:03;UT800D.U004_TC15_OP.F_CV;25.632495880;100.0 +25/10/2020 02:06:08;UT800D.U004_TC15_OP.F_CV;25.632495880;100.0 +25/10/2020 02:06:09;UT800D.U004_TC15_OP.F_CV;26.609088898;100.0 +25/10/2020 02:06:15;UT800D.U004_TC15_OP.F_CV;26.462598801;100.0 +25/10/2020 02:06:20;UT800D.U004_TC15_OP.F_CV;26.462598801;100.0 +25/10/2020 02:06:21;UT800D.U004_TC15_OP.F_CV;27.219457626;100.0 +25/10/2020 02:06:26;UT800D.U004_TC15_OP.F_CV;27.219457626;100.0 +25/10/2020 02:06:27;UT800D.U004_TC15_OP.F_CV;27.658926010;100.0 +25/10/2020 02:06:33;UT800D.U004_TC15_OP.F_CV;27.829828262;100.0 +25/10/2020 02:06:44;UT800D.U004_TC15_OP.F_CV;27.829828262;100.0 +25/10/2020 02:06:45;UT800D.U004_TC15_OP.F_CV;28.489028931;100.0 +25/10/2020 02:06:50;UT800D.U004_TC15_OP.F_CV;28.489028931;100.0 +25/10/2020 02:06:51;UT800D.U004_TC15_OP.F_CV;27.756584167;100.0 +25/10/2020 02:06:57;UT800D.U004_TC15_OP.F_CV;27.951902390;100.0 +25/10/2020 02:06:02;UT800D.U004_TC15_PV.F_CV;70.171875000;100.0 +25/10/2020 02:06:03;UT800D.U004_TC15_PV.F_CV;70.203125000;100.0 +25/10/2020 02:06:08;UT800D.U004_TC15_PV.F_CV;70.203125000;100.0 +25/10/2020 02:06:09;UT800D.U004_TC15_PV.F_CV;70.152343750;100.0 +25/10/2020 02:06:14;UT800D.U004_TC15_PV.F_CV;70.152343750;100.0 +25/10/2020 02:06:15;UT800D.U004_TC15_PV.F_CV;70.179687500;100.0 +25/10/2020 02:06:20;UT800D.U004_TC15_PV.F_CV;70.179687500;100.0 +25/10/2020 02:06:21;UT800D.U004_TC15_PV.F_CV;70.130859375;100.0 +25/10/2020 02:06:26;UT800D.U004_TC15_PV.F_CV;70.130859375;100.0 +25/10/2020 02:06:27;UT800D.U004_TC15_PV.F_CV;70.119140625;100.0 +25/10/2020 02:06:32;UT800D.U004_TC15_PV.F_CV;70.119140625;100.0 +25/10/2020 02:06:33;UT800D.U004_TC15_PV.F_CV;70.068359375;100.0 +25/10/2020 02:06:38;UT800D.U004_TC15_PV.F_CV;70.068359375;100.0 +25/10/2020 02:06:39;UT800D.U004_TC15_PV.F_CV;70.060546875;100.0 +25/10/2020 02:06:44;UT800D.U004_TC15_PV.F_CV;70.060546875;100.0 +25/10/2020 02:06:45;UT800D.U004_TC15_PV.F_CV;70.017578125;100.0 +25/10/2020 02:06:50;UT800D.U004_TC15_PV.F_CV;70.017578125;100.0 +25/10/2020 02:06:51;UT800D.U004_TC15_PV.F_CV;70.013671875;100.0 +25/10/2020 02:06:56;UT800D.U004_TC15_PV.F_CV;70.013671875;100.0 +25/10/2020 02:06:57;UT800D.U004_TC15_PV.F_CV;70.001953125;100.0 +25/10/2020 02:06:46;UT800D.U004_TC15_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:02;UT800D.U004_TC16_OP.F_CV;33.811454773;100.0 +25/10/2020 02:06:03;UT800D.U004_TC16_OP.F_CV;32.810447693;100.0 +25/10/2020 02:06:14;UT800D.U004_TC16_OP.F_CV;32.908107758;100.0 +25/10/2020 02:06:15;UT800D.U004_TC16_OP.F_CV;33.762626648;100.0 +25/10/2020 02:06:20;UT800D.U004_TC16_OP.F_CV;33.762626648;100.0 +25/10/2020 02:06:21;UT800D.U004_TC16_OP.F_CV;32.346569061;100.0 +25/10/2020 02:06:26;UT800D.U004_TC16_OP.F_CV;32.346569061;100.0 +25/10/2020 02:06:27;UT800D.U004_TC16_OP.F_CV;31.589708328;100.0 +25/10/2020 02:06:32;UT800D.U004_TC16_OP.F_CV;31.589708328;100.0 +25/10/2020 02:06:33;UT800D.U004_TC16_OP.F_CV;31.980346680;100.0 +25/10/2020 02:06:38;UT800D.U004_TC16_OP.F_CV;31.980346680;100.0 +25/10/2020 02:06:39;UT800D.U004_TC16_OP.F_CV;32.688373566;100.0 +25/10/2020 02:06:44;UT800D.U004_TC16_OP.F_CV;32.688373566;100.0 +25/10/2020 02:06:45;UT800D.U004_TC16_OP.F_CV;31.760612488;100.0 +25/10/2020 02:06:56;UT800D.U004_TC16_OP.F_CV;31.833856583;100.0 +25/10/2020 02:06:57;UT800D.U004_TC16_OP.F_CV;32.297737122;100.0 +25/10/2020 02:06:02;UT800D.U004_TC16_PV.F_CV;69.980468750;100.0 +25/10/2020 02:06:03;UT800D.U004_TC16_PV.F_CV;70.039062500;100.0 +25/10/2020 02:06:08;UT800D.U004_TC16_PV.F_CV;70.039062500;100.0 +25/10/2020 02:06:09;UT800D.U004_TC16_PV.F_CV;70.044921875;100.0 +25/10/2020 02:06:14;UT800D.U004_TC16_PV.F_CV;70.044921875;100.0 +25/10/2020 02:06:15;UT800D.U004_TC16_PV.F_CV;70.011718750;100.0 +25/10/2020 02:06:20;UT800D.U004_TC16_PV.F_CV;70.011718750;100.0 +25/10/2020 02:06:21;UT800D.U004_TC16_PV.F_CV;70.054687500;100.0 +25/10/2020 02:06:26;UT800D.U004_TC16_PV.F_CV;70.054687500;100.0 +25/10/2020 02:06:27;UT800D.U004_TC16_PV.F_CV;70.160156250;100.0 +25/10/2020 02:06:32;UT800D.U004_TC16_PV.F_CV;70.160156250;100.0 +25/10/2020 02:06:33;UT800D.U004_TC16_PV.F_CV;70.158203125;100.0 +25/10/2020 02:06:38;UT800D.U004_TC16_PV.F_CV;70.158203125;100.0 +25/10/2020 02:06:39;UT800D.U004_TC16_PV.F_CV;70.132812500;100.0 +25/10/2020 02:06:44;UT800D.U004_TC16_PV.F_CV;70.132812500;100.0 +25/10/2020 02:06:45;UT800D.U004_TC16_PV.F_CV;70.189453125;100.0 +25/10/2020 02:06:50;UT800D.U004_TC16_PV.F_CV;70.189453125;100.0 +25/10/2020 02:06:51;UT800D.U004_TC16_PV.F_CV;70.210937500;100.0 +25/10/2020 02:06:56;UT800D.U004_TC16_PV.F_CV;70.210937500;100.0 +25/10/2020 02:06:57;UT800D.U004_TC16_PV.F_CV;70.197265625;100.0 +25/10/2020 02:06:46;UT800D.U004_TC16_SP.F_CV;70.000000000;100.0 +25/10/2020 02:06:08;UT800D.U004_TC17_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;UT800D.U004_TC17_OP.F_CV;0.216681421;100.0 +25/10/2020 02:06:14;UT800D.U004_TC17_OP.F_CV;0.216681421;100.0 +25/10/2020 02:06:15;UT800D.U004_TC17_OP.F_CV;0.997955263;100.0 +25/10/2020 02:06:26;UT800D.U004_TC17_OP.F_CV;0.900296032;100.0 +25/10/2020 02:06:27;UT800D.U004_TC17_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;UT800D.U004_TC17_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;UT800D.U004_TC17_OP.F_CV;0.436414689;100.0 +25/10/2020 02:06:44;UT800D.U004_TC17_OP.F_CV;0.436414689;100.0 +25/10/2020 02:06:45;UT800D.U004_TC17_OP.F_CV;0.143436998;100.0 +25/10/2020 02:06:50;UT800D.U004_TC17_OP.F_CV;0.143436998;100.0 +25/10/2020 02:06:51;UT800D.U004_TC17_OP.F_CV;0.973540425;100.0 +25/10/2020 02:06:56;UT800D.U004_TC17_OP.F_CV;0.973540425;100.0 +25/10/2020 02:06:57;UT800D.U004_TC17_OP.F_CV;1.705984712;100.0 +25/10/2020 02:06:02;UT800D.U004_TC17_PV.F_CV;60.266601563;100.0 +25/10/2020 02:06:03;UT800D.U004_TC17_PV.F_CV;60.254882813;100.0 +25/10/2020 02:06:08;UT800D.U004_TC17_PV.F_CV;60.254882813;100.0 +25/10/2020 02:06:09;UT800D.U004_TC17_PV.F_CV;60.236328125;100.0 +25/10/2020 02:06:14;UT800D.U004_TC17_PV.F_CV;60.236328125;100.0 +25/10/2020 02:06:15;UT800D.U004_TC17_PV.F_CV;60.192382813;100.0 +25/10/2020 02:06:20;UT800D.U004_TC17_PV.F_CV;60.192382813;100.0 +25/10/2020 02:06:21;UT800D.U004_TC17_PV.F_CV;60.204101563;100.0 +25/10/2020 02:06:26;UT800D.U004_TC17_PV.F_CV;60.204101563;100.0 +25/10/2020 02:06:27;UT800D.U004_TC17_PV.F_CV;60.278320313;100.0 +25/10/2020 02:06:32;UT800D.U004_TC17_PV.F_CV;60.278320313;100.0 +25/10/2020 02:06:33;UT800D.U004_TC17_PV.F_CV;60.287109375;100.0 +25/10/2020 02:06:38;UT800D.U004_TC17_PV.F_CV;60.287109375;100.0 +25/10/2020 02:06:39;UT800D.U004_TC17_PV.F_CV;60.265625000;100.0 +25/10/2020 02:06:44;UT800D.U004_TC17_PV.F_CV;60.265625000;100.0 +25/10/2020 02:06:45;UT800D.U004_TC17_PV.F_CV;60.250000000;100.0 +25/10/2020 02:06:50;UT800D.U004_TC17_PV.F_CV;60.250000000;100.0 +25/10/2020 02:06:51;UT800D.U004_TC17_PV.F_CV;60.189453125;100.0 +25/10/2020 02:06:56;UT800D.U004_TC17_PV.F_CV;60.189453125;100.0 +25/10/2020 02:06:57;UT800D.U004_TC17_PV.F_CV;60.150390625;100.0 +25/10/2020 02:06:46;UT800D.U004_TC17_SP.F_CV;60.000000000;100.0 +25/10/2020 02:06:03;UT800D.U004_TC18_OP.F_CV;24.021118164;100.0 +25/10/2020 02:06:08;UT800D.U004_TC18_OP.F_CV;24.021118164;100.0 +25/10/2020 02:06:09;UT800D.U004_TC18_OP.F_CV;23.703725815;100.0 +25/10/2020 02:06:14;UT800D.U004_TC18_OP.F_CV;23.703725815;100.0 +25/10/2020 02:06:15;UT800D.U004_TC18_OP.F_CV;22.605060577;100.0 +25/10/2020 02:06:20;UT800D.U004_TC18_OP.F_CV;22.605060577;100.0 +25/10/2020 02:06:21;UT800D.U004_TC18_OP.F_CV;23.703725815;100.0 +25/10/2020 02:06:26;UT800D.U004_TC18_OP.F_CV;23.703725815;100.0 +25/10/2020 02:06:27;UT800D.U004_TC18_OP.F_CV;24.167608261;100.0 +25/10/2020 02:06:32;UT800D.U004_TC18_OP.F_CV;24.167608261;100.0 +25/10/2020 02:06:33;UT800D.U004_TC18_OP.F_CV;23.483993530;100.0 +25/10/2020 02:06:38;UT800D.U004_TC18_OP.F_CV;23.483993530;100.0 +25/10/2020 02:06:39;UT800D.U004_TC18_OP.F_CV;24.509414673;100.0 +25/10/2020 02:06:44;UT800D.U004_TC18_OP.F_CV;24.509414673;100.0 +25/10/2020 02:06:45;UT800D.U004_TC18_OP.F_CV;23.728141785;100.0 +25/10/2020 02:06:56;UT800D.U004_TC18_OP.F_CV;23.728141785;100.0 +25/10/2020 02:06:57;UT800D.U004_TC18_OP.F_CV;23.435163498;100.0 +25/10/2020 02:06:45;UT800D.U004_TC18_PV.F_CV;49.983398438;100.0 +25/10/2020 02:06:18;UT800D.U004_TC18_SP.F_CV;50.000000000;100.0 +25/10/2020 02:06:03;UT800D.U004_TC19_OP.F_CV;14.474928856;100.0 +25/10/2020 02:06:14;UT800D.U004_TC19_OP.F_CV;14.474928856;100.0 +25/10/2020 02:06:15;UT800D.U004_TC19_OP.F_CV;14.133121490;100.0 +25/10/2020 02:06:21;UT800D.U004_TC19_OP.F_CV;13.937803268;100.0 +25/10/2020 02:06:26;UT800D.U004_TC19_OP.F_CV;13.937803268;100.0 +25/10/2020 02:06:27;UT800D.U004_TC19_OP.F_CV;13.669239998;100.0 +25/10/2020 02:06:39;UT800D.U004_TC19_OP.F_CV;13.595995903;100.0 +25/10/2020 02:06:45;UT800D.U004_TC19_OP.F_CV;13.473921776;100.0 +25/10/2020 02:06:51;UT800D.U004_TC19_OP.F_CV;13.547165871;100.0 +25/10/2020 02:06:02;UT800D.U004_TC19_PV.F_CV;59.887695313;100.0 +25/10/2020 02:06:03;UT800D.U004_TC19_PV.F_CV;59.932617188;100.0 +25/10/2020 02:06:08;UT800D.U004_TC19_PV.F_CV;59.932617188;100.0 +25/10/2020 02:06:09;UT800D.U004_TC19_PV.F_CV;59.942382813;100.0 +25/10/2020 02:06:14;UT800D.U004_TC19_PV.F_CV;59.942382813;100.0 +25/10/2020 02:06:15;UT800D.U004_TC19_PV.F_CV;59.982421875;100.0 +25/10/2020 02:06:20;UT800D.U004_TC19_PV.F_CV;59.982421875;100.0 +25/10/2020 02:06:21;UT800D.U004_TC19_PV.F_CV;60.020507813;100.0 +25/10/2020 02:06:26;UT800D.U004_TC19_PV.F_CV;60.020507813;100.0 +25/10/2020 02:06:27;UT800D.U004_TC19_PV.F_CV;60.068359375;100.0 +25/10/2020 02:06:32;UT800D.U004_TC19_PV.F_CV;60.068359375;100.0 +25/10/2020 02:06:33;UT800D.U004_TC19_PV.F_CV;60.039062500;100.0 +25/10/2020 02:06:38;UT800D.U004_TC19_PV.F_CV;60.039062500;100.0 +25/10/2020 02:06:39;UT800D.U004_TC19_PV.F_CV;60.066406250;100.0 +25/10/2020 02:06:44;UT800D.U004_TC19_PV.F_CV;60.066406250;100.0 +25/10/2020 02:06:45;UT800D.U004_TC19_PV.F_CV;60.078125000;100.0 +25/10/2020 02:06:50;UT800D.U004_TC19_PV.F_CV;60.078125000;100.0 +25/10/2020 02:06:51;UT800D.U004_TC19_PV.F_CV;60.086914063;100.0 +25/10/2020 02:06:56;UT800D.U004_TC19_PV.F_CV;60.086914063;100.0 +25/10/2020 02:06:57;UT800D.U004_TC19_PV.F_CV;60.066406250;100.0 +25/10/2020 02:06:46;UT800D.U004_TC19_SP.F_CV;60.000000000;100.0 +25/10/2020 02:06:02;UT800D.U004_TC20_OP.F_CV;16.354869843;100.0 +25/10/2020 02:06:03;UT800D.U004_TC20_OP.F_CV;16.061891556;100.0 +25/10/2020 02:06:08;UT800D.U004_TC20_OP.F_CV;16.061891556;100.0 +25/10/2020 02:06:09;UT800D.U004_TC20_OP.F_CV;15.768914223;100.0 +25/10/2020 02:06:15;UT800D.U004_TC20_OP.F_CV;15.573595047;100.0 +25/10/2020 02:06:21;UT800D.U004_TC20_OP.F_CV;15.744499207;100.0 +25/10/2020 02:06:26;UT800D.U004_TC20_OP.F_CV;15.744499207;100.0 +25/10/2020 02:06:27;UT800D.U004_TC20_OP.F_CV;16.086305618;100.0 +25/10/2020 02:06:44;UT800D.U004_TC20_OP.F_CV;16.086305618;100.0 +25/10/2020 02:06:45;UT800D.U004_TC20_OP.F_CV;15.817743301;100.0 +25/10/2020 02:06:51;UT800D.U004_TC20_OP.F_CV;15.939817429;100.0 +25/10/2020 02:06:56;UT800D.U004_TC20_OP.F_CV;15.939817429;100.0 +25/10/2020 02:06:57;UT800D.U004_TC20_OP.F_CV;16.208379745;100.0 +25/10/2020 02:06:02;UT800D.U004_TC20_PV.F_CV;64.949218750;100.0 +25/10/2020 02:06:03;UT800D.U004_TC20_PV.F_CV;64.970703125;100.0 +25/10/2020 02:06:08;UT800D.U004_TC20_PV.F_CV;64.970703125;100.0 +25/10/2020 02:06:09;UT800D.U004_TC20_PV.F_CV;64.988281250;100.0 +25/10/2020 02:06:14;UT800D.U004_TC20_PV.F_CV;64.988281250;100.0 +25/10/2020 02:06:15;UT800D.U004_TC20_PV.F_CV;64.990234375;100.0 +25/10/2020 02:06:20;UT800D.U004_TC20_PV.F_CV;64.990234375;100.0 +25/10/2020 02:06:21;UT800D.U004_TC20_PV.F_CV;64.966796875;100.0 +25/10/2020 02:06:26;UT800D.U004_TC20_PV.F_CV;64.966796875;100.0 +25/10/2020 02:06:27;UT800D.U004_TC20_PV.F_CV;64.976562500;100.0 +25/10/2020 02:06:32;UT800D.U004_TC20_PV.F_CV;64.976562500;100.0 +25/10/2020 02:06:33;UT800D.U004_TC20_PV.F_CV;64.980468750;100.0 +25/10/2020 02:06:44;UT800D.U004_TC20_PV.F_CV;64.980468750;100.0 +25/10/2020 02:06:45;UT800D.U004_TC20_PV.F_CV;65.005859375;100.0 +25/10/2020 02:06:50;UT800D.U004_TC20_PV.F_CV;65.005859375;100.0 +25/10/2020 02:06:51;UT800D.U004_TC20_PV.F_CV;64.992187500;100.0 +25/10/2020 02:06:56;UT800D.U004_TC20_PV.F_CV;64.992187500;100.0 +25/10/2020 02:06:57;UT800D.U004_TC20_PV.F_CV;64.978515625;100.0 +25/10/2020 02:06:12;UT800D.U004_TC20_SP.F_CV;65.000000000;100.0 +25/10/2020 02:06:02;UT800D.U004_TC21_OP.F_CV;13.351847649;100.0 +25/10/2020 02:06:03;UT800D.U004_TC21_OP.F_CV;12.228766441;100.0 +25/10/2020 02:06:08;UT800D.U004_TC21_OP.F_CV;12.228766441;100.0 +25/10/2020 02:06:09;UT800D.U004_TC21_OP.F_CV;12.009033203;100.0 +25/10/2020 02:06:20;UT800D.U004_TC21_OP.F_CV;12.009033203;100.0 +25/10/2020 02:06:21;UT800D.U004_TC21_OP.F_CV;12.717062950;100.0 +25/10/2020 02:06:26;UT800D.U004_TC21_OP.F_CV;12.717062950;100.0 +25/10/2020 02:06:27;UT800D.U004_TC21_OP.F_CV;13.107699394;100.0 +25/10/2020 02:06:32;UT800D.U004_TC21_OP.F_CV;13.107699394;100.0 +25/10/2020 02:06:33;UT800D.U004_TC21_OP.F_CV;12.887966156;100.0 +25/10/2020 02:06:38;UT800D.U004_TC21_OP.F_CV;12.887966156;100.0 +25/10/2020 02:06:39;UT800D.U004_TC21_OP.F_CV;13.595995903;100.0 +25/10/2020 02:06:44;UT800D.U004_TC21_OP.F_CV;13.595995903;100.0 +25/10/2020 02:06:45;UT800D.U004_TC21_OP.F_CV;14.035462379;100.0 +25/10/2020 02:06:51;UT800D.U004_TC21_OP.F_CV;13.913388252;100.0 +25/10/2020 02:06:56;UT800D.U004_TC21_OP.F_CV;13.913388252;100.0 +25/10/2020 02:06:57;UT800D.U004_TC21_OP.F_CV;12.717062950;100.0 +25/10/2020 02:06:51;UT800D.U004_TC21_PV.F_CV;64.943359375;100.0 +25/10/2020 02:06:12;UT800D.U004_TC21_SP.F_CV;65.000000000;100.0 +25/10/2020 02:06:39;UT800D.U004_TI01.F_CV;393.144622803;100.0 +25/10/2020 02:06:46;UT800D.U004_TI02.F_CV;417.664062500;100.0 +25/10/2020 02:06:12;UT800D.U004_TI03.F_CV;417.972137451;100.0 +25/10/2020 02:06:46;UT800D.U004_TI04.F_CV;1340.687500000;100.0 +25/10/2020 02:06:09;UT800D.U004_TI09.F_CV;63.652343750;100.0 +25/10/2020 02:06:02;UT800D.U004_TI10.F_CV;81.472656250;100.0 +25/10/2020 02:06:03;UT800D.U004_TI10.F_CV;81.228515625;100.0 +25/10/2020 02:06:09;UT800D.U004_TI10.F_CV;81.039062500;100.0 +25/10/2020 02:06:15;UT800D.U004_TI10.F_CV;80.951171875;100.0 +25/10/2020 02:06:21;UT800D.U004_TI10.F_CV;80.800781250;100.0 +25/10/2020 02:06:27;UT800D.U004_TI10.F_CV;80.718750000;100.0 +25/10/2020 02:06:39;UT800D.U004_TI10.F_CV;80.625000000;100.0 +25/10/2020 02:06:45;UT800D.U004_TI10.F_CV;80.677734375;100.0 +25/10/2020 02:06:57;UT800D.U004_TI10.F_CV;80.796875000;100.0 +25/10/2020 02:06:15;UT800D.U004_TI101.F_CV;402.679687500;100.0 +25/10/2020 02:06:12;UT800D.U004_TI102.F_CV;418.351562500;100.0 +25/10/2020 02:06:51;UT800D.U004_TI103.F_CV;416.218750000;100.0 +25/10/2020 02:06:46;UT800D.U004_TI104.F_CV;1340.687500000;100.0 +25/10/2020 02:06:57;UT800D.U004_TI105A.F_CV;62.870117188;100.0 +25/10/2020 02:06:45;UT800D.U004_TI105B.F_CV;71.181640625;100.0 +25/10/2020 02:06:51;UT800D.U004_TI106A.F_CV;63.103515625;100.0 +25/10/2020 02:06:26;UT800D.U004_TI106B.F_CV;49.562500000;100.0 +25/10/2020 02:06:09;UT800D.U004_TI11.F_CV;393.927246094;100.0 +25/10/2020 02:06:45;UT800D.U004_TI111.F_CV;401.437500000;100.0 +25/10/2020 02:06:18;UT800D.U004_TI112.F_CV;414.109375000;100.0 +25/10/2020 02:06:45;UT800D.U004_TI113.F_CV;413.898437500;100.0 +25/10/2020 02:06:39;UT800D.U004_TI115.F_CV;53.351562500;100.0 +25/10/2020 02:06:03;UT800D.U004_TI116A.F_CV;72.423828125;100.0 +25/10/2020 02:06:21;UT800D.U004_TI116B.F_CV;92.287109375;100.0 +25/10/2020 02:06:51;UT800D.U004_TI117.F_CV;65.951171875;100.0 +25/10/2020 02:06:21;UT800D.U004_TI118.F_CV;74.496093750;100.0 +25/10/2020 02:06:12;UT800D.U004_TI119A.F_CV;44.902343750;100.0 +25/10/2020 02:06:45;UT800D.U004_TI119B.F_CV;58.482421875;100.0 +25/10/2020 02:06:46;UT800D.U004_TI12.F_CV;418.010528564;100.0 +25/10/2020 02:06:33;UT800D.U004_TI120.F_CV;75.136718750;100.0 +25/10/2020 02:06:03;UT800D.U004_TI121.F_CV;61.917968750;100.0 +25/10/2020 02:06:45;UT800D.U004_TI13.F_CV;417.994720459;100.0 +25/10/2020 02:06:57;UT800D.U004_TI30.F_CV;26.295898438;100.0 +25/10/2020 02:06:02;UT800D.U004_VIT_P2.F_CV;53.776054382;100.0 +25/10/2020 02:06:03;UT800D.U004_VIT_P2.F_CV;54.186222076;100.0 +25/10/2020 02:06:08;UT800D.U004_VIT_P2.F_CV;54.186222076;100.0 +25/10/2020 02:06:09;UT800D.U004_VIT_P2.F_CV;54.244819641;100.0 +25/10/2020 02:06:14;UT800D.U004_VIT_P2.F_CV;54.244819641;100.0 +25/10/2020 02:06:15;UT800D.U004_VIT_P2.F_CV;54.303413391;100.0 +25/10/2020 02:06:20;UT800D.U004_VIT_P2.F_CV;54.303413391;100.0 +25/10/2020 02:06:21;UT800D.U004_VIT_P2.F_CV;54.479202271;100.0 +25/10/2020 02:06:26;UT800D.U004_VIT_P2.F_CV;54.479202271;100.0 +25/10/2020 02:06:27;UT800D.U004_VIT_P2.F_CV;54.772178650;100.0 +25/10/2020 02:06:32;UT800D.U004_VIT_P2.F_CV;54.772178650;100.0 +25/10/2020 02:06:33;UT800D.U004_VIT_P2.F_CV;55.006561279;100.0 +25/10/2020 02:06:38;UT800D.U004_VIT_P2.F_CV;55.006561279;100.0 +25/10/2020 02:06:39;UT800D.U004_VIT_P2.F_CV;55.094455719;100.0 +25/10/2020 02:06:44;UT800D.U004_VIT_P2.F_CV;55.094455719;100.0 +25/10/2020 02:06:45;UT800D.U004_VIT_P2.F_CV;54.889369965;100.0 +25/10/2020 02:06:56;UT800D.U004_VIT_P2.F_CV;54.889369965;100.0 +25/10/2020 02:06:57;UT800D.U004_VIT_P2.F_CV;54.654987335;100.0 +25/10/2020 02:06:51;UT800D.U004_WI02.F_CV;479.762969971;100.0 +25/10/2020 02:06:15;UT800D.U004_WI06.F_CV;0.000000000;100.0 +25/10/2020 02:06:46;UT800D.U007_COMPTEUR_INJECTIONS.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_DP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_FC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_FC11_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_FC12_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_FC12_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_FI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_FI05.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_FI11.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_FQ05.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_LC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_LC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_LI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_LI03.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_LI07.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_LI10.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_LT03.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_MI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_PC01.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_PC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_PC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_PC01_SP_BROOKS.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_PI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_TC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_TC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_TC02_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_TC02_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_TC03_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_TC03_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_TC04_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_TC04_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_TC05_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_TC05_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_TI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_TI04.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_TI105.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_TI105A.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_TI105B.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_TI11.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_TI12.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_TI13.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_TI14.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_TI30.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_VIT_P2.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U007_WI06.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U010_COMPTEUR_INJECTIONS.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U010_DP.F_CV;-0.357421875;100.0 +25/10/2020 02:06:46;UT800D.U010_FC01_PV.F_CV;67.144691467;100.0 +25/10/2020 02:06:09;UT800D.U010_FC10_OP.F_CV;90.722373962;100.0 +25/10/2020 02:06:50;UT800D.U010_FC10_SP.F_CV;75.800003052;100.0 +25/10/2020 02:06:15;UT800D.U010_FC11_PV.F_CV;9.959343910;100.0 +25/10/2020 02:06:46;UT800D.U010_FI01.F_CV;67.144691467;100.0 +25/10/2020 02:06:15;UT800D.U010_FI05.F_CV;85.500000000;100.0 +25/10/2020 02:06:32;UT800D.U010_FI05.F_CV;85.500000000;100.0 +25/10/2020 02:06:33;UT800D.U010_FI05.F_CV;81.000000000;100.0 +25/10/2020 02:06:50;UT800D.U010_FI05.F_CV;81.000000000;100.0 +25/10/2020 02:06:51;UT800D.U010_FI05.F_CV;90.000000000;100.0 +25/10/2020 02:06:56;UT800D.U010_FI05.F_CV;90.000000000;100.0 +25/10/2020 02:06:57;UT800D.U010_FI05.F_CV;85.500000000;100.0 +25/10/2020 02:06:30;UT800D.U010_FI10A.F_CV;76.588752747;100.0 +25/10/2020 02:06:15;UT800D.U010_FI10B.F_CV;76.319274902;100.0 +25/10/2020 02:06:02;UT800D.U010_FQ05.F_CV;240178.515625000;100.0 +25/10/2020 02:06:03;UT800D.U010_FQ05.F_CV;240178.656250000;100.0 +25/10/2020 02:06:08;UT800D.U010_FQ05.F_CV;240178.656250000;100.0 +25/10/2020 02:06:09;UT800D.U010_FQ05.F_CV;240178.812500000;100.0 +25/10/2020 02:06:14;UT800D.U010_FQ05.F_CV;240178.812500000;100.0 +25/10/2020 02:06:15;UT800D.U010_FQ05.F_CV;240178.953125000;100.0 +25/10/2020 02:06:20;UT800D.U010_FQ05.F_CV;240178.953125000;100.0 +25/10/2020 02:06:21;UT800D.U010_FQ05.F_CV;240179.109375000;100.0 +25/10/2020 02:06:26;UT800D.U010_FQ05.F_CV;240179.109375000;100.0 +25/10/2020 02:06:27;UT800D.U010_FQ05.F_CV;240179.265625000;100.0 +25/10/2020 02:06:38;UT800D.U010_FQ05.F_CV;240179.265625000;100.0 +25/10/2020 02:06:39;UT800D.U010_FQ05.F_CV;240179.406250000;100.0 +25/10/2020 02:06:44;UT800D.U010_FQ05.F_CV;240179.406250000;100.0 +25/10/2020 02:06:45;UT800D.U010_FQ05.F_CV;240179.562500000;100.0 +25/10/2020 02:06:50;UT800D.U010_FQ05.F_CV;240179.562500000;100.0 +25/10/2020 02:06:51;UT800D.U010_FQ05.F_CV;240179.859375000;100.0 +25/10/2020 02:06:08;UT800D.U010_LC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:09;UT800D.U010_LC01_OP.F_CV;4.953154087;100.0 +25/10/2020 02:06:14;UT800D.U010_LC01_OP.F_CV;4.953154087;100.0 +25/10/2020 02:06:15;UT800D.U010_LC01_OP.F_CV;22.287668228;100.0 +25/10/2020 02:06:20;UT800D.U010_LC01_OP.F_CV;22.287668228;100.0 +25/10/2020 02:06:21;UT800D.U010_LC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:38;UT800D.U010_LC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:39;UT800D.U010_LC01_OP.F_CV;14.865566254;100.0 +25/10/2020 02:06:44;UT800D.U010_LC01_OP.F_CV;14.865566254;100.0 +25/10/2020 02:06:45;UT800D.U010_LC01_OP.F_CV;31.028167725;100.0 +25/10/2020 02:06:50;UT800D.U010_LC01_OP.F_CV;31.028167725;100.0 +25/10/2020 02:06:51;UT800D.U010_LC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;UT800D.U010_LC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:57;UT800D.U010_LC01_OP.F_CV;7.638782978;100.0 +25/10/2020 02:06:09;UT800D.U010_LC01_PV.F_CV;39.753906250;100.0 +25/10/2020 02:06:14;UT800D.U010_LC01_PV.F_CV;39.753906250;100.0 +25/10/2020 02:06:15;UT800D.U010_LC01_PV.F_CV;39.958007813;100.0 +25/10/2020 02:06:20;UT800D.U010_LC01_PV.F_CV;39.958007813;100.0 +25/10/2020 02:06:21;UT800D.U010_LC01_PV.F_CV;39.720703125;100.0 +25/10/2020 02:06:27;UT800D.U010_LC01_PV.F_CV;39.528320313;100.0 +25/10/2020 02:06:33;UT800D.U010_LC01_PV.F_CV;39.672851563;100.0 +25/10/2020 02:06:38;UT800D.U010_LC01_PV.F_CV;39.672851563;100.0 +25/10/2020 02:06:39;UT800D.U010_LC01_PV.F_CV;39.875976563;100.0 +25/10/2020 02:06:45;UT800D.U010_LC01_PV.F_CV;40.038085938;100.0 +25/10/2020 02:06:50;UT800D.U010_LC01_PV.F_CV;40.038085938;100.0 +25/10/2020 02:06:51;UT800D.U010_LC01_PV.F_CV;39.577148438;100.0 +25/10/2020 02:06:56;UT800D.U010_LC01_PV.F_CV;39.577148438;100.0 +25/10/2020 02:06:57;UT800D.U010_LC01_PV.F_CV;39.813476563;100.0 +25/10/2020 02:06:09;UT800D.U010_LI01.F_CV;39.748046875;100.0 +25/10/2020 02:06:14;UT800D.U010_LI01.F_CV;39.748046875;100.0 +25/10/2020 02:06:15;UT800D.U010_LI01.F_CV;39.958007813;100.0 +25/10/2020 02:06:20;UT800D.U010_LI01.F_CV;39.958007813;100.0 +25/10/2020 02:06:21;UT800D.U010_LI01.F_CV;39.720703125;100.0 +25/10/2020 02:06:27;UT800D.U010_LI01.F_CV;39.528320313;100.0 +25/10/2020 02:06:45;UT800D.U010_LI01.F_CV;40.038085938;100.0 +25/10/2020 02:06:50;UT800D.U010_LI01.F_CV;40.038085938;100.0 +25/10/2020 02:06:51;UT800D.U010_LI01.F_CV;39.590820313;100.0 +25/10/2020 02:06:56;UT800D.U010_LI01.F_CV;39.590820313;100.0 +25/10/2020 02:06:57;UT800D.U010_LI01.F_CV;39.813476563;100.0 +25/10/2020 02:06:23;UT800D.U010_LI03.F_CV;74.705078125;100.0 +25/10/2020 02:06:21;UT800D.U010_LI07.F_CV;40.086914063;100.0 +25/10/2020 02:06:33;UT800D.U010_LI07.F_CV;40.297851563;100.0 +25/10/2020 02:06:39;UT800D.U010_LI07.F_CV;40.492187500;100.0 +25/10/2020 02:06:57;UT800D.U010_LI07.F_CV;40.546875000;100.0 +25/10/2020 02:06:46;UT800D.U010_LI10.F_CV;-10.000000000;100.0 +25/10/2020 02:06:23;UT800D.U010_LT03.F_CV;74.705078125;100.0 +25/10/2020 02:06:24;UT800D.U010_LT03_AFF.F_CV;74.705078125;100.0 +25/10/2020 02:06:46;UT800D.U010_LT03_CA1.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U010_LT03_CA2.F_CV;0.000000000;0.0 +25/10/2020 02:06:09;UT800D.U010_PC01_OP.F_CV;14.084292412;100.0 +25/10/2020 02:06:21;UT800D.U010_PC01_OP.F_CV;13.986633301;100.0 +25/10/2020 02:06:39;UT800D.U010_PC01_OP.F_CV;14.328439713;100.0 +25/10/2020 02:06:51;UT800D.U010_PC01_OP.F_CV;14.157536507;100.0 +25/10/2020 02:06:57;UT800D.U010_PC01_OP.F_CV;14.255195618;100.0 +25/10/2020 02:06:02;UT800D.U010_PC01_PV.F_CV;49.991210938;100.0 +25/10/2020 02:06:03;UT800D.U010_PC01_PV.F_CV;50.005859375;100.0 +25/10/2020 02:06:08;UT800D.U010_PC01_PV.F_CV;50.005859375;100.0 +25/10/2020 02:06:09;UT800D.U010_PC01_PV.F_CV;50.029296875;100.0 +25/10/2020 02:06:14;UT800D.U010_PC01_PV.F_CV;50.029296875;100.0 +25/10/2020 02:06:15;UT800D.U010_PC01_PV.F_CV;50.030273438;100.0 +25/10/2020 02:06:20;UT800D.U010_PC01_PV.F_CV;50.030273438;100.0 +25/10/2020 02:06:21;UT800D.U010_PC01_PV.F_CV;49.994140625;100.0 +25/10/2020 02:06:26;UT800D.U010_PC01_PV.F_CV;49.994140625;100.0 +25/10/2020 02:06:27;UT800D.U010_PC01_PV.F_CV;50.018554688;100.0 +25/10/2020 02:06:32;UT800D.U010_PC01_PV.F_CV;50.018554688;100.0 +25/10/2020 02:06:33;UT800D.U010_PC01_PV.F_CV;50.023437500;100.0 +25/10/2020 02:06:38;UT800D.U010_PC01_PV.F_CV;50.023437500;100.0 +25/10/2020 02:06:39;UT800D.U010_PC01_PV.F_CV;50.043945313;100.0 +25/10/2020 02:06:44;UT800D.U010_PC01_PV.F_CV;50.043945313;100.0 +25/10/2020 02:06:45;UT800D.U010_PC01_PV.F_CV;50.030273438;100.0 +25/10/2020 02:06:50;UT800D.U010_PC01_PV.F_CV;50.030273438;100.0 +25/10/2020 02:06:51;UT800D.U010_PC01_PV.F_CV;49.990234375;100.0 +25/10/2020 02:06:56;UT800D.U010_PC01_PV.F_CV;49.990234375;100.0 +25/10/2020 02:06:57;UT800D.U010_PC01_PV.F_CV;50.007812500;100.0 +25/10/2020 02:06:46;UT800D.U010_PI02.F_CV;49.672851563;100.0 +25/10/2020 02:06:46;UT800D.U010_PI04.F_CV;0.186317444;100.0 +25/10/2020 02:06:15;UT800D.U010_TC01_OP.F_CV;12.936796188;100.0 +25/10/2020 02:06:20;UT800D.U010_TC01_OP.F_CV;12.936796188;100.0 +25/10/2020 02:06:21;UT800D.U010_TC01_OP.F_CV;12.570573807;100.0 +25/10/2020 02:06:27;UT800D.U010_TC01_OP.F_CV;12.668232918;100.0 +25/10/2020 02:06:33;UT800D.U010_TC01_OP.F_CV;12.546158791;100.0 +25/10/2020 02:06:45;UT800D.U010_TC01_OP.F_CV;12.887966156;100.0 +25/10/2020 02:06:57;UT800D.U010_TC01_OP.F_CV;12.961211205;100.0 +25/10/2020 02:06:39;UT800D.U010_TC01_PV.F_CV;160.129943848;100.0 +25/10/2020 02:06:08;UT800D.U010_TC02_OP.F_CV;18.454542160;100.0 +25/10/2020 02:06:09;UT800D.U010_TC02_OP.F_CV;18.088319778;100.0 +25/10/2020 02:06:20;UT800D.U010_TC02_OP.F_CV;18.185979843;100.0 +25/10/2020 02:06:21;UT800D.U010_TC02_OP.F_CV;18.405712128;100.0 +25/10/2020 02:06:27;UT800D.U010_TC02_OP.F_CV;18.283639908;100.0 +25/10/2020 02:06:38;UT800D.U010_TC02_OP.F_CV;18.381298065;100.0 +25/10/2020 02:06:39;UT800D.U010_TC02_OP.F_CV;18.796350479;100.0 +25/10/2020 02:06:44;UT800D.U010_TC02_OP.F_CV;18.796350479;100.0 +25/10/2020 02:06:45;UT800D.U010_TC02_OP.F_CV;18.552202225;100.0 +25/10/2020 02:06:15;UT800D.U010_TC02_PV.F_CV;300.061889648;100.0 +25/10/2020 02:06:26;UT800D.U010_TC03_OP.F_CV;0.314340651;100.0 +25/10/2020 02:06:27;UT800D.U010_TC03_OP.F_CV;0.534073889;100.0 +25/10/2020 02:06:44;UT800D.U010_TC03_OP.F_CV;0.460829496;100.0 +25/10/2020 02:06:45;UT800D.U010_TC03_OP.F_CV;0.216681421;100.0 +25/10/2020 02:06:51;UT800D.U010_TC03_OP.F_CV;0.070192575;100.0 +25/10/2020 02:06:57;UT800D.U010_TC03_OP.F_CV;0.241096228;100.0 +25/10/2020 02:06:21;UT800D.U010_TC03_PV.F_CV;299.943298340;100.0 +25/10/2020 02:06:03;UT800D.U010_TC04_OP.F_CV;9.982604027;100.0 +25/10/2020 02:06:09;UT800D.U010_TC04_OP.F_CV;10.153508186;100.0 +25/10/2020 02:06:15;UT800D.U010_TC04_OP.F_CV;9.958189964;100.0 +25/10/2020 02:06:26;UT800D.U010_TC04_OP.F_CV;9.958189964;100.0 +25/10/2020 02:06:27;UT800D.U010_TC04_OP.F_CV;10.275582314;100.0 +25/10/2020 02:06:32;UT800D.U010_TC04_OP.F_CV;10.275582314;100.0 +25/10/2020 02:06:33;UT800D.U010_TC04_OP.F_CV;10.031434059;100.0 +25/10/2020 02:06:45;UT800D.U010_TC04_OP.F_CV;9.933774948;100.0 +25/10/2020 02:06:51;UT800D.U010_TC04_OP.F_CV;10.007019043;100.0 +25/10/2020 02:06:02;UT800D.U010_TC04_PV.F_CV;289.992187500;100.0 +25/10/2020 02:06:02;UT800D.U010_TC05_OP.F_CV;3.488265514;100.0 +25/10/2020 02:06:03;UT800D.U010_TC05_OP.F_CV;3.244117498;100.0 +25/10/2020 02:06:32;UT800D.U010_TC05_OP.F_CV;3.146458387;100.0 +25/10/2020 02:06:33;UT800D.U010_TC05_OP.F_CV;3.439435959;100.0 +25/10/2020 02:06:51;UT800D.U010_TC05_OP.F_CV;3.170873165;100.0 +25/10/2020 02:06:56;UT800D.U010_TC05_OP.F_CV;3.170873165;100.0 +25/10/2020 02:06:57;UT800D.U010_TC05_OP.F_CV;3.390606403;100.0 +25/10/2020 02:06:02;UT800D.U010_TC05_PV.F_CV;54.944335938;100.0 +25/10/2020 02:06:03;UT800D.U010_TC05_PV.F_CV;55.041992188;100.0 +25/10/2020 02:06:08;UT800D.U010_TC05_PV.F_CV;55.041992188;100.0 +25/10/2020 02:06:09;UT800D.U010_TC05_PV.F_CV;55.025390625;100.0 +25/10/2020 02:06:14;UT800D.U010_TC05_PV.F_CV;55.025390625;100.0 +25/10/2020 02:06:15;UT800D.U010_TC05_PV.F_CV;55.066406250;100.0 +25/10/2020 02:06:20;UT800D.U010_TC05_PV.F_CV;55.066406250;100.0 +25/10/2020 02:06:21;UT800D.U010_TC05_PV.F_CV;55.023437500;100.0 +25/10/2020 02:06:26;UT800D.U010_TC05_PV.F_CV;55.023437500;100.0 +25/10/2020 02:06:27;UT800D.U010_TC05_PV.F_CV;55.050781250;100.0 +25/10/2020 02:06:32;UT800D.U010_TC05_PV.F_CV;55.050781250;100.0 +25/10/2020 02:06:33;UT800D.U010_TC05_PV.F_CV;54.969726563;100.0 +25/10/2020 02:06:38;UT800D.U010_TC05_PV.F_CV;54.969726563;100.0 +25/10/2020 02:06:39;UT800D.U010_TC05_PV.F_CV;54.954101563;100.0 +25/10/2020 02:06:44;UT800D.U010_TC05_PV.F_CV;54.954101563;100.0 +25/10/2020 02:06:45;UT800D.U010_TC05_PV.F_CV;55.030273438;100.0 +25/10/2020 02:06:50;UT800D.U010_TC05_PV.F_CV;55.030273438;100.0 +25/10/2020 02:06:51;UT800D.U010_TC05_PV.F_CV;55.071289063;100.0 +25/10/2020 02:06:56;UT800D.U010_TC05_PV.F_CV;55.071289063;100.0 +25/10/2020 02:06:57;UT800D.U010_TC05_PV.F_CV;55.009765625;100.0 +25/10/2020 02:06:08;UT800D.U010_TC06_OP.F_CV;2.145451307;100.0 +25/10/2020 02:06:09;UT800D.U010_TC06_OP.F_CV;1.144444108;100.0 +25/10/2020 02:06:14;UT800D.U010_TC06_OP.F_CV;1.144444108;100.0 +25/10/2020 02:06:15;UT800D.U010_TC06_OP.F_CV;0.753807187;100.0 +25/10/2020 02:06:20;UT800D.U010_TC06_OP.F_CV;0.753807187;100.0 +25/10/2020 02:06:21;UT800D.U010_TC06_OP.F_CV;0.216681421;100.0 +25/10/2020 02:06:26;UT800D.U010_TC06_OP.F_CV;0.216681421;100.0 +25/10/2020 02:06:27;UT800D.U010_TC06_OP.F_CV;1.046784878;100.0 +25/10/2020 02:06:32;UT800D.U010_TC06_OP.F_CV;1.046784878;100.0 +25/10/2020 02:06:33;UT800D.U010_TC06_OP.F_CV;0.656147957;100.0 +25/10/2020 02:06:44;UT800D.U010_TC06_OP.F_CV;0.656147957;100.0 +25/10/2020 02:06:45;UT800D.U010_TC06_OP.F_CV;0.363170266;100.0 +25/10/2020 02:06:50;UT800D.U010_TC06_OP.F_CV;0.363170266;100.0 +25/10/2020 02:06:51;UT800D.U010_TC06_OP.F_CV;0.021362957;100.0 +25/10/2020 02:06:56;UT800D.U010_TC06_OP.F_CV;0.021362957;100.0 +25/10/2020 02:06:57;UT800D.U010_TC06_OP.F_CV;0.241096228;100.0 +25/10/2020 02:06:02;UT800D.U010_TC06_PV.F_CV;39.813476563;100.0 +25/10/2020 02:06:03;UT800D.U010_TC06_PV.F_CV;39.894531250;100.0 +25/10/2020 02:06:08;UT800D.U010_TC06_PV.F_CV;39.894531250;100.0 +25/10/2020 02:06:09;UT800D.U010_TC06_PV.F_CV;40.017578125;100.0 +25/10/2020 02:06:14;UT800D.U010_TC06_PV.F_CV;40.017578125;100.0 +25/10/2020 02:06:15;UT800D.U010_TC06_PV.F_CV;40.058593750;100.0 +25/10/2020 02:06:20;UT800D.U010_TC06_PV.F_CV;40.058593750;100.0 +25/10/2020 02:06:21;UT800D.U010_TC06_PV.F_CV;40.176757813;100.0 +25/10/2020 02:06:26;UT800D.U010_TC06_PV.F_CV;40.176757813;100.0 +25/10/2020 02:06:27;UT800D.U010_TC06_PV.F_CV;40.050781250;100.0 +25/10/2020 02:06:32;UT800D.U010_TC06_PV.F_CV;40.050781250;100.0 +25/10/2020 02:06:33;UT800D.U010_TC06_PV.F_CV;40.108398438;100.0 +25/10/2020 02:06:38;UT800D.U010_TC06_PV.F_CV;40.108398438;100.0 +25/10/2020 02:06:39;UT800D.U010_TC06_PV.F_CV;40.086914063;100.0 +25/10/2020 02:06:44;UT800D.U010_TC06_PV.F_CV;40.086914063;100.0 +25/10/2020 02:06:45;UT800D.U010_TC06_PV.F_CV;40.163085938;100.0 +25/10/2020 02:06:50;UT800D.U010_TC06_PV.F_CV;40.163085938;100.0 +25/10/2020 02:06:51;UT800D.U010_TC06_PV.F_CV;40.198242188;100.0 +25/10/2020 02:06:56;UT800D.U010_TC06_PV.F_CV;40.198242188;100.0 +25/10/2020 02:06:57;UT800D.U010_TC06_PV.F_CV;40.152343750;100.0 +25/10/2020 02:06:03;UT800D.U010_TC15_OP.F_CV;32.175662994;100.0 +25/10/2020 02:06:14;UT800D.U010_TC15_OP.F_CV;32.175662994;100.0 +25/10/2020 02:06:15;UT800D.U010_TC15_OP.F_CV;32.395397186;100.0 +25/10/2020 02:06:26;UT800D.U010_TC15_OP.F_CV;32.395397186;100.0 +25/10/2020 02:06:27;UT800D.U010_TC15_OP.F_CV;31.955930710;100.0 +25/10/2020 02:06:38;UT800D.U010_TC15_OP.F_CV;31.858272552;100.0 +25/10/2020 02:06:39;UT800D.U010_TC15_OP.F_CV;31.492050171;100.0 +25/10/2020 02:06:44;UT800D.U010_TC15_OP.F_CV;31.492050171;100.0 +25/10/2020 02:06:45;UT800D.U010_TC15_OP.F_CV;31.247901917;100.0 +25/10/2020 02:06:50;UT800D.U010_TC15_OP.F_CV;31.247901917;100.0 +25/10/2020 02:06:51;UT800D.U010_TC15_OP.F_CV;31.736198425;100.0 +25/10/2020 02:06:56;UT800D.U010_TC15_OP.F_CV;31.736198425;100.0 +25/10/2020 02:06:57;UT800D.U010_TC15_OP.F_CV;31.516464233;100.0 +25/10/2020 02:06:02;UT800D.U010_TC15_PV.F_CV;69.292968750;100.0 +25/10/2020 02:06:03;UT800D.U010_TC15_PV.F_CV;69.447265625;100.0 +25/10/2020 02:06:08;UT800D.U010_TC15_PV.F_CV;69.447265625;100.0 +25/10/2020 02:06:09;UT800D.U010_TC15_PV.F_CV;69.480468750;100.0 +25/10/2020 02:06:14;UT800D.U010_TC15_PV.F_CV;69.480468750;100.0 +25/10/2020 02:06:15;UT800D.U010_TC15_PV.F_CV;69.400390625;100.0 +25/10/2020 02:06:20;UT800D.U010_TC15_PV.F_CV;69.400390625;100.0 +25/10/2020 02:06:21;UT800D.U010_TC15_PV.F_CV;69.453125000;100.0 +25/10/2020 02:06:26;UT800D.U010_TC15_PV.F_CV;69.453125000;100.0 +25/10/2020 02:06:27;UT800D.U010_TC15_PV.F_CV;69.722656250;100.0 +25/10/2020 02:06:32;UT800D.U010_TC15_PV.F_CV;69.722656250;100.0 +25/10/2020 02:06:33;UT800D.U010_TC15_PV.F_CV;69.781250000;100.0 +25/10/2020 02:06:38;UT800D.U010_TC15_PV.F_CV;69.781250000;100.0 +25/10/2020 02:06:39;UT800D.U010_TC15_PV.F_CV;70.003906250;100.0 +25/10/2020 02:06:44;UT800D.U010_TC15_PV.F_CV;70.003906250;100.0 +25/10/2020 02:06:45;UT800D.U010_TC15_PV.F_CV;70.134765625;100.0 +25/10/2020 02:06:50;UT800D.U010_TC15_PV.F_CV;70.134765625;100.0 +25/10/2020 02:06:51;UT800D.U010_TC15_PV.F_CV;69.863281250;100.0 +25/10/2020 02:06:56;UT800D.U010_TC15_PV.F_CV;69.863281250;100.0 +25/10/2020 02:06:57;UT800D.U010_TC15_PV.F_CV;69.978515625;100.0 +25/10/2020 02:06:33;UT800D.U010_TC16_OP.F_CV;32.981353760;100.0 +25/10/2020 02:06:39;UT800D.U010_TC16_OP.F_CV;33.127841949;100.0 +25/10/2020 02:06:02;UT800D.U010_TC16_PV.F_CV;69.849609375;100.0 +25/10/2020 02:06:03;UT800D.U010_TC16_PV.F_CV;69.906250000;100.0 +25/10/2020 02:06:08;UT800D.U010_TC16_PV.F_CV;69.906250000;100.0 +25/10/2020 02:06:09;UT800D.U010_TC16_PV.F_CV;69.873046875;100.0 +25/10/2020 02:06:14;UT800D.U010_TC16_PV.F_CV;69.873046875;100.0 +25/10/2020 02:06:15;UT800D.U010_TC16_PV.F_CV;69.960937500;100.0 +25/10/2020 02:06:20;UT800D.U010_TC16_PV.F_CV;69.960937500;100.0 +25/10/2020 02:06:21;UT800D.U010_TC16_PV.F_CV;69.939453125;100.0 +25/10/2020 02:06:26;UT800D.U010_TC16_PV.F_CV;69.939453125;100.0 +25/10/2020 02:06:27;UT800D.U010_TC16_PV.F_CV;69.923828125;100.0 +25/10/2020 02:06:32;UT800D.U010_TC16_PV.F_CV;69.923828125;100.0 +25/10/2020 02:06:33;UT800D.U010_TC16_PV.F_CV;69.837890625;100.0 +25/10/2020 02:06:38;UT800D.U010_TC16_PV.F_CV;69.837890625;100.0 +25/10/2020 02:06:39;UT800D.U010_TC16_PV.F_CV;69.714843750;100.0 +25/10/2020 02:06:44;UT800D.U010_TC16_PV.F_CV;69.714843750;100.0 +25/10/2020 02:06:45;UT800D.U010_TC16_PV.F_CV;69.814453125;100.0 +25/10/2020 02:06:50;UT800D.U010_TC16_PV.F_CV;69.814453125;100.0 +25/10/2020 02:06:51;UT800D.U010_TC16_PV.F_CV;69.908203125;100.0 +25/10/2020 02:06:56;UT800D.U010_TC16_PV.F_CV;69.908203125;100.0 +25/10/2020 02:06:57;UT800D.U010_TC16_PV.F_CV;70.048828125;100.0 +25/10/2020 02:06:14;UT800D.U010_TC17_OP.F_CV;24.094362259;100.0 +25/10/2020 02:06:15;UT800D.U010_TC17_OP.F_CV;24.875637054;100.0 +25/10/2020 02:06:20;UT800D.U010_TC17_OP.F_CV;24.875637054;100.0 +25/10/2020 02:06:21;UT800D.U010_TC17_OP.F_CV;24.192022324;100.0 +25/10/2020 02:06:38;UT800D.U010_TC17_OP.F_CV;24.192022324;100.0 +25/10/2020 02:06:39;UT800D.U010_TC17_OP.F_CV;24.460584641;100.0 +25/10/2020 02:06:50;UT800D.U010_TC17_OP.F_CV;24.362926483;100.0 +25/10/2020 02:06:51;UT800D.U010_TC17_OP.F_CV;24.021118164;100.0 +25/10/2020 02:06:57;UT800D.U010_TC17_OP.F_CV;24.094362259;100.0 +25/10/2020 02:06:02;UT800D.U010_TC17_PV.F_CV;89.984375000;100.0 +25/10/2020 02:06:03;UT800D.U010_TC17_PV.F_CV;89.972656250;100.0 +25/10/2020 02:06:08;UT800D.U010_TC17_PV.F_CV;89.972656250;100.0 +25/10/2020 02:06:09;UT800D.U010_TC17_PV.F_CV;90.021484375;100.0 +25/10/2020 02:06:14;UT800D.U010_TC17_PV.F_CV;90.021484375;100.0 +25/10/2020 02:06:15;UT800D.U010_TC17_PV.F_CV;89.802734375;100.0 +25/10/2020 02:06:20;UT800D.U010_TC17_PV.F_CV;89.802734375;100.0 +25/10/2020 02:06:21;UT800D.U010_TC17_PV.F_CV;89.984375000;100.0 +25/10/2020 02:06:26;UT800D.U010_TC17_PV.F_CV;89.984375000;100.0 +25/10/2020 02:06:27;UT800D.U010_TC17_PV.F_CV;90.000000000;100.0 +25/10/2020 02:06:32;UT800D.U010_TC17_PV.F_CV;90.000000000;100.0 +25/10/2020 02:06:33;UT800D.U010_TC17_PV.F_CV;90.001953125;100.0 +25/10/2020 02:06:38;UT800D.U010_TC17_PV.F_CV;90.001953125;100.0 +25/10/2020 02:06:39;UT800D.U010_TC17_PV.F_CV;89.943359375;100.0 +25/10/2020 02:06:44;UT800D.U010_TC17_PV.F_CV;89.943359375;100.0 +25/10/2020 02:06:45;UT800D.U010_TC17_PV.F_CV;89.949218750;100.0 +25/10/2020 02:06:50;UT800D.U010_TC17_PV.F_CV;89.949218750;100.0 +25/10/2020 02:06:51;UT800D.U010_TC17_PV.F_CV;90.066406250;100.0 +25/10/2020 02:06:56;UT800D.U010_TC17_PV.F_CV;90.066406250;100.0 +25/10/2020 02:06:57;UT800D.U010_TC17_PV.F_CV;90.007812500;100.0 +25/10/2020 02:06:02;UT800D.U010_TC19_OP.F_CV;50.535598755;100.0 +25/10/2020 02:06:03;UT800D.U010_TC19_OP.F_CV;51.145969391;100.0 +25/10/2020 02:06:08;UT800D.U010_TC19_OP.F_CV;51.145969391;100.0 +25/10/2020 02:06:09;UT800D.U010_TC19_OP.F_CV;52.195808411;100.0 +25/10/2020 02:06:14;UT800D.U010_TC19_OP.F_CV;52.195808411;100.0 +25/10/2020 02:06:15;UT800D.U010_TC19_OP.F_CV;53.294471741;100.0 +25/10/2020 02:06:20;UT800D.U010_TC19_OP.F_CV;53.294471741;100.0 +25/10/2020 02:06:21;UT800D.U010_TC19_OP.F_CV;52.757347107;100.0 +25/10/2020 02:06:26;UT800D.U010_TC19_OP.F_CV;52.757347107;100.0 +25/10/2020 02:06:27;UT800D.U010_TC19_OP.F_CV;53.294471741;100.0 +25/10/2020 02:06:32;UT800D.U010_TC19_OP.F_CV;53.294471741;100.0 +25/10/2020 02:06:33;UT800D.U010_TC19_OP.F_CV;54.319896698;100.0 +25/10/2020 02:06:38;UT800D.U010_TC19_OP.F_CV;54.319896698;100.0 +25/10/2020 02:06:39;UT800D.U010_TC19_OP.F_CV;54.979095459;100.0 +25/10/2020 02:06:44;UT800D.U010_TC19_OP.F_CV;54.979095459;100.0 +25/10/2020 02:06:45;UT800D.U010_TC19_OP.F_CV;54.515213013;100.0 +25/10/2020 02:06:50;UT800D.U010_TC19_OP.F_CV;54.515213013;100.0 +25/10/2020 02:06:51;UT800D.U010_TC19_OP.F_CV;53.978088379;100.0 +25/10/2020 02:06:02;UT800D.U010_TC19_PV.F_CV;90.058593750;100.0 +25/10/2020 02:06:03;UT800D.U010_TC19_PV.F_CV;89.912109375;100.0 +25/10/2020 02:06:08;UT800D.U010_TC19_PV.F_CV;89.912109375;100.0 +25/10/2020 02:06:09;UT800D.U010_TC19_PV.F_CV;89.667968750;100.0 +25/10/2020 02:06:14;UT800D.U010_TC19_PV.F_CV;89.667968750;100.0 +25/10/2020 02:06:15;UT800D.U010_TC19_PV.F_CV;89.410156250;100.0 +25/10/2020 02:06:20;UT800D.U010_TC19_PV.F_CV;89.410156250;100.0 +25/10/2020 02:06:21;UT800D.U010_TC19_PV.F_CV;89.556640625;100.0 +25/10/2020 02:06:26;UT800D.U010_TC19_PV.F_CV;89.556640625;100.0 +25/10/2020 02:06:27;UT800D.U010_TC19_PV.F_CV;89.435546875;100.0 +25/10/2020 02:06:32;UT800D.U010_TC19_PV.F_CV;89.435546875;100.0 +25/10/2020 02:06:33;UT800D.U010_TC19_PV.F_CV;89.201171875;100.0 +25/10/2020 02:06:38;UT800D.U010_TC19_PV.F_CV;89.201171875;100.0 +25/10/2020 02:06:39;UT800D.U010_TC19_PV.F_CV;89.089843750;100.0 +25/10/2020 02:06:44;UT800D.U010_TC19_PV.F_CV;89.089843750;100.0 +25/10/2020 02:06:45;UT800D.U010_TC19_PV.F_CV;89.193359375;100.0 +25/10/2020 02:06:50;UT800D.U010_TC19_PV.F_CV;89.193359375;100.0 +25/10/2020 02:06:51;UT800D.U010_TC19_PV.F_CV;89.335937500;100.0 +25/10/2020 02:06:56;UT800D.U010_TC19_PV.F_CV;89.335937500;100.0 +25/10/2020 02:06:57;UT800D.U010_TC19_PV.F_CV;89.390625000;100.0 +25/10/2020 02:06:46;UT800D.U010_TC21_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:02;UT800D.U010_TC21_PV.F_CV;24.642578125;100.0 +25/10/2020 02:06:03;UT800D.U010_TC21_PV.F_CV;24.643554688;100.0 +25/10/2020 02:06:08;UT800D.U010_TC21_PV.F_CV;24.643554688;100.0 +25/10/2020 02:06:09;UT800D.U010_TC21_PV.F_CV;24.604003906;100.0 +25/10/2020 02:06:14;UT800D.U010_TC21_PV.F_CV;24.604003906;100.0 +25/10/2020 02:06:15;UT800D.U010_TC21_PV.F_CV;24.657226563;100.0 +25/10/2020 02:06:20;UT800D.U010_TC21_PV.F_CV;24.657226563;100.0 +25/10/2020 02:06:21;UT800D.U010_TC21_PV.F_CV;24.685546875;100.0 +25/10/2020 02:06:26;UT800D.U010_TC21_PV.F_CV;24.685546875;100.0 +25/10/2020 02:06:27;UT800D.U010_TC21_PV.F_CV;24.666503906;100.0 +25/10/2020 02:06:32;UT800D.U010_TC21_PV.F_CV;24.666503906;100.0 +25/10/2020 02:06:33;UT800D.U010_TC21_PV.F_CV;24.664062500;100.0 +25/10/2020 02:06:38;UT800D.U010_TC21_PV.F_CV;24.664062500;100.0 +25/10/2020 02:06:39;UT800D.U010_TC21_PV.F_CV;24.561523438;100.0 +25/10/2020 02:06:44;UT800D.U010_TC21_PV.F_CV;24.561523438;100.0 +25/10/2020 02:06:45;UT800D.U010_TC21_PV.F_CV;24.552246094;100.0 +25/10/2020 02:06:50;UT800D.U010_TC21_PV.F_CV;24.552246094;100.0 +25/10/2020 02:06:51;UT800D.U010_TC21_PV.F_CV;24.564941406;100.0 +25/10/2020 02:06:56;UT800D.U010_TC21_PV.F_CV;24.564941406;100.0 +25/10/2020 02:06:57;UT800D.U010_TC21_PV.F_CV;24.681152344;100.0 +25/10/2020 02:06:15;UT800D.U010_TI09.F_CV;54.931640625;100.0 +25/10/2020 02:06:15;UT800D.U010_TI105.F_CV;60.550781250;100.0 +25/10/2020 02:06:45;UT800D.U010_TI106.F_CV;40.532226563;100.0 +25/10/2020 02:06:45;UT800D.U010_TI11.F_CV;228.660156250;100.0 +25/10/2020 02:06:27;UT800D.U010_TI115.F_CV;46.652343750;100.0 +25/10/2020 02:06:45;UT800D.U010_TI116.F_CV;93.236328125;100.0 +25/10/2020 02:06:03;UT800D.U010_TI117.F_CV;91.890625000;100.0 +25/10/2020 02:06:21;UT800D.U010_TI119.F_CV;94.921875000;100.0 +25/10/2020 02:06:33;UT800D.U010_TI119.F_CV;95.250000000;100.0 +25/10/2020 02:06:51;UT800D.U010_TI119.F_CV;94.869140625;100.0 +25/10/2020 02:06:03;UT800D.U010_TI12.F_CV;340.976562500;100.0 +25/10/2020 02:06:57;UT800D.U010_TI13.F_CV;278.671875000;100.0 +25/10/2020 02:06:39;UT800D.U010_TI14.F_CV;301.093750000;100.0 +25/10/2020 02:06:46;UT800D.U010_TI20.F_CV;0.000000000;0.0 +25/10/2020 02:06:45;UT800D.U010_TI30.F_CV;25.972656250;100.0 +25/10/2020 02:06:39;UT800D.U010_VIT_P2.F_CV;90.722373962;100.0 +25/10/2020 02:06:45;UT800D.U010_WI02.F_CV;525.764648438;100.0 +25/10/2020 02:06:02;UT800D.U010_WI06.F_CV;123.099998474;100.0 +25/10/2020 02:06:03;UT800D.U010_WI06.F_CV;123.400001526;100.0 +25/10/2020 02:06:08;UT800D.U010_WI06.F_CV;123.400001526;100.0 +25/10/2020 02:06:09;UT800D.U010_WI06.F_CV;123.500000000;100.0 +25/10/2020 02:06:14;UT800D.U010_WI06.F_CV;123.500000000;100.0 +25/10/2020 02:06:15;UT800D.U010_WI06.F_CV;123.199996948;100.0 +25/10/2020 02:06:20;UT800D.U010_WI06.F_CV;123.199996948;100.0 +25/10/2020 02:06:21;UT800D.U010_WI06.F_CV;123.000000000;100.0 +25/10/2020 02:06:26;UT800D.U010_WI06.F_CV;123.000000000;100.0 +25/10/2020 02:06:27;UT800D.U010_WI06.F_CV;123.400001526;100.0 +25/10/2020 02:06:32;UT800D.U010_WI06.F_CV;123.400001526;100.0 +25/10/2020 02:06:33;UT800D.U010_WI06.F_CV;123.199996948;100.0 +25/10/2020 02:06:38;UT800D.U010_WI06.F_CV;123.199996948;100.0 +25/10/2020 02:06:39;UT800D.U010_WI06.F_CV;123.500000000;100.0 +25/10/2020 02:06:44;UT800D.U010_WI06.F_CV;123.500000000;100.0 +25/10/2020 02:06:45;UT800D.U010_WI06.F_CV;123.300003052;100.0 +25/10/2020 02:06:50;UT800D.U010_WI06.F_CV;123.300003052;100.0 +25/10/2020 02:06:51;UT800D.U010_WI06.F_CV;123.599998474;100.0 +25/10/2020 02:06:56;UT800D.U010_WI06.F_CV;123.599998474;100.0 +25/10/2020 02:06:57;UT800D.U010_WI06.F_CV;123.500000000;100.0 +25/10/2020 02:06:46;UT800D.U023_DP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_FC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_FC11_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_FC12_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_FC12_SP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_FI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_FI05.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_FI11.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_FQ05.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_LC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_LC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_LI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_LI03.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_LI07.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_LI10.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_LT03.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_PC01.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_PC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_PC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_PI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_TC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_TC01_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_TC02_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_TC02_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_TC03_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_TC03_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_TC04_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_TC04_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_TC05_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_TC05_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_TI02.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_TI04.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_TI09.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_TI105.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_TI11.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_TI12.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_TI13.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_TI14.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_TI30.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_VIT_P2.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800D.U023_WI06.F_CV;0.000000000;0.0 +25/10/2020 02:06:45;UT800E.U002_DP.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;UT800E.U002_FC01_PV.F_CV;0.008721316;100.0 +25/10/2020 02:06:43;UT800E.U002_FC02_PV.F_CV;0.109176531;100.0 +25/10/2020 02:06:22;UT800E.U002_FC03_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:59;UT800E.U002_FC12_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;UT800E.U002_FC12_SP.F_CV;500.000000000;100.0 +25/10/2020 02:06:44;UT800E.U002_FC20_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;UT800E.U002_FC20_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:16;UT800E.U002_FC21A_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;UT800E.U002_FC21A_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:33;UT800E.U002_FC21B_PV.F_CV;0.840000331;100.0 +25/10/2020 02:06:43;UT800E.U002_FC21B_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;UT800E.U002_FC22_PV.F_CV;0.031937797;100.0 +25/10/2020 02:06:43;UT800E.U002_FC22_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;UT800E.U002_FI05.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;UT800E.U002_FQ05.F_CV;236050.875000000;100.0 +25/10/2020 02:06:43;UT800E.U002_LI03.F_CV;0.006561518;100.0 +25/10/2020 02:06:24;UT800E.U002_LI04.F_CV;-0.859664917;100.0 +25/10/2020 02:06:43;UT800E.U002_LT03.F_CV;0.006561518;100.0 +25/10/2020 02:06:03;UT800E.U002_PC01_OP.F_CV;99.926757813;100.0 +25/10/2020 02:06:45;UT800E.U002_PC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;UT800E.U002_PI02.F_CV;-0.061779022;100.0 +25/10/2020 02:06:24;UT800E.U002_PI04.F_CV;-0.011456013;100.0 +25/10/2020 02:06:22;UT800E.U002_PI34.F_CV;42.314453125;100.0 +25/10/2020 02:06:24;UT800E.U002_TC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;UT800E.U002_TC01_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:24;UT800E.U002_TC02_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;UT800E.U002_TC02_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:43;UT800E.U002_TC03_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;UT800E.U002_TC03_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:24;UT800E.U002_TC04_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;UT800E.U002_TC04_PV.F_CV;23.433593750;100.0 +25/10/2020 02:06:51;UT800E.U002_TC04_SP.F_CV;20.000000000;100.0 +25/10/2020 02:06:15;UT800E.U002_TC19_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;UT800E.U002_TC19_PV.F_CV;24.208984375;100.0 +25/10/2020 02:06:04;UT800E.U002_TC19_PV.F_CV;24.192871094;100.0 +25/10/2020 02:06:09;UT800E.U002_TC19_PV.F_CV;24.192871094;100.0 +25/10/2020 02:06:10;UT800E.U002_TC19_PV.F_CV;24.073242188;100.0 +25/10/2020 02:06:15;UT800E.U002_TC19_PV.F_CV;24.073242188;100.0 +25/10/2020 02:06:16;UT800E.U002_TC19_PV.F_CV;24.197265625;100.0 +25/10/2020 02:06:21;UT800E.U002_TC19_PV.F_CV;24.197265625;100.0 +25/10/2020 02:06:22;UT800E.U002_TC19_PV.F_CV;24.186523438;100.0 +25/10/2020 02:06:27;UT800E.U002_TC19_PV.F_CV;24.186523438;100.0 +25/10/2020 02:06:28;UT800E.U002_TC19_PV.F_CV;24.273925781;100.0 +25/10/2020 02:06:33;UT800E.U002_TC19_PV.F_CV;24.273925781;100.0 +25/10/2020 02:06:34;UT800E.U002_TC19_PV.F_CV;24.181640625;100.0 +25/10/2020 02:06:39;UT800E.U002_TC19_PV.F_CV;24.181640625;100.0 +25/10/2020 02:06:40;UT800E.U002_TC19_PV.F_CV;24.182128906;100.0 +25/10/2020 02:06:45;UT800E.U002_TC19_PV.F_CV;24.182128906;100.0 +25/10/2020 02:06:46;UT800E.U002_TC19_PV.F_CV;24.166992188;100.0 +25/10/2020 02:06:51;UT800E.U002_TC19_PV.F_CV;24.166992188;100.0 +25/10/2020 02:06:52;UT800E.U002_TC19_PV.F_CV;24.244628906;100.0 +25/10/2020 02:06:57;UT800E.U002_TC19_PV.F_CV;24.244628906;100.0 +25/10/2020 02:06:58;UT800E.U002_TC19_PV.F_CV;24.108886719;100.0 +25/10/2020 02:06:52;UT800E.U002_TI04.F_CV;23.433593750;100.0 +25/10/2020 02:06:58;UT800E.U002_TI05.F_CV;23.575683594;100.0 +25/10/2020 02:06:43;UT800E.U002_TI10.F_CV;954.281250000;100.0 +25/10/2020 02:06:46;UT800E.U002_TI11.F_CV;24.105468750;100.0 +25/10/2020 02:06:24;UT800E.U002_TI119.F_CV;24.164062500;100.0 +25/10/2020 02:06:43;UT800E.U002_TI12.F_CV;23.963867188;100.0 +25/10/2020 02:06:04;UT800E.U002_TI121B.F_CV;20.997558594;100.0 +25/10/2020 02:06:22;UT800E.U002_TI121B.F_CV;20.929199219;100.0 +25/10/2020 02:06:04;UT800E.U002_TI123B.F_CV;20.554687500;100.0 +25/10/2020 02:06:16;UT800E.U002_TI123B.F_CV;20.611816406;100.0 +25/10/2020 02:06:22;UT800E.U002_TI123B.F_CV;20.557617188;100.0 +25/10/2020 02:06:34;UT800E.U002_TI123B.F_CV;20.672851563;100.0 +25/10/2020 02:06:46;UT800E.U002_TI123B.F_CV;20.583984375;100.0 +25/10/2020 02:06:58;UT800E.U002_TI123B.F_CV;20.550292969;100.0 +25/10/2020 02:06:58;UT800E.U002_TI125.F_CV;19.480957031;100.0 +25/10/2020 02:06:43;UT800E.U002_TI13.F_CV;24.126464844;100.0 +25/10/2020 02:06:24;UT800E.U002_TI14.F_CV;954.281250000;100.0 +25/10/2020 02:06:22;UT800E.U002_TI24.F_CV;38.323242188;100.0 +25/10/2020 02:06:28;UT800E.U002_TI24.F_CV;38.293945313;100.0 +25/10/2020 02:06:18;UT800E.U002_TI30.F_CV;23.854492188;100.0 +25/10/2020 02:06:21;UT800E.U002_TI30.F_CV;23.525390625;100.0 +25/10/2020 02:06:47;UT800E.U002_TI30.F_CV;23.832519531;100.0 +25/10/2020 02:06:24;UT800E.U012_CO.F_CV;1525.812500000;100.0 +25/10/2020 02:06:43;UT800E.U012_CO2.F_CV;1525.812500000;100.0 +25/10/2020 02:06:24;UT800E.U012_DP.F_CV;-0.053558350;100.0 +25/10/2020 02:06:03;UT800E.U012_FC01_PV.F_CV;0.863240480;100.0 +25/10/2020 02:06:04;UT800E.U012_FC01_PV.F_CV;0.859972060;100.0 +25/10/2020 02:06:09;UT800E.U012_FC01_PV.F_CV;0.859972060;100.0 +25/10/2020 02:06:10;UT800E.U012_FC01_PV.F_CV;0.868090510;100.0 +25/10/2020 02:06:15;UT800E.U012_FC01_PV.F_CV;0.868090510;100.0 +25/10/2020 02:06:16;UT800E.U012_FC01_PV.F_CV;0.863903284;100.0 +25/10/2020 02:06:21;UT800E.U012_FC01_PV.F_CV;0.863903284;100.0 +25/10/2020 02:06:22;UT800E.U012_FC01_PV.F_CV;0.861651659;100.0 +25/10/2020 02:06:27;UT800E.U012_FC01_PV.F_CV;0.861651659;100.0 +25/10/2020 02:06:28;UT800E.U012_FC01_PV.F_CV;0.863710821;100.0 +25/10/2020 02:06:33;UT800E.U012_FC01_PV.F_CV;0.863710821;100.0 +25/10/2020 02:06:34;UT800E.U012_FC01_PV.F_CV;0.868261158;100.0 +25/10/2020 02:06:39;UT800E.U012_FC01_PV.F_CV;0.868261158;100.0 +25/10/2020 02:06:40;UT800E.U012_FC01_PV.F_CV;0.864257336;100.0 +25/10/2020 02:06:45;UT800E.U012_FC01_PV.F_CV;0.864257336;100.0 +25/10/2020 02:06:46;UT800E.U012_FC01_PV.F_CV;0.864665926;100.0 +25/10/2020 02:06:51;UT800E.U012_FC01_PV.F_CV;0.864665926;100.0 +25/10/2020 02:06:52;UT800E.U012_FC01_PV.F_CV;0.862100184;100.0 +25/10/2020 02:06:57;UT800E.U012_FC01_PV.F_CV;0.862100184;100.0 +25/10/2020 02:06:58;UT800E.U012_FC01_PV.F_CV;0.862661242;100.0 +25/10/2020 02:06:12;UT800E.U012_FC01_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;UT800E.U012_FC03_PV.F_CV;0.035731792;100.0 +25/10/2020 02:06:43;UT800E.U012_FC10_OP.F_CV;43.235572815;100.0 +25/10/2020 02:06:43;UT800E.U012_FC11_PV.F_CV;0.029820442;100.0 +25/10/2020 02:06:19;UT800E.U012_FI01.F_CV;0.863903284;100.0 +25/10/2020 02:06:43;UT800E.U012_FI04.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;UT800E.U012_FI05.F_CV;0.015807629;100.0 +25/10/2020 02:06:52;UT800E.U012_FI06.F_CV;0.714416504;100.0 +25/10/2020 02:06:05;UT800E.U012_FI10A.F_CV;490.323760986;100.0 +25/10/2020 02:06:53;UT800E.U012_FI10B.F_CV;299.240844727;100.0 +25/10/2020 02:06:43;UT800E.U012_FQ04.F_CV;2233.250000000;100.0 +25/10/2020 02:06:28;UT800E.U012_FQ05.F_CV;2912.000000000;100.0 +25/10/2020 02:06:43;UT800E.U012_LC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:22;UT800E.U012_LC01_PV.F_CV;35.700195313;100.0 +25/10/2020 02:06:22;UT800E.U012_LI01.F_CV;35.700195313;100.0 +25/10/2020 02:06:56;UT800E.U012_LI03.F_CV;-1.264129639;100.0 +25/10/2020 02:06:04;UT800E.U012_LI07.F_CV;59.594726563;100.0 +25/10/2020 02:06:40;UT800E.U012_LI07.F_CV;59.494140625;100.0 +25/10/2020 02:06:10;UT800E.U012_LI10.F_CV;11.214599609;100.0 +25/10/2020 02:06:27;UT800E.U012_LI10.F_CV;11.121582031;100.0 +25/10/2020 02:06:28;UT800E.U012_LI10.F_CV;11.361572266;100.0 +25/10/2020 02:06:33;UT800E.U012_LI10.F_CV;11.361572266;100.0 +25/10/2020 02:06:34;UT800E.U012_LI10.F_CV;11.051025391;100.0 +25/10/2020 02:06:40;UT800E.U012_LI10.F_CV;10.936035156;100.0 +25/10/2020 02:06:46;UT800E.U012_LI10.F_CV;11.080566406;100.0 +25/10/2020 02:06:51;UT800E.U012_LI10.F_CV;11.080566406;100.0 +25/10/2020 02:06:52;UT800E.U012_LI10.F_CV;11.340332031;100.0 +25/10/2020 02:06:57;UT800E.U012_LI10.F_CV;11.340332031;100.0 +25/10/2020 02:06:58;UT800E.U012_LI10.F_CV;10.902832031;100.0 +25/10/2020 02:06:24;UT800E.U012_LI32.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;UT800E.U012_LT03.F_CV;-1.264129639;100.0 +25/10/2020 02:06:45;UT800E.U012_LT03_AFF.F_CV;0.000000000;100.0 +25/10/2020 02:06:24;UT800E.U012_LT03_AFF.F_TV5;152.000000000;100.0 +25/10/2020 02:06:43;UT800E.U012_LT03_CA1.F_CV;0.000000000;0.0 +25/10/2020 02:06:24;UT800E.U012_LT03_CA1.F_TV5;0.000000000;0.0 +25/10/2020 02:06:24;UT800E.U012_LT03_CA2.F_CV;0.000000000;0.0 +25/10/2020 02:06:24;UT800E.U012_LT03_CA2.F_TV5;0.000000000;0.0 +25/10/2020 02:06:03;UT800E.U012_PC01.F_CV;0.054883003;100.0 +25/10/2020 02:06:04;UT800E.U012_PC01.F_CV;0.056139946;100.0 +25/10/2020 02:06:09;UT800E.U012_PC01.F_CV;0.056139946;100.0 +25/10/2020 02:06:10;UT800E.U012_PC01.F_CV;0.057350159;100.0 +25/10/2020 02:06:15;UT800E.U012_PC01.F_CV;0.057350159;100.0 +25/10/2020 02:06:16;UT800E.U012_PC01.F_CV;0.054202080;100.0 +25/10/2020 02:06:21;UT800E.U012_PC01.F_CV;0.054202080;100.0 +25/10/2020 02:06:22;UT800E.U012_PC01.F_CV;0.052943230;100.0 +25/10/2020 02:06:27;UT800E.U012_PC01.F_CV;0.052943230;100.0 +25/10/2020 02:06:28;UT800E.U012_PC01.F_CV;0.054084778;100.0 +25/10/2020 02:06:33;UT800E.U012_PC01.F_CV;0.054084778;100.0 +25/10/2020 02:06:34;UT800E.U012_PC01.F_CV;0.053496361;100.0 +25/10/2020 02:06:39;UT800E.U012_PC01.F_CV;0.053496361;100.0 +25/10/2020 02:06:40;UT800E.U012_PC01.F_CV;0.052390099;100.0 +25/10/2020 02:06:45;UT800E.U012_PC01.F_CV;0.052390099;100.0 +25/10/2020 02:06:46;UT800E.U012_PC01.F_CV;0.057152748;100.0 +25/10/2020 02:06:51;UT800E.U012_PC01.F_CV;0.057152748;100.0 +25/10/2020 02:06:52;UT800E.U012_PC01.F_CV;0.056794167;100.0 +25/10/2020 02:06:57;UT800E.U012_PC01.F_CV;0.056794167;100.0 +25/10/2020 02:06:58;UT800E.U012_PC01.F_CV;0.058910370;100.0 +25/10/2020 02:06:10;UT800E.U012_PC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;UT800E.U012_PC01_PV.F_CV;0.054883003;100.0 +25/10/2020 02:06:04;UT800E.U012_PC01_PV.F_CV;0.056139946;100.0 +25/10/2020 02:06:09;UT800E.U012_PC01_PV.F_CV;0.056139946;100.0 +25/10/2020 02:06:10;UT800E.U012_PC01_PV.F_CV;0.057350159;100.0 +25/10/2020 02:06:15;UT800E.U012_PC01_PV.F_CV;0.057350159;100.0 +25/10/2020 02:06:16;UT800E.U012_PC01_PV.F_CV;0.054202080;100.0 +25/10/2020 02:06:21;UT800E.U012_PC01_PV.F_CV;0.054202080;100.0 +25/10/2020 02:06:22;UT800E.U012_PC01_PV.F_CV;0.052943230;100.0 +25/10/2020 02:06:27;UT800E.U012_PC01_PV.F_CV;0.052943230;100.0 +25/10/2020 02:06:28;UT800E.U012_PC01_PV.F_CV;0.054084778;100.0 +25/10/2020 02:06:33;UT800E.U012_PC01_PV.F_CV;0.054084778;100.0 +25/10/2020 02:06:34;UT800E.U012_PC01_PV.F_CV;0.053496361;100.0 +25/10/2020 02:06:39;UT800E.U012_PC01_PV.F_CV;0.053496361;100.0 +25/10/2020 02:06:40;UT800E.U012_PC01_PV.F_CV;0.052390099;100.0 +25/10/2020 02:06:45;UT800E.U012_PC01_PV.F_CV;0.052390099;100.0 +25/10/2020 02:06:46;UT800E.U012_PC01_PV.F_CV;0.057152748;100.0 +25/10/2020 02:06:51;UT800E.U012_PC01_PV.F_CV;0.057152748;100.0 +25/10/2020 02:06:52;UT800E.U012_PC01_PV.F_CV;0.056794167;100.0 +25/10/2020 02:06:57;UT800E.U012_PC01_PV.F_CV;0.056794167;100.0 +25/10/2020 02:06:58;UT800E.U012_PC01_PV.F_CV;0.058910370;100.0 +25/10/2020 02:06:43;UT800E.U012_PC01_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;UT800E.U012_PI02.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;UT800E.U012_PI04.F_CV;-0.043592453;100.0 +25/10/2020 02:06:00;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:01;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:02;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:03;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:04;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:05;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:06;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:07;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:08;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:09;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:10;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:11;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:12;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:13;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:14;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:15;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:16;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:17;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:18;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:19;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:20;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:21;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:22;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:23;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:24;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:25;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:26;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:27;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:28;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:29;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:30;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:31;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:32;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:33;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:34;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:35;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:36;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:38;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:39;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:40;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:41;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:42;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:43;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:44;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:45;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:46;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:47;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:48;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:49;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:50;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:51;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:53;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:54;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:55;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:56;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:57;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:58;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:59;UT800E.U012_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:43;UT800E.U012_TC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;UT800E.U012_TC01_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:43;UT800E.U012_TC01_SP.F_CV;100.000000000;100.0 +25/10/2020 02:06:10;UT800E.U012_TC02_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;UT800E.U012_TC02_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:43;UT800E.U012_TC02_SP.F_CV;100.000000000;100.0 +25/10/2020 02:06:43;UT800E.U012_TC03_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;UT800E.U012_TC03_PV.F_CV;600.000000000;100.0 +25/10/2020 02:06:57;UT800E.U012_TC03_SP.F_CV;100.000000000;100.0 +25/10/2020 02:06:34;UT800E.U012_TI11.F_CV;24.598632813;100.0 +25/10/2020 02:06:19;UT800E.U012_TI12.F_CV;24.557128906;100.0 +25/10/2020 02:06:46;UT800E.U012_TI13.F_CV;24.356445313;100.0 +25/10/2020 02:06:05;UT800E.U012_TI14.F_CV;28.917480469;100.0 +25/10/2020 02:06:17;UT800E.U012_TI30.F_CV;24.143554688;100.0 +25/10/2020 02:06:24;UT800E.U012_VIT_P02.F_CV;0.000000000;0.0 +25/10/2020 02:06:24;UT800E.U012_WI01.F_CV;0.000000000;0.0 +25/10/2020 02:06:58;UT800E.U012_WI02.F_CV;2823.500000000;100.0 +25/10/2020 02:06:16;UT800E.U012_WI06.F_CV;546.200012207;100.0 +25/10/2020 02:06:43;UT800E.U019_AI01.F_CV;0.726153910;100.0 +25/10/2020 02:06:24;UT800E.U019_AI02.F_CV;0.722690821;100.0 +25/10/2020 02:06:58;UT800E.U019_DI12.F_CV;0.741867065;100.0 +25/10/2020 02:06:43;UT800E.U019_DI15.F_CV;0.580001831;100.0 +25/10/2020 02:06:24;UT800E.U019_DP.F_CV;-0.184875488;100.0 +25/10/2020 02:06:43;UT800E.U019_FC01_PV.F_CV;22.369640350;100.0 +25/10/2020 02:06:24;UT800E.U019_FC02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;UT800E.U019_FC04_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:49;UT800E.U019_FC12_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;UT800E.U019_FC12_SP.F_CV;75.000000000;100.0 +25/10/2020 02:06:43;UT800E.U019_FC15_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;UT800E.U019_FC15_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;UT800E.U019_FI01.F_CV;22.369640350;100.0 +25/10/2020 02:06:02;UT800E.U019_FI05.F_CV;38.250000000;100.0 +25/10/2020 02:06:03;UT800E.U019_FI05.F_CV;36.000000000;100.0 +25/10/2020 02:06:05;UT800E.U019_FI05.F_CV;38.250000000;100.0 +25/10/2020 02:06:10;UT800E.U019_FI05.F_CV;38.250000000;100.0 +25/10/2020 02:06:11;UT800E.U019_FI05.F_CV;36.000000000;100.0 +25/10/2020 02:06:12;UT800E.U019_FI05.F_CV;38.250000000;100.0 +25/10/2020 02:06:17;UT800E.U019_FI05.F_CV;38.250000000;100.0 +25/10/2020 02:06:18;UT800E.U019_FI05.F_CV;36.000000000;100.0 +25/10/2020 02:06:20;UT800E.U019_FI05.F_CV;38.250000000;100.0 +25/10/2020 02:06:24;UT800E.U019_FI05.F_CV;38.250000000;100.0 +25/10/2020 02:06:25;UT800E.U019_FI05.F_CV;36.000000000;100.0 +25/10/2020 02:06:28;UT800E.U019_FI05.F_CV;38.250000000;100.0 +25/10/2020 02:06:32;UT800E.U019_FI05.F_CV;36.000000000;100.0 +25/10/2020 02:06:34;UT800E.U019_FI05.F_CV;38.250000000;100.0 +25/10/2020 02:06:38;UT800E.U019_FI05.F_CV;38.250000000;100.0 +25/10/2020 02:06:39;UT800E.U019_FI05.F_CV;36.000000000;100.0 +25/10/2020 02:06:42;UT800E.U019_FI05.F_CV;38.250000000;100.0 +25/10/2020 02:06:44;UT800E.U019_FI05.F_CV;36.000000000;100.0 +25/10/2020 02:06:48;UT800E.U019_FI05.F_CV;38.250000000;100.0 +25/10/2020 02:06:53;UT800E.U019_FI05.F_CV;38.250000000;100.0 +25/10/2020 02:06:54;UT800E.U019_FI05.F_CV;36.000000000;100.0 +25/10/2020 02:06:55;UT800E.U019_FI05.F_CV;38.250000000;100.0 +25/10/2020 02:06:59;UT800E.U019_FI05.F_CV;38.250000000;100.0 +25/10/2020 02:06:04;UT800E.U019_FQ05.F_CV;537769.875000000;100.0 +25/10/2020 02:06:05;UT800E.U019_FQ05.F_CV;537769.937500000;100.0 +25/10/2020 02:06:11;UT800E.U019_FQ05.F_CV;537769.937500000;100.0 +25/10/2020 02:06:12;UT800E.U019_FQ05.F_CV;537770.000000000;100.0 +25/10/2020 02:06:19;UT800E.U019_FQ05.F_CV;537770.000000000;100.0 +25/10/2020 02:06:20;UT800E.U019_FQ05.F_CV;537770.062500000;100.0 +25/10/2020 02:06:26;UT800E.U019_FQ05.F_CV;537770.062500000;100.0 +25/10/2020 02:06:27;UT800E.U019_FQ05.F_CV;537770.187500000;100.0 +25/10/2020 02:06:33;UT800E.U019_FQ05.F_CV;537770.187500000;100.0 +25/10/2020 02:06:34;UT800E.U019_FQ05.F_CV;537770.250000000;100.0 +25/10/2020 02:06:40;UT800E.U019_FQ05.F_CV;537770.250000000;100.0 +25/10/2020 02:06:41;UT800E.U019_FQ05.F_CV;537770.312500000;100.0 +25/10/2020 02:06:47;UT800E.U019_FQ05.F_CV;537770.312500000;100.0 +25/10/2020 02:06:48;UT800E.U019_FQ05.F_CV;537770.375000000;100.0 +25/10/2020 02:06:53;UT800E.U019_FQ05.F_CV;537770.375000000;100.0 +25/10/2020 02:06:54;UT800E.U019_FQ05.F_CV;537770.437500000;100.0 +25/10/2020 02:06:59;UT800E.U019_FQ05.F_CV;537770.437500000;100.0 +25/10/2020 02:06:04;UT800E.U019_LC01_OP.F_CV;28.489028931;100.0 +25/10/2020 02:06:09;UT800E.U019_LC01_OP.F_CV;28.489028931;100.0 +25/10/2020 02:06:10;UT800E.U019_LC01_OP.F_CV;28.196050644;100.0 +25/10/2020 02:06:15;UT800E.U019_LC01_OP.F_CV;28.196050644;100.0 +25/10/2020 02:06:16;UT800E.U019_LC01_OP.F_CV;30.002746582;100.0 +25/10/2020 02:06:21;UT800E.U019_LC01_OP.F_CV;30.002746582;100.0 +25/10/2020 02:06:22;UT800E.U019_LC01_OP.F_CV;28.952909470;100.0 +25/10/2020 02:06:45;UT800E.U019_LC01_OP.F_CV;28.879665375;100.0 +25/10/2020 02:06:46;UT800E.U019_LC01_OP.F_CV;31.614124298;100.0 +25/10/2020 02:06:51;UT800E.U019_LC01_OP.F_CV;31.614124298;100.0 +25/10/2020 02:06:52;UT800E.U019_LC01_OP.F_CV;30.442213058;100.0 +25/10/2020 02:06:57;UT800E.U019_LC01_OP.F_CV;30.442213058;100.0 +25/10/2020 02:06:58;UT800E.U019_LC01_OP.F_CV;29.660940170;100.0 +25/10/2020 02:06:16;UT800E.U019_LC01_PV.F_CV;50.080078125;100.0 +25/10/2020 02:06:22;UT800E.U019_LC01_PV.F_CV;50.021484375;100.0 +25/10/2020 02:06:46;UT800E.U019_LC01_PV.F_CV;50.132812500;100.0 +25/10/2020 02:06:06;UT800E.U019_LI03.F_CV;65.117187500;100.0 +25/10/2020 02:06:44;UT800E.U019_LI03.F_CV;65.066406250;100.0 +25/10/2020 02:06:15;UT800E.U019_LI04.F_CV;59.884765625;100.0 +25/10/2020 02:06:58;UT800E.U019_LI07.F_CV;-0.007988453;100.0 +25/10/2020 02:06:09;UT800E.U019_LI10.F_CV;40.128906250;100.0 +25/10/2020 02:06:10;UT800E.U019_LI10.F_CV;40.372070313;100.0 +25/10/2020 02:06:15;UT800E.U019_LI10.F_CV;40.372070313;100.0 +25/10/2020 02:06:16;UT800E.U019_LI10.F_CV;40.099609375;100.0 +25/10/2020 02:06:21;UT800E.U019_LI10.F_CV;40.099609375;100.0 +25/10/2020 02:06:22;UT800E.U019_LI10.F_CV;40.329101563;100.0 +25/10/2020 02:06:33;UT800E.U019_LI10.F_CV;40.260742188;100.0 +25/10/2020 02:06:34;UT800E.U019_LI10.F_CV;40.023437500;100.0 +25/10/2020 02:06:40;UT800E.U019_LI10.F_CV;39.828125000;100.0 +25/10/2020 02:06:51;UT800E.U019_LI10.F_CV;39.890625000;100.0 +25/10/2020 02:06:52;UT800E.U019_LI10.F_CV;40.126953125;100.0 +25/10/2020 02:06:06;UT800E.U019_LT03.F_CV;65.117187500;100.0 +25/10/2020 02:06:44;UT800E.U019_LT03.F_CV;65.066406250;100.0 +25/10/2020 02:06:07;UT800E.U019_LT03_AFF.F_CV;65.117187500;100.0 +25/10/2020 02:06:45;UT800E.U019_LT03_AFF.F_CV;65.066406250;100.0 +25/10/2020 02:06:43;UT800E.U019_LT03_CA1.F_CV;0.000000000;0.0 +25/10/2020 02:06:24;UT800E.U019_LT03_CA2.F_CV;0.000000000;0.0 +25/10/2020 02:06:37;UT800E.U019_MI01.F_CV;23.789550781;100.0 +25/10/2020 02:06:12;UT800E.U019_PC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;UT800E.U019_PC01_PV.F_CV;4.117187500;100.0 +25/10/2020 02:06:04;UT800E.U019_PC01_PV.F_CV;4.116577148;100.0 +25/10/2020 02:06:09;UT800E.U019_PC01_PV.F_CV;4.116577148;100.0 +25/10/2020 02:06:10;UT800E.U019_PC01_PV.F_CV;4.120361328;100.0 +25/10/2020 02:06:15;UT800E.U019_PC01_PV.F_CV;4.120361328;100.0 +25/10/2020 02:06:16;UT800E.U019_PC01_PV.F_CV;4.117553711;100.0 +25/10/2020 02:06:21;UT800E.U019_PC01_PV.F_CV;4.117553711;100.0 +25/10/2020 02:06:22;UT800E.U019_PC01_PV.F_CV;4.119995117;100.0 +25/10/2020 02:06:27;UT800E.U019_PC01_PV.F_CV;4.119995117;100.0 +25/10/2020 02:06:28;UT800E.U019_PC01_PV.F_CV;4.119384766;100.0 +25/10/2020 02:06:33;UT800E.U019_PC01_PV.F_CV;4.119384766;100.0 +25/10/2020 02:06:34;UT800E.U019_PC01_PV.F_CV;4.117065430;100.0 +25/10/2020 02:06:39;UT800E.U019_PC01_PV.F_CV;4.117065430;100.0 +25/10/2020 02:06:40;UT800E.U019_PC01_PV.F_CV;4.118774414;100.0 +25/10/2020 02:06:45;UT800E.U019_PC01_PV.F_CV;4.118774414;100.0 +25/10/2020 02:06:46;UT800E.U019_PC01_PV.F_CV;4.122680664;100.0 +25/10/2020 02:06:51;UT800E.U019_PC01_PV.F_CV;4.122680664;100.0 +25/10/2020 02:06:52;UT800E.U019_PC01_PV.F_CV;4.116333008;100.0 +25/10/2020 02:06:57;UT800E.U019_PC01_PV.F_CV;4.116333008;100.0 +25/10/2020 02:06:58;UT800E.U019_PC01_PV.F_CV;4.119628906;100.0 +25/10/2020 02:06:43;UT800E.U019_PI02.F_CV;3.949768066;100.0 +25/10/2020 02:06:45;UT800E.U019_PI04.F_CV;0.204463959;100.0 +25/10/2020 02:06:09;UT800E.U019_TC01_OP.F_CV;28.293710709;100.0 +25/10/2020 02:06:10;UT800E.U019_TC01_OP.F_CV;28.611103058;100.0 +25/10/2020 02:06:15;UT800E.U019_TC01_OP.F_CV;28.611103058;100.0 +25/10/2020 02:06:16;UT800E.U019_TC01_OP.F_CV;28.342538834;100.0 +25/10/2020 02:06:21;UT800E.U019_TC01_OP.F_CV;28.342538834;100.0 +25/10/2020 02:06:22;UT800E.U019_TC01_OP.F_CV;29.099399567;100.0 +25/10/2020 02:06:27;UT800E.U019_TC01_OP.F_CV;29.099399567;100.0 +25/10/2020 02:06:28;UT800E.U019_TC01_OP.F_CV;28.440198898;100.0 +25/10/2020 02:06:33;UT800E.U019_TC01_OP.F_CV;28.440198898;100.0 +25/10/2020 02:06:34;UT800E.U019_TC01_OP.F_CV;28.806421280;100.0 +25/10/2020 02:06:45;UT800E.U019_TC01_OP.F_CV;28.733177185;100.0 +25/10/2020 02:06:46;UT800E.U019_TC01_OP.F_CV;28.318124771;100.0 +25/10/2020 02:06:51;UT800E.U019_TC01_OP.F_CV;28.318124771;100.0 +25/10/2020 02:06:52;UT800E.U019_TC01_OP.F_CV;28.782005310;100.0 +25/10/2020 02:06:58;UT800E.U019_TC01_OP.F_CV;28.635517120;100.0 +25/10/2020 02:06:04;UT800E.U019_TC01_PV.F_CV;499.899963379;100.0 +25/10/2020 02:06:09;UT800E.U019_TC02_OP.F_CV;19.113742828;100.0 +25/10/2020 02:06:10;UT800E.U019_TC02_OP.F_CV;18.747520447;100.0 +25/10/2020 02:06:16;UT800E.U019_TC02_OP.F_CV;18.869594574;100.0 +25/10/2020 02:06:21;UT800E.U019_TC02_OP.F_CV;18.869594574;100.0 +25/10/2020 02:06:22;UT800E.U019_TC02_OP.F_CV;19.406719208;100.0 +25/10/2020 02:06:27;UT800E.U019_TC02_OP.F_CV;19.406719208;100.0 +25/10/2020 02:06:28;UT800E.U019_TC02_OP.F_CV;18.771934509;100.0 +25/10/2020 02:06:34;UT800E.U019_TC02_OP.F_CV;18.967252731;100.0 +25/10/2020 02:06:39;UT800E.U019_TC02_OP.F_CV;18.967252731;100.0 +25/10/2020 02:06:40;UT800E.U019_TC02_OP.F_CV;19.479965210;100.0 +25/10/2020 02:06:45;UT800E.U019_TC02_OP.F_CV;19.479965210;100.0 +25/10/2020 02:06:46;UT800E.U019_TC02_OP.F_CV;18.796350479;100.0 +25/10/2020 02:06:04;UT800E.U019_TC02_PV.F_CV;499.477905273;100.0 +25/10/2020 02:06:03;UT800E.U019_TC03_OP.F_CV;13.547165871;100.0 +25/10/2020 02:06:04;UT800E.U019_TC03_OP.F_CV;13.327432632;100.0 +25/10/2020 02:06:09;UT800E.U019_TC03_OP.F_CV;13.327432632;100.0 +25/10/2020 02:06:10;UT800E.U019_TC03_OP.F_CV;13.766900063;100.0 +25/10/2020 02:06:15;UT800E.U019_TC03_OP.F_CV;13.766900063;100.0 +25/10/2020 02:06:16;UT800E.U019_TC03_OP.F_CV;13.522751808;100.0 +25/10/2020 02:06:27;UT800E.U019_TC03_OP.F_CV;13.620410919;100.0 +25/10/2020 02:06:28;UT800E.U019_TC03_OP.F_CV;14.059877396;100.0 +25/10/2020 02:06:33;UT800E.U019_TC03_OP.F_CV;14.059877396;100.0 +25/10/2020 02:06:34;UT800E.U019_TC03_OP.F_CV;13.815729141;100.0 +25/10/2020 02:06:57;UT800E.U019_TC03_OP.F_CV;13.595995903;100.0 +25/10/2020 02:06:58;UT800E.U019_TC03_OP.F_CV;13.840144157;100.0 +25/10/2020 02:06:28;UT800E.U019_TC03_PV.F_CV;499.651184082;100.0 +25/10/2020 02:06:03;UT800E.U019_TC04_OP.F_CV;28.025146484;100.0 +25/10/2020 02:06:04;UT800E.U019_TC04_OP.F_CV;27.756584167;100.0 +25/10/2020 02:06:09;UT800E.U019_TC04_OP.F_CV;27.756584167;100.0 +25/10/2020 02:06:10;UT800E.U019_TC04_OP.F_CV;28.049562454;100.0 +25/10/2020 02:06:15;UT800E.U019_TC04_OP.F_CV;28.049562454;100.0 +25/10/2020 02:06:16;UT800E.U019_TC04_OP.F_CV;27.561265945;100.0 +25/10/2020 02:06:21;UT800E.U019_TC04_OP.F_CV;27.561265945;100.0 +25/10/2020 02:06:22;UT800E.U019_TC04_OP.F_CV;28.098392487;100.0 +25/10/2020 02:06:34;UT800E.U019_TC04_OP.F_CV;27.903072357;100.0 +25/10/2020 02:06:40;UT800E.U019_TC04_OP.F_CV;28.073976517;100.0 +25/10/2020 02:06:45;UT800E.U019_TC04_OP.F_CV;28.073976517;100.0 +25/10/2020 02:06:46;UT800E.U019_TC04_OP.F_CV;27.658926010;100.0 +25/10/2020 02:06:51;UT800E.U019_TC04_OP.F_CV;27.658926010;100.0 +25/10/2020 02:06:52;UT800E.U019_TC04_OP.F_CV;28.000732422;100.0 +25/10/2020 02:06:58;UT800E.U019_TC04_OP.F_CV;28.122806549;100.0 +25/10/2020 02:06:16;UT800E.U019_TC04_PV.F_CV;484.815734863;100.0 +25/10/2020 02:06:14;UT800E.U019_TI05.F_CV;1340.250000000;100.0 +25/10/2020 02:06:24;UT800E.U019_TI11.F_CV;0.000000000;0.0 +25/10/2020 02:06:24;UT800E.U019_TI12.F_CV;0.000000000;0.0 +25/10/2020 02:06:24;UT800E.U019_TI13.F_CV;0.000000000;0.0 +25/10/2020 02:06:24;UT800E.U019_TI14.F_CV;0.000000000;0.0 +25/10/2020 02:06:09;UT800E.U019_TI30.F_CV;25.258789063;100.0 +25/10/2020 02:06:46;UT800E.U019_VIT_P02.F_CV;40.000000000;100.0 +25/10/2020 02:06:10;UT800E.U019_WI06.F_CV;473.700012207;100.0 +25/10/2020 02:06:27;UT800E.U019_WI06.F_CV;473.700012207;100.0 +25/10/2020 02:06:28;UT800E.U019_WI06.F_CV;473.600006104;100.0 +25/10/2020 02:06:33;UT800E.U019_WI06.F_CV;473.600006104;100.0 +25/10/2020 02:06:34;UT800E.U019_WI06.F_CV;473.700012207;100.0 +25/10/2020 02:06:57;UT800E.U024_COEF_A_TI20.F_CV;1.009999990;100.0 +25/10/2020 02:06:57;UT800E.U024_COEF_B_TI20.F_CV;-0.400000006;100.0 +25/10/2020 02:06:04;UT800E.U024_DP.F_CV;0.839416504;100.0 +25/10/2020 02:06:16;UT800E.U024_FC01_PV.F_CV;53.892311096;100.0 +25/10/2020 02:06:43;UT800E.U024_FC02_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:47;UT800E.U024_FC10_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:23;UT800E.U024_FC10_PV.F_CV;641.475402832;100.0 +25/10/2020 02:06:16;UT800E.U024_FI01.F_CV;53.892311096;100.0 +25/10/2020 02:06:37;UT800E.U024_FI05.F_CV;49.165542603;100.0 +25/10/2020 02:06:59;UT800E.U024_FI10B.F_CV;699.999572754;100.0 +25/10/2020 02:06:30;UT800E.U024_FQ05.F_CV;149142.562500000;100.0 +25/10/2020 02:06:31;UT800E.U024_FQ05.F_CV;149143.156250000;100.0 +25/10/2020 02:06:43;UT800E.U024_LC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;UT800E.U024_LC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:43;UT800E.U024_LI01.F_CV;-0.847061157;100.0 +25/10/2020 02:06:00;UT800E.U024_LI03.F_CV;12.740722656;100.0 +25/10/2020 02:06:02;UT800E.U024_LI03.F_CV;12.804687500;100.0 +25/10/2020 02:06:03;UT800E.U024_LI03.F_CV;12.708251953;100.0 +25/10/2020 02:06:04;UT800E.U024_LI03.F_CV;12.759277344;100.0 +25/10/2020 02:06:13;UT800E.U024_LI03.F_CV;12.617431641;100.0 +25/10/2020 02:06:14;UT800E.U024_LI03.F_CV;12.520019531;100.0 +25/10/2020 02:06:16;UT800E.U024_LI03.F_CV;12.761962891;100.0 +25/10/2020 02:06:20;UT800E.U024_LI03.F_CV;12.611572266;100.0 +25/10/2020 02:06:25;UT800E.U024_LI03.F_CV;12.418457031;100.0 +25/10/2020 02:06:26;UT800E.U024_LI03.F_CV;12.587646484;100.0 +25/10/2020 02:06:31;UT800E.U024_LI03.F_CV;12.654052734;100.0 +25/10/2020 02:06:35;UT800E.U024_LI03.F_CV;12.323486328;100.0 +25/10/2020 02:06:38;UT800E.U024_LI03.F_CV;12.563720703;100.0 +25/10/2020 02:06:39;UT800E.U024_LI03.F_CV;12.472412109;100.0 +25/10/2020 02:06:42;UT800E.U024_LI03.F_CV;12.662109375;100.0 +25/10/2020 02:06:44;UT800E.U024_LI03.F_CV;12.446044922;100.0 +25/10/2020 02:06:46;UT800E.U024_LI03.F_CV;12.699951172;100.0 +25/10/2020 02:06:49;UT800E.U024_LI03.F_CV;12.808837891;100.0 +25/10/2020 02:06:54;UT800E.U024_LI03.F_CV;12.330078125;100.0 +25/10/2020 02:06:09;UT800E.U024_LI07.F_CV;2.793090820;100.0 +25/10/2020 02:06:10;UT800E.U024_LI07.F_CV;2.526062012;100.0 +25/10/2020 02:06:15;UT800E.U024_LI07.F_CV;2.526062012;100.0 +25/10/2020 02:06:16;UT800E.U024_LI07.F_CV;2.832092285;100.0 +25/10/2020 02:06:21;UT800E.U024_LI07.F_CV;2.832092285;100.0 +25/10/2020 02:06:22;UT800E.U024_LI07.F_CV;2.563598633;100.0 +25/10/2020 02:06:34;UT800E.U024_LI07.F_CV;2.642944336;100.0 +25/10/2020 02:06:51;UT800E.U024_LI07.F_CV;2.561645508;100.0 +25/10/2020 02:06:52;UT800E.U024_LI07.F_CV;2.919738770;100.0 +25/10/2020 02:06:58;UT800E.U024_LI07.F_CV;2.771850586;100.0 +25/10/2020 02:06:04;UT800E.U024_LI10.F_CV;24.421386719;100.0 +25/10/2020 02:06:21;UT800E.U024_LI10.F_CV;24.362792969;100.0 +25/10/2020 02:06:22;UT800E.U024_LI10.F_CV;24.571289063;100.0 +25/10/2020 02:06:28;UT800E.U024_LI10.F_CV;24.372558594;100.0 +25/10/2020 02:06:34;UT800E.U024_LI10.F_CV;24.456054688;100.0 +25/10/2020 02:06:45;UT800E.U024_LI10.F_CV;24.374023438;100.0 +25/10/2020 02:06:46;UT800E.U024_LI10.F_CV;24.675781250;100.0 +25/10/2020 02:06:51;UT800E.U024_LI10.F_CV;24.675781250;100.0 +25/10/2020 02:06:52;UT800E.U024_LI10.F_CV;24.458496094;100.0 +25/10/2020 02:06:57;UT800E.U024_LI10.F_CV;24.458496094;100.0 +25/10/2020 02:06:58;UT800E.U024_LI10.F_CV;24.729980469;100.0 +25/10/2020 02:06:00;UT800E.U024_LT03.F_CV;12.740722656;100.0 +25/10/2020 02:06:02;UT800E.U024_LT03.F_CV;12.804687500;100.0 +25/10/2020 02:06:03;UT800E.U024_LT03.F_CV;12.708251953;100.0 +25/10/2020 02:06:04;UT800E.U024_LT03.F_CV;12.759277344;100.0 +25/10/2020 02:06:13;UT800E.U024_LT03.F_CV;12.617431641;100.0 +25/10/2020 02:06:14;UT800E.U024_LT03.F_CV;12.520019531;100.0 +25/10/2020 02:06:16;UT800E.U024_LT03.F_CV;12.761962891;100.0 +25/10/2020 02:06:20;UT800E.U024_LT03.F_CV;12.611572266;100.0 +25/10/2020 02:06:25;UT800E.U024_LT03.F_CV;12.418457031;100.0 +25/10/2020 02:06:26;UT800E.U024_LT03.F_CV;12.587646484;100.0 +25/10/2020 02:06:31;UT800E.U024_LT03.F_CV;12.654052734;100.0 +25/10/2020 02:06:35;UT800E.U024_LT03.F_CV;12.323486328;100.0 +25/10/2020 02:06:38;UT800E.U024_LT03.F_CV;12.563720703;100.0 +25/10/2020 02:06:39;UT800E.U024_LT03.F_CV;12.472412109;100.0 +25/10/2020 02:06:42;UT800E.U024_LT03.F_CV;12.662109375;100.0 +25/10/2020 02:06:44;UT800E.U024_LT03.F_CV;12.446044922;100.0 +25/10/2020 02:06:46;UT800E.U024_LT03.F_CV;12.699951172;100.0 +25/10/2020 02:06:49;UT800E.U024_LT03.F_CV;12.808837891;100.0 +25/10/2020 02:06:54;UT800E.U024_LT03.F_CV;12.330078125;100.0 +25/10/2020 02:06:01;UT800E.U024_LT03_AFF.F_CV;12.740722656;100.0 +25/10/2020 02:06:03;UT800E.U024_LT03_AFF.F_CV;12.804687500;100.0 +25/10/2020 02:06:04;UT800E.U024_LT03_AFF.F_CV;12.708251953;100.0 +25/10/2020 02:06:05;UT800E.U024_LT03_AFF.F_CV;12.759277344;100.0 +25/10/2020 02:06:14;UT800E.U024_LT03_AFF.F_CV;12.617431641;100.0 +25/10/2020 02:06:15;UT800E.U024_LT03_AFF.F_CV;12.520019531;100.0 +25/10/2020 02:06:17;UT800E.U024_LT03_AFF.F_CV;12.761962891;100.0 +25/10/2020 02:06:21;UT800E.U024_LT03_AFF.F_CV;12.611572266;100.0 +25/10/2020 02:06:26;UT800E.U024_LT03_AFF.F_CV;12.418457031;100.0 +25/10/2020 02:06:27;UT800E.U024_LT03_AFF.F_CV;12.587646484;100.0 +25/10/2020 02:06:32;UT800E.U024_LT03_AFF.F_CV;12.654052734;100.0 +25/10/2020 02:06:36;UT800E.U024_LT03_AFF.F_CV;12.323486328;100.0 +25/10/2020 02:06:39;UT800E.U024_LT03_AFF.F_CV;12.563720703;100.0 +25/10/2020 02:06:40;UT800E.U024_LT03_AFF.F_CV;12.472412109;100.0 +25/10/2020 02:06:43;UT800E.U024_LT03_AFF.F_CV;12.662109375;100.0 +25/10/2020 02:06:45;UT800E.U024_LT03_AFF.F_CV;12.446044922;100.0 +25/10/2020 02:06:47;UT800E.U024_LT03_AFF.F_CV;12.699951172;100.0 +25/10/2020 02:06:50;UT800E.U024_LT03_AFF.F_CV;12.808837891;100.0 +25/10/2020 02:06:55;UT800E.U024_LT03_AFF.F_CV;12.330078125;100.0 +25/10/2020 02:06:43;UT800E.U024_LT03_CA1.F_CV;0.000000000;0.0 +25/10/2020 02:06:24;UT800E.U024_LT03_CA2.F_CV;0.000000000;0.0 +25/10/2020 02:06:03;UT800E.U024_PC01.F_CV;3.045898438;100.0 +25/10/2020 02:06:04;UT800E.U024_PC01.F_CV;3.042358398;100.0 +25/10/2020 02:06:09;UT800E.U024_PC01.F_CV;3.042358398;100.0 +25/10/2020 02:06:10;UT800E.U024_PC01.F_CV;3.046264648;100.0 +25/10/2020 02:06:15;UT800E.U024_PC01.F_CV;3.046264648;100.0 +25/10/2020 02:06:16;UT800E.U024_PC01.F_CV;3.043395996;100.0 +25/10/2020 02:06:21;UT800E.U024_PC01.F_CV;3.043395996;100.0 +25/10/2020 02:06:22;UT800E.U024_PC01.F_CV;3.044555664;100.0 +25/10/2020 02:06:27;UT800E.U024_PC01.F_CV;3.044555664;100.0 +25/10/2020 02:06:28;UT800E.U024_PC01.F_CV;3.043884277;100.0 +25/10/2020 02:06:33;UT800E.U024_PC01.F_CV;3.043884277;100.0 +25/10/2020 02:06:34;UT800E.U024_PC01.F_CV;3.044372559;100.0 +25/10/2020 02:06:39;UT800E.U024_PC01.F_CV;3.044372559;100.0 +25/10/2020 02:06:40;UT800E.U024_PC01.F_CV;3.044616699;100.0 +25/10/2020 02:06:45;UT800E.U024_PC01.F_CV;3.044616699;100.0 +25/10/2020 02:06:46;UT800E.U024_PC01.F_CV;3.044250488;100.0 +25/10/2020 02:06:51;UT800E.U024_PC01.F_CV;3.044250488;100.0 +25/10/2020 02:06:52;UT800E.U024_PC01.F_CV;3.044067383;100.0 +25/10/2020 02:06:57;UT800E.U024_PC01.F_CV;3.044067383;100.0 +25/10/2020 02:06:58;UT800E.U024_PC01.F_CV;3.043151855;100.0 +25/10/2020 02:06:58;UT800E.U024_PC01_OP.F_CV;0.000000000;100.0 +25/10/2020 02:06:03;UT800E.U024_PC01_PV.F_CV;3.045898438;100.0 +25/10/2020 02:06:04;UT800E.U024_PC01_PV.F_CV;3.042358398;100.0 +25/10/2020 02:06:09;UT800E.U024_PC01_PV.F_CV;3.042358398;100.0 +25/10/2020 02:06:10;UT800E.U024_PC01_PV.F_CV;3.046264648;100.0 +25/10/2020 02:06:15;UT800E.U024_PC01_PV.F_CV;3.046264648;100.0 +25/10/2020 02:06:16;UT800E.U024_PC01_PV.F_CV;3.043395996;100.0 +25/10/2020 02:06:21;UT800E.U024_PC01_PV.F_CV;3.043395996;100.0 +25/10/2020 02:06:22;UT800E.U024_PC01_PV.F_CV;3.044555664;100.0 +25/10/2020 02:06:27;UT800E.U024_PC01_PV.F_CV;3.044555664;100.0 +25/10/2020 02:06:28;UT800E.U024_PC01_PV.F_CV;3.043884277;100.0 +25/10/2020 02:06:33;UT800E.U024_PC01_PV.F_CV;3.043884277;100.0 +25/10/2020 02:06:34;UT800E.U024_PC01_PV.F_CV;3.044372559;100.0 +25/10/2020 02:06:39;UT800E.U024_PC01_PV.F_CV;3.044372559;100.0 +25/10/2020 02:06:40;UT800E.U024_PC01_PV.F_CV;3.044616699;100.0 +25/10/2020 02:06:45;UT800E.U024_PC01_PV.F_CV;3.044616699;100.0 +25/10/2020 02:06:46;UT800E.U024_PC01_PV.F_CV;3.044250488;100.0 +25/10/2020 02:06:51;UT800E.U024_PC01_PV.F_CV;3.044250488;100.0 +25/10/2020 02:06:52;UT800E.U024_PC01_PV.F_CV;3.044067383;100.0 +25/10/2020 02:06:57;UT800E.U024_PC01_PV.F_CV;3.044067383;100.0 +25/10/2020 02:06:58;UT800E.U024_PC01_PV.F_CV;3.043151855;100.0 +25/10/2020 02:06:46;UT800E.U024_PI02.F_CV;3.882263184;100.0 +25/10/2020 02:06:43;UT800E.U024_SCRUT_EVOL.F_CV;0.000000000;0.0 +25/10/2020 02:06:24;UT800E.U024_TC01_OP.F_CV;25.000000000;100.0 +25/10/2020 02:06:24;UT800E.U024_TC01_PV.F_CV;24.725097656;100.0 +25/10/2020 02:06:43;UT800E.U024_TC02_OP.F_CV;20.000000000;100.0 +25/10/2020 02:06:43;UT800E.U024_TC02_PV.F_CV;24.722167969;100.0 +25/10/2020 02:06:24;UT800E.U024_TC03_OP.F_CV;20.000000000;100.0 +25/10/2020 02:06:24;UT800E.U024_TC03_PV.F_CV;24.668945313;100.0 +25/10/2020 02:06:43;UT800E.U024_TC04_OP.F_CV;20.000000000;100.0 +25/10/2020 02:06:43;UT800E.U024_TC04_PV.F_CV;24.799316406;100.0 +25/10/2020 02:06:22;UT800E.U024_TC20_PV.F_CV;30.474536896;100.0 +25/10/2020 02:06:58;UT800E.U024_TC20_SP.F_CV;30.000000000;100.0 +25/10/2020 02:06:24;UT800E.U024_TI01.F_CV;600.000000000;100.0 +25/10/2020 02:06:34;UT800E.U024_TI02.F_CV;23.952636719;100.0 +25/10/2020 02:06:24;UT800E.U024_TI03.F_CV;600.000000000;100.0 +25/10/2020 02:06:16;UT800E.U024_TI04.F_CV;31.388650894;100.0 +25/10/2020 02:06:24;UT800E.U024_TI05.F_CV;600.000000000;100.0 +25/10/2020 02:06:15;UT800E.U024_TI06.F_CV;600.000000000;100.0 +25/10/2020 02:06:24;UT800E.U024_TI07.F_CV;600.000000000;100.0 +25/10/2020 02:06:43;UT800E.U024_TI08.F_CV;600.000000000;100.0 +25/10/2020 02:06:43;UT800E.U024_TI11.F_CV;24.766113281;100.0 +25/10/2020 02:06:43;UT800E.U024_TI12.F_CV;24.722167969;100.0 +25/10/2020 02:06:24;UT800E.U024_TI13.F_CV;24.668945313;100.0 +25/10/2020 02:06:24;UT800E.U024_TI14.F_CV;24.828125000;100.0 +25/10/2020 02:06:22;UT800E.U024_TI20.F_CV;30.474536896;100.0 +25/10/2020 02:06:43;UT800E.U024_TI21.F_CV;-20.000000000;100.0 +25/10/2020 02:06:14;UT800E.U024_TI30.F_CV;23.898437500;100.0 +25/10/2020 02:06:24;UT800E.U024_VIT_P2.F_CV;0.000000000;0.0 +25/10/2020 02:06:45;UT800E.U024_WGD_DI2.F_CV;0.000000000;100.0 +25/10/2020 02:06:55;UT800E.U024_WGD_DI2.F_CV;0.000000000;100.0 +25/10/2020 02:06:56;UT800E.U024_WGD_DI2.F_CV;1.000000000;100.0 +25/10/2020 02:06:22;UT800E.U024_WI02.F_CV;2760.800048828;100.0 +25/10/2020 02:06:52;UT800E.U024_WI06.F_CV;412.399993896;100.0 +25/10/2020 02:06:52;UT800F.U828_FC01_OP.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;UT800F.U828_FC01_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_FC01_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_FC10_PV.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_FC10_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_FC11_PV.F_CV;0.093462303;100.0 +25/10/2020 02:06:52;UT800F.U828_FC11_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_FC12_PV.F_CV;0.235956684;100.0 +25/10/2020 02:06:52;UT800F.U828_FC12_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_FC15_PV.F_CV;0.030895777;100.0 +25/10/2020 02:06:52;UT800F.U828_FC15_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_FI01A.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;UT800F.U828_FQI40.F_CV;-0.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_LC31_OP.F_CV;70.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_LC31_PV.F_CV;12.864013672;100.0 +25/10/2020 02:06:52;UT800F.U828_LI03.F_CV;-1.281555176;100.0 +25/10/2020 02:06:52;UT800F.U828_PC01_OP.F_CV;99.978637695;100.0 +25/10/2020 02:06:52;UT800F.U828_PC01_PV.F_CV;0.029095650;100.0 +25/10/2020 02:06:52;UT800F.U828_PC01_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_PI22.F_CV;0.663330078;100.0 +25/10/2020 02:06:52;UT800F.U828_PI25.F_CV;0.242153168;100.0 +25/10/2020 02:06:52;UT800F.U828_PI40.F_CV;-0.027662754;100.0 +25/10/2020 02:06:52;UT800F.U828_TC101_OP.F_CV;3.599999905;100.0 +25/10/2020 02:06:52;UT800F.U828_TC101_PV.F_CV;500.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_TC101_SP.F_CV;500.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_TC102_OP.F_CV;0.500000000;100.0 +25/10/2020 02:06:52;UT800F.U828_TC102_PV.F_CV;500.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_TC102_SP.F_CV;500.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_TC103_OP.F_CV;1.000000000;100.0 +25/10/2020 02:06:53;UT800F.U828_TC103_PV.F_CV;500.000000000;100.0 +25/10/2020 02:06:53;UT800F.U828_TC103_SP.F_CV;500.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_TC104_OP.F_CV;1.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_TC104_PV.F_CV;500.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_TC104_SP.F_CV;500.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_TC105_OP.F_CV;2.000000000;100.0 +25/10/2020 02:06:53;UT800F.U828_TC105_PV.F_CV;500.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_TC105_SP.F_CV;500.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_TC106_PV.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;UT800F.U828_TC110_OP.F_CV;2.599999905;100.0 +25/10/2020 02:06:52;UT800F.U828_TC110_PV.F_CV;20.571289063;100.0 +25/10/2020 02:06:52;UT800F.U828_TC110_SP.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_TC116_OP.F_CV;5.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_TC116_PV.F_CV;20.408203125;100.0 +25/10/2020 02:06:52;UT800F.U828_TC116_SP.F_CV;20.434570313;100.0 +25/10/2020 02:06:52;UT800F.U828_TI101.F_CV;500.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_TI102.F_CV;500.000000000;100.0 +25/10/2020 02:06:53;UT800F.U828_TI103.F_CV;500.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_TI104.F_CV;500.000000000;100.0 +25/10/2020 02:06:53;UT800F.U828_TI105.F_CV;500.000000000;100.0 +25/10/2020 02:06:52;UT800F.U828_TI110.F_CV;20.568359375;100.0 +25/10/2020 02:06:52;UT800F.U828_TI111.F_CV;21.192871094;100.0 +25/10/2020 02:06:52;UT800F.U828_TI112.F_CV;21.123046875;100.0 +25/10/2020 02:06:52;UT800F.U828_TI113.F_CV;21.035156250;100.0 +25/10/2020 02:06:52;UT800F.U828_TI114.F_CV;20.966796875;100.0 +25/10/2020 02:06:52;UT800F.U828_TI115.F_CV;20.527832031;100.0 +25/10/2020 02:06:52;UT800F.U828_TI116.F_CV;20.471679688;100.0 +25/10/2020 02:06:52;UT800F.U828_TI120.F_CV;20.708007813;100.0 +25/10/2020 02:06:52;UT800F.U828_TI121.F_CV;20.711425781;100.0 +25/10/2020 02:06:52;UT800F.U828_TI122.F_CV;20.724121094;100.0 +25/10/2020 02:06:52;UT800F.U828_TI123.F_CV;20.629394531;100.0 +25/10/2020 02:06:52;UT800F.U828_TI124.F_CV;20.719238281;100.0 +25/10/2020 02:06:52;UT800F.U828_TI125.F_CV;20.635253906;100.0 +25/10/2020 02:06:52;UT800F.U828_TI126.F_CV;20.174804688;100.0 +25/10/2020 02:06:52;UT800F.U828_TI26.F_CV;20.174804688;100.0 +25/10/2020 02:06:52;UT800F.U828_TI30.F_CV;20.907714844;100.0 +25/10/2020 02:06:52;UT800F.U828_TI40.F_CV;20.896972656;100.0 +25/10/2020 02:06:52;UT800F.U828_WI03.F_CV;-411.500000000;100.0 +25/10/2020 02:06:52;UT800F.U828_WI04.F_CV;0.000000000;100.0 +25/10/2020 02:06:52;UT800F.U850_INCIDENTE.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;UT800F.U850_LI03.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;UT800F.U850_PDI04.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;UT800F.U850_PI13.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;UT800F.U850_REFLECHIE.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;UT800F.U850_TI03.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;UT800F.U850_TI04A.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;UT800F.U850_TI04B.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;UT800F.U850_VITESSE_P06.F_CV;0.000000000;0.0 +25/10/2020 02:06:52;UT800F.U946C_PT31.F_CV;6.643767357;100.0 +25/10/2020 02:06:52;UT800F.U946C_PT32.F_CV;8.133578300;100.0 +25/10/2020 02:06:52;UT800F.U946C_PT33.F_CV;9.777375221;100.0 +25/10/2020 02:06:52;UT800F.U946C_PT34.F_CV;6.177073479;100.0 +25/10/2020 02:06:52;UT800F.U946C_PT35.F_CV;9.931362152;100.0 +25/10/2020 02:06:52;UT800F.U946C_TE01B.F_CV;25.490427017;100.0 +25/10/2020 02:06:30;UT800F.U978_TI01.F_CV;44.127296448;100.0 +25/10/2020 02:06:06;UT800F.U978_TI02.F_CV;45.647670746;100.0 +25/10/2020 02:06:17;UT800F.U978_TI02.F_CV;45.453342438;100.0 +25/10/2020 02:06:23;UT800F.U978_TI02.F_CV;45.627647400;100.0 +25/10/2020 02:06:30;UT800F.U978_TI02.F_CV;45.484802246;100.0 +25/10/2020 02:06:48;UT800F.U978_TI02.F_CV;45.659088135;100.0 +25/10/2020 02:06:59;UT800F.U978_TI02.F_CV;45.514869690;100.0 +25/10/2020 02:06:36;UT800F.U978_TI03.F_CV;98.102081299;100.0 +25/10/2020 02:06:42;UT800F.U978_TI03.F_CV;97.998245239;100.0 +25/10/2020 02:06:48;UVIE.U764_PI11_PV.F_CV;-1.197193265;100.0 +25/10/2020 02:06:48;UVIE.U764_PI21_PV.F_CV;-2.958622694;100.0 +25/10/2020 02:06:48;UVIE.U764_PI31_PV.F_CV;-0.354456007;100.0 +25/10/2020 02:06:48;UVIE.U764_PI41_PV.F_CV;-0.636574090;100.0 +25/10/2020 02:06:48;UVIE.U764_PI51_PV.F_CV;-1.576967597;100.0 +25/10/2020 02:06:48;UVIE.U764_TC11_OP.F_CV;50.080471039;100.0 +25/10/2020 02:06:48;UVIE.U764_TC11_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:48;UVIE.U764_TC21_OP.F_CV;100.000000000;100.0 +25/10/2020 02:06:01;UVIE.U764_TC21_PV.F_CV;11.663366318;100.0 +25/10/2020 02:06:03;UVIE.U764_TC21_PV.F_CV;11.537904739;100.0 +25/10/2020 02:06:06;UVIE.U764_TC21_PV.F_CV;11.664496422;100.0 +25/10/2020 02:06:08;UVIE.U764_TC21_PV.F_CV;11.528862953;100.0 +25/10/2020 02:06:10;UVIE.U764_TC21_PV.F_CV;11.655454636;100.0 +25/10/2020 02:06:11;UVIE.U764_TC21_PV.F_CV;11.528862953;100.0 +25/10/2020 02:06:14;UVIE.U764_TC21_PV.F_CV;11.655454636;100.0 +25/10/2020 02:06:16;UVIE.U764_TC21_PV.F_CV;11.519820213;100.0 +25/10/2020 02:06:18;UVIE.U764_TC21_PV.F_CV;11.646411896;100.0 +25/10/2020 02:06:21;UVIE.U764_TC21_PV.F_CV;11.476869583;100.0 +25/10/2020 02:06:26;UVIE.U764_TC21_PV.F_CV;11.655454636;100.0 +25/10/2020 02:06:46;UVIE.U764_TC21_PV.F_CV;11.526279449;100.0 +25/10/2020 02:06:49;UVIE.U764_TC21_PV.F_CV;11.691623688;100.0 +25/10/2020 02:06:50;UVIE.U764_TC21_PV.F_CV;11.537904739;100.0 +25/10/2020 02:06:54;UVIE.U764_TC21_PV.F_CV;11.682580948;100.0 +25/10/2020 02:06:55;UVIE.U764_TC21_PV.F_CV;11.528862953;100.0 +25/10/2020 02:06:48;UVIE.U764_TC31_OP.F_CV;0.037249759;100.0 +25/10/2020 02:06:44;UVIE.U764_TC31_PV.F_CV;10.441492081;100.0 +25/10/2020 02:06:52;UVIE.U764_TC31_PV.F_CV;10.606554031;100.0 +25/10/2020 02:06:48;UVIE.U764_TC41_OP.F_CV;50.000000000;100.0 +25/10/2020 02:06:48;UVIE.U764_TC41_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:48;UVIE.U764_TC51_OP.F_CV;50.000000000;100.0 +25/10/2020 02:06:00;UVIE.U764_TC51_PV.F_CV;12.415002823;100.0 +25/10/2020 02:06:03;UVIE.U764_TC51_PV.F_CV;12.568720818;100.0 +25/10/2020 02:06:05;UVIE.U764_TC51_PV.F_CV;12.433087349;100.0 +25/10/2020 02:06:07;UVIE.U764_TC51_PV.F_CV;12.577763557;100.0 +25/10/2020 02:06:09;UVIE.U764_TC51_PV.F_CV;12.424045563;100.0 +25/10/2020 02:06:13;UVIE.U764_TC51_PV.F_CV;12.568720818;100.0 +25/10/2020 02:06:27;UVIE.U764_TC51_PV.F_CV;12.442130089;100.0 +25/10/2020 02:06:30;UVIE.U764_TC51_PV.F_CV;12.604889870;100.0 +25/10/2020 02:06:31;UVIE.U764_TC51_PV.F_CV;12.433087349;100.0 +25/10/2020 02:06:32;UVIE.U764_TC51_PV.F_CV;12.577763557;100.0 +25/10/2020 02:06:34;UVIE.U764_TC51_PV.F_CV;12.451171875;100.0 +25/10/2020 02:06:35;UVIE.U764_TC51_PV.F_CV;12.577763557;100.0 +25/10/2020 02:06:37;UVIE.U764_TC51_PV.F_CV;12.451171875;100.0 +25/10/2020 02:06:42;UVIE.U764_TC51_PV.F_CV;12.595848083;100.0 +25/10/2020 02:06:53;UVIE.U764_TC51_PV.F_CV;12.467964172;100.0 +25/10/2020 02:06:48;UVIE.U764_TI12A_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:38;UVIE.U764_TI22A_PV.F_CV;12.000000000;100.0 +25/10/2020 02:06:28;UVIE.U764_TI32A_PV.F_CV;12.000000000;100.0 +25/10/2020 02:06:48;UVIE.U764_TI42A_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:48;UVIE.U764_TI52A_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:58;UVIE.U795_PI01_PV.F_CV;-0.059678819;100.0 +25/10/2020 02:06:29;UVIE.U795_PI02_PV.F_CV;-0.059678819;100.0 +25/10/2020 02:06:54;UVIE.U795_TC11_OP.F_CV;18.474876404;100.0 +25/10/2020 02:06:58;UVIE.U795_TC11_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:57;UVIE.U795_TC21_OP.F_CV;12.164837837;100.0 +25/10/2020 02:06:32;UVIE.U795_TC21_PV.F_CV;14.453125000;100.0 +25/10/2020 02:06:42;UVIE.U795_TC21_PV.F_CV;14.603364944;100.0 +25/10/2020 02:06:37;UVIE.U795_TI12A_PV.F_CV;999.900024414;100.0 +25/10/2020 02:06:38;UVIE.U795_TI13A_PV.F_CV;19.000000000;100.0 +25/10/2020 02:06:01;UVIE.U795_TI22A_PV.F_CV;13.000000000;100.0 +25/10/2020 02:06:02;UVIE.U795_TI22A_PV.F_CV;14.000000000;100.0 +25/10/2020 02:06:03;UVIE.U795_TI22A_PV.F_CV;13.000000000;100.0 +25/10/2020 02:06:07;UVIE.U795_TI22A_PV.F_CV;14.000000000;100.0 +25/10/2020 02:06:08;UVIE.U795_TI22A_PV.F_CV;13.000000000;100.0 +25/10/2020 02:06:11;UVIE.U795_TI22A_PV.F_CV;14.000000000;100.0 +25/10/2020 02:06:12;UVIE.U795_TI22A_PV.F_CV;13.000000000;100.0 +25/10/2020 02:06:16;UVIE.U795_TI22A_PV.F_CV;14.000000000;100.0 +25/10/2020 02:06:17;UVIE.U795_TI22A_PV.F_CV;13.000000000;100.0 +25/10/2020 02:06:18;UVIE.U795_TI22A_PV.F_CV;14.000000000;100.0 +25/10/2020 02:06:22;UVIE.U795_TI22A_PV.F_CV;13.000000000;100.0 +25/10/2020 02:06:24;UVIE.U795_TI22A_PV.F_CV;14.000000000;100.0 +25/10/2020 02:06:26;UVIE.U795_TI22A_PV.F_CV;13.000000000;100.0 +25/10/2020 02:06:27;UVIE.U795_TI22A_PV.F_CV;14.000000000;100.0 +25/10/2020 02:06:42;UVIE.U795_TI22A_PV.F_CV;14.000000000;100.0 +25/10/2020 02:06:43;UVIE.U795_TI22A_PV.F_CV;13.000000000;100.0 +25/10/2020 02:06:44;UVIE.U795_TI22A_PV.F_CV;14.000000000;100.0 +25/10/2020 02:06:36;UVIE.U795_TI23A_PV.F_CV;15.000000000;100.0 diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/DataHasMoreFields.data b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/csv/DataHasMoreFields.csv similarity index 100% rename from logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/DataHasMoreFields.data rename to logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/csv/DataHasMoreFields.csv diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/FieldsMatch.data b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/csv/FieldsMatch.csv similarity index 100% rename from logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/FieldsMatch.data rename to logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/csv/FieldsMatch.csv diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/FileModeFieldFieldsMatch.data b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/csv/FileModeFieldFieldsMatch.csv similarity index 100% rename from logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/FileModeFieldFieldsMatch.data rename to logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/csv/FileModeFieldFieldsMatch.csv diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/SchemaHasMoreFields.data b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/csv/SchemaHasMoreFields.csv similarity index 100% rename from logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/SchemaHasMoreFields.data rename to logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/csv/SchemaHasMoreFields.csv diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/SourceOffset.data b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/csv/SourceOffset.csv similarity index 100% rename from logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/SourceOffset.data rename to logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/csv/SourceOffset.csv diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/WithoutHeader.data b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/csv/WithoutHeader.csv similarity index 100% rename from logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/csv/WithoutHeader.data rename to logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/csv/WithoutHeader.csv diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/json/DataHasMoreFields.data b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/json/DataHasMoreFields.data similarity index 100% rename from logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/json/DataHasMoreFields.data rename to logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/json/DataHasMoreFields.data diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/json/DataHasMoreFields.json b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/json/DataHasMoreFields.json similarity index 100% rename from logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/json/DataHasMoreFields.json rename to logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/json/DataHasMoreFields.json diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/json/FieldsMatch.data b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/json/FieldsMatch.data similarity index 100% rename from logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/json/FieldsMatch.data rename to logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/json/FieldsMatch.data diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/json/FieldsMatch.json b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/json/FieldsMatch.json similarity index 100% rename from logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/json/FieldsMatch.json rename to logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/json/FieldsMatch.json diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/json/FileModeFieldFieldsMatch.data b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/json/FileModeFieldFieldsMatch.data similarity index 100% rename from logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/json/FileModeFieldFieldsMatch.data rename to logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/json/FileModeFieldFieldsMatch.data diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/json/FileModeFieldFieldsMatch.json b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/json/FileModeFieldFieldsMatch.json similarity index 100% rename from logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/json/FileModeFieldFieldsMatch.json rename to logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/json/FileModeFieldFieldsMatch.json diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/json/SchemaHasMoreFields.data b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/json/SchemaHasMoreFields.data similarity index 100% rename from logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/json/SchemaHasMoreFields.data rename to logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/json/SchemaHasMoreFields.data diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/json/SchemaHasMoreFields.json b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/json/SchemaHasMoreFields.json similarity index 100% rename from logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/json/SchemaHasMoreFields.json rename to logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/json/SchemaHasMoreFields.json diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/json/SourceOffset.data b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/json/SourceOffset.data similarity index 100% rename from logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/json/SourceOffset.data rename to logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/json/SourceOffset.data diff --git a/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/json/SourceOffset.json b/logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/json/SourceOffset.json similarity index 100% rename from logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/com/hurence/logisland/connect/spooldir/json/SourceOffset.json rename to logisland-components/logisland-connectors/logisland-connector-spooldir/src/test/resources/spooldir/json/SourceOffset.json diff --git a/logisland-components/logisland-connectors/pom.xml b/logisland-components/logisland-connectors/pom.xml index 2a1c5d580..9d5d5651c 100644 --- a/logisland-components/logisland-connectors/pom.xml +++ b/logisland-components/logisland-connectors/pom.xml @@ -6,7 +6,7 @@ com.hurence.logisland logisland-components - 1.3.0 + 1.4.0 pom @@ -35,10 +35,13 @@ 2.0.0.RELEASE + + repackaged + + none repackage - none diff --git a/logisland-components/logisland-processors/logisland-processor-botsearch/pom.xml b/logisland-components/logisland-processors/logisland-processor-botsearch/pom.xml index 15b55ac4e..9c3fee7c9 100644 --- a/logisland-components/logisland-processors/logisland-processor-botsearch/pom.xml +++ b/logisland-components/logisland-processors/logisland-processor-botsearch/pom.xml @@ -23,7 +23,7 @@ com.hurence.logisland logisland-processors - 1.3.0 + 1.4.0 logisland-processor-botsearch diff --git a/logisland-components/logisland-processors/logisland-processor-common/pom.xml b/logisland-components/logisland-processors/logisland-processor-common/pom.xml index 4c57fc159..aff219c83 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/pom.xml +++ b/logisland-components/logisland-processors/logisland-processor-common/pom.xml @@ -23,7 +23,7 @@ com.hurence.logisland logisland-processors - 1.3.0 + 1.4.0 logisland-processor-common @@ -143,20 +143,10 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/AddFields.java b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/AddFields.java index 1c950ed7d..29f58ee90 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/AddFields.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/AddFields.java @@ -117,7 +117,6 @@ protected PropertyDescriptor getSupportedDynamicPropertyDescriptor(final String return new PropertyDescriptor.Builder() .name(propertyDescriptorName) .expressionLanguageSupported(true) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) .required(false) .dynamic(true) .build(); diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/ComputeAggsProcessor.java b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/ComputeAggsProcessor.java index 0fae50613..8ab62785f 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/ComputeAggsProcessor.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/ComputeAggsProcessor.java @@ -41,7 +41,7 @@ import com.hurence.logisland.record.FieldType; import com.hurence.logisland.record.Record; import com.hurence.logisland.validator.StandardValidators; -import com.hurence.logisland.validator.ValidationContext; +import com.hurence.logisland.validator.Configuration; import com.hurence.logisland.validator.ValidationResult; import org.apache.commons.lang3.StringUtils; @@ -71,7 +71,7 @@ public List getSupportedPropertyDescriptors() { } @Override - protected Collection customValidate(ValidationContext context) { + protected Collection customValidate(Configuration context) { final Collection validations = new ArrayList<>(); Set> props = context.getProperties().entrySet(); if (props.isEmpty()) { @@ -85,7 +85,7 @@ protected Collection customValidate(ValidationContext context) final Set dynamicFieldPropertiesTmp = new HashSet<>(); final Map dynamicAggTypePropertiesTmp = new HashMap<>(); final Map dynamicTypeResultPropertiesTmp = new HashMap<>(); - for (final Map.Entry entry : props) {//TODO + for (final Map.Entry entry : props) { if (!entry.getKey().isDynamic()) { continue; } diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/DebugStream.java b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/DebugStream.java index 046c9ae42..9aa3b5908 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/DebugStream.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/DebugStream.java @@ -20,9 +20,7 @@ import com.hurence.logisland.component.InitializationException; import com.hurence.logisland.component.PropertyDescriptor; import com.hurence.logisland.record.Record; -import com.hurence.logisland.serializer.JsonSerializer; -import com.hurence.logisland.serializer.RecordSerializer; -import com.hurence.logisland.serializer.StringSerializer; +import com.hurence.logisland.serializer.*; import com.hurence.logisland.validator.StandardValidators; import java.io.ByteArrayOutputStream; @@ -40,32 +38,50 @@ @ExtraDetailFile("./details/common-processors/DebugStream-Detail.rst") public class DebugStream extends AbstractProcessor { + public static final AllowableValue NO_DESERIALIZER = + new AllowableValue("none", "no deserialization", "get body as raw string"); - public static final AllowableValue JSON = new AllowableValue("json", "Json serialization", - "serialize events as json blocs"); + public static final AllowableValue AVRO_DESERIALIZER = + new AllowableValue(AvroSerializer.class.getName(), "avro deserialization", "deserialize body as avro blocs"); - public static final AllowableValue STRING = new AllowableValue("string", "String serialization", - "serialize events as toString() blocs"); + public static final AllowableValue JSON_DESERIALIZER = + new AllowableValue(JsonSerializer.class.getName(), "json deserialization", "deserialize body as json blocs"); + + public static final AllowableValue EXTENDED_JSON_DESERIALIZER = + new AllowableValue(ExtendedJsonSerializer.class.getName(), "extended json deserialization", "deserialize body as json blocs"); + + public static final AllowableValue KRYO_DESERIALIZER = + new AllowableValue(KryoSerializer.class.getName(), "kryo deserialization", "deserialize body with kryo"); public static final PropertyDescriptor SERIALIZER = new PropertyDescriptor.Builder() .name("event.serializer") - .description("the way to serialize event") - .required(true) + .description("the serializer needed for loading the payload and handling it as a record set.") + .expressionLanguageSupported(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .allowableValues(KRYO_DESERIALIZER, JSON_DESERIALIZER, AVRO_DESERIALIZER, NO_DESERIALIZER, EXTENDED_JSON_DESERIALIZER) + .defaultValue(EXTENDED_JSON_DESERIALIZER.getValue()) + .build(); + + static final PropertyDescriptor RECORD_SCHEMA = new PropertyDescriptor.Builder() + .name("event.serializer.schema") + .description("the schema definition for the deserializer (for response payload). You can limit data to retrieve this way") + .required(false) .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .defaultValue(JSON.getValue()) - .allowableValues(JSON, STRING) .build(); + + @Override public final List getSupportedPropertyDescriptors() { final List descriptors = new ArrayList<>(); descriptors.add(SERIALIZER); + descriptors.add(RECORD_SCHEMA); return Collections.unmodifiableList(descriptors); } private volatile MemoryMXBean memBean; - + private volatile RecordSerializer serializer; @Override public void init(ProcessContext context) throws InitializationException { @@ -73,6 +89,18 @@ public void init(ProcessContext context) throws InitializationException { if (memBean == null) { memBean = ManagementFactory.getMemoryMXBean(); } + if (context.getPropertyValue(RECORD_SCHEMA).isSet()) { + serializer = SerializerProvider.getSerializer( + context.getPropertyValue(SERIALIZER).asString(), + context.getPropertyValue(RECORD_SCHEMA).asString()); + } else { + String serializerCanonicName = context.getPropertyValue(SERIALIZER).asString(); + if (!serializerCanonicName.equals(NO_DESERIALIZER.getValue())) { + serializer = SerializerProvider.getSerializer(context.getPropertyValue(SERIALIZER).asString(), null); + } else { + serializer = new StringSerializer(); + } + } } @Override @@ -81,33 +109,13 @@ public Collection process(final ProcessContext context, final Collection getLogger().info("processing {} records", new Object[]{collection.size()}); if (collection.size() != 0) { - RecordSerializer serializer = null; - if (context.getPropertyValue(SERIALIZER).asString().equals(JSON.getValue())) { - serializer = new JsonSerializer(); - } else { - serializer = new StringSerializer(); - } - - - final RecordSerializer finalSerializer = serializer; - collection.forEach(event -> { - - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - finalSerializer.serialize(baos, event); - try { - baos.close(); - } catch (IOException e) { - getLogger().debug("error {} ", e.getCause()); - } - - getLogger().info(new String(baos.toByteArray())); - - + //Do not use serialization ! It is pointless as at this point the object is already deserialized into a Record ! + //Moreover trying to serialize the record may fail for a lot of reason (if record contains some objects without appropriate bean pattern. + collection.forEach(record -> { + getLogger().info(record.toString(1)); }); } - return collection; } diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/DecodeBase64.java b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/DecodeBase64.java index 0684cacd0..3b1e19a29 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/DecodeBase64.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/DecodeBase64.java @@ -1,12 +1,12 @@ /** - * Copyright (C) 2019 Hurence (support@hurence.com) - *

+ * Copyright (C) 2016 Hurence (support@hurence.com) + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

+ * + * 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. diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/EncodeBase64.java b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/EncodeBase64.java index fef5c9af9..99d925135 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/EncodeBase64.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/EncodeBase64.java @@ -1,12 +1,12 @@ /** - * Copyright (C) 2019 Hurence (support@hurence.com) - *

+ * Copyright (C) 2016 Hurence (support@hurence.com) + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

+ * + * 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. @@ -66,21 +66,16 @@ public List getSupportedPropertyDescriptors() { @Override public void init(ProcessContext context) throws InitializationException { super.init(context); + context.getPropertyValue(SOURCE_FIELDS).asStringOpt().ifPresent(s -> + sourceFieldNames.addAll(Arrays.asList((s.split(","))))); + context.getPropertyValue(DESTINATION_FIELDS).asStringOpt().ifPresent(s -> + destinationFieldNames.addAll(Arrays.asList((s.split(","))))); + if (sourceFieldNames.size() != destinationFieldNames.size()) { + throw new InitializationException(String.format("Processor properties %s and %s must contains the same number of elements. " + + "Actual are: %d and %d", SOURCE_FIELDS.getName(), DESTINATION_FIELDS.getName(), + sourceFieldNames.size(), destinationFieldNames.size())); - if(!isInitialized){ - context.getPropertyValue(SOURCE_FIELDS).asStringOpt().ifPresent(s -> - sourceFieldNames.addAll(Arrays.asList((s.split(","))))); - context.getPropertyValue(DESTINATION_FIELDS).asStringOpt().ifPresent(s -> - destinationFieldNames.addAll(Arrays.asList((s.split(","))))); - if (sourceFieldNames.size() != destinationFieldNames.size()) { - throw new InitializationException(String.format("Processor properties %s and %s must contains the same number of elements. " + - "Actual are: %d and %d", SOURCE_FIELDS.getName(), DESTINATION_FIELDS.getName(), - sourceFieldNames.size(), destinationFieldNames.size())); - - } - isInitialized = true; } - } @Override diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/EncryptField.java b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/EncryptField.java index 8cb1dd7e3..89c3e876d 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/EncryptField.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/EncryptField.java @@ -26,7 +26,7 @@ import com.hurence.logisland.record.FieldType; import com.hurence.logisland.record.Record; import com.hurence.logisland.validator.StandardValidators; -import com.hurence.logisland.validator.ValidationContext; +import com.hurence.logisland.validator.Configuration; import com.hurence.logisland.validator.ValidationResult; @@ -245,7 +245,7 @@ public List getSupportedPropertyDescriptors() { protected PropertyDescriptor getSupportedDynamicPropertyDescriptor(final String propertyDescriptorName) { return new PropertyDescriptor.Builder() .name(propertyDescriptorName) - .expressionLanguageSupported(false) // TODO understand what expressionLanguage is !!! + .expressionLanguageSupported(false) .required(false) .dynamic(true) .build(); @@ -253,7 +253,7 @@ protected PropertyDescriptor getSupportedDynamicPropertyDescriptor(final String @Override - protected Collection customValidate(final ValidationContext context) { + protected Collection customValidate(final Configuration context) { final List validationResults = new ArrayList<>(super.customValidate(context)); try { String keyFile; diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/EvaluateJsonPath.java b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/EvaluateJsonPath.java index f7b502239..cb603d2e5 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/EvaluateJsonPath.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/EvaluateJsonPath.java @@ -21,7 +21,7 @@ import com.hurence.logisland.record.FieldDictionary; import com.hurence.logisland.record.FieldType; import com.hurence.logisland.record.Record; -import com.hurence.logisland.validator.ValidationContext; +import com.hurence.logisland.validator.Configuration; import com.hurence.logisland.validator.ValidationResult; import com.jayway.jsonpath.DocumentContext; import com.jayway.jsonpath.InvalidJsonException; @@ -92,7 +92,7 @@ public class EvaluateJsonPath extends AbstractJsonPathProcessor { private transient final ConcurrentMap cachedJsonPathMap = new ConcurrentHashMap<>(); @Override - protected Collection customValidate(final ValidationContext context) { + protected Collection customValidate(final Configuration context) { final List results = new ArrayList<>(super.customValidate(context)); int jsonPathCount = 0; diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/FilterRecords.java b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/FilterRecords.java index b89772f80..b486f1ccd 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/FilterRecords.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/FilterRecords.java @@ -23,7 +23,7 @@ import com.hurence.logisland.component.PropertyDescriptor; import com.hurence.logisland.record.Record; import com.hurence.logisland.validator.StandardValidators; -import com.hurence.logisland.validator.ValidationContext; +import com.hurence.logisland.validator.Configuration; import com.hurence.logisland.validator.ValidationResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -87,7 +87,7 @@ public class FilterRecords extends AbstractProcessor { private final Set dynamicMethodProperties = new HashSet<>(); @Override - protected Collection customValidate(ValidationContext context) { + protected Collection customValidate(Configuration context) { final List validationResults = new ArrayList<>(super.customValidate(context)); if (context.getPropertyValue(FIELD_NAME).isSet() && !context.getPropertyValue(FIELD_VALUE).isSet()) { validationResults.add( @@ -213,7 +213,7 @@ private void initDynamicProperties(ProcessContext context) { } - private boolean noDynamicProps(ValidationContext context) { + private boolean noDynamicProps(Configuration context) { for (final Map.Entry entry : context.getProperties().entrySet()) { if (!entry.getKey().isDynamic()) { continue; diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/ModifyId.java b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/ModifyId.java index b5786729e..2c3e8d5d6 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/ModifyId.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/ModifyId.java @@ -23,7 +23,7 @@ import com.hurence.logisland.record.FieldDictionary; import com.hurence.logisland.record.Record; import com.hurence.logisland.validator.StandardValidators; -import com.hurence.logisland.validator.ValidationContext; +import com.hurence.logisland.validator.Configuration; import com.hurence.logisland.validator.ValidationResult; import org.apache.commons.codec.binary.Hex; import org.slf4j.Logger; @@ -138,7 +138,7 @@ public class ModifyId extends AbstractProcessor { @Override - protected Collection customValidate(ValidationContext context) { + protected Collection customValidate(Configuration context) { final List validationResults = new ArrayList<>(super.customValidate(context)); if (context.getPropertyValue(STRATEGY).isSet()) { if (context.getPropertyValue(STRATEGY).getRawValue().equals(JAVA_FORMAT_STRING_WITH_FIELDS_STRATEGY.getValue())) { diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/RemoveFields.java b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/RemoveFields.java index bcd5f624e..e94f7f5f5 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/RemoveFields.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/RemoveFields.java @@ -25,7 +25,7 @@ import com.hurence.logisland.record.FieldDictionary; import com.hurence.logisland.record.Record; import com.hurence.logisland.validator.StandardValidators; -import com.hurence.logisland.validator.ValidationContext; +import com.hurence.logisland.validator.Configuration; import com.hurence.logisland.validator.ValidationResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -142,7 +142,7 @@ public List getSupportedPropertyDescriptors() { } @Override - protected Collection customValidate(ValidationContext context) { + protected Collection customValidate(Configuration context) { final List validationResults = new ArrayList<>(super.customValidate(context)); diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/SendMail.java b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/SendMail.java index 703c0718c..43f84a73a 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/SendMail.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/SendMail.java @@ -23,7 +23,7 @@ import com.hurence.logisland.record.Field; import com.hurence.logisland.record.Record; import com.hurence.logisland.validator.StandardValidators; -import com.hurence.logisland.validator.ValidationContext; +import com.hurence.logisland.validator.Configuration; import com.hurence.logisland.validator.ValidationResult; import org.apache.commons.mail.EmailException; @@ -628,7 +628,7 @@ private String getStringField(Record record, String fieldName) } @Override - protected Collection customValidate(ValidationContext context) { + protected Collection customValidate(Configuration context) { final List validationResults = new ArrayList<>(super.customValidate(context)); logger.debug("customValidate"); diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/SplitRecord.java b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/SplitRecord.java index fd7de391e..1db4a6371 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/SplitRecord.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/SplitRecord.java @@ -1,3 +1,18 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.hurence.logisland.processor; import com.hurence.logisland.annotation.behavior.DynamicProperty; @@ -5,13 +20,9 @@ import com.hurence.logisland.component.InitializationException; import com.hurence.logisland.component.PropertyDescriptor; import com.hurence.logisland.record.Field; -import com.hurence.logisland.record.FieldDictionary; import com.hurence.logisland.record.Record; import com.hurence.logisland.record.StandardRecord; import com.hurence.logisland.validator.StandardValidators; -import com.hurence.logisland.validator.ValidationContext; -import com.hurence.logisland.validator.ValidationResult; - import java.util.*; diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/SplitText.java b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/SplitText.java index 489d0b6e3..d2980b326 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/SplitText.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/SplitText.java @@ -1,12 +1,12 @@ /** * Copyright (C) 2016 Hurence (support@hurence.com) - *

+ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

+ * + * 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. @@ -20,8 +20,8 @@ import com.hurence.logisland.component.PropertyDescriptor; import com.hurence.logisland.record.*; import com.hurence.logisland.util.time.DateUtil; +import com.hurence.logisland.validator.Configuration; import com.hurence.logisland.validator.StandardValidators; -import com.hurence.logisland.validator.ValidationContext; import com.hurence.logisland.validator.ValidationResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -148,7 +148,7 @@ protected PropertyDescriptor getSupportedDynamicPropertyDescriptor(final String } @Override - protected Collection customValidate(ValidationContext context) { + protected Collection customValidate(Configuration context) { final List validationResults = new ArrayList<>(super.customValidate(context)); // key regex and fields must be set together diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/datastore/EnrichRecords.java b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/datastore/EnrichRecords.java index 003c0e4cd..af5fe6ce2 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/datastore/EnrichRecords.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/datastore/EnrichRecords.java @@ -20,10 +20,10 @@ import com.hurence.logisland.processor.ProcessContext; import com.hurence.logisland.record.FieldDictionary; import com.hurence.logisland.record.Record; -import com.hurence.logisland.service.datastore.InvalidMultiGetQueryRecordException; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetQueryRecordBuilder; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; +import com.hurence.logisland.service.datastore.model.exception.InvalidMultiGetQueryRecordException; +import com.hurence.logisland.service.datastore.model.MultiGetQueryRecord; +import com.hurence.logisland.service.datastore.model.MultiGetQueryRecordBuilder; +import com.hurence.logisland.service.datastore.model.MultiGetResponseRecord; import com.hurence.logisland.validator.StandardValidators; import org.apache.commons.lang3.tuple.ImmutableTriple; import org.apache.commons.lang3.tuple.Triple; diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/datastore/MultiGet.java b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/datastore/MultiGet.java index d80869d6e..d3e5601e8 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/datastore/MultiGet.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/main/java/com/hurence/logisland/processor/datastore/MultiGet.java @@ -23,9 +23,9 @@ import com.hurence.logisland.record.FieldType; import com.hurence.logisland.record.Record; import com.hurence.logisland.record.StandardRecord; -import com.hurence.logisland.service.datastore.InvalidMultiGetQueryRecordException; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; +import com.hurence.logisland.service.datastore.model.exception.InvalidMultiGetQueryRecordException; +import com.hurence.logisland.service.datastore.model.MultiGetQueryRecord; +import com.hurence.logisland.service.datastore.model.MultiGetResponseRecord; import com.hurence.logisland.validator.StandardValidators; import java.util.*; diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/AddFieldsTest.java b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/AddFieldsTest.java index 06d4fc733..293d2b7c1 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/AddFieldsTest.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/AddFieldsTest.java @@ -428,4 +428,92 @@ public void testWithEexpressionLanguageInName() { out.assertFieldTypeEquals("_value1_", FieldType.STRING); out.assertRecordSizeEquals(sizeBeforeProcessing + 1);//should only have 3 more fields } + + @Test + public void testWithEexpressionLanguageUsingOutputFieldForCalculatingValue() { + Record record1 = new StandardRecord(); + record1.setField("is_PunchOut", FieldType.STRING, null); + record1.setField("is_PunchOut2", FieldType.STRING, "off"); + + TestRunner testRunner = TestRunners.newTestRunner(new AddFields()); + testRunner.setProperty(NormalizeFields.CONFLICT_RESOLUTION_POLICY, NormalizeFields.OVERWRITE_EXISTING); + testRunner.setProperty("is_PunchOut", + "${if ( is_PunchOut != null) return is_PunchOut; else return 'was null';}"); + testRunner.setProperty("is_PunchOut2", + "${if ( is_PunchOut2 != null) return is_PunchOut2; else return 'was null';}"); + testRunner.assertValid(); + testRunner.enqueue(record1); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertFieldEquals("is_PunchOut", "was null"); + out.assertFieldEquals("is_PunchOut2", "off"); + } + +// @Test +// public void testExpressionLanguageToConvertEs2_4_bollInto_ES_7_X_Bool() { +// /* +// false value in ES 2.4 : false, "false", "off", "no", "0", "" (empty string), 0, 0.0 +// Others are true +// +// In Es 7_X +// False values: false, "false", "" (empty string) +// True values: true, "true" +// */ +// Record record1 = new StandardRecord(); +// record1.setField("is_PunchOut", FieldType.STRING, null); +// record1.setField("is_PunchOut2", FieldType.STRING, ""); +// record1.setField("is_PunchOut3", FieldType.STRING, "undefined"); +// record1.setField("is_PunchOut4", FieldType.STRING, "true"); +// record1.setField("is_PunchOut5", FieldType.STRING, "false"); +// record1.setField("is_PunchOut6", FieldType.STRING, "0"); +// record1.setField("is_PunchOut7", FieldType.STRING, "1"); +// record1.setField("is_PunchOut8", FieldType.STRING, "off"); +// record1.setField("is_PunchOut9", FieldType.STRING, "no"); +// record1.setField("is_PunchOut10", FieldType.STRING, 0); +// record1.setField("is_PunchOut11", FieldType.STRING, 0.0); +// +// +// TestRunner testRunner = TestRunners.newTestRunner(new AddFields()); +// testRunner.setProperty(NormalizeFields.CONFLICT_RESOLUTION_POLICY, NormalizeFields.OVERWRITE_EXISTING); +// testRunner.setProperty("is_PunchOut", buildExpressionForField("is_PunchOut1")); +// testRunner.setProperty("is_PunchOut2", buildExpressionForField("is_PunchOut2")); +// testRunner.setProperty("is_PunchOut3", buildExpressionForField("is_PunchOut3")); +// testRunner.setProperty("is_PunchOut4", buildExpressionForField("is_PunchOut4")); +// testRunner.setProperty("is_PunchOut5", buildExpressionForField("is_PunchOut5")); +// testRunner.setProperty("is_PunchOut6", buildExpressionForField("is_PunchOut6")); +// testRunner.setProperty("is_PunchOut7", buildExpressionForField("is_PunchOut7")); +// testRunner.setProperty("is_PunchOut8", buildExpressionForField("is_PunchOut8")); +// testRunner.setProperty("is_PunchOut9", buildExpressionForField("is_PunchOut9")); +// testRunner.setProperty("is_PunchOut10", buildExpressionForField("is_PunchOut10")); +// testRunner.setProperty("is_PunchOut11", buildExpressionForField("is_PunchOut11")); +// testRunner.setProperty("is_PunchOut12", buildExpressionForField("is_PunchOut12")); +// testRunner.assertValid(); +// testRunner.enqueue(record1); +// testRunner.run(); +// testRunner.assertAllInputRecordsProcessed(); +// testRunner.assertOutputRecordsCount(1); +// +// MockRecord out = testRunner.getOutputRecords().get(0); +// out.assertFieldEquals("is_PunchOut", null); +// out.assertFieldEquals("is_PunchOut2", "false"); +// out.assertFieldEquals("is_PunchOut3", "false"); +// out.assertFieldEquals("is_PunchOut4", "true"); +// out.assertFieldEquals("is_PunchOut5", "false"); +// out.assertFieldEquals("is_PunchOut6", "false"); +// out.assertFieldEquals("is_PunchOut7", "true"); +// out.assertFieldEquals("is_PunchOut8", "false"); +// out.assertFieldEquals("is_PunchOut9", "false"); +// out.assertFieldEquals("is_PunchOut10", "S"); +// out.assertFieldEquals("is_PunchOut11", "S"); +// out.assertFieldEquals("is_PunchOut12", "S"); +// +// } +// +// private String buildExpressionForField(String fieldName) { +// return "${if ( " + fieldName + " == null ) return " + fieldName + "; \n " + +// "if ( " + fieldName + " == '' ) return false; else return true}"; +// } } diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/ApplyRegexpTest.java b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/ApplyRegexpTest.java index f7e4a83ef..7bf48c310 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/ApplyRegexpTest.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/ApplyRegexpTest.java @@ -147,6 +147,45 @@ public void testRegexpMultipleMoreOutputVarsThanGroups() { out.assertFieldEquals("part2", "text2"); } + @Test + public void testIpRegexWithPort() { + + Record record1 = getRecord(); + record1.setField("host", FieldType.STRING, "84.209.99.184:8888"); + + TestRunner testRunner = TestRunners.newTestRunner(new ApplyRegexp()); + testRunner.setProperty("host", "part1:((.+)(?=\\:)|\\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b)"); + testRunner.assertValid(); + testRunner.enqueue(record1); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(6); + out.assertFieldEquals("part1", "84.209.99.184"); + } + + @Test + public void testIpRegexWithoutPort() { + + Record record1 = getRecord(); + record1.setField("remoteHost", FieldType.STRING, "84.209.99.184"); + + TestRunner testRunner = TestRunners.newTestRunner(new ApplyRegexp()); + testRunner.setProperty("remoteHost", "remoteHost:((.+)(?=\\:)|\\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b)"); + testRunner.assertValid(); + testRunner.enqueue(record1); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(5); + out.assertFieldEquals("remoteHost", "84.209.99.184"); + } + + @Test public void testRegexpMultipleLessOutputVarsThanGroups() { diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/DebugStreamTest.java b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/DebugStreamTest.java index 5d0fd4754..5170163bc 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/DebugStreamTest.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/DebugStreamTest.java @@ -20,10 +20,10 @@ import com.hurence.logisland.record.StandardRecord; import com.hurence.logisland.util.runner.TestRunner; import com.hurence.logisland.util.runner.TestRunners; +import org.junit.Assert; import org.junit.Test; -import java.util.ArrayList; -import java.util.Collection; +import java.util.*; public class DebugStreamTest { @@ -74,4 +74,242 @@ public void testLogOfDebugStream() { testRunner.run(); testRunner.assertOutputRecordsCount(21); } + + @Test + public void testWithNestedRecord() { + Record record1 = new StandardRecord() + .setField("a", FieldType.STRING, "a1") + .setField("b", FieldType.STRING, "b1") + .setField("c", FieldType.LONG, 1); + Record record2 = new StandardRecord() + .setField("a", FieldType.STRING, "a2") + .setField("b", FieldType.STRING, "b2") + .setField("nested", FieldType.RECORD, record1); + Record record3 = new StandardRecord() + .setField("a", FieldType.STRING, "a3") + .setField("b", FieldType.STRING, "b3") + .setField("nested", FieldType.RECORD, record2); + Record record4 = new StandardRecord() + .setField("a", FieldType.STRING, "a3") + .setField("b", FieldType.STRING, "b3") + .setField("nested", FieldType.RECORD, record3) + .setField("nested_simple", FieldType.RECORD, record1); + + TestRunner testRunner = TestRunners.newTestRunner(new DebugStream()); + testRunner.setProcessorIdentifier("debug_1"); + testRunner.assertValid(); + testRunner.enqueue(Arrays.asList(record1, record2, record3, record4)); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(4); + testRunner.assertOutputErrorCount(0); + + //last one Should output something like this +// Record{ +// Field{name='a', type=string, rawValue=a3}, +// Field{name='b', type=string, rawValue=b3}, +// Field{name='nested', type=record, rawValue=Record{ +// Field{name='a', type=string, rawValue=a3}, +// Field{name='b', type=string, rawValue=b3}, +// Field{name='nested', type=record, rawValue=Record{ +// Field{name='a', type=string, rawValue=a2}, +// Field{name='b', type=string, rawValue=b2}, +// Field{name='nested', type=record, rawValue=Record{ +// Field{name='a', type=string, rawValue=a1}, +// Field{name='b', type=string, rawValue=b1}, +// Field{name='c', type=long, rawValue=1}, +// Field{name='record_id', type=string, rawValue=23e5fb95-4048-4321-8913-15aebaedfe7b}, +// Field{name='record_time', type=long, rawValue=1607969587760}, +// Field{name='record_type', type=string, rawValue=generic} +// }}, +// Field{name='record_id', type=string, rawValue=106cd6db-0873-43f3-9ead-dc05ae70ffc5}, +// Field{name='record_time', type=long, rawValue=1607969587760}, +// Field{name='record_type', type=string, rawValue=generic} +// }}, +// Field{name='record_id', type=string, rawValue=32cb5007-f9e2-4247-9588-5f0f1d57157f}, +// Field{name='record_time', type=long, rawValue=1607969587760}, +// Field{name='record_type', type=string, rawValue=generic} +// }}, +// Field{name='nested_simple', type=record, rawValue=Record{ +// Field{name='a', type=string, rawValue=a1}, +// Field{name='b', type=string, rawValue=b1}, +// Field{name='c', type=long, rawValue=1}, +// Field{name='record_id', type=string, rawValue=23e5fb95-4048-4321-8913-15aebaedfe7b}, +// Field{name='record_time', type=long, rawValue=1607969587760}, +// Field{name='record_type', type=string, rawValue=generic} +// }}, +// Field{name='record_id', type=string, rawValue=b2ca6894-91db-44a7-a150-885474036849}, +// Field{name='record_time', type=long, rawValue=1607969587760}, +// Field{name='record_type', type=string, rawValue=generic} +// } + + } + + @Test + public void testWithAllBasictype() { + Map map = new HashMap<>(); + map.put("hi", 4L); + map.put("hi2", 5L); + Map mapObject = new HashMap<>(); + mapObject.put("un", new Date()); + mapObject.put("CoordinateWithoutBean", new CoordinateWithoutBean(3, 55 )); + mapObject.put("CoordinateWithBean", new CoordinateWithBean(3, 55 )); + Record record1 = new StandardRecord() + .setField("STRING", FieldType.STRING, "a1") + .setField("INT", FieldType.INT, 1) + .setField("BOOLEAN", FieldType.BOOLEAN, true) + .setField("BYTES", FieldType.BYTES, new byte[]{1, 2, 3})//TODO how to show correctly bytes in debugstream + .setField("DATETIME", FieldType.DATETIME, new Date()) + .setField("DOUBLE", FieldType.DOUBLE, 1d) + .setField("FLOAT", FieldType.FLOAT, 1f) + .setField("ENUM", FieldType.ENUM, TOTO.UN) + .setField("LONG", FieldType.LONG, 1L) + .setField("MAP", FieldType.MAP, map) + .setField("MAP2", FieldType.MAP, mapObject) + .setField("NULLNOTNULL", FieldType.NULL, 1L) + .setField("NULLNOTNULL2", FieldType.NULL, "not null") + .setField("NULL", FieldType.NULL, null) + .setField("OBJECT", FieldType.OBJECT, "not null") + .setField("OBJECT null", FieldType.OBJECT, null) + .setField("OBJECT CoordinateWithoutBean", FieldType.OBJECT, new CoordinateWithoutBean(2, 5)) + .setField("OBJECT CoordinateWithBean", FieldType.OBJECT, new CoordinateWithBean(2, 5)); + + TestRunner testRunner = TestRunners.newTestRunner(new DebugStream()); + testRunner.setProcessorIdentifier("debug_1"); + testRunner.assertValid(); + testRunner.enqueue(Arrays.asList(record1)); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + testRunner.assertOutputErrorCount(0); + + //Should output something like this +// "Record{\n" + +// Field{name='BOOLEAN', type=boolean, rawValue=true},\n" + +// Field{name='BYTES', type=bytes, rawValue=[B@5a39699c},\n" + +// Field{name='DATETIME', type=datetime, rawValue=Mon Dec 14 17:49:37 CET 2020},\n" + +// Field{name='DOUBLE', type=double, rawValue=1.0},\n" + +// Field{name='ENUM', type=enum, rawValue=UN},\n" + +// Field{name='FLOAT', type=float, rawValue=1.0},\n" + +// Field{name='INT', type=int, rawValue=1},\n" + +// Field{name='LONG', type=long, rawValue=1},\n" + +// Field{name='MAP', type=map, rawValue={hi2=5, hi=4}},\n" + +// Field{name='MAP2', type=map, rawValue={CoordinateWithBean=cordinate{x=3, y=55}, CoordinateWithoutBean=cordinate{x=3, y=55}, un=Mon Dec 14 17:49:37 CET 2020}},\n" + +// Field{name='NULL', type=null, rawValue=null},\n" + +// Field{name='NULLNOTNULL', type=null, rawValue=1},\n" + +// Field{name='NULLNOTNULL2', type=null, rawValue=not null},\n" + +// Field{name='OBJECT', type=object, rawValue=not null},\n" + +// Field{name='OBJECT CoordinateWithBean', type=object, rawValue=cordinate{x=2, y=5}},\n" + +// Field{name='OBJECT CoordinateWithoutBean', type=object, rawValue=cordinate{x=2, y=5}},\n" + +// Field{name='OBJECT null', type=object, rawValue=null},\n" + +// Field{name='STRING', type=string, rawValue=a1},\n" + +// Field{name='record_id', type=string, rawValue=66b12461-1a31-4763-885c-a50a07deedd5},\n" + +// Field{name='record_time', type=long, rawValue=1607964577381},\n" + +// Field{name='record_type', type=string, rawValue=generic}\n" + +// }"; + + + } + + @Test + public void testWithArrayComplextype() { + Record record1 = new StandardRecord() + .setField("listString", FieldType.ARRAY, Arrays.asList("a,b,c")) + .setField("listInt", FieldType.ARRAY, Arrays.asList(1,2,3)) + .setField("listObj", FieldType.ARRAY, Arrays.asList(new CoordinateWithoutBean(1,2), new CoordinateWithoutBean(12,22))) + .setField("listBytes", FieldType.ARRAY, Arrays.asList((byte)1, (byte)2, (byte)55)) + .setField("arrayString", FieldType.ARRAY, new String[]{"a,b,c"}) + .setField("arrayInt", FieldType.ARRAY, new int[]{1,2,3}) + .setField("arrayObj", FieldType.ARRAY, new Object[]{new CoordinateWithoutBean(1,2), new CoordinateWithoutBean(12,22)}) + .setField("arrayBytes", FieldType.ARRAY, new byte[]{1, 2, 55}); + + TestRunner testRunner = TestRunners.newTestRunner(new DebugStream()); + testRunner.setProcessorIdentifier("debug_1"); + testRunner.assertValid(); + testRunner.enqueue(Arrays.asList(record1)); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + testRunner.assertOutputErrorCount(0); + + //Should output something like this + } + + @Test + public void testWithEmptyRecord() { + Record record1 = new StandardRecord(); + + TestRunner testRunner = TestRunners.newTestRunner(new DebugStream()); + testRunner.setProcessorIdentifier("debug_1"); + testRunner.assertValid(); + testRunner.enqueue(Collections.singletonList(record1)); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + testRunner.assertOutputErrorCount(0); + + //Should output something like this +// Record{ +// Field{name='record_id', type=string, rawValue=96f6bf08-f822-4787-b79e-0bf0fc03ceb4}, +// Field{name='record_time', type=long, rawValue=1607964909920}, +// Field{name='record_type', type=string, rawValue=generic} +// } + } + + private enum TOTO { + UN,DEUX + } + private class CoordinateWithoutBean { + int x; + int y; + + public CoordinateWithoutBean(int x, int y) { + this.x = x; + this.y = y; + } + + @Override + public String toString() { + return "cordinate{" + + "x=" + x + + ", y=" + y + + '}'; + } + } + + private class CoordinateWithBean { + int x; + int y; + + public CoordinateWithBean(int x, int y) { + this.x = x; + this.y = y; + } + + @Override + public String toString() { + return "cordinate{" + + "x=" + x + + ", y=" + y + + '}'; + } + + public int getX() { + return x; + } + + public CoordinateWithBean setX(int x) { + this.x = x; + return this; + } + + public int getY() { + return y; + } + + public CoordinateWithBean setY(int y) { + this.y = y; + return this; + } + } } diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/DecodeBase64Test.java b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/DecodeBase64Test.java index e69b4ea4a..e1db5fd63 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/DecodeBase64Test.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/DecodeBase64Test.java @@ -1,3 +1,18 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.hurence.logisland.processor; import com.hurence.logisland.record.StandardRecord; diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/EncodeBase64Test.java b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/EncodeBase64Test.java index 1da636fd5..f316fd653 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/EncodeBase64Test.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/EncodeBase64Test.java @@ -1,3 +1,18 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.hurence.logisland.processor; import com.hurence.logisland.record.FieldType; diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/EncryptorAESTest.java b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/EncryptorAESTest.java index 645a2cc3f..33f44cbfe 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/EncryptorAESTest.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/EncryptorAESTest.java @@ -275,12 +275,12 @@ public void testProcessingEncryptionAllTypesAES() throws Exception { out1.assertFieldEquals("boolean2", false); byte[] expectedBytes = EncryptField.toByteArray(type); byte[] expectedBytes1 = EncryptField.toByteArray(method); - Assert.assertTrue(Arrays.equals(expectedBytes,EncryptField.toByteArray(out.getField("enum1").getRawValue()))); - Assert.assertTrue(Arrays.equals( expectedBytes1, EncryptField.toByteArray(out.getField("enum2").getRawValue()))); + Assert.assertTrue(Arrays.equals(expectedBytes,EncryptField.toByteArray(out1.getField("enum1").getRawValue()))); + Assert.assertTrue(Arrays.equals( expectedBytes1, EncryptField.toByteArray(out1.getField("enum2").getRawValue()))); byte[] expectedBytes2 = EncryptField.toByteArray(date); byte[] expectedBytes3 = EncryptField.toByteArray(date1); - Assert.assertTrue(Arrays.equals(expectedBytes2,EncryptField.toByteArray(out.getField("date1").getRawValue())) ); - Assert.assertTrue(Arrays.equals( expectedBytes3, EncryptField.toByteArray(out.getField("date2").getRawValue()))); + Assert.assertTrue(Arrays.equals(expectedBytes2,EncryptField.toByteArray(out1.getField("date1").getRawValue())) ); + Assert.assertTrue(Arrays.equals( expectedBytes3, EncryptField.toByteArray(out1.getField("date2").getRawValue()))); } } diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/EncryptorDESTest.java b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/EncryptorDESTest.java index da12e1fc2..bd8c1f829 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/EncryptorDESTest.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/EncryptorDESTest.java @@ -251,12 +251,12 @@ public void testProcessingEncryptionAllTypesDES() throws Exception { out1.assertFieldEquals("boolean2", false); byte[] expectedBytes = EncryptField.toByteArray(type); byte[] expectedBytes1 = EncryptField.toByteArray(method); - Assert.assertTrue(Arrays.equals(expectedBytes,EncryptField.toByteArray(out.getField("enum1").getRawValue()))); - Assert.assertTrue(Arrays.equals( expectedBytes1, EncryptField.toByteArray(out.getField("enum2").getRawValue()))); + Assert.assertTrue(Arrays.equals(expectedBytes,EncryptField.toByteArray(out1.getField("enum1").getRawValue()))); + Assert.assertTrue(Arrays.equals( expectedBytes1, EncryptField.toByteArray(out1.getField("enum2").getRawValue()))); byte[] expectedBytes2 = EncryptField.toByteArray(date); byte[] expectedBytes3 = EncryptField.toByteArray(date1); - Assert.assertTrue(Arrays.equals(expectedBytes2,EncryptField.toByteArray(out.getField("date1").getRawValue())) ); - Assert.assertTrue(Arrays.equals( expectedBytes3, EncryptField.toByteArray(out.getField("date2").getRawValue()))); + Assert.assertTrue(Arrays.equals(expectedBytes2,EncryptField.toByteArray(out1.getField("date1").getRawValue())) ); + Assert.assertTrue(Arrays.equals( expectedBytes3, EncryptField.toByteArray(out1.getField("date2").getRawValue()))); } } diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/EncryptorDESedeTest.java b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/EncryptorDESedeTest.java index 7a5f0faeb..85bb3441a 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/EncryptorDESedeTest.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/EncryptorDESedeTest.java @@ -251,12 +251,12 @@ public void testProcessingEncryptionAllTypesDES() throws Exception { out1.assertFieldEquals("boolean2", false); byte[] expectedBytes = EncryptField.toByteArray(type); byte[] expectedBytes1 = EncryptField.toByteArray(method); - Assert.assertTrue(Arrays.equals(expectedBytes,EncryptField.toByteArray(out.getField("enum1").getRawValue()))); - Assert.assertTrue(Arrays.equals( expectedBytes1, EncryptField.toByteArray(out.getField("enum2").getRawValue()))); + Assert.assertTrue(Arrays.equals(expectedBytes,EncryptField.toByteArray(out1.getField("enum1").getRawValue()))); + Assert.assertTrue(Arrays.equals( expectedBytes1, EncryptField.toByteArray(out1.getField("enum2").getRawValue()))); byte[] expectedBytes2 = EncryptField.toByteArray(date); byte[] expectedBytes3 = EncryptField.toByteArray(date1); - Assert.assertTrue(Arrays.equals(expectedBytes2,EncryptField.toByteArray(out.getField("date1").getRawValue())) ); - Assert.assertTrue(Arrays.equals( expectedBytes3, EncryptField.toByteArray(out.getField("date2").getRawValue()))); + Assert.assertTrue(Arrays.equals(expectedBytes2,EncryptField.toByteArray(out1.getField("date1").getRawValue())) ); + Assert.assertTrue(Arrays.equals( expectedBytes3, EncryptField.toByteArray(out1.getField("date2").getRawValue()))); } diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/EncryptorRSATest.java b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/EncryptorRSATest.java index 3eeae4f5d..d1d1bf357 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/EncryptorRSATest.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/EncryptorRSATest.java @@ -206,12 +206,12 @@ public void testProcessingEncryptionAllTypesRSA_DER() throws Exception { out1.assertFieldEquals("boolean2", false); byte[] expectedBytes = EncryptField.toByteArray(type); byte[] expectedBytes1 = EncryptField.toByteArray(method); - Assert.assertTrue(Arrays.equals(expectedBytes,EncryptField.toByteArray(out.getField("enum1").getRawValue()))); - Assert.assertTrue(Arrays.equals( expectedBytes1, EncryptField.toByteArray(out.getField("enum2").getRawValue()))); + Assert.assertTrue(Arrays.equals(expectedBytes,EncryptField.toByteArray(out1.getField("enum1").getRawValue()))); + Assert.assertTrue(Arrays.equals( expectedBytes1, EncryptField.toByteArray(out1.getField("enum2").getRawValue()))); byte[] expectedBytes2 = EncryptField.toByteArray(date); byte[] expectedBytes3 = EncryptField.toByteArray(date1); - Assert.assertTrue(Arrays.equals(expectedBytes2,EncryptField.toByteArray(out.getField("date1").getRawValue())) ); - Assert.assertTrue(Arrays.equals( expectedBytes3, EncryptField.toByteArray(out.getField("date2").getRawValue()))); + Assert.assertTrue(Arrays.equals(expectedBytes2,EncryptField.toByteArray(out1.getField("date1").getRawValue())) ); + Assert.assertTrue(Arrays.equals( expectedBytes3, EncryptField.toByteArray(out1.getField("date2").getRawValue()))); } @@ -391,12 +391,12 @@ public void testProcessingEncryptionAllTypesRSA_PEM() throws Exception { out1.assertFieldEquals("boolean2", false); byte[] expectedBytes = EncryptField.toByteArray(type); byte[] expectedBytes1 = EncryptField.toByteArray(method); - Assert.assertTrue(Arrays.equals(expectedBytes,EncryptField.toByteArray(out.getField("enum1").getRawValue()))); - Assert.assertTrue(Arrays.equals( expectedBytes1, EncryptField.toByteArray(out.getField("enum2").getRawValue()))); + Assert.assertTrue(Arrays.equals(expectedBytes,EncryptField.toByteArray(out1.getField("enum1").getRawValue()))); + Assert.assertTrue(Arrays.equals( expectedBytes1, EncryptField.toByteArray(out1.getField("enum2").getRawValue()))); byte[] expectedBytes2 = EncryptField.toByteArray(date); byte[] expectedBytes3 = EncryptField.toByteArray(date1); - Assert.assertTrue(Arrays.equals(expectedBytes2,EncryptField.toByteArray(out.getField("date1").getRawValue())) ); - Assert.assertTrue(Arrays.equals( expectedBytes3, EncryptField.toByteArray(out.getField("date2").getRawValue()))); + Assert.assertTrue(Arrays.equals(expectedBytes2,EncryptField.toByteArray(out1.getField("date1").getRawValue())) ); + Assert.assertTrue(Arrays.equals( expectedBytes3, EncryptField.toByteArray(out1.getField("date2").getRawValue()))); } diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/ParsePropertiesTest.java b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/ParsePropertiesTest.java index fc5ebc6de..d40a0f7d2 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/ParsePropertiesTest.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/ParsePropertiesTest.java @@ -19,6 +19,7 @@ import com.hurence.logisland.record.FieldType; import com.hurence.logisland.record.Record; import com.hurence.logisland.record.StandardRecord; +import com.hurence.logisland.util.runner.MockRecord; import com.hurence.logisland.util.runner.TestRunner; import com.hurence.logisland.util.runner.TestRunners; import org.junit.Test; @@ -66,19 +67,20 @@ public void testPropertiesClean() { testRunner.run(); testRunner.assertAllInputRecordsProcessed(); testRunner.assertOutputRecordsCount(1); - - assertEquals(10, record1.getAllFields().size()); - assertEquals("value1", record1.getField("string1").getRawValue()); - assertEquals(FieldType.STRING, record1.getField("string1").getType()); - assertEquals("value2", record1.getField("string2").getRawValue()); - assertEquals(FieldType.STRING, record1.getField("string2").getType()); - assertEquals(1, record1.getField("long1").getRawValue()); - assertEquals(FieldType.LONG, record1.getField("long1").getType()); - assertEquals(2, record1.getField("long2").getRawValue()); - assertEquals(FieldType.LONG, record1.getField("long2").getType()); - assertEquals("1", record1.getField("a").getRawValue()); - assertEquals("2", record1.getField("b").getRawValue()); - assertEquals("3", record1.getField("c").getRawValue()); + MockRecord out1 = testRunner.getOutputRecords().get(0); + + assertEquals(10, out1.getAllFields().size()); + assertEquals("value1", out1.getField("string1").getRawValue()); + assertEquals(FieldType.STRING, out1.getField("string1").getType()); + assertEquals("value2", out1.getField("string2").getRawValue()); + assertEquals(FieldType.STRING, out1.getField("string2").getType()); + assertEquals(1, out1.getField("long1").getRawValue()); + assertEquals(FieldType.LONG, out1.getField("long1").getType()); + assertEquals(2, out1.getField("long2").getRawValue()); + assertEquals(FieldType.LONG, out1.getField("long2").getType()); + assertEquals("1", out1.getField("a").getRawValue()); + assertEquals("2", out1.getField("b").getRawValue()); + assertEquals("3", out1.getField("c").getRawValue()); } @Test @@ -93,15 +95,16 @@ public void testPropertiesWithHeadAndTrailingSpaces() { testRunner.run(); testRunner.assertAllInputRecordsProcessed(); testRunner.assertOutputRecordsCount(1); - - assertEquals(10, record1.getAllFields().size()); - assertField(record1, "string1", "value1", FieldType.STRING); - assertField(record1, "string2", "value2", FieldType.STRING); - assertField(record1, "long1", 1, FieldType.LONG); - assertField(record1, "long2", 2, FieldType.LONG); - assertField(record1, "a", "1", FieldType.STRING); - assertField(record1, "b", "2", FieldType.STRING); - assertField(record1, "c", "3", FieldType.STRING); + MockRecord out1 = testRunner.getOutputRecords().get(0); + + assertEquals(10, out1.getAllFields().size()); + assertField(out1, "string1", "value1", FieldType.STRING); + assertField(out1, "string2", "value2", FieldType.STRING); + assertField(out1, "long1", 1, FieldType.LONG); + assertField(out1, "long2", 2, FieldType.LONG); + assertField(out1, "a", "1", FieldType.STRING); + assertField(out1, "b", "2", FieldType.STRING); + assertField(out1, "c", "3", FieldType.STRING); } private void assertField(Record record, String key, Object value, FieldType type) { diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/SplitFieldTest.java b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/SplitFieldTest.java index a145fd63b..db6c955a1 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/SplitFieldTest.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/SplitFieldTest.java @@ -1,12 +1,12 @@ /** * Copyright (C) 2016 Hurence (support@hurence.com) - *

+ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

+ * + * 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. diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/SplitRecordTest.java b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/SplitRecordTest.java index 8e5acca0c..3470398e9 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/SplitRecordTest.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/SplitRecordTest.java @@ -1,3 +1,18 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.hurence.logisland.processor; import com.hurence.logisland.record.FieldType; diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/SplitTextTest.java b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/SplitTextTest.java index 8787dd958..c73405744 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/SplitTextTest.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/SplitTextTest.java @@ -26,6 +26,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -111,7 +112,7 @@ public void testApacheLog() { } @Test - public void testApacheLogWithoutRawContent() { + public void testApacheLogWithoutRawContent() throws IOException { final TestRunner testRunner = TestRunners.newTestRunner(new SplitText()); final RecordValidator avroValidator = new AvroRecordValidator(SplitTextTest.class.getResourceAsStream(APACHE_LOG_SCHEMA)); testRunner.setProperty(SplitText.VALUE_REGEX, APACHE_LOG_REGEX); diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/datastore/MockDatastoreService.java b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/datastore/MockDatastoreService.java index 939179f96..8faa486cb 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/datastore/MockDatastoreService.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/datastore/MockDatastoreService.java @@ -23,9 +23,9 @@ import com.hurence.logisland.record.StandardRecord; import com.hurence.logisland.service.datastore.DatastoreClientService; import com.hurence.logisland.service.datastore.DatastoreClientServiceException; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; -import com.hurence.logisland.validator.ValidationContext; +import com.hurence.logisland.service.datastore.model.MultiGetQueryRecord; +import com.hurence.logisland.service.datastore.model.MultiGetResponseRecord; +import com.hurence.logisland.validator.Configuration; import com.hurence.logisland.validator.ValidationResult; import java.util.*; @@ -34,6 +34,16 @@ public class MockDatastoreService implements DatastoreClientService { Map> collections = new HashMap<>(); + @Override + public void waitUntilCollectionReady(String name, long timeoutMilli) throws DatastoreClientServiceException { + + } + + @Override + public void waitUntilCollectionReady(String name) throws DatastoreClientServiceException { + + } + @Override public void createCollection(String name, int partitionsCount, int replicationFactor) throws DatastoreClientServiceException { collections.computeIfAbsent(name, k -> new HashMap<>()); @@ -145,7 +155,7 @@ public void initialize(ControllerServiceInitializationContext context) throws In } @Override - public Collection validate(ValidationContext context) { + public Collection validate(Configuration context) { return Collections.emptyList(); } diff --git a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/util/BaseSyslogTest.java b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/util/BaseSyslogTest.java index 83e99e2be..6a3c2a1ff 100644 --- a/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/util/BaseSyslogTest.java +++ b/logisland-components/logisland-processors/logisland-processor-common/src/test/java/com/hurence/logisland/processor/util/BaseSyslogTest.java @@ -28,7 +28,6 @@ import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; -import org.junit.Assert; import java.io.*; import java.net.URI; @@ -160,8 +159,8 @@ protected TestRunner createTestRunner(String confPath, String processorName) thr return createTestRunner(processorConfiguration); } - protected TestRunner createTestRunner(ProcessorConfiguration processorsConfiguration) throws Exception { - ProcessContext processContext = ComponentFactory.getProcessContext(processorsConfiguration).get(); + protected TestRunner createTestRunner(ProcessorConfiguration processorsConfiguration) { + ProcessContext processContext = ComponentFactory.buildAndSetUpProcessContext(processorsConfiguration); return TestRunners.newTestRunner(processContext); } diff --git a/logisland-components/logisland-processors/logisland-processor-computer-vision/pom.xml b/logisland-components/logisland-processors/logisland-processor-computer-vision/pom.xml index 418ae0ecd..2d8acc9d5 100644 --- a/logisland-components/logisland-processors/logisland-processor-computer-vision/pom.xml +++ b/logisland-components/logisland-processors/logisland-processor-computer-vision/pom.xml @@ -23,7 +23,7 @@ com.hurence.logisland logisland-processors - 1.3.0 + 1.4.0 logisland-processor-computer-vision @@ -73,7 +73,7 @@ com.hurence.logisland logisland-api - 1.3.0 + 1.4.0 compile @@ -85,7 +85,7 @@ com.hurence.logisland logisland-utils - 1.3.0 + 1.4.0 test @@ -132,26 +132,15 @@ - org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - diff --git a/logisland-components/logisland-processors/logisland-processor-computer-vision/src/main/java/com/hurence/logisland/cv/processor/RunScript.java b/logisland-components/logisland-processors/logisland-processor-computer-vision/src/main/java/com/hurence/logisland/cv/processor/RunScript.java index 7f0eb6314..ef3075b1b 100644 --- a/logisland-components/logisland-processors/logisland-processor-computer-vision/src/main/java/com/hurence/logisland/cv/processor/RunScript.java +++ b/logisland-components/logisland-processors/logisland-processor-computer-vision/src/main/java/com/hurence/logisland/cv/processor/RunScript.java @@ -1,12 +1,12 @@ /** * Copyright (C) 2016 Hurence (support@hurence.com) - *

+ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

+ * + * 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. diff --git a/logisland-components/logisland-processors/logisland-processor-computer-vision/src/main/java/com/hurence/logisland/cv/utils/CVUtils.java b/logisland-components/logisland-processors/logisland-processor-computer-vision/src/main/java/com/hurence/logisland/cv/utils/CVUtils.java index 72af04bfa..ce652d3b9 100644 --- a/logisland-components/logisland-processors/logisland-processor-computer-vision/src/main/java/com/hurence/logisland/cv/utils/CVUtils.java +++ b/logisland-components/logisland-processors/logisland-processor-computer-vision/src/main/java/com/hurence/logisland/cv/utils/CVUtils.java @@ -1,3 +1,18 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.hurence.logisland.cv.utils; import com.hurence.logisland.processor.ProcessException; diff --git a/logisland-components/logisland-processors/logisland-processor-computer-vision/src/test/java/com/hurence/logisland/cv/processor/ClojureWrapper.java b/logisland-components/logisland-processors/logisland-processor-computer-vision/src/test/java/com/hurence/logisland/cv/processor/ClojureWrapper.java index f5764935d..2402e06d7 100644 --- a/logisland-components/logisland-processors/logisland-processor-computer-vision/src/test/java/com/hurence/logisland/cv/processor/ClojureWrapper.java +++ b/logisland-components/logisland-processors/logisland-processor-computer-vision/src/test/java/com/hurence/logisland/cv/processor/ClojureWrapper.java @@ -1,3 +1,18 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.hurence.logisland.cv.processor; import clojure.lang.RT; diff --git a/logisland-components/logisland-processors/logisland-processor-computer-vision/src/test/java/com/hurence/logisland/cv/processor/RunScriptTest.java b/logisland-components/logisland-processors/logisland-processor-computer-vision/src/test/java/com/hurence/logisland/cv/processor/RunScriptTest.java index 9c40c03a5..40122397e 100644 --- a/logisland-components/logisland-processors/logisland-processor-computer-vision/src/test/java/com/hurence/logisland/cv/processor/RunScriptTest.java +++ b/logisland-components/logisland-processors/logisland-processor-computer-vision/src/test/java/com/hurence/logisland/cv/processor/RunScriptTest.java @@ -1,12 +1,12 @@ /** * Copyright (C) 2016 Hurence (support@hurence.com) - *

+ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

+ * + * 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. diff --git a/logisland-components/logisland-processors/logisland-processor-cyber-security/pom.xml b/logisland-components/logisland-processors/logisland-processor-cyber-security/pom.xml index 3378f9957..48f3df525 100644 --- a/logisland-components/logisland-processors/logisland-processor-cyber-security/pom.xml +++ b/logisland-components/logisland-processors/logisland-processor-cyber-security/pom.xml @@ -23,7 +23,7 @@ com.hurence.logisland logisland-processors - 1.3.0 + 1.4.0 logisland-processor-cyber-security @@ -106,20 +106,10 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - diff --git a/logisland-components/logisland-processors/logisland-processor-elasticsearch/pom.xml b/logisland-components/logisland-processors/logisland-processor-elasticsearch/pom.xml index a0cabe4fa..84442ca68 100644 --- a/logisland-components/logisland-processors/logisland-processor-elasticsearch/pom.xml +++ b/logisland-components/logisland-processors/logisland-processor-elasticsearch/pom.xml @@ -23,7 +23,7 @@ com.hurence.logisland logisland-processors - 1.3.0 + 1.4.0 logisland-processor-elasticsearch @@ -91,20 +91,10 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - diff --git a/logisland-components/logisland-processors/logisland-processor-elasticsearch/src/main/java/com/hurence/logisland/processor/elasticsearch/EnrichRecordsElasticsearch.java b/logisland-components/logisland-processors/logisland-processor-elasticsearch/src/main/java/com/hurence/logisland/processor/elasticsearch/EnrichRecordsElasticsearch.java index 274f7efb1..e76503594 100644 --- a/logisland-components/logisland-processors/logisland-processor-elasticsearch/src/main/java/com/hurence/logisland/processor/elasticsearch/EnrichRecordsElasticsearch.java +++ b/logisland-components/logisland-processors/logisland-processor-elasticsearch/src/main/java/com/hurence/logisland/processor/elasticsearch/EnrichRecordsElasticsearch.java @@ -19,16 +19,19 @@ import com.hurence.logisland.annotation.documentation.CapabilityDescription; import com.hurence.logisland.annotation.documentation.ExtraDetailFile; import com.hurence.logisland.annotation.documentation.Tags; +import com.hurence.logisland.classloading.PluginProxy; import com.hurence.logisland.component.InitializationException; import com.hurence.logisland.component.PropertyDescriptor; import com.hurence.logisland.processor.ProcessContext; import com.hurence.logisland.processor.ProcessError; import com.hurence.logisland.record.FieldDictionary; import com.hurence.logisland.record.Record; -import com.hurence.logisland.service.datastore.InvalidMultiGetQueryRecordException; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetQueryRecordBuilder; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; +import com.hurence.logisland.service.cache.CacheService; +import com.hurence.logisland.service.datastore.model.exception.InvalidMultiGetQueryRecordException; +import com.hurence.logisland.service.datastore.model.MultiGetQueryRecord; +import com.hurence.logisland.service.datastore.model.MultiGetQueryRecordBuilder; +import com.hurence.logisland.service.datastore.model.MultiGetResponseRecord; +import com.hurence.logisland.service.elasticsearch.ElasticsearchClientService; import com.hurence.logisland.validator.StandardValidators; import org.apache.commons.lang3.tuple.ImmutableTriple; import org.apache.commons.lang3.tuple.Triple; @@ -68,7 +71,7 @@ public class EnrichRecordsElasticsearch extends AbstractElasticsearchProcessor { .name("es.type") .description("The name of the ES type to use in multiget query.") .required(false) - .defaultValue("default") + .defaultValue("_doc") .expressionLanguageSupported(true) .build(); @@ -89,10 +92,18 @@ public class EnrichRecordsElasticsearch extends AbstractElasticsearchProcessor { .defaultValue("N/A") .build(); + public static final PropertyDescriptor CACHE_SERVICE = new PropertyDescriptor.Builder() + .name("cache.service") + .description("The instance of the Cache Service to use (optional).") + .required(false) + .identifiesControllerService(CacheService.class) + .build(); + private static final String ATTRIBUTE_MAPPING_SEPARATOR = ":"; private static final String ATTRIBUTE_MAPPING_SEPARATOR_REGEXP = "\\s*"+ATTRIBUTE_MAPPING_SEPARATOR+"\\s*"; private String[] excludesArray = null; + private CacheService cacheService = null; @Override public List getSupportedPropertyDescriptors() { @@ -104,11 +115,11 @@ public List getSupportedPropertyDescriptors() { props.add(ES_TYPE_FIELD); props.add(ES_INCLUDES_FIELD); props.add(ES_EXCLUDES_FIELD); + props.add(CACHE_SERVICE); return Collections.unmodifiableList(props); } - @Override public void init(final ProcessContext context) throws InitializationException { super.init(context); @@ -116,6 +127,8 @@ public void init(final ProcessContext context) throws InitializationException { if ((excludesFieldName != null) && (!excludesFieldName.isEmpty())) { excludesArray = excludesFieldName.split("\\s*,\\s*"); } + + cacheService = PluginProxy.rewrap(context.getPropertyValue(CACHE_SERVICE).asControllerService()); } /** @@ -131,6 +144,7 @@ public Collection process(final ProcessContext context, final Collection return Collections.emptyList(); } + Map esInfoFromCache = new HashMap(); List> recordsToEnrich = new ArrayList<>(); MultiGetQueryRecordBuilder mgqrBuilder = new MultiGetQueryRecordBuilder(); @@ -143,22 +157,41 @@ public Collection process(final ProcessContext context, final Collection String typeName = evaluatePropAsString(record, context, ES_TYPE_FIELD); String includesFieldName = evaluatePropAsString(record, context, ES_INCLUDES_FIELD); + String[] includesArray = null; + try { + // Includes : + if ((includesFieldName != null) && (!includesFieldName.isEmpty())) { + includesArray = includesFieldName.split("\\s*,\\s*"); + } + } catch (Throwable t) { + record.setStringField(FieldDictionary.RECORD_ERRORS, "Can not request ElasticSearch with " + indexName + " " + typeName + " " + recordKeyName); + getLogger().error("Can not request ElasticSearch with index: {}, type: {}, recordKey: {}, record id is :\n{}", + new Object[]{ indexName, typeName, recordKeyName, record.getId() }, + t); + } + IncludeFields includeFields = new IncludeFields(includesArray); + if (recordKeyName != null && indexName != null && typeName != null) { - try { - // Includes : - String[] includesArray = null; - if ((includesFieldName != null) && (!includesFieldName.isEmpty())) { - includesArray = includesFieldName.split("\\s*,\\s*"); - } - IncludeFields includeFields = new IncludeFields(includesArray); + + // Compute unique key for the ES entry to get ans also stored in the cache + String esKey = asUniqueKey(indexName, typeName, recordKeyName); + + // Is info es info already present in the cache ? + MultiGetResponseRecord multiGetResponseRecord = null; + if (cacheService != null) { + // Retrieve es doc fields from cache if it exists + multiGetResponseRecord = cacheService.get(esKey); + } + if (multiGetResponseRecord != null) { + // Info is already in cache, store it + esInfoFromCache.put(asUniqueKey(multiGetResponseRecord), multiGetResponseRecord); + } else { + // Info is not yet in the cache, add it to the list of info to fetch from ES mgqrBuilder.add(indexName, typeName, includeFields.getAttrsToIncludeArray(), recordKeyName); - recordsToEnrich.add(new ImmutableTriple(record, asUniqueKey(indexName, typeName, recordKeyName), includeFields)); - } catch (Throwable t) { - record.setStringField(FieldDictionary.RECORD_ERRORS, "Can not request ElasticSearch with " + indexName + " " + typeName + " " + recordKeyName); - getLogger().error("Can not request ElasticSearch with index: {}, type: {}, recordKey: {}, record id is :\n{}", - new Object[]{ indexName, typeName, recordKeyName, record.getId() }, - t); } + + // All records are anyway to be enriched + recordsToEnrich.add(new ImmutableTriple(record, esKey, includeFields)); } else { getLogger().warn("Can not request ElasticSearch with " + "index: {}, type: {}, recordKey: {}, record id is :\n{}", @@ -166,25 +199,35 @@ public Collection process(final ProcessContext context, final Collection } } + // Ask ES for missing info List multiGetResponseRecords = null; try { List mgqrs = mgqrBuilder.build(); - if (mgqrs.isEmpty()) return records; + if (mgqrs.isEmpty() && esInfoFromCache.size() == 0) return records; multiGetResponseRecords = elasticsearchClientService.multiGet(mgqrs); } catch (InvalidMultiGetQueryRecordException e ) { getLogger().error("error while multiGet elasticsearch", e); } - if (multiGetResponseRecords == null || multiGetResponseRecords.isEmpty()) { + if ( (multiGetResponseRecords == null || multiGetResponseRecords.isEmpty()) && esInfoFromCache.size() == 0) { return records; } - // Transform the returned documents from ES in a Map Map responses = multiGetResponseRecords. stream(). collect(Collectors.toMap(EnrichRecordsElasticsearch::asUniqueKey, Function.identity())); + if (cacheService != null) { + // Update cache with newly retrieved info from ES + responses.forEach((esKey, multiGetResponseRecord) -> { + cacheService.set(esKey, multiGetResponseRecord); + }); + + // Add to responses info that were already present in the cache + responses.putAll(esInfoFromCache); + } + recordsToEnrich.forEach(recordToEnrich -> { Triple triple = recordToEnrich; diff --git a/logisland-components/logisland-processors/logisland-processor-elasticsearch/src/main/java/com/hurence/logisland/processor/elasticsearch/MultiGetElasticsearch.java b/logisland-components/logisland-processors/logisland-processor-elasticsearch/src/main/java/com/hurence/logisland/processor/elasticsearch/MultiGetElasticsearch.java index 67b86601a..5a131e661 100644 --- a/logisland-components/logisland-processors/logisland-processor-elasticsearch/src/main/java/com/hurence/logisland/processor/elasticsearch/MultiGetElasticsearch.java +++ b/logisland-components/logisland-processors/logisland-processor-elasticsearch/src/main/java/com/hurence/logisland/processor/elasticsearch/MultiGetElasticsearch.java @@ -20,9 +20,9 @@ import com.hurence.logisland.component.PropertyDescriptor; import com.hurence.logisland.processor.ProcessContext; import com.hurence.logisland.processor.ProcessError; -import com.hurence.logisland.service.datastore.InvalidMultiGetQueryRecordException; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; +import com.hurence.logisland.service.datastore.model.exception.InvalidMultiGetQueryRecordException; +import com.hurence.logisland.service.datastore.model.MultiGetQueryRecord; +import com.hurence.logisland.service.datastore.model.MultiGetResponseRecord; import com.hurence.logisland.record.*; import com.hurence.logisland.validator.StandardValidators; diff --git a/logisland-components/logisland-processors/logisland-processor-elasticsearch/src/test/java/com/hurence/logisland/processor/elasticsearch/MockElasticsearchClientService.java b/logisland-components/logisland-processors/logisland-processor-elasticsearch/src/test/java/com/hurence/logisland/processor/elasticsearch/MockElasticsearchClientService.java index 2c54a63c4..ce402a513 100644 --- a/logisland-components/logisland-processors/logisland-processor-elasticsearch/src/test/java/com/hurence/logisland/processor/elasticsearch/MockElasticsearchClientService.java +++ b/logisland-components/logisland-processors/logisland-processor-elasticsearch/src/test/java/com/hurence/logisland/processor/elasticsearch/MockElasticsearchClientService.java @@ -17,13 +17,11 @@ import com.hurence.logisland.component.PropertyDescriptor; import com.hurence.logisland.controller.AbstractControllerService; -import com.hurence.logisland.service.datastore.DatastoreClientServiceException; +import com.hurence.logisland.service.datastore.*; +import com.hurence.logisland.service.datastore.model.*; import com.hurence.logisland.service.elasticsearch.ElasticsearchClientService; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; import com.hurence.logisland.record.Record; -import java.io.IOException; import java.util.*; public class MockElasticsearchClientService extends AbstractControllerService implements ElasticsearchClientService { @@ -91,6 +89,36 @@ public void bulkPut(String docIndex, String docType, Map document, Op this.mapDocuments.add(mapDocument); } + @Override + public void bulkDelete(String docIndex, String docType, String id) { + + } + + @Override + public void deleteByQuery(QueryRecord queryRecord) throws DatastoreClientServiceException { + + } + + @Override + public QueryResponseRecord queryGet(QueryRecord queryRecord) throws DatastoreClientServiceException { + return null; + } + + @Override + public MultiQueryResponseRecord multiQueryGet(MultiQueryRecord queryRecords) throws DatastoreClientServiceException { + return null; + } + + @Override + public void waitUntilCollectionIsReadyAndRefreshIfAnyPendingTasks(String index, long timeoutMilli) throws DatastoreClientServiceException { + + } + + @Override + public void waitUntilCollectionIsReadyAndRefreshIfAnyPendingTasks(String[] indices, long timeoutMilli) throws DatastoreClientServiceException { + + } + @Override public List multiGet(List multiGetQueryRecords){ @@ -151,6 +179,11 @@ public long countCollection(String indexName) throws DatastoreClientServiceExcep return stringDocuments.size() + mapDocuments.size(); } + @Override + public void waitUntilCollectionReady(String name, long timeoutMilli) throws DatastoreClientServiceException { + + } + @Override public void createCollection(String indexName, int numShards, int numReplicas) throws DatastoreClientServiceException { } diff --git a/logisland-components/logisland-processors/logisland-processor-elasticsearch/src/test/java/com/hurence/logisland/processor/elasticsearch/TestBulkAddElasticsearch.java b/logisland-components/logisland-processors/logisland-processor-elasticsearch/src/test/java/com/hurence/logisland/processor/elasticsearch/TestBulkAddElasticsearch.java index f0ec03312..beb0f9923 100644 --- a/logisland-components/logisland-processors/logisland-processor-elasticsearch/src/test/java/com/hurence/logisland/processor/elasticsearch/TestBulkAddElasticsearch.java +++ b/logisland-components/logisland-processors/logisland-processor-elasticsearch/src/test/java/com/hurence/logisland/processor/elasticsearch/TestBulkAddElasticsearch.java @@ -42,6 +42,32 @@ public class TestBulkAddElasticsearch { private static Logger logger = LoggerFactory.getLogger(TestBulkAddElasticsearch.class); + @Test + public void testValidity() { + final TestRunner runner = TestRunners.newTestRunner(new BulkAddElasticsearch()); + runner.assertNotValid(); + runner.setProperty(BulkAddElasticsearch.DEFAULT_INDEX, "aaa"); + runner.setProperty(BulkAddElasticsearch.DEFAULT_TYPE, "bbb"); + runner.setProperty(BulkAddElasticsearch.ELASTICSEARCH_CLIENT_SERVICE, "elasticsearchClient"); + runner.assertValid(); + runner.setProperty(BulkAddElasticsearch.TIMEBASED_INDEX, TODAY_DATE_SUFFIX); + runner.setProperty(BulkAddElasticsearch.ES_INDEX_FIELD, "aa"); + runner.setProperty(BulkAddElasticsearch.ES_TYPE_FIELD, "bb"); + runner.assertValid(); + runner.removeProperty(BulkAddElasticsearch.DEFAULT_INDEX); + runner.assertNotValid(); + runner.setProperty(BulkAddElasticsearch.DEFAULT_INDEX, "aaa"); + runner.assertValid(); + runner.removeProperty(BulkAddElasticsearch.DEFAULT_TYPE); + runner.assertNotValid(); + runner.setProperty(BulkAddElasticsearch.DEFAULT_TYPE, "aaa"); + runner.assertValid(); + runner.removeProperty(BulkAddElasticsearch.ELASTICSEARCH_CLIENT_SERVICE); + runner.assertNotValid(); + runner.setProperty(BulkAddElasticsearch.ELASTICSEARCH_CLIENT_SERVICE, "aaa"); + runner.assertValid(); + } + @Test public void testBulkAddElasticsearchTwoRecords() throws IOException, InitializationException { diff --git a/logisland-components/logisland-processors/logisland-processor-enrichment/pom.xml b/logisland-components/logisland-processors/logisland-processor-enrichment/pom.xml index e2fae41fd..30f1f483e 100644 --- a/logisland-components/logisland-processors/logisland-processor-enrichment/pom.xml +++ b/logisland-components/logisland-processors/logisland-processor-enrichment/pom.xml @@ -7,7 +7,7 @@ com.hurence.logisland logisland-processors - 1.3.0 + 1.4.0 logisland-processor-enrichment @@ -69,13 +69,13 @@ com.fasterxml.jackson.core jackson-databind - 2.9.3 + ${jackson.version} test com.maxmind.geoip2 geoip2 - 2.11.0 + 2.13.1 test @@ -98,20 +98,10 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - diff --git a/logisland-components/logisland-processors/logisland-processor-excel/pom.xml b/logisland-components/logisland-processors/logisland-processor-excel/pom.xml index 0bc95c997..9cfda762a 100644 --- a/logisland-components/logisland-processors/logisland-processor-excel/pom.xml +++ b/logisland-components/logisland-processors/logisland-processor-excel/pom.xml @@ -23,7 +23,7 @@ com.hurence.logisland logisland-processors - 1.3.0 + 1.4.0 logisland-processor-excel @@ -89,20 +89,10 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - diff --git a/logisland-components/logisland-processors/logisland-processor-excel/src/main/java/com/hurence/logisland/processor/excel/ExcelExtract.java b/logisland-components/logisland-processors/logisland-processor-excel/src/main/java/com/hurence/logisland/processor/excel/ExcelExtract.java index 1abcdd16a..49f1be969 100644 --- a/logisland-components/logisland-processors/logisland-processor-excel/src/main/java/com/hurence/logisland/processor/excel/ExcelExtract.java +++ b/logisland-components/logisland-processors/logisland-processor-excel/src/main/java/com/hurence/logisland/processor/excel/ExcelExtract.java @@ -25,7 +25,7 @@ import com.hurence.logisland.processor.ProcessError; import com.hurence.logisland.record.*; import com.hurence.logisland.util.stream.io.StreamUtils; -import com.hurence.logisland.validator.ValidationContext; +import com.hurence.logisland.validator.Configuration; import com.hurence.logisland.validator.ValidationResult; import org.apache.commons.io.IOUtils; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; @@ -68,7 +68,7 @@ public void init(ProcessContext context) throws InitializationException { @Override - protected Collection customValidate(ValidationContext context) { + protected Collection customValidate(Configuration context) { ValidationResult.Builder ret = new ValidationResult.Builder().valid(true); if (!(context.getPropertyValue(ExcelExtractProperties.FIELD_NAMES).isSet() ^ context.getPropertyValue(ExcelExtractProperties.HEADER_ROW_NB).isSet())) { diff --git a/logisland-components/logisland-processors/logisland-processor-hbase/pom.xml b/logisland-components/logisland-processors/logisland-processor-hbase/pom.xml deleted file mode 100644 index 69bad45cc..000000000 --- a/logisland-components/logisland-processors/logisland-processor-hbase/pom.xml +++ /dev/null @@ -1,108 +0,0 @@ - - - - 4.0.0 - - - com.hurence.logisland - logisland-processors - 1.3.0 - - - logisland-processor-hbase - jar - HBase processor plugin - - - - - org.slf4j - slf4j-api - provided - true - - - com.hurence.logisland - logisland-api - ${project.version} - provided - true - - - com.hurence.logisland - logisland-utils - ${project.version} - provided - true - - - com.hurence.logisland - logisland-service-hbase-api - ${project.version} - provided - true - - - - org.slf4j - slf4j-simple - ${org.slf4j.version} - test - - - com.hurence.logisland - logisland-scripting-mvel - ${project.version} - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - package - - - - - com.hurence.logisland - logisland-maven-plugin - - - package - - - - - - com.hurence.logisland - logisland-service-hbase-api - - - - - - - - - diff --git a/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/AbstractPutHBase.java b/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/AbstractPutHBase.java deleted file mode 100644 index 348f30299..000000000 --- a/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/AbstractPutHBase.java +++ /dev/null @@ -1,312 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.processor.hbase; - - -import com.hurence.logisland.classloading.PluginProxy; -import com.hurence.logisland.component.AllowableValue; -import com.hurence.logisland.component.InitializationException; -import com.hurence.logisland.component.PropertyDescriptor; -import com.hurence.logisland.service.hbase.HBaseClientService; -import com.hurence.logisland.service.hbase.put.PutRecord; -import com.hurence.logisland.processor.AbstractProcessor; -import com.hurence.logisland.processor.ProcessContext; -import com.hurence.logisland.processor.ProcessError; -import com.hurence.logisland.processor.ProcessException; -import com.hurence.logisland.record.Record; -import com.hurence.logisland.serializer.*; -import com.hurence.logisland.validator.StandardValidators; -import com.hurence.logisland.validator.ValidationContext; -import com.hurence.logisland.validator.ValidationResult; -import org.apache.commons.lang3.StringUtils; - -import java.nio.charset.StandardCharsets; -import java.util.*; -import java.util.concurrent.TimeUnit; - -/** - * Base class for processors that put data to HBase. - */ -public abstract class AbstractPutHBase extends AbstractProcessor { - - public static final PropertyDescriptor HBASE_CLIENT_SERVICE = new PropertyDescriptor.Builder() - .name("hbase.client.service") - .description("The instance of the Controller Service to use for accessing HBase.") - .required(true) - .identifiesControllerService(HBaseClientService.class) - .build(); - - - public static final PropertyDescriptor TABLE_NAME_DEFAULT = new PropertyDescriptor.Builder() - .name("table.name.default") - .description("The table table to use if table name field is not set") - .required(false) - .build(); - - public static final PropertyDescriptor TABLE_NAME_FIELD = new PropertyDescriptor.Builder() - .name("table.name.field") - .description("The field containing the name of the HBase Table to put data into") - .required(true) - .expressionLanguageSupported(true) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .build(); - - public static final PropertyDescriptor ROW_ID_FIELD = new PropertyDescriptor.Builder() - .name("row.identifier.field") - .description("Specifies field containing the Row ID to use when inserting data into HBase") - .required(false) // not all sub-classes will require this - .expressionLanguageSupported(true) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .build(); - - static final String STRING_ENCODING_VALUE = "String"; - static final String BYTES_ENCODING_VALUE = "Bytes"; - static final String BINARY_ENCODING_VALUE = "Binary"; - - - public static final AllowableValue ROW_ID_ENCODING_STRING = new AllowableValue(STRING_ENCODING_VALUE, STRING_ENCODING_VALUE, - "Stores the value of row id as a UTF-8 String."); - - public static final AllowableValue ROW_ID_ENCODING_BINARY = new AllowableValue(BINARY_ENCODING_VALUE, BINARY_ENCODING_VALUE, - "Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string."); - - static final PropertyDescriptor ROW_ID_ENCODING_STRATEGY = new PropertyDescriptor.Builder() - .name("row.identifier.encoding.strategy") - .description("Specifies the data type of Row ID used when inserting data into HBase. The default behavior is" + - " to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string" + - " to the correct byte[] representation. The Binary option should be used if you are using Binary row" + - " keys in HBase") - .required(false) // not all sub-classes will require this - .expressionLanguageSupported(false) - .defaultValue(ROW_ID_ENCODING_STRING.getValue()) - .allowableValues(ROW_ID_ENCODING_STRING, ROW_ID_ENCODING_BINARY) - .build(); - - public static final PropertyDescriptor COLUMN_FAMILY_DEFAULT = new PropertyDescriptor.Builder() - .name("column.family.default") - .description("The column family to use if column family field is not set") - .required(false) - .build(); - - public static final PropertyDescriptor COLUMN_FAMILY_FIELD = new PropertyDescriptor.Builder() - .name("column.family.field") - .description("The field containing the Column Family to use when inserting data into HBase") - .required(true) - .expressionLanguageSupported(true) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .build(); - - public static final PropertyDescriptor COLUMN_QUALIFIER_DEFAULT = new PropertyDescriptor.Builder() - .name("column.qualifier.default") - .description("The column qualifier to use if column qualifier field is not set") - .required(false) - .build(); - - public static final PropertyDescriptor COLUMN_QUALIFIER_FIELD = new PropertyDescriptor.Builder() - .name("column.qualifier.field") - .description("The field containing the Column Qualifier to use when inserting data into HBase") - .required(true) - .expressionLanguageSupported(true) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .build(); - - public static final PropertyDescriptor BATCH_SIZE = new PropertyDescriptor.Builder() - .name("batch.size") - .description("The maximum number of Records to process in a single execution. The Records will be " + - "grouped by table, and a single Put per table will be performed.") - .required(true) - .addValidator(StandardValidators.POSITIVE_INTEGER_VALIDATOR) - .defaultValue("25") - .build(); - - public static final AllowableValue AVRO_SERIALIZER = - new AllowableValue(AvroSerializer.class.getName(), "avro serialization", "serialize events as avro blocs"); - - public static final AllowableValue JSON_SERIALIZER = - new AllowableValue(JsonSerializer.class.getName(), "json serialization", "serialize events as json blocs"); - - public static final AllowableValue KRYO_SERIALIZER = - new AllowableValue(KryoSerializer.class.getName(), "kryo serialization", "serialize events as json blocs"); - - public static final AllowableValue NO_SERIALIZER = - new AllowableValue("none", "no serialization", "send events as bytes"); - - - public static final PropertyDescriptor RECORD_SERIALIZER = new PropertyDescriptor.Builder() - .name("record.serializer") - .description("the serializer needed to i/o the record in the HBase row") - .required(false) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, AVRO_SERIALIZER, NO_SERIALIZER) - .defaultValue(KRYO_SERIALIZER.getValue()) - .build(); - - public static final PropertyDescriptor RECORD_SCHEMA = new PropertyDescriptor.Builder() - .name("record.schema") - .description("the avro schema definition for the Avro serialization") - .required(false) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .build(); - - - protected HBaseClientService clientService; - protected RecordSerializer serializer; - - - @Override - public boolean hasControllerService() { - return true; - } - - @Override - protected Collection customValidate(ValidationContext validationContext) { - final boolean isAvroSerializer = validationContext.getPropertyValue(RECORD_SERIALIZER).asString().toLowerCase().contains("avro"); - final boolean isAvroSchemaSet = validationContext.getPropertyValue(RECORD_SCHEMA).isSet(); - - final List problems = new ArrayList<>(); - - if (isAvroSerializer && !isAvroSchemaSet) { - problems.add(new ValidationResult.Builder() - .subject(RECORD_SERIALIZER.getDisplayName()) - .valid(false) - .explanation("an avro schema must be provided with an avro serializer") - .build()); - } - - return problems; - } - - @Override - public void init(final ProcessContext context) throws InitializationException { - super.init(context); - clientService = PluginProxy.rewrap(context.getPropertyValue(HBASE_CLIENT_SERVICE).asControllerService()); - if(clientService == null) - getLogger().error("HBase client service is not initialized!"); - - if (context.getPropertyValue(RECORD_SCHEMA).isSet()) { - serializer = SerializerProvider.getSerializer( - context.getPropertyValue(RECORD_SERIALIZER).asString(), - context.getPropertyValue(RECORD_SCHEMA).asString()); - } else { - serializer = SerializerProvider.getSerializer(context.getPropertyValue(RECORD_SERIALIZER).asString(), null); - } - } - - @Override - public Collection process(final ProcessContext context, final Collection records) throws ProcessException { - - final int batchSize = context.getPropertyValue(BATCH_SIZE).asInteger(); - - if (records == null || records.size() == 0) { - return Collections.emptyList(); - } - - final Map> tablePuts = new HashMap<>(); - - // Group Records by HBase Table - for (final Record record : records) { - final PutRecord putRecord = createPut(context, record, serializer); - - if (putRecord == null) { - // sub-classes should log appropriate error messages before returning null - record.addError(ProcessError.RECORD_CONVERSION_ERROR.toString(), - getLogger(), - "Failed to produce a put for Record from {}" + record.toString()); - } else if (!putRecord.isValid()) { - if (StringUtils.isBlank(putRecord.getTableName())) { - record.addError(ProcessError.BAD_RECORD.toString(), - getLogger(), - "Missing table name for Record " + record.toString() ); - } else if (null == putRecord.getRow()) { - record.addError(ProcessError.BAD_RECORD.toString(), - getLogger(), - "Missing row id for Record " + record.toString()); - } else if (putRecord.getColumns() == null || putRecord.getColumns().isEmpty()) { - record.addError(ProcessError.BAD_RECORD.toString(), - getLogger(), - "No columns provided for Record " + record.toString()); - } else { - // really shouldn't get here, but just in case - record.addError(ProcessError.RECORD_CONVERSION_ERROR.toString(), - getLogger(), - "Failed to produce a put for Record from " + record.toString() - ); - } - } else { - List putRecords = tablePuts.get(putRecord.getTableName()); - if (putRecords == null) { - putRecords = new ArrayList<>(); - tablePuts.put(putRecord.getTableName(), putRecords); - } - putRecords.add(putRecord); - } - } - - getLogger().debug("Sending {} Records to HBase in {} put operations", new Object[]{records.size(), tablePuts.size()}); - - final long start = System.nanoTime(); - final List successes = new ArrayList<>(); - - for (Map.Entry> entry : tablePuts.entrySet()) { - try { - clientService.put(entry.getKey(), entry.getValue()); - successes.addAll(entry.getValue()); - } catch (Exception e) { - getLogger().error(e.getMessage(), e); - - for (PutRecord putRecord : entry.getValue()) { - String msg = String.format("Failed to send {} to HBase due to {}; routing to failure", putRecord.getRecord(), e); - putRecord.getRecord().addError("HBASE_PUT_RECORD_FAILURE", getLogger(), msg); - } - } - } - - final long sendMillis = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start); - getLogger().debug("Sent {} Records to HBase successfully in {} milliseconds", new Object[]{successes.size(), sendMillis}); - - for (PutRecord putRecord : successes) { - final String details = "Put " + putRecord.getColumns().size() + " cells to HBase"; - //session.getProvenanceReporter().send(putRecord.getRecord(), getTransitUri(putRecord), details, sendMillis); - } - return records; - - } - - protected String getTransitUri(PutRecord putRecord) { - return "hbase://" + putRecord.getTableName() + "/" + new String(putRecord.getRow(), StandardCharsets.UTF_8); - } - - protected byte[] getRow(final String row, final String encoding) { - //check to see if we need to modify the rowKey before we pass it down to the PutRecord - byte[] rowKeyBytes = null; - if (BINARY_ENCODING_VALUE.contentEquals(encoding)) { - rowKeyBytes = clientService.toBytesBinary(row); - } else { - rowKeyBytes = row.getBytes(StandardCharsets.UTF_8); - } - return rowKeyBytes; - } - - /** - * Sub-classes provide the implementation to create a put from a Record. - * - * @param context the current context - * @param record the Record to create a Put from - * @return a PutRecord instance for the given Record - */ - protected abstract PutRecord createPut(final ProcessContext context, final Record record, final RecordSerializer serializer); - -} diff --git a/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/FetchHBaseRow.java b/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/FetchHBaseRow.java deleted file mode 100644 index 7ba4fee41..000000000 --- a/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/FetchHBaseRow.java +++ /dev/null @@ -1,337 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.processor.hbase; - -import com.hurence.logisland.annotation.behavior.WritesAttribute; -import com.hurence.logisland.annotation.behavior.WritesAttributes; -import com.hurence.logisland.annotation.documentation.*; -import com.hurence.logisland.classloading.PluginProxy; -import com.hurence.logisland.component.AllowableValue; -import com.hurence.logisland.component.InitializationException; -import com.hurence.logisland.component.PropertyDescriptor; -import com.hurence.logisland.logging.ComponentLog; -import com.hurence.logisland.logging.StandardComponentLogger; -import com.hurence.logisland.processor.AbstractProcessor; -import com.hurence.logisland.processor.ProcessContext; -import com.hurence.logisland.processor.ProcessError; -import com.hurence.logisland.processor.ProcessException; -import com.hurence.logisland.record.Record; -import com.hurence.logisland.serializer.*; -import com.hurence.logisland.service.hbase.HBaseClientService; -import com.hurence.logisland.service.hbase.scan.Column; -import com.hurence.logisland.service.hbase.scan.ResultCell; -import com.hurence.logisland.service.hbase.scan.ResultHandler; -import com.hurence.logisland.validator.StandardValidators; -import org.apache.commons.lang3.StringUtils; - -import java.io.ByteArrayInputStream; -import java.nio.charset.StandardCharsets; -import java.util.*; -import java.util.regex.Pattern; - -@Category(ComponentCategory.DATASTORE) -@Tags({"hbase", "scan", "fetch", "get", "enrich"}) -@CapabilityDescription("Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, " + - "or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the " + - "table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from " + - "incoming flow files.") -@WritesAttributes({ - @WritesAttribute(attribute = "hbase.table", description = "The name of the HBase table that the row was fetched from"), - @WritesAttribute(attribute = "hbase.row", description = "A JSON document representing the row. This property is only written when a Destination of flowfile-attributes is selected."), - @WritesAttribute(attribute = "mime.type", description = "Set to application/json when using a Destination of flowfile-content, not set or modified otherwise") -}) -@ExtraDetailFile("./details/FetchHBaseRow-Detail.rst") -public class FetchHBaseRow extends AbstractProcessor { - - static final Pattern COLUMNS_PATTERN = Pattern.compile("\\w+(:\\w+)?(?:,\\w+(:\\w+)?)*"); - - public static final PropertyDescriptor HBASE_CLIENT_SERVICE = new PropertyDescriptor.Builder() - .name("hbase.client.service") - .description("The instance of the Controller Service to use for accessing HBase.") - .required(true) - .identifiesControllerService(HBaseClientService.class) - .build(); - - - public static final PropertyDescriptor TABLE_NAME_DEFAULT = new PropertyDescriptor.Builder() - .name("table.name.default") - .description("The table to use if table name field is not set") - .required(false) - .build(); - - public static final PropertyDescriptor TABLE_NAME_FIELD = new PropertyDescriptor.Builder() - .name("table.name.field") - .description("The field containing the name of the HBase Table to fetch from.") - .required(true) - .expressionLanguageSupported(true) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .build(); - - public static final PropertyDescriptor ROW_ID_FIELD = new PropertyDescriptor.Builder() - .name("row.identifier.field") - .description("The field containing the identifier of the row to fetch.") - .required(true) - .expressionLanguageSupported(true) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .build(); - - public static final PropertyDescriptor COLUMNS_FIELD = new PropertyDescriptor.Builder() - .name("columns.field") - .description("The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns " + - "for a given family, leave off the qualifier such as \"\",\"\".") - .required(false) - .expressionLanguageSupported(true) - .addValidator(StandardValidators.createRegexMatchingValidator(COLUMNS_PATTERN)) - .build(); - - - public static final AllowableValue AVRO_SERIALIZER = - new AllowableValue(AvroSerializer.class.getName(), "avro serialization", "serialize events as avro blocs"); - - public static final AllowableValue JSON_SERIALIZER = - new AllowableValue(JsonSerializer.class.getName(), "json serialization", "serialize events as json blocs"); - - public static final AllowableValue KRYO_SERIALIZER = - new AllowableValue(KryoSerializer.class.getName(), "kryo serialization", "serialize events as json blocs"); - - public static final AllowableValue NO_SERIALIZER = - new AllowableValue("none", "no serialization", "send events as bytes"); - - - public static final PropertyDescriptor RECORD_SERIALIZER = new PropertyDescriptor.Builder() - .name("record.serializer") - .description("the serializer needed to i/o the record in the HBase row") - .required(false) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, AVRO_SERIALIZER, NO_SERIALIZER) - .defaultValue(KRYO_SERIALIZER.getValue()) - .build(); - - public static final PropertyDescriptor RECORD_SCHEMA = new PropertyDescriptor.Builder() - .name("record.schema") - .description("the avro schema definition for the Avro serialization") - .required(false) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .build(); - - - public HBaseClientService clientService; - public RecordSerializer serializer; - - - static final String HBASE_TABLE_ATTR = "hbase.table"; - static final String HBASE_ROW_ATTR = "hbase.row"; - - static final List properties; - - static { - List props = new ArrayList<>(); - props.add(HBASE_CLIENT_SERVICE); - props.add(TABLE_NAME_FIELD); - props.add(ROW_ID_FIELD); - props.add(COLUMNS_FIELD); - props.add(RECORD_SERIALIZER); - props.add(RECORD_SCHEMA); - props.add(TABLE_NAME_DEFAULT); - properties = Collections.unmodifiableList(props); - } - - - @Override - public boolean hasControllerService() { - return true; - } - - - @Override - public List getSupportedPropertyDescriptors() { - return properties; - } - - - @Override - public void init(ProcessContext context) throws InitializationException{ - super.init(context); - this.clientService = PluginProxy.rewrap(context.getPropertyValue(HBASE_CLIENT_SERVICE).asControllerService()); - if (context.getPropertyValue(RECORD_SCHEMA).isSet()) { - serializer = SerializerProvider.getSerializer( - context.getPropertyValue(RECORD_SERIALIZER).asString(), - context.getPropertyValue(RECORD_SCHEMA).asString()); - } else { - serializer = SerializerProvider.getSerializer(context.getPropertyValue(RECORD_SERIALIZER).asString(), null); - } - - - } - - - @Override - public Collection process(ProcessContext context, Collection records) throws ProcessException { - - - List outputRecords = new ArrayList<>(); - for (Record record : records) { - - try { - String tableName = context.getPropertyValue(TABLE_NAME_DEFAULT).asString(); - if (record.hasField(context.getPropertyValue(TABLE_NAME_FIELD).asString())) - tableName = record.getField(context.getPropertyValue(TABLE_NAME_FIELD).asString()).asString(); - - if (StringUtils.isBlank(tableName)) { - record.addError( - ProcessError.BAD_RECORD.toString(), - getLogger(), - "Table Name is blank or null for {}", - new Object[]{record}); - - continue; - } - - final String rowId = record.getField(context.getPropertyValue(ROW_ID_FIELD).asString()).asString(); - if (StringUtils.isBlank(rowId)) { - record.addError( - ProcessError.BAD_RECORD.toString(), - getLogger(), - "Row Identifier is blank or null for {}", - new Object[]{record}); - continue; - } - - List columns = null; - if (record.hasField(context.getPropertyValue(COLUMNS_FIELD).asString())) - columns = getColumns(record.getField(context.getPropertyValue(COLUMNS_FIELD).asString()).asString()); - - - final RecordContentHandler handler = new RecordContentHandler(serializer); - - final byte[] rowIdBytes = rowId.getBytes(StandardCharsets.UTF_8); - - try { - clientService.scan(tableName, rowIdBytes, rowIdBytes, columns, handler); - } catch (Exception e) { - record.addError( - ProcessError.BAD_RECORD.toString(), - getLogger(), - "Unable to fetch row {} from {} due to {}", - new Object[]{rowId, tableName, e}); - continue; - } - - Collection handlerRecords = handler.getRecords(); - if (!handler.handledRow()) { - record.addError( - ProcessError.BAD_RECORD.toString(), - getLogger(), - "Row {} not found in {}", - new Object[]{rowId, tableName}); - continue; - } - - if (getLogger().isDebugEnabled()) { - getLogger().debug("Fetched {} from {} with row id {}", new Object[]{handlerRecords, tableName, rowId}); - } - - final Map attributes = new HashMap<>(); - attributes.put(HBASE_TABLE_ATTR, tableName); - - - outputRecords.addAll(handlerRecords); - - - } catch (Exception ex) { - record.addError(ProcessError.RUNTIME_ERROR.toString(), - getLogger(), - "Unable to fetch row {}", - new Object[]{ex}); - } - - } - - return outputRecords; - - } - - /** - * @param columnsValue a String in the form colFam:colQual,colFam:colQual - * @return a list of Columns based on parsing the given String - */ - private List getColumns(final String columnsValue) { - final String[] columns = (columnsValue == null || columnsValue.isEmpty() ? new String[0] : columnsValue.split(",")); - - List columnsList = new ArrayList<>(columns.length); - - for (final String column : columns) { - if (column.contains(":")) { - final String[] parts = column.split(":"); - final byte[] cf = parts[0].getBytes(StandardCharsets.UTF_8); - final byte[] cq = parts[1].getBytes(StandardCharsets.UTF_8); - columnsList.add(new Column(cf, cq)); - } else { - final byte[] cf = column.getBytes(StandardCharsets.UTF_8); - columnsList.add(new Column(cf, null)); - } - } - - return columnsList; - } - - - /** - * A FetchHBaseRowHandler that writes the resulting row to the Record content. - */ - private static class RecordContentHandler implements ResultHandler { - - private ArrayList records; - private final RecordSerializer serializer; - private boolean handledRow = false; - - private ComponentLog logger = new StandardComponentLogger("", this.getClass()); - - public RecordContentHandler(final RecordSerializer serializer) { - this.records = new ArrayList<>(); - this.serializer = serializer; - } - - @Override - public void handle(byte[] row, ResultCell[] resultCells) { - - for (ResultCell cell : resultCells) { - - try { - final byte[] cellValue = Arrays.copyOfRange(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength() + cell.getValueOffset()); - ByteArrayInputStream bais = new ByteArrayInputStream(cellValue); - Record deserializedRecord = serializer.deserialize(bais); - records.add(deserializedRecord); - bais.close(); - } catch (Exception e) { - logger.error("error while handling ResultCell for {} : {}", new Object[]{cell, e}); - } - } - handledRow = true; - } - - - public Collection getRecords() { - return records; - } - - public boolean handledRow() { - return handledRow; - } - } - - -} diff --git a/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/PutHBaseCell.java b/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/PutHBaseCell.java deleted file mode 100644 index c2cf6cd4f..000000000 --- a/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/PutHBaseCell.java +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.processor.hbase; - - -import com.hurence.logisland.annotation.documentation.*; -import com.hurence.logisland.component.PropertyDescriptor; -import com.hurence.logisland.processor.ProcessContext; -import com.hurence.logisland.service.hbase.put.PutColumn; -import com.hurence.logisland.service.hbase.put.PutRecord; -import com.hurence.logisland.record.Record; -import com.hurence.logisland.serializer.RecordSerializer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.ByteArrayOutputStream; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -@Category(ComponentCategory.DATASTORE) -@Tags({"hadoop", "hbase"}) -@CapabilityDescription("Adds the Contents of a Record to HBase as the value of a single cell") -@ExtraDetailFile("./details/PutHBaseCell-Detail.rst") -public class PutHBaseCell extends AbstractPutHBase { - - private static Logger logger = LoggerFactory.getLogger(PutHBaseCell.class); - - @Override - public List getSupportedPropertyDescriptors() { - final List properties = new ArrayList<>(); - properties.add(HBASE_CLIENT_SERVICE); - properties.add(TABLE_NAME_FIELD); - properties.add(ROW_ID_FIELD); - properties.add(ROW_ID_ENCODING_STRATEGY); - properties.add(COLUMN_FAMILY_FIELD); - properties.add(COLUMN_QUALIFIER_FIELD); - properties.add(BATCH_SIZE); - properties.add(RECORD_SCHEMA); - properties.add(RECORD_SERIALIZER); - properties.add(TABLE_NAME_DEFAULT); - properties.add(COLUMN_FAMILY_DEFAULT); - properties.add(COLUMN_QUALIFIER_DEFAULT); - return properties; - } - - - @Override - protected PutRecord createPut(final ProcessContext context, final Record record, final RecordSerializer serializer) { - - String tableName = context.getPropertyValue(TABLE_NAME_DEFAULT).asString(); - String columnFamily = context.getPropertyValue(COLUMN_FAMILY_DEFAULT).asString(); - String columnQualifier = context.getPropertyValue(COLUMN_QUALIFIER_DEFAULT).asString(); - - try { - if (!record.hasField(context.getPropertyValue(ROW_ID_FIELD).asString())) - throw new IllegalArgumentException("record has no ROW_ID_FIELD"); - - final String row = record.getField(context.getPropertyValue(ROW_ID_FIELD).asString()).asString(); - - if (record.hasField(context.getPropertyValue(TABLE_NAME_FIELD).asString())) - tableName = record.getField(context.getPropertyValue(TABLE_NAME_FIELD).asString()).asString(); - - if (record.hasField(context.getPropertyValue(COLUMN_FAMILY_FIELD).asString())) - columnFamily = record.getField(context.getPropertyValue(COLUMN_FAMILY_FIELD).asString()).asString(); - - if (record.hasField(context.getPropertyValue(COLUMN_QUALIFIER_FIELD).asString())) - columnQualifier = record.getField(context.getPropertyValue(COLUMN_QUALIFIER_FIELD).asString()).asString(); - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - serializer.serialize(baos, record); - final byte[] buffer = baos.toByteArray(); - baos.close(); - final Collection columns = Collections.singletonList(new PutColumn( - columnFamily.getBytes(StandardCharsets.UTF_8), - columnQualifier.getBytes(StandardCharsets.UTF_8), - buffer)); - byte[] rowKeyBytes = getRow(row, context.getPropertyValue(ROW_ID_ENCODING_STRATEGY).asString()); - - return new PutRecord(tableName, rowKeyBytes, columns, record); - - } catch (Exception e) { - logger.error(e.toString()); - } - - - return new PutRecord(tableName, null, Collections.emptyList(), record); - } - - -} diff --git a/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/io/JsonFullRowSerializer.java b/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/io/JsonFullRowSerializer.java deleted file mode 100644 index d78226c4d..000000000 --- a/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/io/JsonFullRowSerializer.java +++ /dev/null @@ -1,133 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.processor.hbase.io; - -import com.hurence.logisland.service.hbase.scan.ResultCell; -import com.hurence.logisland.processor.hbase.util.RowSerializerUtil; -import org.apache.commons.lang3.StringEscapeUtils; - -import java.io.IOException; -import java.io.OutputStream; -import java.nio.charset.Charset; - -/** - * Serializes a row from HBase to a JSON document of the form: - * - * { - * "row" : "row1", - * "cells": [ - * { - * "family" : "fam1", - * "qualifier" : "qual1" - * "value" : "val1" - * "timestamp" : 123456789 - * }, - * { - * "family" : "fam1", - * "qualifier" : "qual2" - * "value" : "val2" - * "timestamp" : 123456789 - * } - * ] - * } - * - * If base64encode is true, the row id, family, qualifier, and value will be represented as base 64 encoded strings. - */ -public class JsonFullRowSerializer implements RowSerializer { - - private final Charset decodeCharset; - private final Charset encodeCharset; - private final boolean base64encode; - - public JsonFullRowSerializer(final Charset decodeCharset, final Charset encodeCharset) { - this(decodeCharset, encodeCharset, false); - } - - public JsonFullRowSerializer(final Charset decodeCharset, final Charset encodeCharset, final boolean base64encode) { - this.decodeCharset = decodeCharset; - this.encodeCharset = encodeCharset; - this.base64encode = base64encode; - } - - @Override - public String serialize(byte[] rowKey, ResultCell[] cells) { - final String rowId = RowSerializerUtil.getRowId(rowKey, decodeCharset, base64encode); - - final StringBuilder jsonBuilder = new StringBuilder(); - jsonBuilder.append("{"); - - jsonBuilder.append("\"row\":"); - appendString(jsonBuilder, rowId, base64encode); - - jsonBuilder.append(", \"cells\": ["); - int i = 0; - for (final ResultCell cell : cells) { - final String cellFamily = RowSerializerUtil.getCellFamily(cell, decodeCharset, base64encode); - final String cellQualifier = RowSerializerUtil.getCellQualifier(cell, decodeCharset, base64encode); - final String cellValue = RowSerializerUtil.getCellValue(cell, decodeCharset, base64encode); - - if (i > 0) { - jsonBuilder.append(", "); - } - - // start cell - jsonBuilder.append("{"); - - jsonBuilder.append("\"fam\":"); - appendString(jsonBuilder, cellFamily, base64encode); - - jsonBuilder.append(",\"qual\":"); - appendString(jsonBuilder, cellQualifier, base64encode); - - jsonBuilder.append(",\"val\":"); - appendString(jsonBuilder, cellValue, base64encode); - - jsonBuilder.append(",\"ts\":"); - jsonBuilder.append(String.valueOf(cell.getTimestamp())); - - // end cell - jsonBuilder.append("}"); - i++; - } - - // end cell array - jsonBuilder.append("]"); - - // end overall document - jsonBuilder.append("}"); - return jsonBuilder.toString(); - } - - @Override - public void serialize(final byte[] rowKey, final ResultCell[] cells, final OutputStream out) throws IOException { - final String json = serialize(rowKey, cells); - out.write(json.getBytes(encodeCharset)); - } - - private void appendString(final StringBuilder jsonBuilder, final String str, final boolean base64encode) { - jsonBuilder.append("\""); - - // only escape the value when not doing base64 - if (!base64encode) { - jsonBuilder.append(StringEscapeUtils.escapeJson(str)); - } else { - jsonBuilder.append(str); - } - - jsonBuilder.append("\""); - } - -} diff --git a/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/io/JsonQualifierAndValueRowSerializer.java b/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/io/JsonQualifierAndValueRowSerializer.java deleted file mode 100644 index eb6d7571c..000000000 --- a/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/io/JsonQualifierAndValueRowSerializer.java +++ /dev/null @@ -1,98 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.hurence.logisland.processor.hbase.io; - -import com.hurence.logisland.service.hbase.scan.ResultCell; -import com.hurence.logisland.processor.hbase.util.RowSerializerUtil; -import org.apache.commons.lang3.StringEscapeUtils; - -import java.io.IOException; -import java.io.OutputStream; -import java.nio.charset.Charset; - -/** - * Serializes an HBase row to a JSON document of the form: - * - * { - * "qual1" : "val1", - * "qual2" : "val2" - * } - * - * If base64encode is true, the qualifiers and values will be represented as base 64 encoded strings. - */ -public class JsonQualifierAndValueRowSerializer implements RowSerializer { - - private final Charset decodeCharset; - private final Charset encodeCharset; - private final boolean base64encode; - - public JsonQualifierAndValueRowSerializer(final Charset decodeCharset, final Charset encodeCharset) { - this(decodeCharset, encodeCharset, false); - } - - public JsonQualifierAndValueRowSerializer(final Charset decodeCharset, final Charset encodeCharset, final boolean base64encode) { - this.decodeCharset = decodeCharset; - this.encodeCharset = encodeCharset; - this.base64encode = base64encode; - } - - @Override - public String serialize(byte[] rowKey, ResultCell[] cells) { - final StringBuilder jsonBuilder = new StringBuilder(); - jsonBuilder.append("{"); - - int i = 0; - for (final ResultCell cell : cells) { - final String cellQualifier = RowSerializerUtil.getCellQualifier(cell, decodeCharset, base64encode); - final String cellValue = RowSerializerUtil.getCellValue(cell, decodeCharset, base64encode); - - if (i > 0) { - jsonBuilder.append(", "); - } - - appendString(jsonBuilder, cellQualifier, base64encode); - jsonBuilder.append(":"); - appendString(jsonBuilder, cellValue, base64encode); - - i++; - } - - jsonBuilder.append("}"); - return jsonBuilder.toString(); - } - - @Override - public void serialize(final byte[] rowKey, final ResultCell[] cells, final OutputStream out) throws IOException { - final String json = serialize(rowKey, cells); - out.write(json.getBytes(encodeCharset)); - } - - private void appendString(final StringBuilder jsonBuilder, final String str, final boolean base64encode) { - jsonBuilder.append("\""); - - // only escape the value when not doing base64 - if (!base64encode) { - jsonBuilder.append(StringEscapeUtils.escapeJson(str)); - } else { - jsonBuilder.append(str); - } - - jsonBuilder.append("\""); - } - - -} diff --git a/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/io/JsonRowSerializer.java b/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/io/JsonRowSerializer.java deleted file mode 100644 index 56bc001eb..000000000 --- a/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/io/JsonRowSerializer.java +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.hurence.logisland.processor.hbase.io; - -import com.hurence.logisland.service.hbase.scan.ResultCell; -import org.apache.commons.lang3.StringEscapeUtils; - -import java.io.IOException; -import java.io.OutputStream; -import java.nio.charset.Charset; - -/** - * Serializes a row from HBase to a JSON document of the form: - * - * { - * "row" : "row1", - * "cells": { - * "fam1:qual1" : "val1", - * "fam1:qual2" : "val2" - * } - * } - * - */ -public class JsonRowSerializer implements RowSerializer { - - private final Charset charset; - - public JsonRowSerializer(final Charset charset) { - this.charset = charset; - } - - @Override - public String serialize(byte[] rowKey, ResultCell[] cells) { - final StringBuilder jsonBuilder = new StringBuilder(); - jsonBuilder.append("{"); - - final String row = new String(rowKey, charset); - jsonBuilder.append("\"row\":") - .append("\"") - .append(StringEscapeUtils.escapeJson(row)) - .append("\""); - - jsonBuilder.append(", \"cells\": {"); - int i = 0; - for (final ResultCell cell : cells) { - final String cellFamily = new String(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength(), charset); - final String cellQualifier = new String(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength(), charset); - - if (i > 0) { - jsonBuilder.append(", "); - } - jsonBuilder.append("\"") - .append(StringEscapeUtils.escapeJson(cellFamily)) - .append(":") - .append(StringEscapeUtils.escapeJson(cellQualifier)) - .append("\":\"") - .append(StringEscapeUtils.escapeJson(new String(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength(), charset))) - .append("\""); - i++; - } - - jsonBuilder.append("}}"); - return jsonBuilder.toString(); - } - - @Override - public void serialize(final byte[] rowKey, final ResultCell[] cells, final OutputStream out) throws IOException { - final String json = serialize(rowKey, cells); - out.write(json.getBytes(charset)); - } - -} diff --git a/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/io/RowSerializer.java b/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/io/RowSerializer.java deleted file mode 100644 index 46d209583..000000000 --- a/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/io/RowSerializer.java +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.processor.hbase.io; - - - -import com.hurence.logisland.service.hbase.scan.ResultCell; - -import java.io.IOException; -import java.io.OutputStream; - -public interface RowSerializer { - - /** - * Serializes the given row and cells to the provided OutputStream - * - * @param rowKey the row's key - * @param cells the cells to serialize - * @param out the OutputStream to serialize to - * @throws IOException if unable to serialize the row - */ - void serialize(byte[] rowKey, ResultCell[] cells, OutputStream out) throws IOException; - - /** - * - * @param rowKey the row key of the row being serialized - * @param cells the cells of the row being serialized - * @return the serialized string representing the row - */ - String serialize(byte[] rowKey, ResultCell[] cells); - -} diff --git a/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/util/ObjectSerDe.java b/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/util/ObjectSerDe.java deleted file mode 100644 index 62264a028..000000000 --- a/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/util/ObjectSerDe.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.processor.hbase.util; - - -import com.hurence.logisland.serializer.DeserializationException; -import com.hurence.logisland.serializer.Deserializer; -import com.hurence.logisland.serializer.SerializationException; -import com.hurence.logisland.serializer.Serializer; -import org.apache.commons.io.IOUtils; - -import java.io.*; - -public class ObjectSerDe implements Serializer, Deserializer { - - @Override - public Object deserialize(InputStream is) throws DeserializationException, IOException { - if (is == null) { - return null; - } - - byte[] input = IOUtils.toByteArray(is); - if (input == null || input.length == 0) { - return null; - } - - try (final ByteArrayInputStream in = new ByteArrayInputStream(input); - final ObjectInputStream objIn = new ObjectInputStream(in)) { - return objIn.readObject(); - } catch (ClassNotFoundException e) { - throw new DeserializationException("Could not deserialize object due to ClassNotFoundException", e); - } - } - - @Override - public void serialize(OutputStream output, Object value) throws SerializationException, IOException { - try (final ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - final ObjectOutputStream objOut = new ObjectOutputStream(bOut)) { - objOut.writeObject(value); - output.write(bOut.toByteArray()); - } - } - -} diff --git a/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/util/RowSerializerUtil.java b/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/util/RowSerializerUtil.java deleted file mode 100644 index 83c3554f6..000000000 --- a/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/util/RowSerializerUtil.java +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.hurence.logisland.processor.hbase.util; - - -import com.hurence.logisland.service.hbase.scan.ResultCell; - -import java.nio.ByteBuffer; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.util.Base64; - -public class RowSerializerUtil { - - /** - * @param rowId the row id to get the string from - * @param charset the charset that was used to encode the cell's row - * @param base64encodeValues whether or not to base64 encode the returned string - * - * @return the String representation of the cell's row - */ - public static String getRowId(final byte[] rowId, final Charset charset, final boolean base64encodeValues) { - if (base64encodeValues) { - ByteBuffer cellRowBuffer = ByteBuffer.wrap(rowId); - ByteBuffer base64Buffer = Base64.getEncoder().encode(cellRowBuffer); - return new String(base64Buffer.array(), StandardCharsets.UTF_8); - } else { - return new String(rowId, charset); - } - } - - /** - * @param cell the cell to get the family from - * @param charset the charset that was used to encode the cell's family - * @param base64encodeValues whether or not to base64 encode the returned string - * - * @return the String representation of the cell's family - */ - public static String getCellFamily(final ResultCell cell, final Charset charset, final boolean base64encodeValues) { - if (base64encodeValues) { - ByteBuffer cellFamilyBuffer = ByteBuffer.wrap(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength()); - ByteBuffer base64Buffer = Base64.getEncoder().encode(cellFamilyBuffer); - return new String(base64Buffer.array(), StandardCharsets.UTF_8); - } else { - return new String(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength(), charset); - } - } - - /** - * @param cell the cell to get the qualifier from - * @param charset the charset that was used to encode the cell's qualifier - * @param base64encodeValues whether or not to base64 encode the returned string - * - * @return the String representation of the cell's qualifier - */ - public static String getCellQualifier(final ResultCell cell, final Charset charset, final boolean base64encodeValues) { - if (base64encodeValues) { - ByteBuffer cellQualifierBuffer = ByteBuffer.wrap(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()); - ByteBuffer base64Buffer = Base64.getEncoder().encode(cellQualifierBuffer); - return new String(base64Buffer.array(), StandardCharsets.UTF_8); - } else { - return new String(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength(), charset); - } - } - - /** - * @param cell the cell to get the value from - * @param charset the charset that was used to encode the cell's value - * @param base64encodeValues whether or not to base64 encode the returned string - * - * @return the String representation of the cell's value - */ - public static String getCellValue(final ResultCell cell, final Charset charset, final boolean base64encodeValues) { - if (base64encodeValues) { - ByteBuffer cellValueBuffer = ByteBuffer.wrap(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()); - ByteBuffer base64Buffer = Base64.getEncoder().encode(cellValueBuffer); - return new String(base64Buffer.array(), StandardCharsets.UTF_8); - } else { - return new String(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength(), charset); - } - } - -} diff --git a/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/util/StringSerDe.java b/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/util/StringSerDe.java deleted file mode 100644 index 4ddb9f0e7..000000000 --- a/logisland-components/logisland-processors/logisland-processor-hbase/src/main/java/com/hurence/logisland/processor/hbase/util/StringSerDe.java +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.hurence.logisland.processor.hbase.util; - - - -import com.hurence.logisland.serializer.DeserializationException; -import com.hurence.logisland.serializer.Deserializer; -import com.hurence.logisland.serializer.SerializationException; -import com.hurence.logisland.serializer.Serializer; -import org.apache.commons.io.IOUtils; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.charset.StandardCharsets; - -public class StringSerDe implements Serializer, Deserializer { - - @Override - public String deserialize(final InputStream input) throws DeserializationException, IOException { - byte[] value = IOUtils.toByteArray(input); - if ( value == null ) { - return null; - } - - return new String(value, StandardCharsets.UTF_8); - } - - @Override - public void serialize(final OutputStream out, final String value) throws SerializationException, IOException { - out.write(value.getBytes(StandardCharsets.UTF_8)); - } - -} diff --git a/logisland-components/logisland-processors/logisland-processor-hbase/src/test/java/com/hurence/logisland/processor/hbase/HBaseTestUtil.java b/logisland-components/logisland-processors/logisland-processor-hbase/src/test/java/com/hurence/logisland/processor/hbase/HBaseTestUtil.java deleted file mode 100644 index 17d9f9aa3..000000000 --- a/logisland-components/logisland-processors/logisland-processor-hbase/src/test/java/com/hurence/logisland/processor/hbase/HBaseTestUtil.java +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.processor.hbase; - -import com.hurence.logisland.service.hbase.put.PutColumn; -import com.hurence.logisland.service.hbase.put.PutRecord; - -import static org.junit.Assert.assertTrue; - -import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.List; -import java.util.Map; - - - -public class HBaseTestUtil { - - public static void verifyPut(final String row, final String columnFamily, final Map columns, final List puts) { - boolean foundPut = false; - - for (final PutRecord put : puts) { - if (!row.equals(new String(put.getRow(), StandardCharsets.UTF_8))) { - continue; - } - - if (put.getColumns() == null || put.getColumns().size() != columns.size()) { - continue; - } - - // start off assuming we have all the columns - boolean foundAllColumns = true; - - for (Map.Entry entry : columns.entrySet()) { - // determine if we have the current expected column - boolean foundColumn = false; - for (PutColumn putColumn : put.getColumns()) { - if (columnFamily.equals(new String(putColumn.getColumnFamily(), StandardCharsets.UTF_8)) - && entry.getKey().equals(new String(putColumn.getColumnQualifier(), StandardCharsets.UTF_8)) - && Arrays.equals(entry.getValue(), putColumn.getBuffer())) { - foundColumn = true; - break; - } - } - - // if we didn't have the current expected column we know we don't have all expected columns - if (!foundColumn) { - foundAllColumns = false; - break; - } - } - - // if we found all the expected columns this was a match so we can break - if (foundAllColumns) { - foundPut = true; - break; - } - } - - assertTrue(foundPut); - } - - -} diff --git a/logisland-components/logisland-processors/logisland-processor-hbase/src/test/java/com/hurence/logisland/processor/hbase/MockHBaseClientService.java b/logisland-components/logisland-processors/logisland-processor-hbase/src/test/java/com/hurence/logisland/processor/hbase/MockHBaseClientService.java deleted file mode 100644 index 8551f07f1..000000000 --- a/logisland-components/logisland-processors/logisland-processor-hbase/src/test/java/com/hurence/logisland/processor/hbase/MockHBaseClientService.java +++ /dev/null @@ -1,189 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.processor.hbase; - -import com.hurence.logisland.component.PropertyDescriptor; -import com.hurence.logisland.controller.AbstractControllerService; -import com.hurence.logisland.service.hbase.HBaseClientService; -import com.hurence.logisland.service.hbase.put.PutColumn; -import com.hurence.logisland.service.hbase.put.PutRecord; -import com.hurence.logisland.service.hbase.scan.Column; -import com.hurence.logisland.service.hbase.scan.ResultCell; -import com.hurence.logisland.service.hbase.scan.ResultHandler; - - -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class MockHBaseClientService extends AbstractControllerService implements HBaseClientService { - - private Map results = new HashMap<>(); - private Map> recordPuts = new HashMap<>(); - private boolean throwException = false; - private int numScans = 0; - - @Override - public void put(String tableName, Collection puts) throws IOException { - if (throwException) { - throw new IOException("exception"); - } - - this.recordPuts.put(tableName, new ArrayList<>(puts)); - } - - @Override - public void put(String tableName, byte[] startRow, Collection columns) throws IOException { - throw new UnsupportedOperationException(); - } - - @Override - public void scan(String tableName, byte[] startRow, byte[] endRow, Collection columns, ResultHandler handler) throws IOException { - if (throwException) { - throw new IOException("exception"); - } - - for (final Map.Entry entry : results.entrySet()) { - - List matchedCells = new ArrayList<>(); - - if (columns == null || columns.isEmpty()) { - Arrays.stream(entry.getValue()).forEach(e -> matchedCells.add(e)); - } else { - for (Column column : columns) { - String colFam = new String(column.getFamily(), StandardCharsets.UTF_8); - String colQual = new String(column.getQualifier(), StandardCharsets.UTF_8); - - for (ResultCell cell : entry.getValue()) { - String cellFam = new String(cell.getFamilyArray(), StandardCharsets.UTF_8); - String cellQual = new String(cell.getQualifierArray(), StandardCharsets.UTF_8); - - if (colFam.equals(cellFam) && colQual.equals(cellQual)) { - matchedCells.add(cell); - } - } - } - } - - handler.handle(entry.getKey().getBytes(StandardCharsets.UTF_8), matchedCells.toArray(new ResultCell[matchedCells.size()])); - } - - numScans++; - } - - @Override - public void scan(String tableName, Collection columns, String filterExpression, long minTime, ResultHandler handler) throws IOException { - if (throwException) { - throw new IOException("exception"); - } - - // pass all the staged data to the handler - for (final Map.Entry entry : results.entrySet()) { - handler.handle(entry.getKey().getBytes(StandardCharsets.UTF_8), entry.getValue()); - } - - numScans++; - } - - public void addResult(final String rowKey, final Map cells, final long timestamp) { - final byte[] rowArray = rowKey.getBytes(StandardCharsets.UTF_8); - - final ResultCell[] cellArray = new ResultCell[cells.size()]; - int i = 0; - for (final Map.Entry cellEntry : cells.entrySet()) { - final ResultCell cell = new ResultCell(); - cell.setRowArray(rowArray); - cell.setRowOffset(0); - cell.setRowLength((short) rowArray.length); - - final String cellValue = cellEntry.getValue(); - final byte[] valueArray = cellValue.getBytes(StandardCharsets.UTF_8); - cell.setValueArray(valueArray); - cell.setValueOffset(0); - cell.setValueLength(valueArray.length); - - final byte[] familyArray = "cf".getBytes(StandardCharsets.UTF_8); - cell.setFamilyArray(familyArray); - cell.setFamilyOffset(0); - cell.setFamilyLength((byte) familyArray.length); - - final String qualifier = cellEntry.getKey(); - final byte[] qualifierArray = qualifier.getBytes(StandardCharsets.UTF_8); - cell.setQualifierArray(qualifierArray); - cell.setQualifierOffset(0); - cell.setQualifierLength(qualifierArray.length); - - cell.setTimestamp(timestamp); - cellArray[i++] = cell; - } - - results.put(rowKey, cellArray); - } - - public Map> getRecordPuts() { - return recordPuts; - } - - public void setThrowException(boolean throwException) { - this.throwException = throwException; - } - - public int getNumScans() { - return numScans; - } - - @Override - public byte[] toBytes(final boolean b) { - return new byte[] { b ? (byte) -1 : (byte) 0 }; - } - - @Override - public byte[] toBytes(long l) { - byte [] b = new byte[8]; - for (int i = 7; i > 0; i--) { - b[i] = (byte) l; - l >>>= 8; - } - b[0] = (byte) l; - return b; - } - - @Override - public byte[] toBytes(final double d) { - return toBytes(Double.doubleToRawLongBits(d)); - } - - @Override - public byte[] toBytes(final String s) { - return s.getBytes(StandardCharsets.UTF_8); - } - - @Override - public byte[] toBytesBinary(String s) { - return s.getBytes(); - } - - - @Override - public List getSupportedPropertyDescriptors() { - return null; - } -} diff --git a/logisland-components/logisland-processors/logisland-processor-hbase/src/test/java/com/hurence/logisland/processor/hbase/TestFetchHBaseRow.java b/logisland-components/logisland-processors/logisland-processor-hbase/src/test/java/com/hurence/logisland/processor/hbase/TestFetchHBaseRow.java deleted file mode 100644 index f5bec4bce..000000000 --- a/logisland-components/logisland-processors/logisland-processor-hbase/src/test/java/com/hurence/logisland/processor/hbase/TestFetchHBaseRow.java +++ /dev/null @@ -1,418 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.hurence.logisland.processor.hbase; - -import com.hurence.logisland.component.InitializationException; -import com.hurence.logisland.record.Record; -import com.hurence.logisland.record.RecordUtils; -import com.hurence.logisland.serializer.JsonSerializer; -import com.hurence.logisland.serializer.RecordSerializer; -import com.hurence.logisland.util.runner.MockRecord; -import com.hurence.logisland.util.runner.TestRunner; -import com.hurence.logisland.util.runner.TestRunners; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -public class TestFetchHBaseRow { - - - public static final String FAMILY = "cf"; - public static final String COLUMN_QUALIFIER_1 = "cq1"; - public static final String COLUMN_QUALIFIER_2 = "cq2"; - private FetchHBaseRow proc; - private MockHBaseClientService hBaseClientService; - private TestRunner runner; - - public static final String TABLE_NAME_KEY = "table_name"; - public static final String ROW_ID_KEY = "row_id"; - public static final String COLUMNS_KEY = "columns"; - - - public static final String TABLE_NAME = "logisland"; - public static final String QUALIFIER = "qualifier1"; - public static final String ROW_ID_1 = "id1"; - public static final String ROW_ID_2 = "id2"; - - public static final String KEY = "some key"; - public static final String VALUE = "some content"; - - - final Record inputRecord = new MockRecord(RecordUtils.getKeyValueRecord(KEY, VALUE)) - .setStringField(ROW_ID_KEY, ROW_ID_1) - .setStringField(COLUMNS_KEY, FAMILY + ":" + COLUMN_QUALIFIER_1) - .setStringField(TABLE_NAME_KEY, TABLE_NAME); - - - - - private String serializeRecord(RecordSerializer serializer, Record inputRecord) throws IOException { - - - inputRecord.setStringField(ROW_ID_KEY, ROW_ID_1); - inputRecord.setStringField(COLUMNS_KEY, FAMILY + ":" + COLUMN_QUALIFIER_1); - inputRecord.setStringField(TABLE_NAME_KEY, TABLE_NAME); - - - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - serializer.serialize(baos, inputRecord); - baos.close(); - - - return new String(baos.toByteArray()); - - } - - @Before - public void setup() throws InitializationException { - proc = new FetchHBaseRow(); - runner = TestRunners.newTestRunner(proc); - - hBaseClientService = new MockHBaseClientService(); - runner.addControllerService("hbaseClient", hBaseClientService); - runner.enableControllerService(hBaseClientService); - runner.setProperty(FetchHBaseRow.HBASE_CLIENT_SERVICE, "hbaseClient"); - - runner.setProperty(FetchHBaseRow.TABLE_NAME_FIELD, TABLE_NAME_KEY); - runner.setProperty(FetchHBaseRow.ROW_ID_FIELD, ROW_ID_KEY); - runner.setProperty(FetchHBaseRow.COLUMNS_FIELD, COLUMNS_KEY); - runner.setProperty(FetchHBaseRow.RECORD_SERIALIZER, JsonSerializer.class.getName()); - } - - @Test - public void testColumnsValidation() { - runner.setProperty(FetchHBaseRow.HBASE_CLIENT_SERVICE, "hbaseService"); - runner.setProperty(FetchHBaseRow.TABLE_NAME_FIELD, "table1"); - runner.setProperty(FetchHBaseRow.ROW_ID_FIELD, "row1"); - runner.assertValid(); - - runner.setProperty(FetchHBaseRow.COLUMNS_FIELD, "cf1:cq1"); - runner.assertValid(); - - runner.setProperty(FetchHBaseRow.COLUMNS_FIELD, "cf1"); - runner.assertValid(); - - runner.setProperty(FetchHBaseRow.COLUMNS_FIELD, "cf1:cq1,cf2:cq2,cf3:cq3"); - runner.assertValid(); - - runner.setProperty(FetchHBaseRow.COLUMNS_FIELD, "cf1,cf2:cq1,cf3"); - runner.assertValid(); - - runner.setProperty(FetchHBaseRow.COLUMNS_FIELD, "cf1 cf2,cf3"); - runner.assertNotValid(); - - runner.setProperty(FetchHBaseRow.COLUMNS_FIELD, "cf1:,cf2,cf3"); - runner.assertNotValid(); - - runner.setProperty(FetchHBaseRow.COLUMNS_FIELD, "cf1:cq1,"); - runner.assertNotValid(); - } - - @Test - public void testNoIncomingRecord() { - runner.setProperty(FetchHBaseRow.TABLE_NAME_FIELD, "table1"); - runner.setProperty(FetchHBaseRow.ROW_ID_FIELD, "row1"); - - runner.run(); - runner.assertOutputErrorCount(0); - runner.assertOutputRecordsCount(0); - - Assert.assertEquals(0, hBaseClientService.getNumScans()); - } - - - @Test - public void testFetchToAttributesWithStringValues() throws IOException { - final Map cells = new HashMap<>(); - cells.put(COLUMN_QUALIFIER_1, serializeRecord(new JsonSerializer(), inputRecord)); - cells.put(COLUMN_QUALIFIER_2, "val2"); - - final long ts1 = 123456789; - hBaseClientService.addResult(FAMILY + ":" + COLUMN_QUALIFIER_1, cells, ts1); - - - Record inRecord = inputRecord; - runner.enqueue(inRecord); - runner.run(); - - runner.assertOutputErrorCount(0); - runner.assertOutputRecordsCount(1); - - final MockRecord record = runner.getOutputRecords().get(0); - record.assertContentEquals(inRecord); - - Assert.assertEquals(1, hBaseClientService.getNumScans()); - } - - @Test - public void testFetchSpecificColumnsToAttributesWithStringValues() throws IOException { - final Map cells = new HashMap<>(); - cells.put(COLUMN_QUALIFIER_1, "val1"); - cells.put(COLUMN_QUALIFIER_2, serializeRecord(new JsonSerializer(), inputRecord)); - - final long ts1 = 123456789; - hBaseClientService.addResult("row1", cells, ts1); - - - Record inRecord = inputRecord.setStringField(COLUMNS_KEY, FAMILY + ":cq2"); - runner.enqueue(inRecord); - runner.run(); - - runner.assertOutputErrorCount(0); - runner.assertOutputRecordsCount(1); - - final MockRecord record = runner.getOutputRecords().get(0); - - - record.assertRecordSizeEquals(5); - - Assert.assertEquals(1, hBaseClientService.getNumScans()); - } -/* - @Test - public void testFetchToAttributesWithBase64Values() { - final Map cells = new HashMap<>(); - cells.put("cq1", "val1"); - cells.put("cq2", "val2"); - - final long ts1 = 123456789; - hBaseClientService.addResult("row1", cells, ts1); - - runner.setProperty(FetchHBaseRow.TABLE_NAME_FIELD, "table1"); - runner.setProperty(FetchHBaseRow.ROW_ID_FIELD, "row1"); - runner.setProperty(FetchHBaseRow.DESTINATION, FetchHBaseRow.DESTINATION_ATTRIBUTES); - runner.setProperty(FetchHBaseRow.JSON_VALUE_ENCODING, FetchHBaseRow.ENCODING_BASE64); - - runner.enqueue("trigger flow file"); - runner.run(); - - runner.assertTransferCount(FetchHBaseRow.REL_FAILURE, 0); - runner.assertTransferCount(FetchHBaseRow.REL_SUCCESS, 1); - runner.assertTransferCount(FetchHBaseRow.REL_NOT_FOUND, 0); - - final String rowBase64 = Base64.encodeBase64String("row1".getBytes(StandardCharsets.UTF_8)); - - final String fam1Base64 = Base64.encodeBase64String("logisland".getBytes(StandardCharsets.UTF_8)); - final String qual1Base64 = Base64.encodeBase64String("cq1".getBytes(StandardCharsets.UTF_8)); - final String val1Base64 = Base64.encodeBase64String("val1".getBytes(StandardCharsets.UTF_8)); - - final String fam2Base64 = Base64.encodeBase64String("logisland".getBytes(StandardCharsets.UTF_8)); - final String qual2Base64 = Base64.encodeBase64String("cq2".getBytes(StandardCharsets.UTF_8)); - final String val2Base64 = Base64.encodeBase64String("val2".getBytes(StandardCharsets.UTF_8)); - - final MockRecord record = runner.getRecordsForRelationship(FetchHBaseRow.REL_SUCCESS).get(0); - record.assertAttributeEquals(FetchHBaseRow.HBASE_ROW_ATTR, - "{\"row\":\"" + rowBase64 + "\", \"cells\": [" + - "{\"fam\":\"" + fam1Base64 + "\",\"qual\":\"" + qual1Base64 + "\",\"val\":\"" + val1Base64 + "\",\"ts\":" + ts1 + "}, " + - "{\"fam\":\"" + fam2Base64 + "\",\"qual\":\"" + qual2Base64 + "\",\"val\":\"" + val2Base64 + "\",\"ts\":" + ts1 + "}]}"); - - Assert.assertEquals(1, hBaseClientService.getNumScans()); - } - - @Test - public void testFetchToAttributesNoResults() { - runner.setProperty(FetchHBaseRow.TABLE_NAME_FIELD, "table1"); - runner.setProperty(FetchHBaseRow.ROW_ID_FIELD, "row1"); - runner.setProperty(FetchHBaseRow.DESTINATION, FetchHBaseRow.DESTINATION_ATTRIBUTES); - - runner.enqueue("trigger flow file"); - runner.run(); - - runner.assertTransferCount(FetchHBaseRow.REL_FAILURE, 0); - runner.assertTransferCount(FetchHBaseRow.REL_SUCCESS, 0); - runner.assertTransferCount(FetchHBaseRow.REL_NOT_FOUND, 1); - - Assert.assertEquals(1, hBaseClientService.getNumScans()); - } - - @Test - public void testFetchToContentWithStringValues() { - final Map cells = new HashMap<>(); - cells.put("cq1", "val1"); - cells.put("cq2", "val2"); - - final long ts1 = 123456789; - hBaseClientService.addResult("row1", cells, ts1); - - runner.setProperty(FetchHBaseRow.TABLE_NAME_FIELD, "table1"); - runner.setProperty(FetchHBaseRow.ROW_ID_FIELD, "row1"); - runner.setProperty(FetchHBaseRow.DESTINATION, FetchHBaseRow.DESTINATION_CONTENT); - - runner.enqueue("trigger flow file"); - runner.run(); - - runner.assertTransferCount(FetchHBaseRow.REL_FAILURE, 0); - runner.assertTransferCount(FetchHBaseRow.REL_SUCCESS, 1); - runner.assertTransferCount(FetchHBaseRow.REL_NOT_FOUND, 0); - - final MockRecord record = runner.getRecordsForRelationship(FetchHBaseRow.REL_SUCCESS).get(0); - record.assertContentEquals("{\"row\":\"row1\", \"cells\": [" + - "{\"fam\":\"logisland\",\"qual\":\"cq1\",\"val\":\"val1\",\"ts\":" + ts1 + "}, " + - "{\"fam\":\"logisland\",\"qual\":\"cq2\",\"val\":\"val2\",\"ts\":" + ts1 + "}]}"); - - Assert.assertEquals(1, hBaseClientService.getNumScans()); - } - - @Test - public void testFetchSpecificColumnsToContentWithStringValues() { - final Map cells = new HashMap<>(); - cells.put("cq1", "val1"); - cells.put("cq2", "val2"); - - final long ts1 = 123456789; - hBaseClientService.addResult("row1", cells, ts1); - - runner.setProperty(FetchHBaseRow.TABLE_NAME_FIELD, "table1"); - runner.setProperty(FetchHBaseRow.ROW_ID_FIELD, "row1"); - runner.setProperty(FetchHBaseRow.DESTINATION, FetchHBaseRow.DESTINATION_CONTENT); - runner.setProperty(FetchHBaseRow.COLUMNS_FIELD, "logisland:cq2"); - - runner.enqueue("trigger flow file"); - runner.run(); - - runner.assertTransferCount(FetchHBaseRow.REL_FAILURE, 0); - runner.assertTransferCount(FetchHBaseRow.REL_SUCCESS, 1); - runner.assertTransferCount(FetchHBaseRow.REL_NOT_FOUND, 0); - - final MockRecord record = runner.getRecordsForRelationship(FetchHBaseRow.REL_SUCCESS).get(0); - record.assertContentEquals("{\"row\":\"row1\", \"cells\": [{\"fam\":\"logisland\",\"qual\":\"cq2\",\"val\":\"val2\",\"ts\":" + ts1 + "}]}"); - - Assert.assertEquals(1, hBaseClientService.getNumScans()); - } - - @Test - public void testFetchSpecificColumnsToContentWithBase64() { - final Map cells = new HashMap<>(); - cells.put("cq1", "val1"); - cells.put("cq2", "val2"); - - final long ts1 = 123456789; - hBaseClientService.addResult("row1", cells, ts1); - - runner.setProperty(FetchHBaseRow.TABLE_NAME_FIELD, "table1"); - runner.setProperty(FetchHBaseRow.ROW_ID_FIELD, "row1"); - runner.setProperty(FetchHBaseRow.DESTINATION, FetchHBaseRow.DESTINATION_CONTENT); - runner.setProperty(FetchHBaseRow.JSON_VALUE_ENCODING, FetchHBaseRow.ENCODING_BASE64); - - runner.enqueue("trigger flow file"); - runner.run(); - - runner.assertTransferCount(FetchHBaseRow.REL_FAILURE, 0); - runner.assertTransferCount(FetchHBaseRow.REL_SUCCESS, 1); - runner.assertTransferCount(FetchHBaseRow.REL_NOT_FOUND, 0); - - final String rowBase64 = Base64.encodeBase64String("row1".getBytes(StandardCharsets.UTF_8)); - - final String fam1Base64 = Base64.encodeBase64String("logisland".getBytes(StandardCharsets.UTF_8)); - final String qual1Base64 = Base64.encodeBase64String("cq1".getBytes(StandardCharsets.UTF_8)); - final String val1Base64 = Base64.encodeBase64String("val1".getBytes(StandardCharsets.UTF_8)); - - final String fam2Base64 = Base64.encodeBase64String("logisland".getBytes(StandardCharsets.UTF_8)); - final String qual2Base64 = Base64.encodeBase64String("cq2".getBytes(StandardCharsets.UTF_8)); - final String val2Base64 = Base64.encodeBase64String("val2".getBytes(StandardCharsets.UTF_8)); - - final MockRecord record = runner.getRecordsForRelationship(FetchHBaseRow.REL_SUCCESS).get(0); - record.assertContentEquals("{\"row\":\"" + rowBase64 + "\", \"cells\": [" + - "{\"fam\":\"" + fam1Base64 + "\",\"qual\":\"" + qual1Base64 + "\",\"val\":\"" + val1Base64 + "\",\"ts\":" + ts1 + "}, " + - "{\"fam\":\"" + fam2Base64 + "\",\"qual\":\"" + qual2Base64 + "\",\"val\":\"" + val2Base64 + "\",\"ts\":" + ts1 + "}]}"); - - Assert.assertEquals(1, hBaseClientService.getNumScans()); - } - - @Test - public void testFetchToContentWithQualifierAndValueJSON() { - final Map cells = new HashMap<>(); - cells.put("cq1", "val1"); - cells.put("cq2", "val2"); - - hBaseClientService.addResult("row1", cells, System.currentTimeMillis()); - - runner.setProperty(FetchHBaseRow.TABLE_NAME_FIELD, "table1"); - runner.setProperty(FetchHBaseRow.ROW_ID_FIELD, "row1"); - runner.setProperty(FetchHBaseRow.DESTINATION, FetchHBaseRow.DESTINATION_CONTENT); - runner.setProperty(FetchHBaseRow.JSON_FORMAT, FetchHBaseRow.JSON_FORMAT_QUALIFIER_AND_VALUE); - - runner.enqueue("trigger flow file"); - runner.run(); - - runner.assertTransferCount(FetchHBaseRow.REL_FAILURE, 0); - runner.assertTransferCount(FetchHBaseRow.REL_SUCCESS, 1); - runner.assertTransferCount(FetchHBaseRow.REL_NOT_FOUND, 0); - - final MockRecord record = runner.getRecordsForRelationship(FetchHBaseRow.REL_SUCCESS).get(0); - record.assertContentEquals("{\"cq1\":\"val1\", \"cq2\":\"val2\"}"); - - Assert.assertEquals(1, hBaseClientService.getNumScans()); - } - - @Test - public void testFetchWithExpressionLanguage() { - final Map cells = new HashMap<>(); - cells.put("cq1", "val1"); - cells.put("cq2", "val2"); - - final long ts1 = 123456789; - hBaseClientService.addResult("row1", cells, ts1); - - runner.setProperty(FetchHBaseRow.TABLE_NAME_FIELD, "${hbase.table}"); - runner.setProperty(FetchHBaseRow.ROW_ID_FIELD, "${hbase.row}"); - runner.setProperty(FetchHBaseRow.COLUMNS_FIELD, "${hbase.cols}"); - runner.setProperty(FetchHBaseRow.DESTINATION, FetchHBaseRow.DESTINATION_CONTENT); - - final Map attributes = new HashMap<>(); - attributes.put("hbase.table", "table1"); - attributes.put("hbase.row", "row1"); - attributes.put("hbase.cols", "logisland:cq2"); - - runner.enqueue("trigger flow file", attributes); - runner.run(); - - runner.assertTransferCount(FetchHBaseRow.REL_FAILURE, 0); - runner.assertTransferCount(FetchHBaseRow.REL_SUCCESS, 1); - runner.assertTransferCount(FetchHBaseRow.REL_NOT_FOUND, 0); - - final MockRecord record = runner.getRecordsForRelationship(FetchHBaseRow.REL_SUCCESS).get(0); - record.assertContentEquals("{\"row\":\"row1\", \"cells\": [{\"fam\":\"logisland\",\"qual\":\"cq2\",\"val\":\"val2\",\"ts\":" + ts1 + "}]}"); - - Assert.assertEquals(1, hBaseClientService.getNumScans()); - } - - @Test - public void testFetchWhenScanThrowsException() { - hBaseClientService.setThrowException(true); - - runner.setProperty(FetchHBaseRow.TABLE_NAME_FIELD, "table1"); - runner.setProperty(FetchHBaseRow.ROW_ID_FIELD, "row1"); - runner.setProperty(FetchHBaseRow.DESTINATION, FetchHBaseRow.DESTINATION_ATTRIBUTES); - - runner.enqueue("trigger flow file"); - runner.run(); - - runner.assertTransferCount(FetchHBaseRow.REL_FAILURE, 1); - runner.assertTransferCount(FetchHBaseRow.REL_SUCCESS, 0); - runner.assertTransferCount(FetchHBaseRow.REL_NOT_FOUND, 0); - - Assert.assertEquals(0, hBaseClientService.getNumScans()); - } -*/ -} diff --git a/logisland-components/logisland-processors/logisland-processor-hbase/src/test/java/com/hurence/logisland/processor/hbase/TestPutHBaseCell.java b/logisland-components/logisland-processors/logisland-processor-hbase/src/test/java/com/hurence/logisland/processor/hbase/TestPutHBaseCell.java deleted file mode 100644 index 623918995..000000000 --- a/logisland-components/logisland-processors/logisland-processor-hbase/src/test/java/com/hurence/logisland/processor/hbase/TestPutHBaseCell.java +++ /dev/null @@ -1,294 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.hurence.logisland.processor.hbase; - -import com.hurence.logisland.component.InitializationException; -import com.hurence.logisland.service.hbase.put.PutColumn; -import com.hurence.logisland.service.hbase.put.PutRecord; -import com.hurence.logisland.record.Record; -import com.hurence.logisland.record.RecordUtils; -import com.hurence.logisland.serializer.KryoSerializer; -import com.hurence.logisland.serializer.RecordSerializer; -import com.hurence.logisland.serializer.SerializerProvider; -import com.hurence.logisland.util.runner.MockRecord; -import com.hurence.logisland.util.runner.TestRunner; -import com.hurence.logisland.util.runner.TestRunners; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.List; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -public class TestPutHBaseCell { - - private static Logger logger = LoggerFactory.getLogger(TestPutHBaseCell.class); - public static final String TABLE_NAME_KEY = "table_name"; - public static final String ROW_ID_KEY = "row_id"; - public static final String COLUMN_FAMILY_KEY = "column_family"; - public static final String COLUMN_QUALIFIER_KEY = "column_qualifier"; - - - public static final String TABLE_NAME = "logisland"; - public static final String QUALIFIER = "qualifier1"; - public static final String ROW_ID_1 = "id1"; - public static final String ROW_ID_2 = "id2"; - public static final String FAMILY = "family1"; - public static final String KEY = "some key"; - public static final String VALUE = "some content"; - public static final String ROW_BINARY = "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00" + - "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00" + - "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00" + - "\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00" + - "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x01\\x00\\x00\\x00\\x00\\x00" + - "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00" + - "\\x00\\x00\\x00\\x01\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00" + - "\\x01\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x01\\x01\\x01\\x00\\x01\\x00\\x01\\x01\\x01\\x00\\x00\\x00" + - "\\x00\\x00\\x00\\x01\\x01\\x01\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x01\\x00\\x01\\x00\\x01\\x00" + - "\\x00\\x01\\x01\\x01\\x01\\x00\\x00\\x01\\x01\\x01\\x00\\x01\\x00\\x00"; - - private byte[] serialize(Record record) { - - - RecordSerializer serializer = SerializerProvider.getSerializer(KryoSerializer.class.getName(), null); - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - serializer.serialize(baos, record); - final byte[] buffer = baos.toByteArray(); - try { - baos.close(); - } catch (IOException e) { - logger.info(e.toString()); - } - return buffer; - } - - private Record deserialize(byte[] cell) { - RecordSerializer serializer = SerializerProvider.getSerializer(KryoSerializer.class.getName(), null); - try { - // final byte[] row = Arrays.copyOfRange(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength() + cell.getRowOffset()); - ByteArrayInputStream bais = new ByteArrayInputStream(cell); - Record deserializedRecord = serializer.deserialize(bais); - bais.close(); - return deserializedRecord; - - } catch (Exception e) { - logger.info(e.toString()); - return null; - } - } - - @Test - public void testSerializing() { - final Record inputRecord = new MockRecord(RecordUtils.getKeyValueRecord("key", "value")); - - final byte[] serialized = serialize(inputRecord); - - assertEquals(inputRecord, new MockRecord(deserialize(serialized))); - } - - @Test - public void testSingleRecord() throws IOException, InitializationException { - - final TestRunner runner = getTestRunner(); - - final MockHBaseClientService hBaseClient = getHBaseClientService(runner); - - final Record inputRecord = getRecord(); - runner.enqueue(inputRecord); - runner.run(); - runner.assertAllInputRecordsProcessed(); - - - final MockRecord outputRecord = runner.getOutputRecords().get(0); - outputRecord.assertContentEquals(inputRecord); - - assertNotNull(hBaseClient.getRecordPuts()); - assertEquals(1, hBaseClient.getRecordPuts().size()); - - List puts = hBaseClient.getRecordPuts().get(TABLE_NAME); - assertEquals(1, puts.size()); - verifyPut(ROW_ID_1, FAMILY, QUALIFIER, inputRecord, puts.get(0)); - - } - - private Record getRecord() { - final Record inputRecord = new MockRecord(RecordUtils.getKeyValueRecord(KEY, VALUE)); - - inputRecord.setStringField(ROW_ID_KEY, ROW_ID_1); - inputRecord.setStringField(COLUMN_FAMILY_KEY, FAMILY); - inputRecord.setStringField(COLUMN_QUALIFIER_KEY, QUALIFIER); - inputRecord.setStringField(TABLE_NAME_KEY, TABLE_NAME); - return inputRecord; - } - - private TestRunner getTestRunner() { - final TestRunner runner = TestRunners.newTestRunner(new PutHBaseCell()); - runner.setProperty(PutHBaseCell.TABLE_NAME_FIELD, TABLE_NAME_KEY); - runner.setProperty(PutHBaseCell.ROW_ID_FIELD, ROW_ID_KEY); - runner.setProperty(PutHBaseCell.COLUMN_FAMILY_FIELD, COLUMN_FAMILY_KEY); - runner.setProperty(PutHBaseCell.COLUMN_QUALIFIER_FIELD, COLUMN_QUALIFIER_KEY); - runner.setProperty(PutHBaseCell.BATCH_SIZE, "1"); - runner.setProperty(PutHBaseCell.RECORD_SERIALIZER, KryoSerializer.class.getName()); - return runner; - } - - - @Test - public void testMultipleRecordsSameTableDifferentRow() throws IOException, InitializationException { - - - final TestRunner runner = getTestRunner(); - final MockHBaseClientService hBaseClient = getHBaseClientService(runner); - final Record inputRecord1 = getRecord().setStringField(ROW_ID_KEY, ROW_ID_1); - final Record inputRecord2 = getRecord().setStringField(ROW_ID_KEY, ROW_ID_2); - runner.enqueue(inputRecord1, inputRecord2); - - - runner.run(); - runner.assertAllInputRecordsProcessed(); - runner.assertOutputErrorCount(0); - - final MockRecord outFile = runner.getOutputRecords().get(0); - outFile.assertContentEquals(inputRecord1); - - assertNotNull(hBaseClient.getRecordPuts()); - assertEquals(1, hBaseClient.getRecordPuts().size()); - - List puts = hBaseClient.getRecordPuts().get(TABLE_NAME); - assertEquals(2, puts.size()); - verifyPut(ROW_ID_1, FAMILY, QUALIFIER, inputRecord1, puts.get(0)); - verifyPut(ROW_ID_2, FAMILY, QUALIFIER, inputRecord2, puts.get(1)); - - } - - - @Test - public void testMultipleRecordsSameTableDifferentRowFailure() throws IOException, InitializationException { - - - final TestRunner runner = getTestRunner(); - final MockHBaseClientService hBaseClient = getHBaseClientService(runner); - hBaseClient.setThrowException(true); - - final Record inputRecord1 = getRecord().setStringField(ROW_ID_KEY, ROW_ID_1); - final Record inputRecord2 = getRecord().setStringField(ROW_ID_KEY, ROW_ID_2); - runner.enqueue(inputRecord1, inputRecord2); - - runner.run(); - runner.assertOutputErrorCount(2); - - } - - @Test - public void testMultipleRecordsSameTableSameRow() throws IOException, InitializationException { - final TestRunner runner = getTestRunner(); - final MockHBaseClientService hBaseClient = getHBaseClientService(runner); - - - final Record inputRecord1 = getRecord().setStringField(ROW_ID_KEY, ROW_ID_1); - final Record inputRecord2 = getRecord().setStringField(ROW_ID_KEY, ROW_ID_1); - runner.enqueue(inputRecord1, inputRecord2); - - runner.run(); - runner.assertAllInputRecordsProcessed(); - - final MockRecord outFile = runner.getOutputRecords().get(0); - outFile.assertContentEquals(inputRecord1); - - assertNotNull(hBaseClient.getRecordPuts()); - assertEquals(1, hBaseClient.getRecordPuts().size()); - - List puts = hBaseClient.getRecordPuts().get(TABLE_NAME); - assertEquals(2, puts.size()); - verifyPut(ROW_ID_1, FAMILY, QUALIFIER, inputRecord1, puts.get(0)); - verifyPut(ROW_ID_1, FAMILY, QUALIFIER, inputRecord2, puts.get(1)); - - - } - - @Test - public void testSingleRecordWithBinaryRowKey() throws IOException, InitializationException { - - - final TestRunner runner = TestRunners.newTestRunner(new PutHBaseCell()); - runner.setProperty(PutHBaseCell.TABLE_NAME_FIELD, TABLE_NAME_KEY); - runner.setProperty(PutHBaseCell.ROW_ID_FIELD, ROW_ID_KEY); - runner.setProperty(PutHBaseCell.ROW_ID_ENCODING_STRATEGY, PutHBaseCell.ROW_ID_ENCODING_BINARY.getValue()); - runner.setProperty(PutHBaseCell.COLUMN_FAMILY_FIELD, COLUMN_FAMILY_KEY); - runner.setProperty(PutHBaseCell.COLUMN_QUALIFIER_FIELD, COLUMN_QUALIFIER_KEY); - runner.setProperty(PutHBaseCell.BATCH_SIZE, "1"); - - final MockHBaseClientService hBaseClient = getHBaseClientService(runner); - - final byte[] expectedRowKey = hBaseClient.toBytesBinary(ROW_BINARY); - - final Record inputRecord1 = getRecord().setStringField(ROW_ID_KEY, ROW_BINARY); - runner.enqueue(inputRecord1); - runner.run(); - runner.assertAllInputRecordsProcessed(); - runner.assertOutputRecordsCount(1); - - final MockRecord outFile = runner.getOutputRecords().get(0); - outFile.assertContentEquals(inputRecord1); - - assertNotNull(hBaseClient.getRecordPuts()); - assertEquals(1, hBaseClient.getRecordPuts().size()); - - List puts = hBaseClient.getRecordPuts().get(TABLE_NAME); - assertEquals(1, puts.size()); - verifyPut(expectedRowKey, FAMILY.getBytes(StandardCharsets.UTF_8), QUALIFIER.getBytes(StandardCharsets.UTF_8), inputRecord1, puts.get(0)); - - } - - - - - private MockHBaseClientService getHBaseClientService(TestRunner runner) throws InitializationException { - final MockHBaseClientService hBaseClient = new MockHBaseClientService(); - runner.addControllerService("hbaseClient", hBaseClient); - runner.enableControllerService(hBaseClient); - runner.setProperty(PutHBaseCell.HBASE_CLIENT_SERVICE, "hbaseClient"); - return hBaseClient; - } - - private void verifyPut(String row, String columnFamily, String columnQualifier, Record content, PutRecord put) { - verifyPut(row.getBytes(StandardCharsets.UTF_8), columnFamily.getBytes(StandardCharsets.UTF_8), - columnQualifier.getBytes(StandardCharsets.UTF_8), content, put); - } - - private void verifyPut(byte[] row, byte[] columnFamily, byte[] columnQualifier, Record content, PutRecord put) { - assertEquals(new String(row, StandardCharsets.UTF_8), new String(put.getRow(), StandardCharsets.UTF_8)); - - assertNotNull(put.getColumns()); - assertEquals(1, put.getColumns().size()); - - final PutColumn column = put.getColumns().iterator().next(); - assertEquals(new String(columnFamily, StandardCharsets.UTF_8), new String(column.getColumnFamily(), StandardCharsets.UTF_8)); - assertEquals(new String(columnQualifier, StandardCharsets.UTF_8), new String(column.getColumnQualifier(), StandardCharsets.UTF_8)); - - MockRecord out = new MockRecord(deserialize(column.getBuffer())); - out.assertContentEquals(content); - } - -} diff --git a/logisland-components/logisland-processors/logisland-processor-hbase/src/test/java/com/hurence/logisland/processor/hbase/io/TestJsonFullRowSerializer.java b/logisland-components/logisland-processors/logisland-processor-hbase/src/test/java/com/hurence/logisland/processor/hbase/io/TestJsonFullRowSerializer.java deleted file mode 100644 index 90f7f0e94..000000000 --- a/logisland-components/logisland-processors/logisland-processor-hbase/src/test/java/com/hurence/logisland/processor/hbase/io/TestJsonFullRowSerializer.java +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.processor.hbase.io; - -import com.hurence.logisland.service.hbase.scan.ResultCell; -import org.apache.commons.codec.binary.Base64; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.nio.charset.StandardCharsets; - -public class TestJsonFullRowSerializer { - - static final String ROW = "row1"; - - static final String FAM1 = "colFam1"; - static final String QUAL1 = "colQual1"; - static final String VAL1 = "val1"; - static final long TS1 = 1111111111; - - static final String FAM2 = "colFam2"; - static final String QUAL2 = "colQual2"; - static final String VAL2 = "val2"; - static final long TS2 = 222222222; - - private final byte[] rowKey = ROW.getBytes(StandardCharsets.UTF_8); - private ResultCell[] cells; - - @Before - public void setup() { - final byte[] cell1Fam = FAM1.getBytes(StandardCharsets.UTF_8); - final byte[] cell1Qual = QUAL1.getBytes(StandardCharsets.UTF_8); - final byte[] cell1Val = VAL1.getBytes(StandardCharsets.UTF_8); - - final byte[] cell2Fam = FAM2.getBytes(StandardCharsets.UTF_8); - final byte[] cell2Qual = QUAL2.getBytes(StandardCharsets.UTF_8); - final byte[] cell2Val = VAL2.getBytes(StandardCharsets.UTF_8); - - final ResultCell cell1 = getResultCell(cell1Fam, cell1Qual, cell1Val, TS1); - final ResultCell cell2 = getResultCell(cell2Fam, cell2Qual, cell2Val, TS2); - - cells = new ResultCell[] { cell1, cell2 }; - } - - @Test - public void testSerializeRegular() throws IOException { - final ByteArrayOutputStream out = new ByteArrayOutputStream(); - final RowSerializer rowSerializer = new JsonFullRowSerializer(StandardCharsets.UTF_8, StandardCharsets.UTF_8); - rowSerializer.serialize(rowKey, cells, out); - - final String json = out.toString(StandardCharsets.UTF_8.name()); - Assert.assertEquals("{\"row\":\"row1\", \"cells\": [" + - "{\"fam\":\"" + FAM1 + "\",\"qual\":\"" + QUAL1 + "\",\"val\":\"" + VAL1 + "\",\"ts\":" + TS1 + "}, " + - "{\"fam\":\"" + FAM2 + "\",\"qual\":\"" + QUAL2 + "\",\"val\":\"" + VAL2 + "\",\"ts\":" + TS2 + "}]}", - json); - } - - @Test - public void testSerializeWithBase64() throws IOException { - final ByteArrayOutputStream out = new ByteArrayOutputStream(); - final RowSerializer rowSerializer = new JsonFullRowSerializer(StandardCharsets.UTF_8, StandardCharsets.UTF_8, true); - rowSerializer.serialize(rowKey, cells, out); - - final String rowBase64 = Base64.encodeBase64String(ROW.getBytes(StandardCharsets.UTF_8)); - - final String fam1Base64 = Base64.encodeBase64String(FAM1.getBytes(StandardCharsets.UTF_8)); - final String qual1Base64 = Base64.encodeBase64String(QUAL1.getBytes(StandardCharsets.UTF_8)); - final String val1Base64 = Base64.encodeBase64String(VAL1.getBytes(StandardCharsets.UTF_8)); - - final String fam2Base64 = Base64.encodeBase64String(FAM2.getBytes(StandardCharsets.UTF_8)); - final String qual2Base64 = Base64.encodeBase64String(QUAL2.getBytes(StandardCharsets.UTF_8)); - final String val2Base64 = Base64.encodeBase64String(VAL2.getBytes(StandardCharsets.UTF_8)); - - final String json = out.toString(StandardCharsets.UTF_8.name()); - Assert.assertEquals("{\"row\":\"" + rowBase64 + "\", \"cells\": [" + - "{\"fam\":\"" + fam1Base64 + "\",\"qual\":\"" + qual1Base64 + "\",\"val\":\"" + val1Base64 + "\",\"ts\":" + TS1 + "}, " + - "{\"fam\":\"" + fam2Base64 + "\",\"qual\":\"" + qual2Base64 + "\",\"val\":\"" + val2Base64 + "\",\"ts\":" + TS2 + "}]}", json); - } - - private ResultCell getResultCell(byte[] fam, byte[] qual, byte[] val, long timestamp) { - final ResultCell cell = new ResultCell(); - - cell.setFamilyArray(fam); - cell.setFamilyOffset(0); - cell.setFamilyLength((byte)fam.length); - - cell.setQualifierArray(qual); - cell.setQualifierOffset(0); - cell.setQualifierLength(qual.length); - - cell.setValueArray(val); - cell.setValueOffset(0); - cell.setValueLength(val.length); - - cell.setTimestamp(timestamp); - - return cell; - } - -} diff --git a/logisland-components/logisland-processors/logisland-processor-hbase/src/test/java/com/hurence/logisland/processor/hbase/io/TestJsonQualifierAndValueRowSerializer.java b/logisland-components/logisland-processors/logisland-processor-hbase/src/test/java/com/hurence/logisland/processor/hbase/io/TestJsonQualifierAndValueRowSerializer.java deleted file mode 100644 index 089a3c5d0..000000000 --- a/logisland-components/logisland-processors/logisland-processor-hbase/src/test/java/com/hurence/logisland/processor/hbase/io/TestJsonQualifierAndValueRowSerializer.java +++ /dev/null @@ -1,107 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.processor.hbase.io; - -import com.hurence.logisland.service.hbase.scan.ResultCell; -import org.apache.commons.codec.binary.Base64; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.nio.charset.StandardCharsets; - -public class TestJsonQualifierAndValueRowSerializer { - - static final String ROW = "row1"; - - static final String FAM1 = "colFam1"; - static final String QUAL1 = "colQual1"; - static final String VAL1 = "val1"; - static final long TS1 = 1111111111; - - static final String FAM2 = "colFam2"; - static final String QUAL2 = "colQual2"; - static final String VAL2 = "val2"; - static final long TS2 = 222222222; - - private final byte[] rowKey = ROW.getBytes(StandardCharsets.UTF_8); - private ResultCell[] cells; - - @Before - public void setup() { - final byte[] cell1Fam = FAM1.getBytes(StandardCharsets.UTF_8); - final byte[] cell1Qual = QUAL1.getBytes(StandardCharsets.UTF_8); - final byte[] cell1Val = VAL1.getBytes(StandardCharsets.UTF_8); - - final byte[] cell2Fam = FAM2.getBytes(StandardCharsets.UTF_8); - final byte[] cell2Qual = QUAL2.getBytes(StandardCharsets.UTF_8); - final byte[] cell2Val = VAL2.getBytes(StandardCharsets.UTF_8); - - final ResultCell cell1 = getResultCell(cell1Fam, cell1Qual, cell1Val, TS1); - final ResultCell cell2 = getResultCell(cell2Fam, cell2Qual, cell2Val, TS2); - - cells = new ResultCell[] { cell1, cell2 }; - } - - @Test - public void testSerializeRegular() throws IOException { - final ByteArrayOutputStream out = new ByteArrayOutputStream(); - final RowSerializer rowSerializer = new JsonQualifierAndValueRowSerializer(StandardCharsets.UTF_8, StandardCharsets.UTF_8); - rowSerializer.serialize(rowKey, cells, out); - - final String json = out.toString(StandardCharsets.UTF_8.name()); - Assert.assertEquals("{\"" + QUAL1 + "\":\"" + VAL1 + "\", \"" + QUAL2 + "\":\"" + VAL2 + "\"}", json); - } - - @Test - public void testSerializeWithBase64() throws IOException { - final ByteArrayOutputStream out = new ByteArrayOutputStream(); - final RowSerializer rowSerializer = new JsonQualifierAndValueRowSerializer(StandardCharsets.UTF_8, StandardCharsets.UTF_8, true); - rowSerializer.serialize(rowKey, cells, out); - - final String qual1Base64 = Base64.encodeBase64String(QUAL1.getBytes(StandardCharsets.UTF_8)); - final String val1Base64 = Base64.encodeBase64String(VAL1.getBytes(StandardCharsets.UTF_8)); - - final String qual2Base64 = Base64.encodeBase64String(QUAL2.getBytes(StandardCharsets.UTF_8)); - final String val2Base64 = Base64.encodeBase64String(VAL2.getBytes(StandardCharsets.UTF_8)); - - final String json = out.toString(StandardCharsets.UTF_8.name()); - Assert.assertEquals("{\"" + qual1Base64 + "\":\"" + val1Base64 + "\", \"" + qual2Base64 + "\":\"" + val2Base64 + "\"}", json); - } - - private ResultCell getResultCell(byte[] fam, byte[] qual, byte[] val, long timestamp) { - final ResultCell cell = new ResultCell(); - - cell.setFamilyArray(fam); - cell.setFamilyOffset(0); - cell.setFamilyLength((byte)fam.length); - - cell.setQualifierArray(qual); - cell.setQualifierOffset(0); - cell.setQualifierLength(qual.length); - - cell.setValueArray(val); - cell.setValueOffset(0); - cell.setValueLength(val.length); - - cell.setTimestamp(timestamp); - - return cell; - } - -} diff --git a/logisland-components/logisland-processors/logisland-processor-hbase/src/test/java/com/hurence/logisland/processor/hbase/io/TestJsonRowSerializer.java b/logisland-components/logisland-processors/logisland-processor-hbase/src/test/java/com/hurence/logisland/processor/hbase/io/TestJsonRowSerializer.java deleted file mode 100644 index f9b22a87d..000000000 --- a/logisland-components/logisland-processors/logisland-processor-hbase/src/test/java/com/hurence/logisland/processor/hbase/io/TestJsonRowSerializer.java +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.processor.hbase.io; - - -import com.hurence.logisland.service.hbase.scan.ResultCell; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.nio.charset.StandardCharsets; - -public class TestJsonRowSerializer { - - private final byte[] rowKey = "row1".getBytes(StandardCharsets.UTF_8); - private ResultCell[] cells; - - @Before - public void setup() { - final byte[] cell1Fam = "colFam1".getBytes(StandardCharsets.UTF_8); - final byte[] cell1Qual = "colQual1".getBytes(StandardCharsets.UTF_8); - final byte[] cell1Val = "val1".getBytes(StandardCharsets.UTF_8); - - final byte[] cell2Fam = "colFam2".getBytes(StandardCharsets.UTF_8); - final byte[] cell2Qual = "colQual2".getBytes(StandardCharsets.UTF_8); - final byte[] cell2Val = "val2".getBytes(StandardCharsets.UTF_8); - - final ResultCell cell1 = getResultCell(cell1Fam, cell1Qual, cell1Val); - final ResultCell cell2 = getResultCell(cell2Fam, cell2Qual, cell2Val); - - cells = new ResultCell[] { cell1, cell2 }; - } - - @Test - public void testSerializeRegular() throws IOException { - final ByteArrayOutputStream out = new ByteArrayOutputStream(); - final RowSerializer rowSerializer = new JsonRowSerializer(StandardCharsets.UTF_8); - rowSerializer.serialize(rowKey, cells, out); - - final String json = out.toString(StandardCharsets.UTF_8.name()); - Assert.assertEquals("{\"row\":\"row1\", \"cells\": {\"colFam1:colQual1\":\"val1\", \"colFam2:colQual2\":\"val2\"}}", json); - } - - private ResultCell getResultCell(byte[] fam, byte[] qual, byte[] val) { - final ResultCell cell = new ResultCell(); - - cell.setFamilyArray(fam); - cell.setFamilyOffset(0); - cell.setFamilyLength((byte)fam.length); - - cell.setQualifierArray(qual); - cell.setQualifierOffset(0); - cell.setQualifierLength(qual.length); - - cell.setValueArray(val); - cell.setValueOffset(0); - cell.setValueLength(val.length); - - return cell; - } - -} diff --git a/logisland-components/logisland-processors/logisland-processor-hbase/src/test/java/com/hurence/logisland/processor/hbase/util/TestObjectSerDe.java b/logisland-components/logisland-processors/logisland-processor-hbase/src/test/java/com/hurence/logisland/processor/hbase/util/TestObjectSerDe.java deleted file mode 100644 index 0a738a078..000000000 --- a/logisland-components/logisland-processors/logisland-processor-hbase/src/test/java/com/hurence/logisland/processor/hbase/util/TestObjectSerDe.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.processor.hbase.util; - -import org.junit.Assert; -import org.junit.Test; - -import java.io.*; - -public class TestObjectSerDe { - - @Test - public void testDeserializeSuccessful() throws IOException { - final ObjectSerDe serDe = new ObjectSerDe(); - - final String myObject = "myObject"; - final ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - final ObjectOutputStream out = new ObjectOutputStream(bOut); - out.writeObject(myObject); - - byte[] myObjectBytes = bOut.toByteArray(); - Assert.assertNotNull(myObjectBytes); - Assert.assertTrue(myObjectBytes.length > 0); - - InputStream input = new ByteArrayInputStream(myObjectBytes); - final Object deserialized = serDe.deserialize(input); - Assert.assertTrue(deserialized instanceof String); - Assert.assertEquals(myObject, deserialized); - } - - @Test - public void testDeserializeNull() throws IOException { - final ObjectSerDe serDe = new ObjectSerDe(); - final Object deserialized = serDe.deserialize(null); - Assert.assertNull(deserialized); - } - - @Test - public void testSerialize() throws IOException, ClassNotFoundException { - final ByteArrayOutputStream out = new ByteArrayOutputStream(); - final String myObject = "myObject"; - - final ObjectSerDe serDe = new ObjectSerDe(); - serDe.serialize(out, myObject); - - final ByteArrayInputStream bIn = new ByteArrayInputStream(out.toByteArray()); - final ObjectInputStream in = new ObjectInputStream(bIn); - - final Object deserialized = in.readObject(); - Assert.assertTrue(deserialized instanceof String); - Assert.assertEquals(myObject, deserialized); - } - -} diff --git a/logisland-components/logisland-processors/logisland-processor-outlier-detection/pom.xml b/logisland-components/logisland-processors/logisland-processor-outlier-detection/pom.xml index a0532230d..ada92eaaa 100644 --- a/logisland-components/logisland-processors/logisland-processor-outlier-detection/pom.xml +++ b/logisland-components/logisland-processors/logisland-processor-outlier-detection/pom.xml @@ -25,7 +25,7 @@ com.hurence.logisland logisland-processors - 1.3.0 + 1.4.0 jar @@ -167,20 +167,10 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - diff --git a/logisland-components/logisland-processors/logisland-processor-outlier-detection/src/main/java/com/hurence/logisland/processor/DetectOutliers.java b/logisland-components/logisland-processors/logisland-processor-outlier-detection/src/main/java/com/hurence/logisland/processor/DetectOutliers.java index 22f7db7cd..36f10e57b 100644 --- a/logisland-components/logisland-processors/logisland-processor-outlier-detection/src/main/java/com/hurence/logisland/processor/DetectOutliers.java +++ b/logisland-components/logisland-processors/logisland-processor-outlier-detection/src/main/java/com/hurence/logisland/processor/DetectOutliers.java @@ -31,7 +31,7 @@ import com.hurence.logisland.annotation.documentation.Tags; import com.hurence.logisland.component.InitializationException; import com.hurence.logisland.component.PropertyDescriptor; -import com.hurence.logisland.validator.ValidationContext; +import com.hurence.logisland.validator.Configuration; import com.hurence.logisland.validator.ValidationResult; import com.hurence.logisland.record.FieldDictionary; import com.hurence.logisland.record.FieldType; @@ -545,7 +545,7 @@ public void init(ProcessContext context) throws InitializationException { @Override - protected Collection customValidate(ValidationContext context) { + protected Collection customValidate(Configuration context) { final Collection results = new ArrayList<>(); diff --git a/logisland-components/logisland-processors/logisland-processor-querymatcher/pom.xml b/logisland-components/logisland-processors/logisland-processor-querymatcher/pom.xml index 200b226ac..82f35b359 100644 --- a/logisland-components/logisland-processors/logisland-processor-querymatcher/pom.xml +++ b/logisland-components/logisland-processors/logisland-processor-querymatcher/pom.xml @@ -26,7 +26,7 @@ http://www.w3.org/2001/XMLSchema-instance "> com.hurence.logisland logisland-processors - 1.3.0 + 1.4.0 jar @@ -96,20 +96,10 @@ http://www.w3.org/2001/XMLSchema-instance "> org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - diff --git a/logisland-components/logisland-processors/logisland-processor-querymatcher/src/main/java/com/hurence/logisland/processor/MatchQuery.java b/logisland-components/logisland-processors/logisland-processor-querymatcher/src/main/java/com/hurence/logisland/processor/MatchQuery.java index 915bc4025..4e6f08668 100644 --- a/logisland-components/logisland-processors/logisland-processor-querymatcher/src/main/java/com/hurence/logisland/processor/MatchQuery.java +++ b/logisland-components/logisland-processors/logisland-processor-querymatcher/src/main/java/com/hurence/logisland/processor/MatchQuery.java @@ -230,7 +230,6 @@ protected void updateMatchingRules(ProcessContext context) { @Override public Collection process(ProcessContext context, Collection records) { - try { return internalProcess(context, records); } finally { @@ -327,5 +326,6 @@ public void stop() { if (stopAnalyzer != null) { stopAnalyzer.close(); } + setIsInitialized(false); } } diff --git a/logisland-components/logisland-processors/logisland-processor-rest/pom.xml b/logisland-components/logisland-processors/logisland-processor-rest/pom.xml index cc9ddce71..05f4399ad 100644 --- a/logisland-components/logisland-processors/logisland-processor-rest/pom.xml +++ b/logisland-components/logisland-processors/logisland-processor-rest/pom.xml @@ -5,7 +5,7 @@ logisland-processors com.hurence.logisland - 1.3.0 + 1.4.0 4.0.0 @@ -14,7 +14,7 @@ logisland-processor-rest - 3.8.1 + 3.8.5 @@ -54,7 +54,11 @@ vertx-rx-java2 ${vertx.version} - + + com.google.guava + guava + 29.0-jre + @@ -64,20 +68,10 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - diff --git a/logisland-components/logisland-processors/logisland-processor-rest/src/main/java/com/hurence/logisland/rest/processor/lookup/AbstractCallRequest.java b/logisland-components/logisland-processors/logisland-processor-rest/src/main/java/com/hurence/logisland/rest/processor/lookup/AbstractCallRequest.java index e723f552b..b4cfc04bc 100644 --- a/logisland-components/logisland-processors/logisland-processor-rest/src/main/java/com/hurence/logisland/rest/processor/lookup/AbstractCallRequest.java +++ b/logisland-components/logisland-processors/logisland-processor-rest/src/main/java/com/hurence/logisland/rest/processor/lookup/AbstractCallRequest.java @@ -16,6 +16,7 @@ package com.hurence.logisland.rest.processor.lookup; +import com.google.common.collect.Lists; import com.hurence.logisland.component.AllowableValue; import com.hurence.logisland.component.InitializationException; import com.hurence.logisland.component.PropertyDescriptor; @@ -27,10 +28,11 @@ import com.hurence.logisland.serializer.RecordSerializer; import com.hurence.logisland.serializer.SerializerProvider; import com.hurence.logisland.validator.StandardValidators; -import com.hurence.logisland.validator.ValidationContext; +import com.hurence.logisland.validator.Configuration; import com.hurence.logisland.validator.ValidationResult; import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; public abstract class AbstractCallRequest extends AbstractHttpProcessor @@ -59,6 +61,27 @@ public abstract class AbstractCallRequest extends AbstractHttpProcessor .expressionLanguageSupported(true) .build(); + /* + tag1=valuea,valueb;tag2=valuea,valuec + */ + public static final PropertyDescriptor TAG_KEY_VALUE = new PropertyDescriptor.Builder() + .name("tag.map") + .description("the tags from the record with their values to allow the bulk rest call") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build(); + + /* + records.threshold=1000 + */ + public static final PropertyDescriptor RECORDS_THRESHOLD = new PropertyDescriptor.Builder() + .name("records.threshold") + .description("the number of records you want to bulk together to construct the curl body") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build(); + + public static final PropertyDescriptor REQUEST_BODY = new PropertyDescriptor.Builder() .name("request.body") .description("The body to use for the request.") @@ -119,7 +142,7 @@ public abstract class AbstractCallRequest extends AbstractHttpProcessor RecordSerializer serializer; @Override - protected Collection customValidate(ValidationContext context) { + protected Collection customValidate(Configuration context) { final List validationResults = new ArrayList<>(super.customValidate(context)); if (context.getPropertyValue(INPUT_AS_BODY).asBoolean() && context.getPropertyValue(REQUEST_BODY).isSet()) { validationResults.add( @@ -152,6 +175,8 @@ public List getSupportedPropertyDescriptors() { props.add(CONFLICT_RESOLUTION_POLICY); props.add(VALID_HTTP_CODES); props.add(KEEP_ONLY_BODY_RESPONSE); + props.add(TAG_KEY_VALUE); + props.add(RECORDS_THRESHOLD); return Collections.unmodifiableList(props); } @@ -213,6 +238,90 @@ Optional calculBody(Record record, ProcessContext context) { return Optional.empty(); } + ArrayList> concatBodyLegacy(Collection records, ProcessContext context) { + ArrayList> result = new ArrayList<>(); + if (records != null && !records.isEmpty()) { + int partition_size = (context.getPropertyValue(RECORDS_THRESHOLD).isSet()) ? context.getPropertyValue(RECORDS_THRESHOLD).asInteger() : 1000; + ArrayList records_list = new ArrayList<>(records); + for (List partition : Lists.partition(records_list, partition_size)) { + + StringBuffer buffer = new StringBuffer(); + for (Record record : partition ) { + if (triggerRestCall(record, context) && record.getField("ItemId") != null && record.getField("Userid") != null + && record.getField("ItemId").isSet() && record.getField("Userid").isSet()) { + buffer.append("{"); + + try { + buffer.append("\"id\":" + Long.parseLong(record.getField("Userid").asString() + record.getField("ItemId").asString())); + buffer.append(","); + } catch (NumberFormatException e) { + getLogger().debug("User id or Item can't be parsed to long (maybe undefined)" + e.getMessage()); + } + + try { + if (record.getField("SecondsViewed").isSet()) { + buffer.append("\"timeWatched\":" + record.getField("SecondsViewed").asLong()); + buffer.append(","); + } + + if (record.getField("VideoPercentViewed").isSet()) { + buffer.append("\"watched\":" + record.getField("VideoPercentViewed").asInteger()); + buffer.append(","); + } + } catch (Exception e) { + getLogger().debug("Best effort mode didn't work to get seconds and/or percent viewed , can happen on live session " + e.getMessage()); + } + + buffer.append("\"presentationId\":" + "\"" + record.getField("ItemId").asString() + "\""); + buffer.append(","); + try { + buffer.append("\"userId\":" + record.getField("Userid").asLong()); + }catch (NumberFormatException e) + { + buffer.append("\"userId\":-1" ); + } + + buffer.append("},"); + } + + } + if (buffer.length() > 0) { + buffer.setLength(buffer.length() - 1); + result.add(Optional.ofNullable("[ " + buffer + " ]")); + } + } + } + return result; + } + + ArrayList> concatBody(Collection records, ProcessContext context) { + ArrayList> result = new ArrayList<>(); + if (records != null && !records.isEmpty()) { + int partition_size = (context.getPropertyValue(RECORDS_THRESHOLD).isSet()) ? context.getPropertyValue(RECORDS_THRESHOLD).asInteger() : 1000; + ArrayList records_list = new ArrayList<>(records); + for (List partition : Lists.partition(records_list, partition_size)) { + + StringBuffer buffer = new StringBuffer(); + for (Record record : partition ) { + if (triggerRestCall(record, context)) { + Optional bodyOptional = calculBody(record,context); + if (bodyOptional.isPresent()) { + if (buffer.length() > 0) { + buffer.append(","); + } + buffer.append((String) bodyOptional.get()); + } + } + } + if (buffer.length() > 0) { + //buffer.setLength(buffer.length() - 1); + result.add(Optional.ofNullable("[ " + buffer + " ]")); + } + } + } + return result; + } + Optional calculMimTyp(Record record, ProcessContext context) { if (context.getPropertyValue(REQUEST_MIME_TYPE).isSet()) { return Optional.ofNullable(context.getPropertyValue(REQUEST_MIME_TYPE.getName()).evaluate(record).asString()); @@ -226,4 +335,33 @@ Optional calculVerb(Record record, ProcessContext context) { } return Optional.empty(); } + + /* + tag1=valuea,valueb;tag2=valuea,valuec + if the record contains one of the tag of the property with one of the value for this tag it will return true + */ + Boolean triggerRestCall(Record record, ProcessContext context) { + AtomicBoolean result = new AtomicBoolean(false); + if (context.getPropertyValue(TAG_KEY_VALUE).isSet()) { + String tag_list = context.getPropertyValue(TAG_KEY_VALUE).asString(); + String [] keyValuePairs = tag_list.split(";"); + Map map = new HashMap<>(); + for(String pair : keyValuePairs) //iterate over the pairs + { + String[] entry = pair.split("="); //split the pairs to get key and value + map.put(entry[0].trim(), entry[1].trim()); //add them to the hashmap and trim whitespaces + } + map.forEach( (k,v) -> { //k here is tag1 and tag2 + if ( record.getField(k) != null && record.getField(k).isSet()){ + String[] single_values = v.split(","); + List stringList = new ArrayList<>(Arrays.asList(single_values)); // List(valuea,valueb) for tag1 List(valuea,valuec) for tag2 + String recordValue = record.getField(k).asString(); + if (stringList.contains(recordValue)){ + result.set(true); + } + } + }); + } + return result.get(); + } } \ No newline at end of file diff --git a/logisland-components/logisland-processors/logisland-processor-rest/src/main/java/com/hurence/logisland/rest/processor/lookup/AsyncCallRequest.java b/logisland-components/logisland-processors/logisland-processor-rest/src/main/java/com/hurence/logisland/rest/processor/lookup/AsyncCallRequest.java index 2d7f18249..e82fc289f 100644 --- a/logisland-components/logisland-processors/logisland-processor-rest/src/main/java/com/hurence/logisland/rest/processor/lookup/AsyncCallRequest.java +++ b/logisland-components/logisland-processors/logisland-processor-rest/src/main/java/com/hurence/logisland/rest/processor/lookup/AsyncCallRequest.java @@ -56,6 +56,8 @@ public void init(ProcessContext context) throws InitializationException { public void stop() { if (vertx != null) { vertx.close(); + vertx = null; + setIsInitialized(false); } } @@ -76,6 +78,7 @@ public Collection process(final ProcessContext context, final Collection * loop over events to add them to bulk */ List>> responses = records.stream() + .filter(record -> triggerRestCall(record, context)) .map(record -> { StandardRecord coordinates = new StandardRecord(record); calculVerb(record, context).ifPresent(verb -> coordinates.setStringField(restClientService.getMethodKey(), verb)); @@ -105,7 +108,6 @@ public Collection process(final ProcessContext context, final Collection }); }).collect(Collectors.toList()); Maybe., Integer>zip(responses, (opts) -> { return 0; }).blockingGet();//wait until all request are done - stop(); return records; } } \ No newline at end of file diff --git a/logisland-components/logisland-processors/logisland-processor-rest/src/main/java/com/hurence/logisland/rest/processor/lookup/AsyncCallRequestBulkPostJson.java b/logisland-components/logisland-processors/logisland-processor-rest/src/main/java/com/hurence/logisland/rest/processor/lookup/AsyncCallRequestBulkPostJson.java new file mode 100644 index 000000000..83680a122 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-rest/src/main/java/com/hurence/logisland/rest/processor/lookup/AsyncCallRequestBulkPostJson.java @@ -0,0 +1,123 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.rest.processor.lookup; + + +import com.hurence.logisland.annotation.documentation.CapabilityDescription; +import com.hurence.logisland.annotation.documentation.Tags; +import com.hurence.logisland.component.InitializationException; +import com.hurence.logisland.error.ErrorUtils; +import com.hurence.logisland.processor.ProcessContext; +import com.hurence.logisland.processor.ProcessError; +import com.hurence.logisland.record.Record; +import com.hurence.logisland.record.StandardRecord; +import io.reactivex.Maybe; +import io.vertx.core.Handler; +import io.vertx.reactivex.core.Promise; +import io.vertx.reactivex.core.Vertx; + +import java.io.ByteArrayOutputStream; +import java.io.OutputStream; +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@Tags({"rest", "record", "http", "request", "call", "server"}) +@CapabilityDescription("Execute an http request with specified verb, body and mime type. Then stock result as a Record in the specified field") +//@ExtraDetailFile("./details/common-processors/BulkPut-Detail.rst") +public class AsyncCallRequestBulkPostJson extends AbstractCallRequest +{ + private Vertx vertx; + + @Override + public void init(ProcessContext context) throws InitializationException { + super.init(context); + try { + vertx = Vertx.vertx(); + } catch (Exception ex) { + throw new InitializationException(ex); + } + } + + public void stop() { + if (vertx != null) { + vertx.close(); + setIsInitialized(false); + } + } + + /** + * process events + * + * @param context + * @param records + * @return + */ + @Override + public Collection process(final ProcessContext context, final Collection records) { + if (records.isEmpty()) { + getLogger().warn("process has been called with an empty list of records !"); + return records; + } + /** + * loop over events to add them to bulk + */ + getLogger().debug("Into the bulk " ); + + ArrayList> requestBodies = concatBody(records, context); + getLogger().debug("Bulk body " +requestBodies ); + + if ( requestBodies !=null && !requestBodies.isEmpty() && records.stream().findFirst().isPresent()) { + for (Optional bodies : requestBodies) { + if (bodies.isPresent()) { + Record record = records.stream().findFirst().get(); + StandardRecord coordinates = new StandardRecord(record); + + calculVerb(record, context).ifPresent(verb -> coordinates.setStringField(restClientService.getMethodKey(), verb)); + calculMimTyp(record, context).ifPresent(mimeType -> coordinates.setStringField(restClientService.getMimeTypeKey(), mimeType)); + + coordinates.setStringField(restClientService.getbodyKey(), bodies.get()); + + getLogger().debug("Calling bulk for method " + coordinates.getField(restClientService.getMethodKey()).asString() + + " type " + coordinates.getField(restClientService.getMimeTypeKey()).asString() + + " with body " + coordinates.getField(restClientService.getbodyKey()).asString()); + Handler>> callRequestHandler = p -> { + try { + p.complete(restClientService.lookup(coordinates)); + } catch (Throwable t) { //There is other errors than LookupException, The proxyWrapper does wrap those into Reflection exceptions... + p.fail(t); + } + }; + + Maybe> response = vertx + .rxExecuteBlocking(callRequestHandler) + .doOnError(t -> { + ErrorUtils.handleError(getLogger(), t, record, ProcessError.RUNTIME_ERROR.getName()); + }) + .doOnSuccess(rspOpt -> { + rspOpt.ifPresent(rsp -> modifyRecord(record, rsp)); + }); + response.blockingGet();// wait until the request is done + } + } + } + getLogger().debug("Bulk ended " ); + return records; + } +} \ No newline at end of file diff --git a/logisland-components/logisland-processors/logisland-processor-rest/src/test/java/com/hurence/logisland/rest/processor/lookup/AbstractCallRequestTest.java b/logisland-components/logisland-processors/logisland-processor-rest/src/test/java/com/hurence/logisland/rest/processor/lookup/AbstractCallRequestTest.java index 49a3cb749..4265bd6c8 100644 --- a/logisland-components/logisland-processors/logisland-processor-rest/src/test/java/com/hurence/logisland/rest/processor/lookup/AbstractCallRequestTest.java +++ b/logisland-components/logisland-processors/logisland-processor-rest/src/test/java/com/hurence/logisland/rest/processor/lookup/AbstractCallRequestTest.java @@ -72,39 +72,6 @@ public void testCustomValidate() { runner.assertValid(); } - @Test - public void basic_test() throws InitializationException { - final TestRunner runner = getRunnerInitialized(); - - //test queries - StandardRecord record1 = new StandardRecord(); - record1.setField("employeeId", FieldType.INT, 1); - StandardRecord record2 = new StandardRecord(); - record2.setField("employeeId", FieldType.INT, 2); - runner.enqueue(record1, record2); - runner.run(); - runner.assertAllInputRecordsProcessed(); - runner.assertOutputRecordsCount(2); - - MockRecord out = runner.getOutputRecords().get(0); - out.assertRecordSizeEquals(2); - out.assertFieldEquals("employeeId", 1); - out.assertFieldTypeEquals("employeeId", FieldType.INT); - out.assertFieldTypeEquals("response", FieldType.RECORD); - MockRecord coordinnates = new MockRecord(out.getField("response").asRecord()); - coordinnates.assertRecordSizeEquals(1); - coordinnates.assertFieldEquals("employeeId", 1); - coordinnates.assertFieldTypeEquals("employeeId", FieldType.INT); - MockRecord out2 = runner.getOutputRecords().get(1); - out2.assertFieldEquals("employeeId", 2); - out2.assertFieldTypeEquals("employeeId", FieldType.INT); - out2.assertFieldTypeEquals("response", FieldType.RECORD); - MockRecord coordinnates2 = new MockRecord(out2.getField("response").asRecord()); - coordinnates2.assertRecordSizeEquals(1); - coordinnates2.assertFieldEquals("employeeId", 2); - coordinnates2.assertFieldTypeEquals("employeeId", FieldType.INT); - - } @Test public void basic_test_2() throws InitializationException, IOException, LookupFailureException { @@ -114,6 +81,7 @@ public void basic_test_2() throws InitializationException, IOException, LookupFa StandardRecord record = new StandardRecord(); record.setField("employeeId", FieldType.STRING, "hello"); runner.enqueue(new StandardRecord(record)); + runner.setProperty(TAG_KEY_VALUE, "employeeId=hello"); runner.run(); runner.assertAllInputRecordsProcessed(); runner.assertOutputRecordsCount(1); @@ -139,6 +107,7 @@ public void adding_verb_to_coordinates() throws InitializationException, IOExcep //test queries StandardRecord record = new StandardRecord(); record.setField("employeeId", FieldType.STRING, "hello"); + runner.setProperty(TAG_KEY_VALUE, "employeeId=hello"); runner.enqueue(new StandardRecord(record)); runner.run(); runner.assertAllInputRecordsProcessed(); @@ -167,6 +136,7 @@ public void adding_verb_to_coordinates_expression_language() throws Initializati StandardRecord record = new StandardRecord(); record.setField("employeeId", FieldType.STRING, "hello"); runner.enqueue(new StandardRecord(record)); + runner.setProperty(TAG_KEY_VALUE, "employeeId=hello"); runner.run(); runner.assertAllInputRecordsProcessed(); runner.assertOutputRecordsCount(1); @@ -193,6 +163,7 @@ public void adding_mime_type_coordinates() throws InitializationException, IOExc //test queries StandardRecord record = new StandardRecord(); record.setField("employeeId", FieldType.STRING, "hello"); + runner.setProperty(TAG_KEY_VALUE, "employeeId=hello"); runner.enqueue(new StandardRecord(record)); runner.run(); runner.assertAllInputRecordsProcessed(); @@ -220,6 +191,7 @@ public void adding_mime_type_coordinates_expression_language() throws Initializa //test queries StandardRecord record = new StandardRecord(); record.setField("employeeId", FieldType.STRING, "hello"); + runner.setProperty(TAG_KEY_VALUE, "employeeId=hello"); runner.enqueue(new StandardRecord(record)); runner.run(); runner.assertAllInputRecordsProcessed(); @@ -248,6 +220,7 @@ public void adding_body_coordinates() throws InitializationException, IOExceptio StandardRecord record = new StandardRecord(); record.setField("employeeId", FieldType.STRING, "hello"); runner.enqueue(new StandardRecord(record)); + runner.setProperty(TAG_KEY_VALUE, "employeeId=hello"); runner.run(); runner.assertAllInputRecordsProcessed(); runner.assertOutputRecordsCount(1); @@ -274,6 +247,7 @@ public void adding_body_coordinates_expression_language() throws InitializationE //test queries StandardRecord record = new StandardRecord(); record.setField("employeeId", FieldType.STRING, "hello"); + runner.setProperty(TAG_KEY_VALUE, "employeeId=hello"); runner.enqueue(new StandardRecord(record)); runner.run(); runner.assertAllInputRecordsProcessed(); @@ -301,6 +275,7 @@ public void adding_body_coordinates_expression_language_2() throws Initializatio //test queries StandardRecord record = new StandardRecord(); record.setField("http_query", FieldType.STRING, "my query"); + runner.setProperty(TAG_KEY_VALUE, "http_query=my query"); runner.enqueue(new StandardRecord(record)); runner.run(); runner.assertAllInputRecordsProcessed(); @@ -318,26 +293,7 @@ public void adding_body_coordinates_expression_language_2() throws Initializatio coordinates.assertFieldTypeEquals("http_query", FieldType.STRING); } - @Test - public void adding_body_coordinates_expression_language_3() throws InitializationException, IOException, LookupFailureException { - final TestRunner runner = getRunnerInitialized(); - final RestClientService service = (RestClientService) runner.getControllerService(SERVICE_ID); - runner.setProperty(REQUEST_BODY, "${http_query}"); - runner.assertValid(); - - //test queries - StandardRecord record = new StandardRecord(); - runner.enqueue(new StandardRecord(record)); - runner.run(); - runner.assertAllInputRecordsProcessed(); - runner.assertOutputRecordsCount(1); - MockRecord out = runner.getOutputRecords().get(0); - out.assertRecordSizeEquals(1); - out.assertFieldTypeEquals("response", FieldType.RECORD); - MockRecord coordinates = new MockRecord(out.getField("response").asRecord()); - coordinates.assertRecordSizeEquals(0); - } @Test public void test_with_input_as_body() throws InitializationException, IOException, LookupFailureException { @@ -354,6 +310,7 @@ public void test_with_input_as_body() throws InitializationException, IOExceptio record.setField(FieldDictionary.RECORD_TYPE, FieldType.STRING, "my_type"); record.setField(FieldDictionary.RECORD_ID, FieldType.STRING, "my_id"); record.setField(FieldDictionary.RECORD_TIME, FieldType.STRING, 1569938866837L); + runner.setProperty(TAG_KEY_VALUE, "param1=hello1;param2=hello2;param3=hello3"); runner.enqueue(new StandardRecord(record)); runner.run(); runner.assertAllInputRecordsProcessed(); @@ -399,6 +356,7 @@ public void keep_only_response_body() throws InitializationException, IOExceptio //test queries StandardRecord record = new StandardRecord(); record.setField("employeeId", FieldType.STRING, "hello"); + runner.setProperty(TAG_KEY_VALUE, "employeeId=hello"); runner.enqueue(new StandardRecord(record)); runner.run(); runner.assertAllInputRecordsProcessed(); @@ -412,7 +370,7 @@ public void keep_only_response_body() throws InitializationException, IOExceptio out.assertFieldEquals("response", fakebody); } - private TestRunner getRunnerInitialized() throws InitializationException { + TestRunner getRunnerInitialized() throws InitializationException { return getRunnerInitialized(null); } diff --git a/logisland-components/logisland-processors/logisland-processor-rest/src/test/java/com/hurence/logisland/rest/processor/lookup/AsyncCallRequestBulkPostJsonTest.java b/logisland-components/logisland-processors/logisland-processor-rest/src/test/java/com/hurence/logisland/rest/processor/lookup/AsyncCallRequestBulkPostJsonTest.java new file mode 100644 index 000000000..5e699f41d --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-rest/src/test/java/com/hurence/logisland/rest/processor/lookup/AsyncCallRequestBulkPostJsonTest.java @@ -0,0 +1,117 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.rest.processor.lookup; + +import com.hurence.logisland.component.ComponentContext; +import com.hurence.logisland.component.InitializationException; +import com.hurence.logisland.processor.ProcessContext; +import com.hurence.logisland.processor.Processor; +import com.hurence.logisland.record.FieldType; +import com.hurence.logisland.record.Record; +import com.hurence.logisland.record.StandardRecord; +import com.hurence.logisland.service.lookup.LookupFailureException; +import com.hurence.logisland.service.rest.MockRestClientService; +import com.hurence.logisland.service.rest.RestClientService; +import com.hurence.logisland.util.runner.MockRecord; +import com.hurence.logisland.util.runner.TestRunner; +import com.hurence.logisland.util.runner.TestRunners; +import org.junit.Test; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; + +import static com.hurence.logisland.rest.processor.lookup.AbstractCallRequest.*; +import static com.hurence.logisland.rest.processor.lookup.AbstractHttpProcessor.HTTP_CLIENT_SERVICE; + +public class AsyncCallRequestBulkPostJsonTest { + + private static String SERVICE_ID = "bulkService"; + + Processor newProc() { + return new AsyncCallRequestBulkPostJson(); + } + + + @Test + public void basic_test() throws InitializationException { + + final TestRunner runner = getRunnerInitialized(); + final RestClientService service = (RestClientService) runner.getControllerService(SERVICE_ID); + runner.setProperty(CONFLICT_RESOLUTION_POLICY, OVERWRITE_EXISTING.getValue()); + //runner.setProperty(KEEP_ONLY_BODY_RESPONSE, "true"); + runner.setProperty(RECORDS_THRESHOLD, "2"); + + runner.setProperty(REQUEST_BODY, "body"); + runner.setProperty(REQUEST_METHOD, "post"); + runner.setProperty(REQUEST_MIME_TYPE, "application/json"); + runner.setProperty(TAG_KEY_VALUE, "tagName=ha_video_engagement_brightcove,ha_video_engagement_brightcove_bis;itemType=pres"); + + runner.assertValid(); + + //test queries + StandardRecord record1 = new StandardRecord(); + record1.setField("ItemId", FieldType.STRING, "218594"); + record1.setField("tagName", FieldType.STRING, "ha_video_engagement_brightcove"); + record1.setField("SecondsViewed", FieldType.LONG, 45); + record1.setField("Userid", FieldType.LONG, 103951); + record1.setField("VideoPercentViewed", FieldType.INT, 15); + + StandardRecord record2 = new StandardRecord(); + record2.setField("ItemId", FieldType.STRING, "215863"); + record2.setField("tagName", FieldType.STRING, "ha_video_engagement_brightcove"); + record2.setField("Userid", FieldType.LONG, 103952); + record2.setField("VideoPercentViewed", FieldType.INT, 15); + + + + StandardRecord record3 = new StandardRecord(); + record3.setField("tagName", FieldType.STRING, "ha_video_engagement_brightcove"); + record3.setField("ItemId", FieldType.STRING, "215863"); + record3.setField("VideoPercentViewed", FieldType.INT, 15); + + + runner.enqueue(record1, record2, record3); + runner.run(); + runner.assertAllInputRecordsProcessed(); + runner.assertOutputRecordsCount(3); + MockRecord out = runner.getOutputRecords().get(0); + out.assertRecordSizeEquals(6); + + MockRecord coordinates = new MockRecord(out.getField("response").asRecord()); + coordinates.assertRecordSizeEquals(9); + + } + + private TestRunner getRunnerInitialized() throws InitializationException { + return getRunnerInitialized(null); + } + + private TestRunner getRunnerInitialized(String fakeBody) throws InitializationException { + final TestRunner runner = TestRunners.newTestRunner(newProc()); + MockRestClientService service = new MockRestClientService(fakeBody); + //enable service + runner.addControllerService("restLookupService", service); + runner.enableControllerService(service); + runner.assertValid(service); + //config proc + runner.setProperty(HTTP_CLIENT_SERVICE, "restLookupService"); + runner.setProperty(FIELD_HTTP_RESPONSE, "response"); + //runner.setProperty(CONFLICT_RESOLUTION_POLICY, KEEP_OLD_FIELD.getValue()); + runner.assertValid(); + return runner; + } +} diff --git a/logisland-components/logisland-processors/logisland-processor-rest/src/test/java/com/hurence/logisland/rest/processor/lookup/CallRequestTest.java b/logisland-components/logisland-processors/logisland-processor-rest/src/test/java/com/hurence/logisland/rest/processor/lookup/CallRequestTest.java index 72ee47c8c..bc3beaa82 100644 --- a/logisland-components/logisland-processors/logisland-processor-rest/src/test/java/com/hurence/logisland/rest/processor/lookup/CallRequestTest.java +++ b/logisland-components/logisland-processors/logisland-processor-rest/src/test/java/com/hurence/logisland/rest/processor/lookup/CallRequestTest.java @@ -15,8 +15,25 @@ */ package com.hurence.logisland.rest.processor.lookup; +import com.hurence.logisland.component.InitializationException; import com.hurence.logisland.processor.Processor; +import com.hurence.logisland.record.FieldType; +import com.hurence.logisland.record.StandardRecord; +import com.hurence.logisland.service.lookup.LookupFailureException; +import com.hurence.logisland.service.rest.RestClientService; +import com.hurence.logisland.util.runner.MockRecord; +import com.hurence.logisland.util.runner.TestRunner; +import org.junit.Test; +import java.io.IOException; + +import static com.hurence.logisland.rest.processor.lookup.AbstractCallRequest.REQUEST_BODY; + + +/** + * note that the two test below cannot be factorized with async call request test + * because of runner.setProperty(TAG_KEY_VALUE, ... ) statement that cannot be computed here + */ public class CallRequestTest extends AbstractCallRequestTest { @@ -24,4 +41,60 @@ public class CallRequestTest extends AbstractCallRequestTest { Processor newProc() { return new CallRequest(); } + + @Test + public void basic_test() throws InitializationException { + final TestRunner runner = getRunnerInitialized(); + + //test queries + StandardRecord record1 = new StandardRecord(); + record1.setField("employeeId", FieldType.INT, 1); + StandardRecord record2 = new StandardRecord(); + record2.setField("employeeId", FieldType.INT, 2); + runner.enqueue(record1, record2); + runner.run(); + runner.assertAllInputRecordsProcessed(); + runner.assertOutputRecordsCount(2); + + MockRecord out = runner.getOutputRecords().get(0); + out.assertRecordSizeEquals(2); + out.assertFieldEquals("employeeId", 1); + out.assertFieldTypeEquals("employeeId", FieldType.INT); + out.assertFieldTypeEquals("response", FieldType.RECORD); + MockRecord coordinnates = new MockRecord(out.getField("response").asRecord()); + coordinnates.assertRecordSizeEquals(1); + coordinnates.assertFieldEquals("employeeId", 1); + coordinnates.assertFieldTypeEquals("employeeId", FieldType.INT); + MockRecord out2 = runner.getOutputRecords().get(1); + out2.assertFieldEquals("employeeId", 2); + out2.assertFieldTypeEquals("employeeId", FieldType.INT); + out2.assertFieldTypeEquals("response", FieldType.RECORD); + MockRecord coordinnates2 = new MockRecord(out2.getField("response").asRecord()); + coordinnates2.assertRecordSizeEquals(1); + coordinnates2.assertFieldEquals("employeeId", 2); + coordinnates2.assertFieldTypeEquals("employeeId", FieldType.INT); + + } + + @Test + public void adding_body_coordinates_expression_language_3() throws InitializationException, IOException, LookupFailureException { + final TestRunner runner = getRunnerInitialized(); + final RestClientService service = (RestClientService) runner.getControllerService(SERVICE_ID); + runner.setProperty(REQUEST_BODY, "${http_query}"); + runner.assertValid(); + + //test queries + StandardRecord record = new StandardRecord(); + runner.enqueue(new StandardRecord(record)); + runner.run(); + runner.assertAllInputRecordsProcessed(); + runner.assertOutputRecordsCount(1); + + MockRecord out = runner.getOutputRecords().get(0); + out.assertRecordSizeEquals(1); + out.assertFieldTypeEquals("response", FieldType.RECORD); + MockRecord coordinates = new MockRecord(out.getField("response").asRecord()); + coordinates.assertRecordSizeEquals(0); + } + } diff --git a/logisland-components/logisland-processors/logisland-processor-scripting/pom.xml b/logisland-components/logisland-processors/logisland-processor-scripting/pom.xml index e1f60cbd5..55059b9f6 100644 --- a/logisland-components/logisland-processors/logisland-processor-scripting/pom.xml +++ b/logisland-components/logisland-processors/logisland-processor-scripting/pom.xml @@ -23,7 +23,7 @@ com.hurence.logisland logisland-processors - 1.3.0 + 1.4.0 logisland-processor-scripting @@ -68,11 +68,6 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - @@ -85,11 +80,6 @@ com.hurence.logisland logisland-maven-plugin - - - package - - diff --git a/logisland-components/logisland-processors/logisland-processor-scripting/src/main/java/com/hurence/logisland/processor/scripting/python/RunPython.java b/logisland-components/logisland-processors/logisland-processor-scripting/src/main/java/com/hurence/logisland/processor/scripting/python/RunPython.java index 66a6fcc2f..330e83d13 100644 --- a/logisland-components/logisland-processors/logisland-processor-scripting/src/main/java/com/hurence/logisland/processor/scripting/python/RunPython.java +++ b/logisland-components/logisland-processors/logisland-processor-scripting/src/main/java/com/hurence/logisland/processor/scripting/python/RunPython.java @@ -23,8 +23,8 @@ import com.hurence.logisland.processor.*; import com.hurence.logisland.record.Record; import com.hurence.logisland.record.StandardRecord; +import com.hurence.logisland.validator.Configuration; import com.hurence.logisland.validator.StandardValidators; -import com.hurence.logisland.validator.ValidationContext; import com.hurence.logisland.validator.ValidationResult; import org.slf4j.Logger; @@ -579,7 +579,7 @@ public void onPropertyModified(PropertyDescriptor descriptor, String oldValue, S } @Override - protected Collection customValidate(ValidationContext context) { + protected Collection customValidate(Configuration context) { final List validationResults = new ArrayList<>(super.customValidate(context)); logger.debug("customValidate"); diff --git a/logisland-components/logisland-processors/logisland-processor-useragent/pom.xml b/logisland-components/logisland-processors/logisland-processor-useragent/pom.xml index f1c7946c3..af80755bd 100644 --- a/logisland-components/logisland-processors/logisland-processor-useragent/pom.xml +++ b/logisland-components/logisland-processors/logisland-processor-useragent/pom.xml @@ -23,7 +23,7 @@ com.hurence.logisland logisland-processors - 1.3.0 + 1.4.0 logisland-processor-useragent @@ -79,20 +79,10 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - diff --git a/logisland-components/logisland-processors/logisland-processor-useragent/src/main/java/com/hurence/logisland/processor/useragent/ParseUserAgent.java b/logisland-components/logisland-processors/logisland-processor-useragent/src/main/java/com/hurence/logisland/processor/useragent/ParseUserAgent.java index 31e7323a9..a2fd72eca 100644 --- a/logisland-components/logisland-processors/logisland-processor-useragent/src/main/java/com/hurence/logisland/processor/useragent/ParseUserAgent.java +++ b/logisland-components/logisland-processors/logisland-processor-useragent/src/main/java/com/hurence/logisland/processor/useragent/ParseUserAgent.java @@ -306,7 +306,7 @@ private void processRecords(Collection records, UserAgentAnalyzer uaa) { Field uaField = record.getField(userAgentField); if (uaField == null) { - getLogger().info("Skipping record. Field '" + userAgentField + "' does not exists in record"); + getLogger().debug("Skipping record. Field '" + userAgentField + "' does not exists in record"); continue; } diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/IncrementalWebSession_archi.md b/logisland-components/logisland-processors/logisland-processor-web-analytics/IncrementalWebSession_archi.md new file mode 100644 index 000000000..abd75afef --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/IncrementalWebSession_archi.md @@ -0,0 +1,188 @@ +# But du processeur + +Ce processeur met à jours els sessions web correspondant auw web events qu'il reçoit. + +# Description du comportement actuelle + +Actuellement le processeur fonctionne comme ça : + +* Pour chaque session concerné par les events en entréé, on fait un multiget sur le mapping pour obtenir la dernière session (les sessions #n). +* Ensuite on fait un multi get pour obtenir chacune de ces sessions +* Ensuite on applique les évènements en entrée à ces sessions. +* On sauvegarde les évènements en entrée avec leur sessions associé (potentiellement modifié avec #n) +* On renvoie les nouvelles sessions qui ont été créer/modifier par le traitement des nouveaux évènements. + +Voir schéma IncrementalWebSession_current_archi.plantuml + +## Problème + +Avant chaque requête ES il faut faire un refresh des index concernées pour être sur d'avoir les informations à jour. +En effet faire un bulkFlush ne garantie pas d'avoir des données à jour lors d'une prochaine requête. +Il n y a que le refresh qui donne cette garantie (preuve par tests d'intégration IncrementalWebSessionIT). + +# Proposition d'une nouvelle architecture + +## Hypothèses + +On suppose que le moteur est kafka stream. Et que les données d'un même utilisateur sont toujours données dans une même partition kafka. + +Dans ce cas la, Structured stream avec kafka garantie que les données provenant d'une même partition kafka est toujours exécuté par +le même exécuteur. Ce qui veut dire que l'on peut utiliser un service de cache qui sera donc toujours synchrone au sein d'un +exécuteur donnée. + +On suppose que dans kafka on a exclusivement des données chronologique au niveau de chaque user. +C'est à dire que pour un partiId donnée, on ne peut pas avoir eventN+1 avec un timestamp inférieur à eventN. + + +## Solution pour la performance + +Dans ce cas la on peut utiliser un cache pour stoquer le mapping d'une sessions à une sub sessions de +manière robuste et performante (sans requête à ES). De même en ce qui concerne les données d'une session en particulier. + +Il reste ensuite à trouver un moyen de gérer un rewind ET un restart sans rewind du job mais en ayant déjà des données précédentes dans ES. De manière que cela +n'est pas d'impacte. Il faut que le job soit idempotent. + +## Proposition pour simplifier le flux + +Changer la session id a l'entrée de logisland ou à la sortie de divolte. En effet la session fournie par divolte ne devrait pas être +la même sur deux journées différentes. Du coup nous pouvons modifier la session de la manière suivante pour garantir cela : + +sessionId = divolt_session + yyyy-MM-dd (attention au timezone ! local ou UTC ?) + +De cette manière nous n'avons pas besoin de gérer le changement de session lorsqu'il ya un changement de jour ! +De plus pour savoir si il y a une sub sessions nous n'avons qu'a chercher les sessions dans l'index au niveau de la journée correspondante ! +En effet sinon la dernière sub session pourrait très bien daté d'il y a 3 mois (voir plus dans un cas extrême !) + +## Solution pour l'idempotence + +Il y a deux cas : +1) Soit le cache connait la sessions demandé et/ou le mapping de la session demandé. +2) Soit le cache ne connait pas une sessions demandé et/ou son mapping. + +Dans le premier cas il n y a pas de problème et le résultat d'un même processing sera toujours le même. +La difficulté est donc de savoir comment on alimente/initialise le cache lorsqu'une information est inconnue. + +Je propose que l'on élimine l'index de mapping des sessions. En effet celui-là pose beaucoup de problème pour l'idempotence. +De plus c'est un index qui n'a aucune utilité en dehors de la mécanique interne du job analytique. + +Nous devons trouver une solution à ces deux problèmes : +* obtenir l'information d'une session lorsqu'elle n'est pas présente dans le cache +* obtenir la dernière sous sessions d'une session données + +### obtenir l'information d'une session lorsqu'elle n'est pas présente dans le cache + +Comme le session id est capé à une journée on peut directement chercher cette session + dans l'index correspondant, actuellement on a un index par mois donc l'index du mois correspondant à l'évènement. + +### obtenir la dernière sous sessions d'une session données + +Comme le session id est capé à une journée on peut directement chercher cette session + dans l'index correspondant, actuellement on a un index par mois donc l'index du mois correspondant à l'évènement. +Il faut trouver une query qui retourne toutes les sub sessions pour une session donnée et trier par le timestamp +afin d'obtenir la dernière. + +### Cas spécifique du rewind + +Le problème est qu'on va avoir les données de la session qui a déjà traité les évènements que l'on a en entrés. +De plus les évènements que nous avons sont potentiellement par exemple uniquement les deux derniers évènements de la sub session 2. +Il faut donc reprendre cette sessions et toute les sessions suivantes. Et pour reconstituer la sub sessions 2 nous allons devoir nous assurer +d'avoir tous les évènements la concernant. + +En effet sinon des paramètres de la session comme "eventCounter" seront erronés. +Il faut donc pour moi : + +1. Détecter que l'on est dans un cas de rewind +2. Dans ce cas effacer les toutes les sessions du futur (par rapport aux évènements en input). A noter que de toute manière nous +avons toujours la donnée brute a disposition dans l'index des évènements et dans kafka. +3. Récupérer tous les évènements des users pour la/les journées par rapport aux évènements d'entrées. +4. Reprocesser les sessions + +--- +**NOTE** : On pourrait se dire que l'étape deux n'est pas nécessaire car les sessions vont être écraser par les nouvelles recalculés. +Seulement si on change la logique des changements de sessions cela pourrait être faux. + +--- + +--- +**NOTE** : Pour les events ou a pas ce problèmes car les nouveaux évènements vont écrasés les anciens sans effet de bord a ma connaissance. + +--- + +#### Détecter que l'on est dans un cas de rewind + +A partir de chaque event en entrée on trouve pour chaque partyId le T-event-min (timestamp minimum). +pour chaque sessionId on demande la dernière sous sessions correspondante et on obtient le sousSessionId. +pour chaque sousSessionId on demande le T-session-start et T-session-end de cette sousSessionId. +Si T-session-end > T-session-start > T-event-min alors cela veut dire que les évènements en cours +ont probablement déjà été traités (dans un fonctionnement nominal). Que ce soit un rewind ou juste +un restart et que certaines sessions ont été enregistré sans que l'offset kafka ait été commité. + +#### Effacer les toutes les sessions du futur + +On efface toutes les sessions dont T-session-end >= T-event-min. + +#### Récupérer tous les évènements des users pour la/les journées + +On récupère tous les events pour les partyId données que l'on merge a nos events en input. + +#### Reprocesser les sessions + +On recréer les sessions à la main a partie de tous les events. + +### Cas spécifique du restart + +Pour moi le cas du restart ne pose presque pas de problème. Dans le pire des cas, le job précédents +a enregistrer des évènements dans ES et certaines sessions dans ES mais pas toutes (sinon l'offset kafka est avancé). + +Dans ce cas la il faut s'assurer que les données de sessions ne soient pas corrompus (par exemple "eventCounter"). + +Le processe que l'on a mis en place pour le rewind devrait aussi fonctionner dans ce cas là. C'est à dire qu'il +devra détecter que els évènements on déjà été traité dans le cadre de certaines sessions, d'aller chercher les évènements +précédents et de recomputer la sessions puis de l'overrider. Il ne faut pas effacer la session en question car sinon +le job ne serait pas idempotent. Et que dans le cas dans double redémarrage rapide, le job ne serait plus capable +de détecter le restart car la sessions serait inexistante. Ou alors si l'on doit effacer des sessions, il ne faut le faire qu'a la fin après avoir injecté les nouvelles. +(si jamais il devait y'avoir au final moins de sessions qu'au début.) + +### Validation avec des scénario de test + + +#### Rejoue du job 2 fois sur les même données + +Faire au moins 2 tests + +#### Rewind du job + +Faire au moins 2 tests + + + + + + + + +``` +GET new_openanalytics_websessions-*/_search +{ + "query": { + "bool": { + "must": [ + { + "term": { + "orignalSessionId.raw": { + "value": "" + } + } + }, + { + "range": { + "firstEventEpochSeconds": { + "lte": + } + } + }, + ] + } + } +} +``` \ No newline at end of file diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/IncrementalWebSession_current_archi.plantuml b/logisland-components/logisland-processors/logisland-processor-web-analytics/IncrementalWebSession_current_archi.plantuml new file mode 100644 index 000000000..7d0f1b047 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/IncrementalWebSession_current_archi.plantuml @@ -0,0 +1,30 @@ + +@startuml +participant session_processor as P1 +participant es_service as ES_S +database ES as ES_D + +P1 -> ES_S: get all last sub-sessions id for each sessions processed +ES_S -> ES_D: multiGet to mapping indice +ES_D --> ES_S: response +ES_S --> P1: response + +P1 -> ES_S: get all concerned sub-sessions +ES_S -> ES_D: multiGet to sessions indices +ES_D --> ES_S: response +ES_S --> P1: response + +P1 -> P1: Applique tous les évènements a leur session correspondante. Ce qui peut modifier et créer de nouvelle sessions + +P1 -> ES_S: save all input events (sessionId potentially modified) +ES_S -> ES_D: bulkput et bulkFlush of events +ES_D --> ES_S: response +ES_S --> P1: response + + +P1 -> bulkPut_processor: give the sessions +bulkPut_processor -> ES_S: bulkput et bulkFlush of sessions +ES_S -> ES_D: bulkput et bulkFlush of sessions +ES_D --> ES_S: response +ES_S --> bulkPut_processor: response +@enduml \ No newline at end of file diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/IncrementalWebSession_proposed_archi.plantuml b/logisland-components/logisland-processors/logisland-processor-web-analytics/IncrementalWebSession_proposed_archi.plantuml new file mode 100644 index 000000000..e9c4bde3f --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/IncrementalWebSession_proposed_archi.plantuml @@ -0,0 +1,52 @@ + +@startuml +participant session_processor as P1 +participant cache_service as CACHE +participant es_service as ES_S +database ES as ES_D + +== Initialization == + +P1 -> P1: compute Map sessionIdToFirstTs (Tmin pour chaque sessionId) a partir des events en entrée. +P1 -> CACHE: pour chaque sessionId demande la dernière sous sessions connue (notamment son timestamp de fin) +CACHE -> CACHE: a l'info et la renvoie ou bien +CACHE -> ES_S: query elasticsearch l'index des sessions pour le mois en cours +ES_S -> CACHE: retourne Map sessionIdToLastSubSessions (y compris les sous sessions) +CACHE -> P1: retourne Map sessionIdToLastSubSessions + +== Cas des sessions avec des évènements du présent (ou bien les sessions du futur ont été effacés) == + +P1 -> P1: petit algo => sessions sans evenement du passé + +P1 -> P1: Applique tous les évènements a leur session correspondante. Ce qui peut modifier et créer de nouvelle sessions. + +P1 -> ES_S: save all input events (sessionId potentially modified) +ES_S -> ES_D: bulkput et bulkFlush of events + +P1 -> bulkPut_processor: give the sessions +bulkPut_processor -> ES_S: bulkput et bulkFlush of sessions +ES_S -> ES_D: bulkput et bulkFlush of sessions +ES_D --> ES_S: response +ES_S --> bulkPut_processor: response + +== Cas des sessions avec des évènements du passé == + +P1 -> P1: petit algo => sessions avec evenement du passé + +P1 -> ES_S: delete toutes les sous sessions sauf la première session car elle va être recalculé et écraser de toute manière (et cela permet d'être capable de redetecter le rewind ou restart si le job restart avant de commit l'offset). +ES_S -> ES_D: delete sessions +P1 -> ES_S: requête tout les évènements associés aux sessionsId (sous session compris) et Tevent <= Tmin +ES_S -> ES_D: multi get events +P1 -> P1: merger avec les events en input (garder en priorité les events en input) et transformer les sous sessionId en sessionId +P1 -> P1: Applique tous les évènements a leur session correspondante. Ce qui peut modifier et créer de nouvelle sessions. + +P1 -> ES_S: save all input events (sessionId potentially modified) +ES_S -> ES_D: bulkput et bulkFlush of events + +P1 -> bulkPut_processor: give the sessions +bulkPut_processor -> ES_S: bulkput et bulkFlush of sessions +ES_S -> ES_D: bulkput et bulkFlush of sessions +ES_D --> ES_S: response +ES_S --> bulkPut_processor: response + +@enduml \ No newline at end of file diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/pom.xml b/logisland-components/logisland-processors/logisland-processor-web-analytics/pom.xml index 3f6d9e299..c4f4257fe 100644 --- a/logisland-components/logisland-processors/logisland-processor-web-analytics/pom.xml +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/pom.xml @@ -23,13 +23,17 @@ com.hurence.logisland logisland-processors - 1.3.0 + 1.4.0 logisland-processor-web-analytics Web Analytics Processor Plugin jar + + 1.16.0 + + com.hurence.logisland @@ -69,7 +73,6 @@ true - com.hurence.logisland logisland-processor-common @@ -77,6 +80,32 @@ test + + com.hurence.logisland + logisland-service-elasticsearch_7_x-client + ${project.version} + test + + + com.hurence.logisland + logisland-service-inmemory-cache + ${project.version} + test + + + + + org.testcontainers + testcontainers + ${test.containers} + test + + + com.hurence.logisland + logisland-processor-elasticsearch + ${project.version} + test + @@ -84,20 +113,10 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/integration-test/java/com/hurence/junit5/extension/Es7DockerExtension.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/integration-test/java/com/hurence/junit5/extension/Es7DockerExtension.java new file mode 100644 index 000000000..de7793334 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/integration-test/java/com/hurence/junit5/extension/Es7DockerExtension.java @@ -0,0 +1,130 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.junit5.extension; + +import org.apache.http.HttpHost; +import org.elasticsearch.client.Client; +import org.elasticsearch.client.RestClient; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.client.transport.TransportClient; +import org.junit.jupiter.api.extension.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testcontainers.containers.DockerComposeContainer; +import org.testcontainers.containers.wait.strategy.Wait; + +import java.io.File; +import java.net.InetSocketAddress; +import java.util.HashSet; + +/** + * A JUnit rule which starts an embedded elastic-search docker container. + *

+ * Tests which use this rule will run relatively slowly, and should only be used when more conventional unit tests are + * not sufficient - eg when testing DAO-specific code. + *

+ */ +public class Es7DockerExtension implements BeforeAllCallback, AfterAllCallback, ParameterResolver { + + private static Logger logger = LoggerFactory.getLogger(Es7DockerExtension.class); + public final static String ES_SERVICE_NAME = "elasticsearch"; + public final static int ES_PORT_HTTP = 9200; + public final static int ES_PORT_TCP = 9300; + private static final HashSet INJECTABLE_TYPES = new HashSet() { + { + add(RestHighLevelClient.class); + add(DockerComposeContainer.class); + } + }; + /** + * The internal-transport client that talks to the local node. + */ + private RestHighLevelClient client; + private DockerComposeContainer dockerComposeContainer; + + /** + * Return the object through which operations can be performed on the ES cluster. + */ + public RestHighLevelClient getClient() { + return client; + } + + @Override + public void afterAll(ExtensionContext extensionContext) throws Exception { + if (getClient() != null) getClient().close(); + if (dockerComposeContainer != null) dockerComposeContainer.stop(); + } + + @Override + public void beforeAll(ExtensionContext extensionContext) throws Exception { + this.dockerComposeContainer = new DockerComposeContainer( + new File(getClass().getResource("/docker-compose-es-test.yml").getFile()) + ) + .withExposedService(ES_SERVICE_NAME, ES_PORT_HTTP, Wait.forListeningPort()) + .withExposedService(ES_SERVICE_NAME, ES_PORT_TCP, Wait.forListeningPort()); + logger.info("Starting docker compose"); + this.dockerComposeContainer.start(); + + String httpUrl = getEsHttpUrl(dockerComposeContainer); + String tcpUrl = getEsTcpUrl(dockerComposeContainer); + logger.info("httpUrl of es http://" + httpUrl); + logger.info("tcpUrl of es tcp://" + tcpUrl); + + client = new RestHighLevelClient( + RestClient.builder( + new HttpHost(dockerComposeContainer.getServiceHost(ES_SERVICE_NAME, ES_PORT_HTTP), + dockerComposeContainer.getServicePort(ES_SERVICE_NAME, ES_PORT_HTTP), + "http") + )); + } + + @Override + public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { + return INJECTABLE_TYPES.contains(parameterType(parameterContext)); + } + + private Class parameterType(ParameterContext parameterContext) { + return parameterContext.getParameter().getType(); + } + + @Override + public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { + Class type = parameterType(parameterContext); + if (type == RestHighLevelClient.class) { + return getClient(); + } + if (type == DockerComposeContainer.class) { + return dockerComposeContainer; + } + throw new IllegalStateException("Looks like the ParameterResolver needs a fix..."); + } + + private static Logger getLogger() { + return logger; + } + + public static String getEsHttpUrl(DockerComposeContainer dockerComposeContainer) { + return dockerComposeContainer.getServiceHost(ES_SERVICE_NAME, ES_PORT_HTTP) + + ":" + + dockerComposeContainer.getServicePort(ES_SERVICE_NAME, ES_PORT_HTTP); + } + + public static String getEsTcpUrl(DockerComposeContainer dockerComposeContainer) { + return dockerComposeContainer.getServiceHost(ES_SERVICE_NAME, ES_PORT_TCP) + + ":" + + dockerComposeContainer.getServicePort(ES_SERVICE_NAME, ES_PORT_TCP); + } +} \ No newline at end of file diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/java/com/hurence/logisland/service/solr/TestProcessor.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/integration-test/java/com/hurence/logisland/processor/TestProcessor.java similarity index 74% rename from logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/java/com/hurence/logisland/service/solr/TestProcessor.java rename to logisland-components/logisland-processors/logisland-processor-web-analytics/src/integration-test/java/com/hurence/logisland/processor/TestProcessor.java index 887e2cc0e..f5a1b2351 100644 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/java/com/hurence/logisland/service/solr/TestProcessor.java +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/integration-test/java/com/hurence/logisland/processor/TestProcessor.java @@ -14,12 +14,11 @@ * limitations under the License. */ -package com.hurence.logisland.service.solr; +package com.hurence.logisland.processor; import com.hurence.logisland.component.PropertyDescriptor; -import com.hurence.logisland.processor.AbstractProcessor; -import com.hurence.logisland.processor.ProcessContext; import com.hurence.logisland.record.Record; +import com.hurence.logisland.service.elasticsearch.ElasticsearchClientService; import java.util.ArrayList; import java.util.Collection; @@ -27,21 +26,20 @@ import java.util.List; - public class TestProcessor extends AbstractProcessor { - public static final PropertyDescriptor SOLR_CLIENT_SERVICE = new PropertyDescriptor.Builder() - .name("solr.chronix.client.service") - .description("The instance of the Controller Service to use for accessing Solr.") + public static final PropertyDescriptor ELASTICSEARCH_CLIENT_SERVICE = new PropertyDescriptor.Builder() + .name("elasticsearch.client.service") + .description("The instance of the Controller Service to use for accessing Elasticsearch.") .required(true) - .identifiesControllerService(Solr_8_ChronixClientService.class) + .identifiesControllerService(ElasticsearchClientService.class) .build(); @Override public List getSupportedPropertyDescriptors() { List propDescs = new ArrayList<>(); - propDescs.add(SOLR_CLIENT_SERVICE); + propDescs.add(ELASTICSEARCH_CLIENT_SERVICE); return propDescs; } diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/integration-test/java/com/hurence/logisland/processor/webanalytics/IncrementalWebSessionIT.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/integration-test/java/com/hurence/logisland/processor/webanalytics/IncrementalWebSessionIT.java new file mode 100644 index 000000000..14217bccb --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/integration-test/java/com/hurence/logisland/processor/webanalytics/IncrementalWebSessionIT.java @@ -0,0 +1,3325 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics; + +import com.hurence.junit5.extension.Es7DockerExtension; +import com.hurence.logisland.classloading.PluginProxy; +import com.hurence.logisland.component.InitializationException; +import com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch; +import com.hurence.logisland.processor.webanalytics.modele.TestMappings; +import com.hurence.logisland.processor.webanalytics.modele.WebSession; +import com.hurence.logisland.processor.webanalytics.util.ElasticsearchServiceUtil; +import com.hurence.logisland.processor.webanalytics.util.WebEvent; +import com.hurence.logisland.processor.webanalytics.util.WebSessionChecker; +import com.hurence.logisland.record.FieldDictionary; +import com.hurence.logisland.record.Record; +import com.hurence.logisland.service.cache.CacheService; +import com.hurence.logisland.service.cache.LRUKeyValueCacheService; +import com.hurence.logisland.service.elasticsearch.ElasticsearchClientService; +import com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService; +import com.hurence.logisland.util.runner.MockRecord; +import com.hurence.logisland.util.runner.TestRunner; +import com.hurence.logisland.util.runner.TestRunners; +import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.support.master.AcknowledgedResponse; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.client.indices.GetIndexRequest; +import org.elasticsearch.client.indices.PutIndexTemplateRequest; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.junit.Assert; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testcontainers.containers.DockerComposeContainer; + +import java.io.IOException; +import java.time.Duration; +import java.time.Instant; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static com.hurence.logisland.processor.webanalytics.IncrementalWebSession.defaultOutputFieldNameForEsIndex; +import static com.hurence.logisland.processor.webanalytics.util.ElasticsearchServiceUtil.*; +import static com.hurence.logisland.processor.webanalytics.util.UtilsTest.assertMapsAreEqualsIgnoringSomeKeys; +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Test incremental web-session processor. + */ +@ExtendWith({Es7DockerExtension.class}) +public class IncrementalWebSessionIT { + private static Logger logger = LoggerFactory.getLogger(IncrementalWebSessionIT.class); + private static boolean jobDoDeleteSessions = false;//we decided currently to never delete sessions + + private final long SESSION_TIMEOUT = 1800L; + private ElasticsearchClientService elasticsearchClientService; + private CacheService lruCache; + private IncrementalWebSession proc; + + + private final String USER1 = "user1"; + private final String USER2 = "user2"; + private final String USER3 = "user3"; + + private final String SESSION1 = "session1"; + private final String SESSION2 = "session2"; + private final String SESSION3 = "session3"; + + private final String URL = "url"; + + private final DockerComposeContainer container; + private final RestHighLevelClient esclient; + + private final TestRunner bulkRunner; + + IncrementalWebSessionIT(DockerComposeContainer container, + RestHighLevelClient esclient) throws InitializationException { + this.container = container; + this.esclient = esclient; + this.bulkRunner = newBulkAddTestRunner(container); + this.elasticsearchClientService = PluginProxy.unwrap(bulkRunner.getProcessContext() + .getPropertyValue(BulkAddElasticsearch.ELASTICSEARCH_CLIENT_SERVICE).asControllerService()); + } + + @BeforeEach + public void clean() throws IOException { + if (proc != null) { + this.proc.resetNumberOfRewindForProcInstance(); + } + try { + Thread.sleep(500L); + Set indices = Arrays.stream(esclient.indices().get( + new GetIndexRequest("*"), + RequestOptions.DEFAULT).getIndices() + ).collect(Collectors.toSet()); + while (!indices.isEmpty()) { + logger.info("Will delete following indices :{}", indices); + DeleteIndexRequest deleteRequest = new DeleteIndexRequest(indices.toArray(new String[0])); + Assert.assertTrue(esclient.indices().delete(deleteRequest, RequestOptions.DEFAULT).isAcknowledged()); + indices = Arrays.stream(esclient.indices().get( + new GetIndexRequest("*"), + RequestOptions.DEFAULT).getIndices() + ).collect(Collectors.toSet()); + } + } catch (Exception ex) { +// ex.printStackTrace(); + //when there is no index + } + PutIndexTemplateRequest templateRequest = new PutIndexTemplateRequest("all-indices") + .patterns(Arrays.asList("*")) + .settings(Settings.builder() + .put("index.number_of_shards", 5) + .put("index.number_of_replicas", 0) + ); + String mappingJson = TestFileHelper.loadFromFile("/rawStringMappingFile.json"); + templateRequest.mapping(mappingJson, XContentType.JSON); + AcknowledgedResponse putTemplateResponse = esclient.indices().putTemplate(templateRequest, RequestOptions.DEFAULT); + logger.info("putTemplateResponse is " + putTemplateResponse); + + } + + + /** + * T2 is one second later than T1 + * + * events : T1--T2--T3 + * changement de session: ---------- + * batch 1: T1 + * batch 2: T2 + * batch 3: T3 + * resultat attendu: S1 -> T1,T2, T3 + * + * + * @throws Exception + */ + @Test + public void testUpdateOneWebSession() + throws Exception + { + String URL1 = "URL1"; + String URL2 = "URL2"; + String URL3 = "URL3"; + Instant firstEvent = Instant.now().minusSeconds(8); + TestRunner testRunner = newTestRunner(container); + testRunner.assertValid(); + testRunner.enqueue(Arrays.asList(new WebEvent("1", SESSION1, USER1, firstEvent.toEpochMilli(), URL1))); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(2); + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + + Instant nextEvent = firstEvent.plusSeconds(2); + testRunner.clearQueues(); + testRunner.enqueue(Arrays.asList(new WebEvent("2", SESSION1, USER1, nextEvent.toEpochMilli(), URL2))); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(2); + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + + Instant lastEvent = nextEvent.plusSeconds(4); + testRunner.clearQueues(); + testRunner.enqueue(Arrays.asList(new WebEvent("3", SESSION1, USER1, lastEvent.toEpochMilli(), URL3))); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(2); + testRunner.assertOutputErrorCount(0); + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + + List sessions = ElasticsearchServiceUtil.getAllSessions( + this.elasticsearchClientService, esclient); + Set ids = sessions.stream().map(WebSession::getSessionId).collect(Collectors.toSet()); + Assert.assertTrue(ids.contains(SESSION1)); + + final MockRecord session = getFirstRecordWithId(SESSION1, testRunner.getOutputRecords()); + new WebSessionChecker(session).sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(firstEvent.toEpochMilli()) + .h2kTimestamp(firstEvent.toEpochMilli()) + .firstVisitedPage(URL1) + .eventsCounter(3) + .lastEventDateTime(lastEvent.toEpochMilli()) + .lastVisitedPage(URL3) + .sessionDuration(Duration.between(firstEvent, lastEvent).getSeconds()) + .is_sessionActive(true) + .sessionInactivityDuration(null); + Assert.assertEquals(0, this.proc.getNumberOfRewindForProcInstance()); + + } + + /** + * T1 is now - SESSION_TIMEOUT - 1. T2 is one second later than T2. + * events : T1--T2 + * changement de session: ------ + * batch 1: T1 session should be tagged as inactive because now - T1 > SESSION_TIMEOUT. + * batch 2: T2 session shoulb be updated even if it is already considered as inactive. + * resultat attendu: S1 -> T1,T2 + * + * + * @throws Exception + */ + @Test + public void testUpdateOneWebSessionInactive() + throws Exception + { + int eventCount = 0; + String URL1 = "URL1"; + String URL2 = "URL2"; + Instant firstEvent = Instant.now().minusSeconds(SESSION_TIMEOUT+1); + TestRunner testRunner = newTestRunner(container); + testRunner.assertValid(); + testRunner.enqueue(Arrays.asList(new WebEvent(String.valueOf(eventCount++), SESSION1, USER1, firstEvent.toEpochMilli(), URL1))); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(2); + injectOutputIntoEsThenSleepThenRefresh(testRunner.getOutputRecords()); + + Record doc = ElasticsearchServiceUtil.getSessionFromEs(elasticsearchClientService, esclient, + SESSION1, + TestMappings.sessionInternalFields); + new WebSessionChecker(doc) + .lastVisitedPage(URL1) + .sessionDuration(null) + .eventsCounter(1) + .firstEventDateTime(firstEvent.toEpochMilli()) + .lastEventDateTime(firstEvent.toEpochMilli()) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + // Update web session with timestamp 1s before timeout. + Instant instantOneSecondBeforeTimeout = firstEvent.plusSeconds(1); + testRunner.clearQueues(); + testRunner.enqueue(Arrays.asList(new WebEvent(String.valueOf(eventCount++), SESSION1, USER1, instantOneSecondBeforeTimeout.toEpochMilli(), URL2))); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(2); + injectOutputIntoEsThenRefresh(testRunner.getOutputRecords()); + + doc = ElasticsearchServiceUtil.getSessionFromEs(elasticsearchClientService, esclient, + SESSION1, + TestMappings.sessionInternalFields); + new WebSessionChecker(doc) + .lastVisitedPage(URL2) + .sessionDuration(instantOneSecondBeforeTimeout.getEpochSecond() - firstEvent.getEpochSecond()) + .eventsCounter(2) + .firstEventDateTime(firstEvent.toEpochMilli()) + .lastEventDateTime(instantOneSecondBeforeTimeout.toEpochMilli()) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + Assert.assertEquals(0, this.proc.getNumberOfRewindForProcInstance()); + } + + /** + * T1 is now - SESSION_TIMEOUT - 2. T2 is now. + * events : T1--T2 + * changement de session: ----X + * batch 1: T1 session should be tagged as inactive because now - T1 > SESSION_TIMEOUT. + * batch 2: T2 a new session should be created as more than SESSION_TIMEOUT seconds has passed + * resultat attendu: S1 -> T1, S1#2 -> T2 + * + * + * @throws Exception + */ + @Test + public void testUpdateOneWebSessionTimeout() + throws Exception + { + + int eventCount = 0; + String URL1 = "URL1"; + String URL2 = "URL2"; + // Create a web session with timestamp 2s before timeout. + Instant firstEvent = Instant.now().minusSeconds(SESSION_TIMEOUT + 2); + TestRunner testRunner = newTestRunner(container); + testRunner.assertValid(); + testRunner.enqueue(Arrays.asList(new WebEvent(String.valueOf(eventCount++), SESSION1, USER1, firstEvent.toEpochMilli(), URL1))); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(2); + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + + //Update web session with a timestamp that is timeout. + Instant timedoutEvent = Instant.now(); + testRunner.clearQueues(); + testRunner.enqueue(Arrays.asList(new WebEvent(String.valueOf(eventCount++), SESSION1, USER1, timedoutEvent.toEpochMilli(), URL2))); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(2 + 1);//1 event et 2 session + testRunner.assertOutputErrorCount(0); + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + + List sessions = ElasticsearchServiceUtil.getAllSessions( + this.elasticsearchClientService, esclient); + Set ids = sessions.stream().map(WebSession::getSessionId).collect(Collectors.toSet()); + Assert.assertTrue(ids.contains(SESSION1)); + + Record doc = ElasticsearchServiceUtil.getSessionFromEs(elasticsearchClientService, esclient, + SESSION1, + TestMappings.sessionInternalFields); + new WebSessionChecker(doc).sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(firstEvent.toEpochMilli()) + .h2kTimestamp(firstEvent.toEpochMilli()) + .firstVisitedPage(URL1) + .eventsCounter(1) + .lastEventDateTime(firstEvent.toEpochMilli()) + .lastVisitedPage(URL1) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + final String EXTRA_SESSION = SESSION1+"#2"; + doc = ElasticsearchServiceUtil.getSessionFromEs(elasticsearchClientService, esclient, + EXTRA_SESSION, + TestMappings.sessionInternalFields); + new WebSessionChecker(doc).sessionId(EXTRA_SESSION) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(EXTRA_SESSION) + .firstEventDateTime(timedoutEvent.toEpochMilli()) + .h2kTimestamp(timedoutEvent.toEpochMilli()) + .firstVisitedPage(URL2) + .eventsCounter(1) + .lastEventDateTime(timedoutEvent.toEpochMilli()) + .lastVisitedPage(URL2) + .is_sessionActive(true); + Assert.assertEquals(0, this.proc.getNumberOfRewindForProcInstance()); + } + + /** + * + * T1 is now - SESSION_TIMEOUT - 2. T2 is now. + * events : T1--T2--T3--T4--T5--T6--T7--T8--T9 + * changement de session: ----------------X-----------X----- + * batch 1: T1,T2,T3,T4,T5,T6,T7 + * S1 -> T1,T2,T3,T4 + * S1#2 -> T5,T6,T7 + * batch 2: T8,T9 + * S1#2 -> T5,T6,T7 + * S1#3 -> T8,T9 + * + * + * @throws Exception + */ + @Test + public void testBugWhenNotFlushingMappingAndHighFrequencyBatch() + throws Exception { + final String url = "https://orexad.preprod.group-iph.com/fr/entretien-de-fluides/c-20-50-10"; + final String divoltSession = "0:kfdxb7hf:U4e3OplHDO8Hda8yIS3O2iCdBOcVE_al"; + final String user = "user"; + final TestRunner testRunner = newTestRunner(container); + testRunner.assertValid(); + //first run + final long time1 = 1601629314416L; + final long time2 = 1601629317974L; + final long time3 = 1601629320331L; + final long time4 = 1601629320450L; + final long time5 = 1601639001984L; + final long time6 = 1601639014885L; + final long time7 = 1601639015025L; + List times = Arrays.asList(time1, time2, time3, time4, time5, time6, time7); + testRunner.enqueue(createEvents(url, divoltSession, user, times)); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + // One webSession expected. + testRunner.assertOutputRecordsCount(7 + 2); + final MockRecord session_1 = getFirstRecordWithId(divoltSession, testRunner.getOutputRecords()); + final MockRecord session_2 = getFirstRecordWithId(divoltSession + "#2", testRunner.getOutputRecords()); + new WebSessionChecker(session_1).sessionId(divoltSession) + .Userid(user) + .record_type("consolidate-session") + .record_id(divoltSession) + .firstEventDateTime(time1) + .h2kTimestamp(time1) + .firstVisitedPage(url) + .eventsCounter(4) + .lastEventDateTime(time4) + .lastVisitedPage(url) + .sessionDuration(6L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + new WebSessionChecker(session_2).sessionId(divoltSession + "#2") + .Userid(user) + .record_type("consolidate-session") + .record_id(divoltSession + "#2") + .firstEventDateTime(time5) + .h2kTimestamp(time5) + .firstVisitedPage(url) + .eventsCounter(3) + .lastEventDateTime(time7) + .lastVisitedPage(url) + .sessionDuration(13L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + //saves sessions + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + + + + //second run + final long time8 = 1601882662402L; + final long time9 = 1601882676592L; + times = Arrays.asList(time8, time9); + testRunner.clearQueues(); + testRunner.enqueue(createEvents(url, divoltSession, user, times)); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(2 + 2); + + final MockRecord session_2Updated = getFirstRecordWithId(divoltSession + "#2", testRunner.getOutputRecords()); + final MockRecord session_3 = getFirstRecordWithId(divoltSession + "#3", testRunner.getOutputRecords()); + new WebSessionChecker(session_2Updated).sessionId(divoltSession + "#2") + .Userid(user) + .record_type("consolidate-session") + .record_id(divoltSession + "#2") + .firstEventDateTime(time5) + .h2kTimestamp(time5) + .firstVisitedPage(url) + .eventsCounter(3) + .lastEventDateTime(time7) + .lastVisitedPage(url) + .sessionDuration(13L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + new WebSessionChecker(session_3).sessionId(divoltSession + "#3") + .Userid(user) + .record_type("consolidate-session") + .record_id(divoltSession + "#3") + .firstEventDateTime(time8) + .h2kTimestamp(time8) + .firstVisitedPage(url) + .eventsCounter(2) + .lastEventDateTime(time9) + .lastVisitedPage(url) + .sessionDuration(14L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + Assert.assertEquals(0, this.proc.getNumberOfRewindForProcInstance()); + } + + /** + * + * T1 is now - SESSION_TIMEOUT - 2. T2 is now. + * events : T1--T2--T3--T4--T5--T6--T7--T8--T9--T10 + * changement de session: ----X---X---X---X---X------------------ + * batch 1: T1,T2,T3,T4,T5 + * S1 -> T1 + * S1#2 -> T2 + * S1#3 -> T3 + * S1#4 -> T4 + * S1#5 -> T5 + * batch 2: T6,T7,T8 + * S1#5 -> T5 + * S1#6 -> T6,T7,T8 + * batch 2: T9,T10 + * S1#6 -> T9,T10 (+ T6,T7,T8, qui ne sont pas retournés) + * + * @throws Exception + */ + @Test + public void testBugWhenNotFlushingMappingAndHighFrequencyBatch2() + throws Exception { + final String url = "https://orexad.preprod.group-iph.com/fr/entretien-de-fluides/c-20-50-10"; + final String session = "0:kfdxb7hf:U4e3OplHDO8Hda8yIS3O2iCdBOcVE_al"; + final String user = "user"; + final TestRunner testRunner = newTestRunner(container); + testRunner.assertValid(); + //first run + final long time1 = 1601629314416L; + final long time2 = time1 + (SESSION_TIMEOUT + 1L) * 1000L; + final long time3 = time2 + (SESSION_TIMEOUT + 1L) * 1000L; + final long time4 = time3 + (SESSION_TIMEOUT + 1L) * 1000L; + final long time5 = time4 + (SESSION_TIMEOUT + 1L) * 1000L; + List times = Arrays.asList(time1, time2, time3, time4, time5); + List events = createEvents(url, session, user, times); + + testRunner.enqueue(events); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(5 + 5);//session + event + MockRecord session1 = getFirstRecordWithId(session, testRunner.getOutputRecords()); + MockRecord session5 = getFirstRecordWithId(session + "#5", testRunner.getOutputRecords()); + + new WebSessionChecker(session1).sessionId(session) + .Userid(user) + .record_type("consolidate-session") + .record_id(session) + .firstEventDateTime(time1) + .h2kTimestamp(time1) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time1) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + new WebSessionChecker(session5).sessionId(session + "#5") + .Userid(user) + .record_type("consolidate-session") + .record_id(session + "#5") + .firstEventDateTime(time5) + .h2kTimestamp(time5) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time5) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + //second run + final long time6 = time5 + 24L * 60L * 60L * 1000L; + final long time7 = time6 + 1000L; + final long time8 = time7 + 1000L; + times = Arrays.asList(time6, time7, time8); + events = createEvents(url, session, user, times); + testRunner.clearQueues(); + testRunner.enqueue(events); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(2 + 3);//session + event + session5 = getFirstRecordWithId(session + "#5", testRunner.getOutputRecords()); + MockRecord session6 = getFirstRecordWithId(session + "#6", testRunner.getOutputRecords()); + + new WebSessionChecker(session5).sessionId(session + "#5") + .Userid(user) + .record_type("consolidate-session") + .record_id(session + "#5") + .firstEventDateTime(time5) + .h2kTimestamp(time5) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time5) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + new WebSessionChecker(session6).sessionId(session + "#6") + .Userid(user) + .record_type("consolidate-session") + .record_id(session + "#6") + .firstEventDateTime(time6) + .h2kTimestamp(time6) + .firstVisitedPage(url) + .eventsCounter(3) + .lastEventDateTime(time8) + .lastVisitedPage(url) + .sessionDuration(2L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + //saves sessions + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + //third run + final long time9 = time8 + 1000L; + final long time10 = time9 + 1000L; + times = Arrays.asList(time9, time10); + events = createEvents(url, session, user, times); + testRunner.clearQueues(); + testRunner.enqueue(events); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(1 + 2);//session + event + + session6 = getFirstRecordWithId(session + "#6", testRunner.getOutputRecords()); + + new WebSessionChecker(session6).sessionId(session + "#6") + .Userid(user) + .record_type("consolidate-session") + .record_id(session + "#6") + .firstEventDateTime(time6) + .h2kTimestamp(time6) + .firstVisitedPage(url) + .eventsCounter(5) + .lastEventDateTime(time10) + .lastVisitedPage(url) + .sessionDuration(4L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + Assert.assertEquals(0, this.proc.getNumberOfRewindForProcInstance()); + } + + + /** + * Here we simulate a rewind by resetting cache and reprocessing events + * + * events : T1--T2--T3--T4--T5 + * changement de session: ----X---X---X---X- + * batch 1: T1,T2,T3,T4 et T5 + * S1 -> T1 + * S1#2 -> T2 + * S1#3 -> T3 + * S1#4 -> T4 + * S1#5 -> T5 + * + * Simulate a rewind by reseting cache + * batch 2: T1,T2 + * S1 -> T1 + * S1#2 -> T2 + * batch 3: T3,T4,T5 + * S1#2 -> T2 + * S1#3 -> T3 + * S1#4 -> T4 + * S1#5 -> T5 + * + * + * @throws Exception + */ + @Test + public void testRewind1() + throws Exception { + final String url = "https://orexad.preprod.group-iph.com/fr/entretien-de-fluides/c-20-50-10"; + final String session = "0:kfdxb7hf:U4e3OplHDO8Hda8yIS3O2iCdBOcVE_al"; + final String user = "user"; + final TestRunner testRunner = newTestRunner(container); + testRunner.assertValid(); + //first run + final long time1 = 1601629314416L; + final long time2 = time1 + (SESSION_TIMEOUT + 1L) * 1000L; + final long time3 = time2 + (SESSION_TIMEOUT + 1L) * 1000L; + final long time4 = time3 + (SESSION_TIMEOUT + 1L) * 1000L; + final long time5 = time4 + (SESSION_TIMEOUT + 1L) * 1000L; + List times = Arrays.asList(time1, time2, time3, time4, time5); + List events = createEvents(url, session, user, times); + + testRunner.enqueue(events); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(5 + 5); + MockRecord session1 = getFirstRecordWithId(session, testRunner.getOutputRecords()); + MockRecord session5 = getFirstRecordWithId(session + "#5", testRunner.getOutputRecords()); + Assert.assertEquals(0, this.proc.getNumberOfRewindForProcInstance()); + new WebSessionChecker(session1).sessionId(session) + .Userid(user) + .record_type("consolidate-session") + .record_id(session) + .firstEventDateTime(time1) + .h2kTimestamp(time1) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time1) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + new WebSessionChecker(session5).sessionId(session + "#5") + .Userid(user) + .record_type("consolidate-session") + .record_id(session + "#5") + .firstEventDateTime(time5) + .h2kTimestamp(time5) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time5) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + injectOutputIntoEsThenSleepThenRefresh(testRunner.getOutputRecords()); + SearchResponse rsp = getAllSessionsAfterRefreshing(esclient); + assertEquals(5, rsp.getHits().getTotalHits().value); + + //rewind batch1 + times = Arrays.asList(time1, time2); + events = createEvents(url, session, user, times); + testRunner.clearQueues(); + resetCache(testRunner); + testRunner.enqueue(events); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(2 + 2); + session1 = getFirstRecordWithId(session, testRunner.getOutputRecords()); + MockRecord session2 = getFirstRecordWithId(session + "#2", testRunner.getOutputRecords()); + Assert.assertEquals(1, this.proc.getNumberOfRewindForProcInstance()); + new WebSessionChecker(session1).sessionId(session) + .Userid(user) + .record_type("consolidate-session") + .record_id(session) + .firstEventDateTime(time1) + .h2kTimestamp(time1) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time1) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + new WebSessionChecker(session2).sessionId(session + "#2") + .Userid(user) + .record_type("consolidate-session") + .record_id(session + "#2") + .firstEventDateTime(time2) + .h2kTimestamp(time2) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time2) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + + //rewind batch 2 + times = Arrays.asList(time3, time4, time5); + events = createEvents(url, session, user, times); + testRunner.clearQueues(); + testRunner.enqueue(events); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(4 + 3); + session2 = getFirstRecordWithId(session + "#2", testRunner.getOutputRecords()); + MockRecord session3 = getFirstRecordWithId(session + "#3", testRunner.getOutputRecords()); + MockRecord session4 = getFirstRecordWithId(session + "#4", testRunner.getOutputRecords()); + session5 = getFirstRecordWithId(session + "#5", testRunner.getOutputRecords()); + + new WebSessionChecker(session2).sessionId(session + "#2") + .Userid(user) + .record_type("consolidate-session") + .record_id(session + "#2") + .firstEventDateTime(time2) + .h2kTimestamp(time2) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time2) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + new WebSessionChecker(session3).sessionId(session + "#3") + .Userid(user) + .record_type("consolidate-session") + .record_id(session + "#3") + .firstEventDateTime(time3) + .h2kTimestamp(time3) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time3) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + new WebSessionChecker(session4).sessionId(session + "#4") + .Userid(user) + .record_type("consolidate-session") + .record_id(session + "#4") + .firstEventDateTime(time4) + .h2kTimestamp(time4) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time4) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + new WebSessionChecker(session5).sessionId(session + "#5") + .Userid(user) + .record_type("consolidate-session") + .record_id(session + "#5") + .firstEventDateTime(time5) + .h2kTimestamp(time5) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time5) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + injectOutputIntoEsWithoutRefreshing(Arrays.asList(session2, session3, session4, session5)); + + + rsp = getAllSessionsAfterRefreshing(esclient); + assertEquals(5, rsp.getHits().getTotalHits().value); + Assert.assertEquals(1, this.proc.getNumberOfRewindForProcInstance()); + } + + /** + * Here we simulate a rewind by resetting cache and reprocessing events + * + * events : T1--T2--T3--T4--T5 + * changement de session: ----X---X---X---X- + * batch 1: T1,T2,T3,T4 et T5 + * S1 -> T1 + * S1#2 -> T2 + * S1#3 -> T3 + * S1#4 -> T4 + * S1#5 -> T5 + * + * Simulate a rewind by reseting cache + * batch 2: T3,T4,T5 + * S1#3 -> T3 + * S1#4 -> T4 + * S1#5 -> T5 + * + * + * @throws Exception + */ + @Test + public void testRewind2() + throws Exception { + final String url = "https://orexad.preprod.group-iph.com/fr/entretien-de-fluides/c-20-50-10"; + final String session = "0:kfdxb7hf:U4e3OplHDO8Hda8yIS3O2iCdBOcVE_al"; + final String user = "user"; + final TestRunner testRunner = newTestRunner(container); + testRunner.assertValid(); + //first run + final long time1 = 1601629314416L; + final long time2 = time1 + (SESSION_TIMEOUT + 1L) * 1000L; + final long time3 = time2 + (SESSION_TIMEOUT + 1L) * 1000L; + final long time4 = time3 + (SESSION_TIMEOUT + 1L) * 1000L; + final long time5 = time4 + (SESSION_TIMEOUT + 1L) * 1000L; + List times = Arrays.asList(time1, time2, time3, time4, time5); + List events = createEvents(url, session, user, times); + + testRunner.enqueue(events); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(5 + 5); + MockRecord session1 = getFirstRecordWithId(session, testRunner.getOutputRecords()); + MockRecord session5 = getFirstRecordWithId(session + "#5", testRunner.getOutputRecords()); + Assert.assertEquals(0, this.proc.getNumberOfRewindForProcInstance()); + new WebSessionChecker(session1).sessionId(session) + .Userid(user) + .record_type("consolidate-session") + .record_id(session) + .firstEventDateTime(time1) + .h2kTimestamp(time1) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time1) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + new WebSessionChecker(session5).sessionId(session + "#5") + .Userid(user) + .record_type("consolidate-session") + .record_id(session + "#5") + .firstEventDateTime(time5) + .h2kTimestamp(time5) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time5) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + injectOutputIntoEsThenSleepThenRefresh(testRunner.getOutputRecords()); + SearchResponse rsp = getAllSessionsAfterRefreshing(esclient); + assertEquals(5, rsp.getHits().getTotalHits().value); + //rewind from time3 + times = Arrays.asList(time3, time4, time5); + events = createEvents(url, session, user, times); + testRunner.clearQueues(); + resetCache(testRunner); + testRunner.enqueue(events); + testRunner.run(); + testRunner.assertOutputRecordsCount(3 + 3); + List outputSessions = testRunner.getOutputRecords(); + injectOutputIntoEsWithoutRefreshing(outputSessions); + + rsp = getAllSessionsAfterRefreshing(esclient); + assertEquals(5, rsp.getHits().getTotalHits().value); + Assert.assertEquals(1, this.proc.getNumberOfRewindForProcInstance()); + } + + /** + * Here we simulate a rewind by resetting cache and reprocessing events. + * We suppose that some events/session were effectively saved but some not before the job crash (power cut). + * + * events : T1--T2--T3--T4--T5 + * changement de session: ----X---X---X---X- + * batch 1: T1,T2,T3,T4 et T5 + * S1 -> T1 + * S1#2 -> T2 + * S1#3 -> T3 + * S1#4 -> T4 + * S1#5 -> T5 + * + * Simulate a rewind by reseting cache + * batch 3: T3,T4,T5 + * S1#3 -> T3 + * S1#4 -> T4 + * S1#5 -> T5 + * => Here we only register session 3 in es + * Simulate a rewind by reseting cache (because of a power cut offset was not commited previously) + * batch 3: T3,T4,T5 + * S1#3 -> T3 + * S1#4 -> T4 + * S1#5 -> T5 + * + * @throws Exception + */ + @Test + public void testRewindFailThenRestart() + throws Exception { + final String url = "https://orexad.preprod.group-iph.com/fr/entretien-de-fluides/c-20-50-10"; + final String session = "0:kfdxb7hf:U4e3OplHDO8Hda8yIS3O2iCdBOcVE_al"; + final String user = "user"; + final TestRunner testRunner = newTestRunner(container); + testRunner.assertValid(); + //first run + final long time1 = 1601629314416L; + final long time2 = time1 + (SESSION_TIMEOUT + 1L) * 1000L; + final long time3 = time2 + (SESSION_TIMEOUT + 1L) * 1000L; + final long time4 = time3 + (SESSION_TIMEOUT + 1L) * 1000L; + final long time5 = time4 + (SESSION_TIMEOUT + 1L) * 1000L; + List times = Arrays.asList(time1, time2, time3, time4, time5); + List events = createEvents(url, session, user, times); + + testRunner.enqueue(events); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(5 + 5); + MockRecord session1 = getFirstRecordWithId(session, testRunner.getOutputRecords()); + MockRecord session5 = getFirstRecordWithId(session + "#5", testRunner.getOutputRecords()); + + new WebSessionChecker(session1).sessionId(session) + .Userid(user) + .record_type("consolidate-session") + .record_id(session) + .firstEventDateTime(time1) + .h2kTimestamp(time1) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time1) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + new WebSessionChecker(session5).sessionId(session + "#5") + .Userid(user) + .record_type("consolidate-session") + .record_id(session + "#5") + .firstEventDateTime(time5) + .h2kTimestamp(time5) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time5) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + injectOutputIntoEsThenSleepThenRefresh(testRunner.getOutputRecords()); + Assert.assertEquals(0, this.proc.getNumberOfRewindForProcInstance()); + //rewind from time3 but fail during registering session so registering only session 3 + times = Arrays.asList(time3, time4, time5); + events = createEvents(url, session, user, times); + testRunner.clearQueues(); + resetCache(testRunner); + testRunner.enqueue(events); + testRunner.run(); + testRunner.assertOutputRecordsCount(3 + 3); + MockRecord session3 = getFirstRecordWithId(session + "#3", testRunner.getOutputRecords()); + injectOutputIntoEsWithoutRefreshing(Arrays.asList(session3)); + Assert.assertEquals(1, this.proc.getNumberOfRewindForProcInstance()); + + //restart from time3 because offset was not commited + times = Arrays.asList(time3, time4, time5); + events = createEvents(url, session, user, times); + testRunner.clearQueues(); + resetCache(testRunner); + testRunner.enqueue(events); + testRunner.run(); + testRunner.assertOutputRecordsCount(3 + 3); + List outputSessions = testRunner.getOutputRecords(); + injectOutputIntoEsWithoutRefreshing(outputSessions); + + SearchResponse rsp = getAllSessionsAfterRefreshing(esclient); + assertEquals(5, rsp.getHits().getTotalHits().value); + Assert.assertEquals(2, this.proc.getNumberOfRewindForProcInstance()); + } + + /** + * Here we simulate a rewind by resetting cache and reprocessing events. + * We suppose that some events/session were effectively saved but some not before the job crash (power cut). + * + * events DivolteSession1: T1--T2--T3--T4--T5 + * events DivolteSession2: T1--T2--T3--T4--T5 + * changement de session: ----X---X---X---X- + * batch 1: DivolteSession1: T1,T2,T3,T4 et T5, DivolteSession2: T1,T2,T3,T4 et T5 + * + * DivolteSession1: S1 -> T1 DivolteSession2: S1 -> T1 + * S1#2 -> T2 S1#2 -> T2 + * S1#3 -> T3 S1#3 -> T3 + * S1#4 -> T4 S1#4 -> T4 + * S1#5 -> T5 S1#5 -> T5 + * + * Simulate a rewind by reseting cache + * batch 2: DivolteSession1: T1,T2 DivolteSession2: T1,T2 + * + * DivolteSession1: S1 -> T1 DivolteSession2: S1 -> T1 + * S1#2 -> T2 S1#2 -> T2 + * + * => Here we only register session 3 in es + * Simulate a rewind by reseting cache (because of a power cut offset was not commited previously) + * batch 3: DivolteSession1: T3,T4,T5 DivolteSession2: T3,T4,T5 + * + * DivolteSession1: S1#3 -> T3 DivolteSession2: S1#3 -> T3 + * S1#4 -> T4 S1#4 -> T4 + * S1#5 -> T5 S1#5 -> T5 + * + * + * + * @throws Exception + */ + @Test + public void testRewind2MultipleDivoltId() + throws Exception { + final String url = "https://orexad.preprod.group-iph.com/fr/entretien-de-fluides/c-20-50-10"; + final String divoltSession = "0:kfdxb7hf:U4e3OplHDO8Hda8yIS3O2iCdBOcVE_al"; + final String divoltSession2 = "0:kfdxb7hf:alpha"; + final String user = "user"; + final TestRunner testRunner = newTestRunner(container); + testRunner.assertValid(); + //first run + final long time1 = 1601629314416L; + final long time2 = time1 + (SESSION_TIMEOUT + 1L) * 1000L; + final long time3 = time2 + (SESSION_TIMEOUT + 1L) * 1000L; + final long time4 = time3 + (SESSION_TIMEOUT + 1L) * 1000L; + final long time5 = time4 + (SESSION_TIMEOUT + 1L) * 1000L; + List times = Arrays.asList(time1, time2, time3, time4, time5); + testRunner.enqueue(createEvents(url, divoltSession, user, times)); + testRunner.enqueue(createEvents(url, divoltSession2, user, times)); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(10 + 10); + MockRecord session_1 = getFirstRecordWithId(divoltSession, testRunner.getOutputRecords()); + MockRecord session_5 = getFirstRecordWithId(divoltSession + "#5", testRunner.getOutputRecords()); + new WebSessionChecker(session_1).sessionId(divoltSession) + .Userid(user) + .record_type("consolidate-session") + .record_id(divoltSession) + .firstEventDateTime(time1) + .h2kTimestamp(time1) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time1) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + new WebSessionChecker(session_5).sessionId(divoltSession + "#5") + .Userid(user) + .record_type("consolidate-session") + .record_id(divoltSession + "#5") + .firstEventDateTime(time5) + .h2kTimestamp(time5) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time5) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + injectOutputIntoEsThenSleepThenRefresh(testRunner.getOutputRecords()); + + SearchResponse rsp = getAllSessionsAfterRefreshing(esclient); + assertEquals(10, rsp.getHits().getTotalHits().value); + Assert.assertEquals(0, this.proc.getNumberOfRewindForProcInstance()); + //rewind from time1 + times = Arrays.asList(time1, time2); + testRunner.clearQueues(); + resetCache(testRunner); + testRunner.enqueue(createEvents(url, divoltSession, user, times)); + testRunner.enqueue(createEvents(url, divoltSession2, user, times)); + testRunner.run(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(4 + 4); + Assert.assertEquals(1, this.proc.getNumberOfRewindForProcInstance()); + if (jobDoDeleteSessions) { + rsp = getAllSessionsAfterRefreshing(esclient); + assertEquals(2, rsp.getHits().getTotalHits().value); + } + + + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + if (jobDoDeleteSessions) { + rsp = getAllSessionsAfterRefreshing(esclient); + assertEquals(4, rsp.getHits().getTotalHits().value); + } + //end of rewind should be as start + times = Arrays.asList(time3, time4, time5); + testRunner.clearQueues(); + testRunner.enqueue(createEvents(url, divoltSession, user, times)); + testRunner.enqueue(createEvents(url, divoltSession2, user, times)); + testRunner.run(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(8 + 6); + if (jobDoDeleteSessions) { + rsp = getAllSessionsAfterRefreshing(esclient); + assertEquals(4, rsp.getHits().getTotalHits().value); + } + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + rsp = getAllSessionsAfterRefreshing(esclient); + assertEquals(10, rsp.getHits().getTotalHits().value); + List sessions = ElasticsearchServiceUtil.getAllSessions(elasticsearchClientService, esclient); + String finalSession = divoltSession; + getWebSessionCheckerForSession(finalSession, sessions) + .sessionId(finalSession) + .Userid(user) + .record_type("consolidate-session") + .record_id(finalSession) + .firstEventDateTime(time1) + .h2kTimestamp(time1) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time1) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + finalSession = divoltSession + "#2"; + getWebSessionCheckerForSession(finalSession, sessions) + .sessionId(finalSession) + .Userid(user) + .record_type("consolidate-session") + .record_id(finalSession) + .firstEventDateTime(time2) + .h2kTimestamp(time2) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time2) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + finalSession = divoltSession + "#3"; + getWebSessionCheckerForSession(finalSession, sessions) + .sessionId(finalSession) + .Userid(user) + .record_type("consolidate-session") + .record_id(finalSession) + .firstEventDateTime(time3) + .h2kTimestamp(time3) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time3) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + finalSession = divoltSession + "#4"; + getWebSessionCheckerForSession(finalSession, sessions) + .sessionId(finalSession) + .Userid(user) + .record_type("consolidate-session") + .record_id(finalSession) + .firstEventDateTime(time4) + .h2kTimestamp(time4) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time4) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + finalSession = divoltSession + "#5"; + getWebSessionCheckerForSession(finalSession, sessions) + .sessionId(finalSession) + .Userid(user) + .record_type("consolidate-session") + .record_id(finalSession) + .firstEventDateTime(time5) + .h2kTimestamp(time5) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time5) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + finalSession = divoltSession2; + getWebSessionCheckerForSession(finalSession, sessions) + .sessionId(finalSession) + .Userid(user) + .record_type("consolidate-session") + .record_id(finalSession) + .firstEventDateTime(time1) + .h2kTimestamp(time1) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time1) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + finalSession = divoltSession2 + "#2"; + getWebSessionCheckerForSession(finalSession, sessions) + .sessionId(finalSession) + .Userid(user) + .record_type("consolidate-session") + .record_id(finalSession) + .firstEventDateTime(time2) + .h2kTimestamp(time2) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time2) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + finalSession = divoltSession2 + "#3"; + getWebSessionCheckerForSession(finalSession, sessions) + .sessionId(finalSession) + .Userid(user) + .record_type("consolidate-session") + .record_id(finalSession) + .firstEventDateTime(time3) + .h2kTimestamp(time3) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time3) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + finalSession = divoltSession2 + "#4"; + getWebSessionCheckerForSession(finalSession, sessions) + .sessionId(finalSession) + .Userid(user) + .record_type("consolidate-session") + .record_id(finalSession) + .firstEventDateTime(time4) + .h2kTimestamp(time4) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time4) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + finalSession = divoltSession2 + "#5"; + getWebSessionCheckerForSession(finalSession, sessions) + .sessionId(finalSession) + .Userid(user) + .record_type("consolidate-session") + .record_id(finalSession) + .firstEventDateTime(time5) + .h2kTimestamp(time5) + .firstVisitedPage(url) + .eventsCounter(1) + .lastEventDateTime(time5) + .lastVisitedPage(url) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + Assert.assertEquals(1, this.proc.getNumberOfRewindForProcInstance()); + } + + + /** + * Here we simulate a rewind by resetting cache and reprocessing events. + * We suppose that some events/session were effectively saved but some not before the job crash (power cut). + * + * events DivolteSession1: T1--T2--T3--T4--T5--T6--T7 + * events DivolteSession2: T1--T2--T3--T4--T5--T6--T7 + * changement de session: ----------------X--------- + * + * batch 1: DivolteSession1: T1,T2,T3,T4,T5,T6,T7 + * DivolteSession2: T1,T2,T3,T4,T5,T6,T7 + * DivolteSession3: T1,T2,T3,T4,T5,T6,T7 + * + * DivolteSession1: S1 -> T1,T2,T3,T4 DivolteSession2: S1 -> T1,T2,T3,T4 DivolteSession3: S1 -> T1,T2,T3,T4 + * S1#2 -> T5,T6,T7 S1#2 -> T5,T6,T7 S1#2 -> T5,T6,T7 + * + * Simulate a rewind by reseting cache + * batch 2: DivolteSession1: T3,T4 + * + * DivolteSession1: S1 -> T1,T2,T3,T4 + * + * batch 3: DivolteSession2: T3,T4 + * + * DivolteSession2: S1 -> T1,T2,T3,T4 + * + * batch 4: DivolteSession1: T5,T6,T7 DivolteSession2: T5,T6,T7 + * + * DivolteSession1: S1#2 -> T5,T6,T7 DivolteSession2: S1#2 -> T5,T6,T7 + * + * + * @throws Exception + */ + @Test + public void testRewindMultipleUsers() throws Exception { + final TestRunner testRunner = newTestRunner(container); + testRunner.assertValid(); + //first run + final long time1 = 1601629314416L; + final long time2 = time1 + 1L; + final long time3 = time2 + 1L; + final long time4 = time3 + 1L; + final long time5 = time4 + (SESSION_TIMEOUT + 1L) * 1000L; + final long time6 = time5 + 1L; + final long time7 = time6 + 1L; + List times = Arrays.asList(time1, time2, time3, time4, time5, time6, time7); + testRunner.enqueue(createEventsUser1(times)); + testRunner.enqueue(createEventsUser2(times)); + testRunner.enqueue(createEventsUser3(times)); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(6 + 3 * 7); + injectOutputIntoEsThenSleepThenRefresh(testRunner.getOutputRecords()); +// events (with 3 different users therefore divolteId: T1--T2--T3--T4--T5--T6---T7 +// changement de traffic: ----------------X---------- + + getWebSessionCheckerForSessionFromRecords(SESSION1, testRunner.getOutputRecords()) + .sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(time1) + .h2kTimestamp(time1) + .firstVisitedPage(URL) + .eventsCounter(4) + .lastEventDateTime(time4) + .lastVisitedPage(URL) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + getWebSessionCheckerForSessionFromRecords(SESSION1+ "#2", testRunner.getOutputRecords()) + .sessionId(SESSION1+ "#2") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1+ "#2") + .firstEventDateTime(time5) + .h2kTimestamp(time5) + .firstVisitedPage(URL) + .eventsCounter(3) + .lastEventDateTime(time7) + .lastVisitedPage(URL) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + getWebSessionCheckerForSessionFromRecords(SESSION3, testRunner.getOutputRecords()) + .sessionId(SESSION3) + .Userid(USER3) + .record_type("consolidate-session") + .record_id(SESSION3) + .firstEventDateTime(time1) + .h2kTimestamp(time1) + .firstVisitedPage(URL) + .eventsCounter(4) + .lastEventDateTime(time4) + .lastVisitedPage(URL) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + getWebSessionCheckerForSessionFromRecords(SESSION3+ "#2", testRunner.getOutputRecords()) + .sessionId(SESSION3+ "#2") + .Userid(USER3) + .record_type("consolidate-session") + .record_id(SESSION3+ "#2") + .firstEventDateTime(time5) + .h2kTimestamp(time5) + .firstVisitedPage(URL) + .eventsCounter(3) + .lastEventDateTime(time7) + .lastVisitedPage(URL) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + + SearchResponse webSessionRsp = getAllSessionsAfterRefreshing(esclient); + assertEquals(6, webSessionRsp.getHits().getTotalHits().value); + SearchHit[] webSessionsDocs = webSessionRsp.getHits().getHits(); + SearchHit sessionUser1 = Arrays.stream(webSessionsDocs) + .filter(hit -> { + return hit.getId().equals(SESSION1); + }) + .findFirst() + .get(); + SearchHit session2User1 = Arrays.stream(webSessionsDocs) + .filter(hit -> { + return hit.getId().equals(SESSION1 + "#2"); + }) + .findFirst() + .get(); + SearchHit sessionUser2 = Arrays.stream(webSessionsDocs) + .filter(hit -> { + return hit.getId().equals(SESSION2); + }) + .findFirst() + .get(); + SearchHit session2User2 = Arrays.stream(webSessionsDocs) + .filter(hit -> { + return hit.getId().equals(SESSION2 + "#2"); + }) + .findFirst() + .get(); + + SearchResponse webEventRsp = getAllEventsAfterRefreshing(esclient); + assertEquals(3 * 7, webEventRsp.getHits().getTotalHits().value); + Assert.assertEquals(0, this.proc.getNumberOfRewindForProcInstance()); + + //rewind only sessions from user 1 + times = Arrays.asList(time3, time4); + testRunner.clearQueues(); + resetCache(testRunner); + testRunner.enqueue(createEventsUser1(times)); + testRunner.run(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(1 + 2 + 2);//session + input events + events from es + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + // events (with 3 different users therefore divolteId: T1--T2--T3--T4--T5--T6---T7 + // changement de traffic: ----------------X---------- + //user 1 : T3 et T4 + if (jobDoDeleteSessions) { + assertEquals(5, getAllSessionsAfterRefreshing(esclient).getHits().getTotalHits().value); + } + + assertEquals(3 * 7, getAllEventsAfterRefreshing(esclient).getHits().getTotalHits().value); + + Assert.assertEquals(1, this.proc.getNumberOfRewindForProcInstance()); + //rewind only sessions from user 2 + times = Arrays.asList(time3, time4); + testRunner.clearQueues(); + testRunner.enqueue(createEventsUser2(times)); + testRunner.run(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(1 + 2 + 2);//session + input events + events from es + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + // events (with 3 different users therefore divolteId: T1--T2--T3--T4--T5--T6---T7 + // changement de traffic: ----------------X---------- + //user 2 : T3 et T4 + if (jobDoDeleteSessions) { + assertEquals(4, getAllSessionsAfterRefreshing(esclient).getHits().getTotalHits().value); + } + assertEquals(3 * 7, getAllEventsAfterRefreshing(esclient).getHits().getTotalHits().value); + Assert.assertEquals(2, this.proc.getNumberOfRewindForProcInstance()); + + //rewind from time5 to time7 + times = Arrays.asList(time5, time6, time7); + testRunner.clearQueues(); + testRunner.enqueue(createEventsUser1(times)); + testRunner.enqueue(createEventsUser2(times)); + testRunner.run(); + testRunner.assertOutputErrorCount(0); + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + + SearchResponse webSessionRsp2 = getAllSessionsAfterRefreshing(esclient); + assertEquals(6, webSessionRsp2.getHits().getTotalHits().value); + SearchHit[] webSessionsDocs2 = webSessionRsp2.getHits().getHits(); + SearchHit session2User1_1 = Arrays.stream(webSessionsDocs2) + .filter(hit -> { + return hit.getId().equals(SESSION1); + }) + .findFirst() + .get(); + SearchHit session2User1_2 = Arrays.stream(webSessionsDocs2) + .filter(hit -> { + return hit.getId().equals(SESSION1 + "#2"); + }) + .findFirst() + .get(); + SearchHit session2User2_1 = Arrays.stream(webSessionsDocs2) + .filter(hit -> { + return hit.getId().equals(SESSION2); + }) + .findFirst() + .get(); + SearchHit session2User2_2 = Arrays.stream(webSessionsDocs2) + .filter(hit -> { + return hit.getId().equals(SESSION2 + "#2"); + }) + .findFirst() + .get(); + + SearchResponse webEventRsp2 = getAllEventsAfterRefreshing(esclient); + assertEquals(3 * 7, webEventRsp2.getHits().getTotalHits().value); + + assertMapsAreEqualsIgnoringSomeKeys(sessionUser1.getSourceAsMap(), session2User1_1.getSourceAsMap() , FieldDictionary.RECORD_TIME, "@timestamp"); + assertMapsAreEqualsIgnoringSomeKeys(session2User1.getSourceAsMap(), session2User1_2.getSourceAsMap(), FieldDictionary.RECORD_TIME, "@timestamp"); + assertMapsAreEqualsIgnoringSomeKeys(sessionUser2.getSourceAsMap(), session2User2_1.getSourceAsMap() , FieldDictionary.RECORD_TIME, "@timestamp"); + assertMapsAreEqualsIgnoringSomeKeys(session2User2.getSourceAsMap(), session2User2_2.getSourceAsMap(), FieldDictionary.RECORD_TIME, "@timestamp"); + Assert.assertEquals(2, this.proc.getNumberOfRewindForProcInstance()); + } + + /** + * The purpose of this test is to ensure that events and session stored es are the same. + * That they are injected to ES directly as input of the processor + * Or that they have been fetched from remote in ES. + * + * events : T1--T2--T3--T4--T5--T6---T7 + * changement de traffic: ----------------X---------- + * @throws Exception + */ + @Test + public void testConsistenceInEs() + throws Exception { + final String url = "https://orexad.preprod.group-iph.com/fr/entretien-de-fluides/c-20-50-10"; + final String divoltSession = "0:kfdxb7hf:U4e3OplHDO8Hda8yIS3O2iCdBOcVE_al"; + final String user = "user"; + final TestRunner testRunner = newTestRunner(container); + testRunner.assertValid(); + //first run + final long time1 = 1601629314416L; + final long time2 = time1 + 1L; + final long time3 = time2 + 1L; + final long time4 = time3 + 1L; + final long time5 = time4 + (SESSION_TIMEOUT + 1L) * 1000L; + final long time6 = time5 + 1L; + final long time7 = time6 + 1L; + List times = Arrays.asList(time1, time2, time3, time4, time5, time6, time7); + testRunner.enqueue(createEvents(url, divoltSession, user, times)); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(2 + 7); + injectOutputIntoEsThenSleepThenRefresh(testRunner.getOutputRecords()); + + SearchResponse webSessionRsp = getAllSessionsAfterRefreshing(esclient); + assertEquals(2, webSessionRsp.getHits().getTotalHits().value); + + SearchHit[] webSessionsDocs = webSessionRsp.getHits().getHits(); + SearchHit session = Arrays.stream(webSessionsDocs) + .filter(hit -> { + return hit.getId().equals(divoltSession); + }) + .findFirst() + .get(); + SearchHit session2 = Arrays.stream(webSessionsDocs) + .filter(hit -> { + return hit.getId().equals(divoltSession + "#2"); + }) + .findFirst() + .get(); + + SearchResponse webEventRsp = getAllEventsAfterRefreshing(esclient); + assertEquals(7, webEventRsp.getHits().getTotalHits().value); + SearchHit[] eventsDoc = webEventRsp.getHits().getHits(); + SearchHit event1 = Arrays.stream(eventsDoc) + .filter(hit -> { + return hit.getId().equals(buildId(time1, divoltSession)); + }) + .findFirst() + .get(); + SearchHit event2 = Arrays.stream(eventsDoc) + .filter(hit -> { + return hit.getId().equals(buildId(time2, divoltSession)); + }) + .findFirst() + .get(); + SearchHit event3 = Arrays.stream(eventsDoc) + .filter(hit -> { + return hit.getId().equals(buildId(time3, divoltSession)); + }) + .findFirst() + .get(); + SearchHit event4 = Arrays.stream(eventsDoc) + .filter(hit -> { + return hit.getId().equals(buildId(time4, divoltSession)); + }) + .findFirst() + .get(); + SearchHit event5 = Arrays.stream(eventsDoc) + .filter(hit -> { + return hit.getId().equals(buildId(time5, divoltSession)); + }) + .findFirst() + .get(); + SearchHit event6 = Arrays.stream(eventsDoc) + .filter(hit -> { + return hit.getId().equals(buildId(time6, divoltSession)); + }) + .findFirst() + .get(); + SearchHit event7 = Arrays.stream(eventsDoc) + .filter(hit -> { + return hit.getId().equals(buildId(time7, divoltSession)); + }) + .findFirst() + .get(); + + //rewind from time3 to time4 + times = Arrays.asList(time3, time4); + testRunner.clearQueues(); + resetCache(testRunner); + testRunner.enqueue(createEvents(url, divoltSession, user, times)); + testRunner.run(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(1 + 2 + 2);//session + input events + events from es + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + // events : T1--T2--T3--T4--T5--T6---T7 + // changement de traffic: ----------------X---------- + //T3 et T4 + + if (jobDoDeleteSessions) { + assertEquals(1, getAllSessionsAfterRefreshing(esclient).getHits().getTotalHits().value); + } + + assertEquals(7, getAllEventsAfterRefreshing(esclient).getHits().getTotalHits().value); + + //from time5 to time7 + times = Arrays.asList(time5, time6, time7); + testRunner.clearQueues(); + testRunner.enqueue(createEvents(url, divoltSession, user, times)); + testRunner.run(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(2 + 3);//session + input events + events from es + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + // events : T1--T2--T3--T4--T5--T6---T7 + // changement de traffic: ----------------X---------- + //T5,T6 et T7 + + SearchResponse webSessionRsp2 = getAllSessionsAfterRefreshing(esclient); + assertEquals(2, webSessionRsp2.getHits().getTotalHits().value); + SearchHit[] webSessionsDocs2 = webSessionRsp2.getHits().getHits(); + SearchHit session2_1 = Arrays.stream(webSessionsDocs2) + .filter(hit -> { + return hit.getId().equals(divoltSession); + }) + .findFirst() + .get(); + SearchHit session2_2 = Arrays.stream(webSessionsDocs2) + .filter(hit -> { + return hit.getId().equals(divoltSession + "#2"); + }) + .findFirst() + .get(); + + + SearchResponse webEventRsp2 = getAllEventsAfterRefreshing(esclient); + assertEquals(7, webEventRsp2.getHits().getTotalHits().value); + SearchHit[] eventsDoc2 = webEventRsp2.getHits().getHits(); + SearchHit event2_1 = Arrays.stream(eventsDoc2) + .filter(hit -> { + return hit.getId().equals(buildId(time1, divoltSession)); + }) + .findFirst() + .get(); + SearchHit event2_2 = Arrays.stream(eventsDoc2) + .filter(hit -> { + return hit.getId().equals(buildId(time2, divoltSession)); + }) + .findFirst() + .get(); + SearchHit event2_3 = Arrays.stream(eventsDoc2) + .filter(hit -> { + return hit.getId().equals(buildId(time3, divoltSession)); + }) + .findFirst() + .get(); + SearchHit event2_4 = Arrays.stream(eventsDoc2) + .filter(hit -> { + return hit.getId().equals(buildId(time4, divoltSession)); + }) + .findFirst() + .get(); + SearchHit event2_5 = Arrays.stream(eventsDoc2) + .filter(hit -> { + return hit.getId().equals(buildId(time5, divoltSession)); + }) + .findFirst() + .get(); + SearchHit event2_6 = Arrays.stream(eventsDoc2) + .filter(hit -> { + return hit.getId().equals(buildId(time6, divoltSession)); + }) + .findFirst() + .get(); + SearchHit event2_7 = Arrays.stream(eventsDoc2) + .filter(hit -> { + return hit.getId().equals(buildId(time7, divoltSession)); + }) + .findFirst() + .get(); + assertEquals(-1, event1.getVersion()); + assertEquals(-1, event2_1.getVersion()); + assertEquals(-1, event4.getVersion()); + assertEquals(-1, event2_4.getVersion()); + assertEquals(-1, event7.getVersion()); + assertEquals(-1, event2_7.getVersion()); + assertMapsAreEqualsIgnoringSomeKeys(event1.getSourceAsMap(), event2_1.getSourceAsMap(), FieldDictionary.RECORD_TIME, "@timestamp"); + assertMapsAreEqualsIgnoringSomeKeys(event2.getSourceAsMap(), event2_2.getSourceAsMap(), FieldDictionary.RECORD_TIME, "@timestamp"); + assertMapsAreEqualsIgnoringSomeKeys(event3.getSourceAsMap(), event2_3.getSourceAsMap(), FieldDictionary.RECORD_TIME, "@timestamp"); + assertMapsAreEqualsIgnoringSomeKeys(event4.getSourceAsMap(), event2_4.getSourceAsMap(), FieldDictionary.RECORD_TIME, "@timestamp"); + assertMapsAreEqualsIgnoringSomeKeys(event5.getSourceAsMap(), event2_5.getSourceAsMap(), FieldDictionary.RECORD_TIME, "@timestamp"); + assertMapsAreEqualsIgnoringSomeKeys(event6.getSourceAsMap(), event2_6.getSourceAsMap(), FieldDictionary.RECORD_TIME, "@timestamp"); + assertMapsAreEqualsIgnoringSomeKeys(event7.getSourceAsMap(), event2_7.getSourceAsMap(), FieldDictionary.RECORD_TIME, "@timestamp"); + + assertEquals(-1, session.getVersion()); + assertEquals(-1, session2.getVersion()); + assertEquals(-1, session2_1.getVersion()); + assertEquals(-1, session2_2.getVersion()); + assertMapsAreEqualsIgnoringSomeKeys(session.getSourceAsMap(), session2_1.getSourceAsMap() , FieldDictionary.RECORD_TIME, "@timestamp"); + assertMapsAreEqualsIgnoringSomeKeys(session2.getSourceAsMap(), session2_2.getSourceAsMap(), FieldDictionary.RECORD_TIME, "@timestamp"); + Assert.assertEquals(1, this.proc.getNumberOfRewindForProcInstance()); + } + + + /** + * The purpose of this test is to ensure that it handles correctly sessions even if it receive events in the wrong order + * and with some event causing a change of session (traffic source for exemple) So that first runs output wrong session + * but at the end session should be okay. + * + * events: T1------T2------T3---T4-------------T5 + * changement de traffic: --------X----------------------------- + * + * First batch: T1,T3,T4 + * S1 -> T1,T3,T4 + * Second batch: T2,T5 + * S1 => T1 + * S1#2 => T2,T3,T4,T5 + * + * @throws Exception + */ + @Test + public void testNotOrderedIncomingEvents() throws Exception { + final TestRunner testRunner = newTestRunner(container); + testRunner.assertValid(); + //first run + final long time1 = 1601629314416L; + final long time2 = time1 + 1000L;//1601629315416L + final long time3 = time2 + 1000L;//1601629316416L + final long time4 = time3 + 1000L;//1601629317416L + final long time5 = time4 + 1000L;//1601629318416L + Record event1 = createEvent("url1", SESSION1, USER1, time1); + Record event2 = createEvent("url2", SESSION1, USER1, time2); + event2.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficSourceField(), "not direct"); + event2.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficMediumField(), "medium 1"); + Record event3 = createEvent("url3", SESSION1, USER1, time3); + Record event4 = createEvent("url4", SESSION1, USER1, time4); + Record event5 = createEvent("url5", SESSION1, USER1, time5); + testRunner.enqueue(event4, event3, event1); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(1 + 3); + Assert.assertEquals(0, this.proc.getNumberOfRewindForProcInstance()); + + injectOutputIntoEsThenSleepThenRefresh(testRunner.getOutputRecords()); + getWebSessionCheckerForSessionFromRecords(SESSION1, testRunner.getOutputRecords()) + .sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(time1) + .firstEventEpochSeconds(time1 / 1000) + .h2kTimestamp(time1) + .firstVisitedPage("url1") + .eventsCounter(3) + .lastEventDateTime(time4) + .lastEventEpochSeconds(time4 / 1000) + .lastVisitedPage("url4") + .sessionDuration(3L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + //events from past arriving (distributed environment does not guaranty order) + testRunner.clearQueues(); + testRunner.enqueue(event5, event2); + testRunner.run(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(2 + 2 + 3);//2 session + 2 events + 3 events from past + Assert.assertEquals(1, this.proc.getNumberOfRewindForProcInstance()); + + getWebSessionCheckerForSessionFromRecords(SESSION1, testRunner.getOutputRecords()) + .sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(time1) + .h2kTimestamp(time1) + .firstVisitedPage("url1") + .eventsCounter(1) + .lastEventDateTime(time1) + .lastVisitedPage("url1") + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + getWebSessionCheckerForSessionFromRecords(SESSION1+ "#2", testRunner.getOutputRecords()) + .sessionId(SESSION1+ "#2") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1+ "#2") + .firstEventDateTime(time2) + .h2kTimestamp(time2) + .firstVisitedPage("url2") + .eventsCounter(4) + .lastEventDateTime(time5) + .lastVisitedPage("url5") + .sessionDuration(3L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + } + + /** + * The purpose of this test is to ensure that it handles correctly sessions even if it receive events in the wrong order + * and with some event causing a change of session (traffic source for exemple) So that first runs output wrong session + * but at the end session should be okay. + * + * Tous les évènements si dessous sont des évènements qui ont a peu près le même timestamp. + * events (chronological order): T1------T2------T3---T4-------------T5---T6-------T7 + * changement de traffic: --------X------------X-------------------X---------- + * + * First batch: T1,T3,T4 + * expected in ES: 2 session + * S1 -> T1,T3 + * S1#2 -> T4 + * Second batch: T5,T7 + * expected in ES: 2 sessions and fixed session so that + * S1 => T1,T3 + * S1#2 => T4, T5, T7 + * Third batch: T2,T6 + * expected in ES: expected 4 sessions and fixed session so that + * S1 => T1 + * S1#2 => T2, T3 + * S1#3 => T4, T5 + * S1#4 => T6, T7 + * @throws Exception + */ + @Test + public void testNotOrderedIncomingEvents2() throws Exception { + final TestRunner testRunner = newTestRunner(container); + testRunner.assertValid(); + //first run + final long time1 = 1601629314416L; + final long time2 = time1 + 1000L; + final long time3 = time2 + 1000L; + final long time4 = time3 + 1000L; + final long time5 = time4 + 1000L; + final long time6 = time5 + 1000L; + final long time7 = time6 + 1000L; + Record event1 = createEvent("url1", SESSION1, USER1, time1); + Record event2 = createEvent("url2", SESSION1, USER1, time2); + event2.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficSourceField(), "not direct"); + event2.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficMediumField(), "medium 1"); + Record event3 = createEvent("url3", SESSION1, USER1, time3); + Record event4 = createEvent("url4", SESSION1, USER1, time4); + event4.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficSourceField(), "not direct"); + event4.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficMediumField(), "medium 2"); + Record event5 = createEvent("url5", SESSION1, USER1, time5); + Record event6 = createEvent("url6", SESSION1, USER1, time6); + event6.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficSourceField(), "not direct"); + event6.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficMediumField(), "medium 3"); + Record event7 = createEvent("url7", SESSION1, USER1, time7); + testRunner.enqueue(event4, event3, event1); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(2 + 3);//2session + 3 event + + injectOutputIntoEsThenSleepThenRefresh(testRunner.getOutputRecords()); + getWebSessionCheckerForSessionFromRecords(SESSION1, testRunner.getOutputRecords()) + .sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(time1) + .h2kTimestamp(time1) + .firstVisitedPage("url1") + .eventsCounter(2) + .lastEventDateTime(time3) + .lastVisitedPage("url3") + .sessionDuration(2L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + getWebSessionCheckerForSessionFromRecords(SESSION1 + "#2", testRunner.getOutputRecords()) + .sessionId(SESSION1 + "#2") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1 + "#2") + .firstEventDateTime(time4) + .h2kTimestamp(time4) + .firstVisitedPage("url4") + .eventsCounter(1) + .lastEventDateTime(time4) + .lastVisitedPage("url4") + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + //events from past arriving (distributed environment does not guaranty order) + testRunner.clearQueues(); + testRunner.enqueue(event5, event7); + testRunner.run(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(1 + 2);//1 session + 2 events + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + + getWebSessionCheckerForSessionFromRecords(SESSION1+ "#2", testRunner.getOutputRecords()) + .sessionId(SESSION1+ "#2") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1+ "#2") + .firstEventDateTime(time4) + .h2kTimestamp(time4) + .firstVisitedPage("url4") + .eventsCounter(3) + .lastEventDateTime(time7) + .lastVisitedPage("url7") + .sessionDuration(3L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + //events from past arriving (distributed environment does not guaranty order) + testRunner.clearQueues(); + testRunner.enqueue(event2, event6); + testRunner.run(); + testRunner.assertOutputErrorCount(0);//TODO random failure here... + testRunner.assertOutputRecordsCount(5 + 4);//7 events et 4 sessions + + getFirstRecordWithId(buildId(time1, SESSION1), testRunner.getOutputRecords()) + .assertFieldEquals(TestMappings.eventsInternalFields.getSessionIdField(), SESSION1); + + getFirstRecordWithId(buildId(time2, SESSION1), testRunner.getOutputRecords()) + .assertFieldEquals(TestMappings.eventsInternalFields.getSessionIdField(), SESSION1 + "#2") + .assertFieldEquals(TestMappings.eventsInternalFields.getOriginalSessionIdField(), SESSION1); + + getFirstRecordWithId(buildId(time3, SESSION1), testRunner.getOutputRecords()) + .assertFieldEquals(TestMappings.eventsInternalFields.getSessionIdField(), SESSION1+ "#2") + .assertFieldEquals(TestMappings.eventsInternalFields.getOriginalSessionIdField(), SESSION1); + + getFirstRecordWithId(buildId(time4, SESSION1), testRunner.getOutputRecords()) + .assertFieldEquals(TestMappings.eventsInternalFields.getSessionIdField(), SESSION1+ "#3") + .assertFieldEquals(TestMappings.eventsInternalFields.getOriginalSessionIdField(), SESSION1); + + getFirstRecordWithId(buildId(time5, SESSION1), testRunner.getOutputRecords()) + .assertFieldEquals(TestMappings.eventsInternalFields.getSessionIdField(), SESSION1+ "#3") + .assertFieldEquals(TestMappings.eventsInternalFields.getOriginalSessionIdField(), SESSION1); + + getFirstRecordWithId(buildId(time6, SESSION1), testRunner.getOutputRecords()) + .assertFieldEquals(TestMappings.eventsInternalFields.getSessionIdField(), SESSION1+ "#4") + .assertFieldEquals(TestMappings.eventsInternalFields.getOriginalSessionIdField(), SESSION1); + + getFirstRecordWithId(buildId(time7, SESSION1), testRunner.getOutputRecords()) + .assertFieldEquals(TestMappings.eventsInternalFields.getSessionIdField(), SESSION1+ "#4") + .assertFieldEquals(TestMappings.eventsInternalFields.getOriginalSessionIdField(), SESSION1); + + getWebSessionCheckerForSessionFromRecords(SESSION1, testRunner.getOutputRecords()) + .sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(time1) + .h2kTimestamp(time1) + .firstVisitedPage("url1") + .eventsCounter(1) + .lastEventDateTime(time1) + .lastVisitedPage("url1") + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + getWebSessionCheckerForSessionFromRecords(SESSION1+ "#2", testRunner.getOutputRecords()) + .sessionId(SESSION1+ "#2") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1+ "#2") + .firstEventDateTime(time2) + .h2kTimestamp(time2) + .firstVisitedPage("url2") + .eventsCounter(2) + .lastEventDateTime(time3) + .lastVisitedPage("url3") + .sessionDuration(1L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + getWebSessionCheckerForSessionFromRecords(SESSION1+ "#3", testRunner.getOutputRecords()) + .sessionId(SESSION1+ "#3") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1+ "#3") + .firstEventDateTime(time4) + .h2kTimestamp(time4) + .firstVisitedPage("url4") + .eventsCounter(2) + .lastEventDateTime(time5) + .lastVisitedPage("url5") + .sessionDuration(1L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + getWebSessionCheckerForSessionFromRecords(SESSION1+ "#4", testRunner.getOutputRecords()) + .sessionId(SESSION1+ "#4") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1+ "#4") + .firstEventDateTime(time6) + .h2kTimestamp(time6) + .firstVisitedPage("url6") + .eventsCounter(2) + .lastEventDateTime(time7) + .lastVisitedPage("url7") + .sessionDuration(1L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + } + + /** + * The purpose of this test is to ensure that it handles correctly sessions even if it receive events in the wrong order + * and with some event causing a change of session (traffic source for exemple). Here we first run sessionazation for all events at once. + * The we simulate a rewind and simulate one batch with one record at a time. The output should be the same nonetheless ! + * + * Tous les évènements si dessous sont des évènements qui ont a peu près le même timestamp. + * events (chronological order): T1------T2------T3---T4-------------T5---T6-------T7 + * changement de traffic: --------X------------X-------------------X---------- + * batch 1: T4 + * S1 -> T4 + * + * batch 2: T3 + * S1 => T3 + * S1#2 => T4 + * + * batch 3: T1 + * S1 => T1,T3 + * + * batch 4: T2 + * S1 => T1 + * S1#2 => T2, T3 + * + * Here there is an error as T4 is not considered anymore in S1#2 + * + * batch 5: T5 + * S1#2 => T2, T3, T5 + * + * T4 is forgotten here ! Becaus of batch 4 which did not get enough events in futur + * (see test testNotOrderedIncomingEventsOneByOneWithConfSessionPlus2 for a solution with configuration) + * + * batch 6: T6 + * S1#2 => T2, T3, T5 + * S1#3 => T6 + * + * batch 7: T7 + * S1#3 => T6, T7 + * + * At the end we get : + * + * S1 => T1 + * S1#2 => T2, T3, T5 , T4 with eventcounter = 3 + * S1#3 => T6, T7 + * + * instead of in reality + * + * S1 => T1 + * S1#2 => T2, T3 + * S1#3 => T4, T5 + * S1#4 => T6, T7 + * + * @throws Exception + */ + @Test + public void testNotOrderedIncomingEventsOneByOneWithConfSessionPlus1() throws Exception { + final TestRunner testRunner = newTestRunner(container); + testRunner.assertValid(); + //first run + final long time1 = 1601629314416L; + final long time2 = time1 + 1000L; + final long time3 = time2 + 1000L; + final long time4 = time3 + 1000L; + final long time5 = time4 + 1000L; + final long time6 = time5 + 1000L; + final long time7 = time6 + 1000L; + Record event1 = createEvent("url1", SESSION1, USER1, time1); + Record event2TrafficSource = createEvent("url2", SESSION1, USER1, time2); + event2TrafficSource.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficSourceField(), "not direct"); + event2TrafficSource.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficMediumField(), "medium 1"); + Record event3 = createEvent("url3", SESSION1, USER1, time3); + Record event4TrafficSource = createEvent("url4", SESSION1, USER1, time4); + event4TrafficSource.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficSourceField(), "not direct"); + event4TrafficSource.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficMediumField(), "medium 2"); + Record event5 = createEvent("url5", SESSION1, USER1, time5); + Record event6TrafficSource = createEvent("url6", SESSION1, USER1, time6); + event6TrafficSource.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficSourceField(), "not direct"); + event6TrafficSource.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficMediumField(), "medium 3"); + Record event7 = createEvent("url7", SESSION1, USER1, time7); + + testRunner.clearQueues(); + testRunner.enqueue(event4TrafficSource); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(1 + 1);//1 session + 1 event + injectOutputIntoEsThenSleepThenRefresh(testRunner.getOutputRecords());// event + //T1------T2------T3---T4-------------T5---T6-------T7 + //--------X------------X-------------------X---------- + //T4 + getWebSessionCheckerForSessionFromRecords(SESSION1, testRunner.getOutputRecords()) + .sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(time4) + .h2kTimestamp(time4) + .firstVisitedPage("url4") + .eventsCounter(1) + .lastEventDateTime(time4) + .lastVisitedPage("url4") + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + assertEquals(0, this.proc.getNumberOfRewindForProcInstance()); + Thread.sleep(2000L);//wait for session index to be created + + testRunner.clearQueues(); + testRunner.enqueue(event3); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(2 + 2);//2 session + 2 event + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + //T1------T2------T3---T4-------------T5---T6-------T7 + //--------X------------X-------------------X---------- + //T4 | T3 + getWebSessionCheckerForSessionFromRecords(SESSION1, testRunner.getOutputRecords()) + .sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(time3) + .h2kTimestamp(time3) + .firstVisitedPage("url3") + .eventsCounter(1) + .lastEventDateTime(time3) + .lastVisitedPage("url3") + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + getWebSessionCheckerForSessionFromRecords(SESSION1 + "#2", testRunner.getOutputRecords()) + .sessionId(SESSION1 + "#2") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1 + "#2") + .firstEventDateTime(time4) + .h2kTimestamp(time4) + .firstVisitedPage("url4") + .eventsCounter(1) + .lastEventDateTime(time4) + .lastVisitedPage("url4") + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + assertEquals(1, this.proc.getNumberOfRewindForProcInstance()); + + testRunner.clearQueues(); + testRunner.enqueue(event1); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(2 + 2);//session + event + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + //T1------T2------T3---T4-------------T5---T6-------T7 + //--------X------------X-------------------X---------- + //T4 | T3 | T1 + getWebSessionCheckerForSessionFromRecords(SESSION1, testRunner.getOutputRecords()) + .sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(time1) + .h2kTimestamp(time1) + .firstVisitedPage("url1") + .eventsCounter(2) + .lastEventDateTime(time3) + .lastVisitedPage("url3") + .sessionDuration(2L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + assertEquals(2, this.proc.getNumberOfRewindForProcInstance()); + + testRunner.clearQueues(); + testRunner.enqueue(event2TrafficSource); + + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(2 + 3);//session + event + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + //T1------T2------T3---T4-------------T5---T6-------T7 + //--------X------------X-------------------X---------- + //T4 | T3 | T1 | T2 + getWebSessionCheckerForSessionFromRecords(SESSION1, testRunner.getOutputRecords()) + .sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(time1) + .h2kTimestamp(time1) + .firstVisitedPage("url1") + .eventsCounter(1) + .lastEventDateTime(time1) + .lastVisitedPage("url1") + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + getWebSessionCheckerForSessionFromRecords(SESSION1 + "#2", testRunner.getOutputRecords()) + .sessionId(SESSION1 + "#2") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1 + "#2") + .firstEventDateTime(time2) + .h2kTimestamp(time2) + .firstVisitedPage("url2") + .eventsCounter(2) + .lastEventDateTime(time3) + .lastVisitedPage("url3") + .sessionDuration(1L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + assertEquals(3, this.proc.getNumberOfRewindForProcInstance()); + + testRunner.clearQueues(); + testRunner.enqueue(event5); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(1 + 1);//session + event + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + //T1------T2------T3---T4-------------T5---T6-------T7 + //--------X------------X-------------------X---------- + //A partir d'ici une erreur se propage car on a pas "réparé" T4. + //T4 | T3 | T1 | T2 | T5 + getWebSessionCheckerForSessionFromRecords(SESSION1 + "#2", testRunner.getOutputRecords()) + .sessionId(SESSION1 + "#2") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1 + "#2") + .firstEventDateTime(time2) + .h2kTimestamp(time2) + .firstVisitedPage("url2") + .eventsCounter(3) + .lastEventDateTime(time5) + .lastVisitedPage("url5") + .sessionDuration(3L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + assertEquals(3, this.proc.getNumberOfRewindForProcInstance()); + + testRunner.clearQueues(); + testRunner.enqueue(event6TrafficSource); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(2 + 1);//session + event + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + //T1------T2------T3---T4-------------T5---T6-------T7 + //--------X------------X-------------------X---------- + //T4 | T3 | T1 | T2 | T5 | T6 + getWebSessionCheckerForSessionFromRecords(SESSION1 + "#2", testRunner.getOutputRecords()) + .sessionId(SESSION1 + "#2") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1 + "#2") + .firstEventDateTime(time2) + .h2kTimestamp(time2) + .firstVisitedPage("url2") + .eventsCounter(3) + .lastEventDateTime(time5) + .lastVisitedPage("url5") + .sessionDuration(3L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + getWebSessionCheckerForSessionFromRecords(SESSION1+ "#3", testRunner.getOutputRecords()) + .sessionId(SESSION1+ "#3") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1+ "#3") + .firstEventDateTime(time6) + .h2kTimestamp(time6) + .firstVisitedPage("url6") + .eventsCounter(1) + .lastEventDateTime(time6) + .lastVisitedPage("url6") + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + assertEquals(3, this.proc.getNumberOfRewindForProcInstance()); + + testRunner.clearQueues(); + testRunner.enqueue(event7); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(1 + 1);//session + event + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + //T1------T2------T3---T4-------------T5---T6-------T7 + //--------X------------X-------------------X---------- + getWebSessionCheckerForSessionFromRecords(SESSION1+ "#3", testRunner.getOutputRecords()) + .sessionId(SESSION1+ "#3") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1+ "#3") + .firstEventDateTime(time6) + .h2kTimestamp(time6) + .firstVisitedPage("url6") + .eventsCounter(2) + .lastEventDateTime(time7) + .lastVisitedPage("url7") + .sessionDuration(1L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); +// assertEquals(6, this.proc.getNumberOfRewindForProcInstance()); + +// FINAL RESULT With an error + List sessionInEs = getAllSessions(this.elasticsearchClientService, esclient); + getWebSessionCheckerForSession(SESSION1, sessionInEs) + .sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(time1) + .h2kTimestamp(time1) + .firstVisitedPage("url1") + .eventsCounter(1) + .lastEventDateTime(time1) + .lastVisitedPage("url1") + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + getWebSessionCheckerForSession(SESSION1 + "#2", sessionInEs) + .sessionId(SESSION1 + "#2") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1 + "#2") + .firstEventDateTime(time2) + .h2kTimestamp(time2) + .firstVisitedPage("url2") + .eventsCounter(3) + .lastEventDateTime(time5) + .lastVisitedPage("url5") + .sessionDuration(3L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + getWebSessionCheckerForSession(SESSION1 + "#3", sessionInEs) + .sessionId(SESSION1+ "#3") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1+ "#3") + .firstEventDateTime(time6) + .h2kTimestamp(time6) + .firstVisitedPage("url6") + .eventsCounter(2) + .lastEventDateTime(time7) + .lastVisitedPage("url7") + .sessionDuration(1L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + + assertEquals(3, this.proc.getNumberOfRewindForProcInstance()); + } + + /** + * The purpose of this test is to ensure that it handles correctly sessions even if it receive events in the wrong order + * and with some event causing a change of session (traffic source for exemple). Here we first run sessionazation for all events at once. + * The we simulate a rewind and simulate one batch with one record at a time. The output should be the same nonetheless ! + * + * Tous les évènements si dessous sont des évènements qui ont a peu près le même timestamp. + * events (chronological order): T1------T2------T3---T4-------------T5---T6-------T7 + * changement de traffic: --------X------------X-------------------X---------- + * + * Pour ce test on modifie la configuration du processeur pour prendre plus d'évènements du futur afin de corriger + * l'erreur du test précédent testNotOrderedIncomingEventsOneByOneWithConfFutureSessionEqual1. + * EN effet nous ne pouvons pas nous permettre de prendre tous les évènements du futur car dans le cas d'un rewind + * sur plusieurs mois cela ferais trop d'évènements ! + * + * batch 1: T4 + * S1 -> T4 + * + * batch 2: T3 + * S1 => T3 + * S1#2 => T4 + * + * batch 3: T1 + * S1 => T1,T3 + * + * batch 4: T2 + * S1 => T1 + * S1#2 => T2, T3 + * S1#3 => T4 + * + * Here event T4 is taken into consideration thanks to the conf we added ! + * + * batch 5: T5 + * S1#3 => T4, T5 + * + * batch 6: T6 + * S1#3 => T4, T5 + * S1#4 => T6 + * + * batch 7: T7 + * S1#4 => T6, T7 + * + * The final result is correct ! + * + * S1 => T1 + * S1#2 => T2, T3 + * S1#3 => T4, T5 + * S1#4 => T6, T7 + * + * @throws Exception + */ + @Test + public void testNotOrderedIncomingEventsOneByOneWithConfFutureSessionEqual2() throws Exception { + Map customConf = new HashMap<>(); + customConf.put(IncrementalWebSession.NUMBER_OF_FUTURE_SESSION.getName(), "2"); + final TestRunner testRunner = newTestRunner(container, customConf); + testRunner.assertValid(); + //first run + final long time1 = 1601629314416L; + final long time2 = time1 + 1000L; + final long time3 = time2 + 1000L; + final long time4 = time3 + 1000L; + final long time5 = time4 + 1000L; + final long time6 = time5 + 1000L; + final long time7 = time6 + 1000L; + Record event1 = createEvent("url1", SESSION1, USER1, time1); + Record event2TrafficSource = createEvent("url2", SESSION1, USER1, time2); + event2TrafficSource.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficSourceField(), "not direct"); + event2TrafficSource.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficMediumField(), "medium 1"); + Record event3 = createEvent("url3", SESSION1, USER1, time3); + Record event4TrafficSource = createEvent("url4", SESSION1, USER1, time4); + event4TrafficSource.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficSourceField(), "not direct"); + event4TrafficSource.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficMediumField(), "medium 2"); + Record event5 = createEvent("url5", SESSION1, USER1, time5); + Record event6TrafficSource = createEvent("url6", SESSION1, USER1, time6); + event6TrafficSource.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficSourceField(), "not direct"); + event6TrafficSource.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficMediumField(), "medium 3"); + Record event7 = createEvent("url7", SESSION1, USER1, time7); + + testRunner.clearQueues(); + testRunner.enqueue(event4TrafficSource); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(1 + 1);//1 session + 1 event + injectOutputIntoEsThenSleepThenRefresh(testRunner.getOutputRecords());// event + //T1------T2------T3---T4-------------T5---T6-------T7 + //--------X------------X-------------------X---------- + //T4 + getWebSessionCheckerForSessionFromRecords(SESSION1, testRunner.getOutputRecords()) + .sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(time4) + .h2kTimestamp(time4) + .firstVisitedPage("url4") + .eventsCounter(1) + .lastEventDateTime(time4) + .lastVisitedPage("url4") + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + assertEquals(0, this.proc.getNumberOfRewindForProcInstance()); +// Thread.sleep(2000L);//wait for session index to be created + + testRunner.clearQueues(); + testRunner.enqueue(event3); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(2 + 2);//2 session + 2 event + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + //T1------T2------T3---T4-------------T5---T6-------T7 + //--------X------------X-------------------X---------- + //T4 | T3 + getWebSessionCheckerForSessionFromRecords(SESSION1, testRunner.getOutputRecords()) + .sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(time3) + .h2kTimestamp(time3) + .firstVisitedPage("url3") + .eventsCounter(1) + .lastEventDateTime(time3) + .lastVisitedPage("url3") + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + getWebSessionCheckerForSessionFromRecords(SESSION1 + "#2", testRunner.getOutputRecords()) + .sessionId(SESSION1 + "#2") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1 + "#2") + .firstEventDateTime(time4) + .h2kTimestamp(time4) + .firstVisitedPage("url4") + .eventsCounter(1) + .lastEventDateTime(time4) + .lastVisitedPage("url4") + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + assertEquals(1, this.proc.getNumberOfRewindForProcInstance()); + + testRunner.clearQueues(); + testRunner.enqueue(event1); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(2 + 2);//session + event + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + //T1------T2------T3---T4-------------T5---T6-------T7 + //--------X------------X-------------------X---------- + //T4 | T3 | T1 + getWebSessionCheckerForSessionFromRecords(SESSION1, testRunner.getOutputRecords()) + .sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(time1) + .h2kTimestamp(time1) + .firstVisitedPage("url1") + .eventsCounter(2) + .lastEventDateTime(time3) + .lastVisitedPage("url3") + .sessionDuration(2L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + getWebSessionCheckerForSessionFromRecords(SESSION1 + "#2", testRunner.getOutputRecords()) + .sessionId(SESSION1 + "#2") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1 + "#2") + .firstEventDateTime(time4) + .h2kTimestamp(time4) + .firstVisitedPage("url4") + .eventsCounter(1) + .lastEventDateTime(time4) + .lastVisitedPage("url4") + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + assertEquals(2, this.proc.getNumberOfRewindForProcInstance()); + + testRunner.clearQueues(); + testRunner.enqueue(event2TrafficSource); + + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(3 + 4);//session + event + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + //T1------T2------T3---T4-------------T5---T6-------T7 + //--------X------------X-------------------X---------- + //T4 | T3 | T1 | T2 + getWebSessionCheckerForSessionFromRecords(SESSION1, testRunner.getOutputRecords()) + .sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(time1) + .h2kTimestamp(time1) + .firstVisitedPage("url1") + .eventsCounter(1) + .lastEventDateTime(time1) + .lastVisitedPage("url1") + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + getWebSessionCheckerForSessionFromRecords(SESSION1 + "#2", testRunner.getOutputRecords()) + .sessionId(SESSION1 + "#2") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1 + "#2") + .firstEventDateTime(time2) + .h2kTimestamp(time2) + .firstVisitedPage("url2") + .eventsCounter(2) + .lastEventDateTime(time3) + .lastVisitedPage("url3") + .sessionDuration(1L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + getWebSessionCheckerForSessionFromRecords(SESSION1 + "#3", testRunner.getOutputRecords()) + .sessionId(SESSION1 + "#3") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1 + "#3") + .firstEventDateTime(time4) + .h2kTimestamp(time4) + .firstVisitedPage("url4") + .eventsCounter(1) + .lastEventDateTime(time4) + .lastVisitedPage("url4") + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + assertEquals(3, this.proc.getNumberOfRewindForProcInstance()); + + testRunner.clearQueues(); + testRunner.enqueue(event5); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(1 + 1);//session + event + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + //T1------T2------T3---T4-------------T5---T6-------T7 + //--------X------------X-------------------X---------- + //T4 | T3 | T1 | T2 | T5 + getWebSessionCheckerForSessionFromRecords(SESSION1 + "#3", testRunner.getOutputRecords()) + .sessionId(SESSION1 + "#3") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1 + "#3") + .firstEventDateTime(time4) + .h2kTimestamp(time4) + .firstVisitedPage("url4") + .eventsCounter(2) + .lastEventDateTime(time5) + .lastVisitedPage("url5") + .sessionDuration(1L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + assertEquals(3, this.proc.getNumberOfRewindForProcInstance()); + + testRunner.clearQueues(); + testRunner.enqueue(event6TrafficSource); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(2 + 1);//session + event + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + //T1------T2------T3---T4-------------T5---T6-------T7 + //--------X------------X-------------------X---------- + //T4 | T3 | T1 | T2 | T5 | T6 + getWebSessionCheckerForSessionFromRecords(SESSION1 + "#3", testRunner.getOutputRecords()) + .sessionId(SESSION1 + "#3") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1 + "#3") + .firstEventDateTime(time4) + .h2kTimestamp(time4) + .firstVisitedPage("url4") + .eventsCounter(2) + .lastEventDateTime(time5) + .lastVisitedPage("url5") + .sessionDuration(1L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + getWebSessionCheckerForSessionFromRecords(SESSION1+ "#4", testRunner.getOutputRecords()) + .sessionId(SESSION1+ "#4") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1+ "#4") + .firstEventDateTime(time6) + .h2kTimestamp(time6) + .firstVisitedPage("url6") + .eventsCounter(1) + .lastEventDateTime(time6) + .lastVisitedPage("url6") + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + assertEquals(3, this.proc.getNumberOfRewindForProcInstance()); + + testRunner.clearQueues(); + testRunner.enqueue(event7); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(1 + 1);//session + event + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + //T1------T2------T3---T4-------------T5---T6-------T7 + //--------X------------X-------------------X---------- + getWebSessionCheckerForSessionFromRecords(SESSION1+ "#4", testRunner.getOutputRecords()) + .sessionId(SESSION1+ "#4") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1+ "#4") + .firstEventDateTime(time6) + .h2kTimestamp(time6) + .firstVisitedPage("url6") + .eventsCounter(2) + .lastEventDateTime(time7) + .lastVisitedPage("url7") + .sessionDuration(1L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); +// assertEquals(6, this.proc.getNumberOfRewindForProcInstance()); + +// FINAL RESULT Without error + List sessionInEs = getAllSessions(this.elasticsearchClientService, esclient); + getWebSessionCheckerForSession(SESSION1, sessionInEs) + .sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(time1) + .h2kTimestamp(time1) + .firstVisitedPage("url1") + .eventsCounter(1) + .lastEventDateTime(time1) + .lastVisitedPage("url1") + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + getWebSessionCheckerForSession(SESSION1 + "#2", sessionInEs) + .sessionId(SESSION1 + "#2") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1 + "#2") + .firstEventDateTime(time2) + .h2kTimestamp(time2) + .firstVisitedPage("url2") + .eventsCounter(2) + .lastEventDateTime(time3) + .lastVisitedPage("url3") + .sessionDuration(1L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + getWebSessionCheckerForSession(SESSION1 + "#3", sessionInEs) + .sessionId(SESSION1+ "#3") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1+ "#3") + .firstEventDateTime(time4) + .h2kTimestamp(time4) + .firstVisitedPage("url4") + .eventsCounter(2) + .lastEventDateTime(time5) + .lastVisitedPage("url5") + .sessionDuration(1L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + getWebSessionCheckerForSession(SESSION1 + "#4", sessionInEs) + .sessionId(SESSION1+ "#4") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1+ "#4") + .firstEventDateTime(time6) + .h2kTimestamp(time6) + .firstVisitedPage("url6") + .eventsCounter(2) + .lastEventDateTime(time7) + .lastVisitedPage("url7") + .sessionDuration(1L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + + assertEquals(3, this.proc.getNumberOfRewindForProcInstance()); + } + + /** + * The purpose of this test is to ensure that it handles correctly sessions even if it receive events in the wrong order + * and with some event causing a change of session (traffic source for exemple). Here we first run sessionazation for all events at once. + * The we simulate a rewind and simulate one batch with one record at a time. The output should be the same nonetheless ! + * + * Tous les évènements si dessous sont des évènements qui ont a peu près le même timestamp. + * events (chronological order): T1--T2--T3--T4--T5--T6--T7 + * changement de traffic: ----X-------X-------X----- + * batch 1: events T1,T2,T2,T3,T4,T5,T6,T7 + * S1 -> T1 + * S1#2 -> T2,T3 + * S1#3 -> T4,T5 + * S1#4 -> T6,T7 + * + * Simulate rewind reset cache + * + * batch 2: T4 + * batch 3: T3 + * batch 4: T1 + * batch 5: T2 + * batch 6: T5 + * batch 7: T6 + * batch 8: T7 + * + * Then just ensure final result in es is coprrect, which should be : + * S1 -> T1 + * S1#2 -> T2,T3 + * S1#3 -> T4,T5 + * S1#4 -> T6,T7 + * + * @throws Exception + */ + @Test + public void testNoRewindInSpecificCases() throws Exception { + final TestRunner testRunner = newTestRunner(container); + testRunner.assertValid(); + //first run + final long time1 = 1601629314416L; + final long time2 = time1 + 1000L; + final long time3 = time2 + 1000L; + final long time4 = time3 + 1000L; + final long time5 = time4 + 1000L; + final long time6 = time5 + 1000L; + final long time7 = time6 + 1000L; + Record event1 = createEvent("url1", SESSION1, USER1, time1); + Record event2TrafficSource = createEvent("url2", SESSION1, USER1, time2); + event2TrafficSource.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficSourceField(), "not direct"); + event2TrafficSource.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficMediumField(), "medium 1"); + Record event3 = createEvent("url3", SESSION1, USER1, time3); + Record event4TrafficSource = createEvent("url4", SESSION1, USER1, time4); + event4TrafficSource.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficSourceField(), "not direct"); + event4TrafficSource.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficMediumField(), "medium 2"); + Record event5 = createEvent("url5", SESSION1, USER1, time5); + Record event6TrafficSource = createEvent("url6", SESSION1, USER1, time6); + event6TrafficSource.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficSourceField(), "not direct"); + event6TrafficSource.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficMediumField(), "medium 3"); + Record event7 = createEvent("url7", SESSION1, USER1, time7); + testRunner.enqueue(event4TrafficSource, event3, event1, event2TrafficSource, event5, event6TrafficSource, event7); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(7 + 4);//4 session + 7 event + + injectOutputIntoEsThenSleepThenRefresh(testRunner.getOutputRecords()); + getWebSessionCheckerForSessionFromRecords(SESSION1, testRunner.getOutputRecords()) + .sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(time1) + .h2kTimestamp(time1) + .firstVisitedPage("url1") + .eventsCounter(1) + .lastEventDateTime(time1) + .lastVisitedPage("url1") + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + getWebSessionCheckerForSessionFromRecords(SESSION1 + "#2", testRunner.getOutputRecords()) + .sessionId(SESSION1 + "#2") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1 + "#2") + .firstEventDateTime(time2) + .h2kTimestamp(time2) + .firstVisitedPage("url2") + .eventsCounter(2) + .lastEventDateTime(time3) + .lastVisitedPage("url3") + .sessionDuration(1L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + getWebSessionCheckerForSessionFromRecords(SESSION1 + "#3", testRunner.getOutputRecords()) + .sessionId(SESSION1+ "#3") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1+ "#3") + .firstEventDateTime(time4) + .h2kTimestamp(time4) + .firstVisitedPage("url4") + .eventsCounter(2) + .lastEventDateTime(time5) + .lastVisitedPage("url5") + .sessionDuration(1L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + getWebSessionCheckerForSessionFromRecords(SESSION1+ "#4", testRunner.getOutputRecords()) + .sessionId(SESSION1+ "#4") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1+ "#4") + .firstEventDateTime(time6) + .h2kTimestamp(time6) + .firstVisitedPage("url6") + .eventsCounter(2) + .lastEventDateTime(time7) + .lastVisitedPage("url7") + .sessionDuration(1L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + assertEquals(0, this.proc.getNumberOfRewindForProcInstance()); + //RESET CACHE ==> REWIND + testRunner.clearQueues(); + resetCache(testRunner); + testRunner.enqueue(event4TrafficSource); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + //T1------T2------T3---T4-------------T5---T6-------T7 + //--------X------------X-------------------X---------- + assertEquals(1, this.proc.getNumberOfRewindForProcInstance()); + + testRunner.clearQueues(); + testRunner.enqueue(event3); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); +// //T1------T2------T3---T4-------------T5---T6-------T7 +// //--------X------------X-------------------X---------- + assertEquals(2, this.proc.getNumberOfRewindForProcInstance()); + + testRunner.clearQueues(); + testRunner.enqueue(event1); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); +// //T1------T2------T3---T4-------------T5---T6-------T7 +// //--------X------------X-------------------X---------- + assertEquals(3, this.proc.getNumberOfRewindForProcInstance()); + + testRunner.clearQueues(); + testRunner.enqueue(event2TrafficSource); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); +// //T1------T2------T3---T4-------------T5---T6-------T7 +// //--------X------------X-------------------X---------- + assertEquals(3, this.proc.getNumberOfRewindForProcInstance()); + + testRunner.clearQueues(); + testRunner.enqueue(event5); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); +// //T1------T2------T3---T4-------------T5---T6-------T7 +// //--------X------------X-------------------X---------- + assertEquals(3, this.proc.getNumberOfRewindForProcInstance()); + + testRunner.clearQueues(); + testRunner.enqueue(event6TrafficSource); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); +// //T1------T2------T3---T4-------------T5---T6-------T7 +// //--------X------------X-------------------X---------- + assertEquals(3, this.proc.getNumberOfRewindForProcInstance()); + + testRunner.clearQueues(); + testRunner.enqueue(event7); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); +// //T1------T2------T3---T4-------------T5---T6-------T7 +// //--------X------------X-------------------X---------- + assertEquals(3, this.proc.getNumberOfRewindForProcInstance()); + + List sessionInEs = getAllSessions(this.elasticsearchClientService, esclient); + getWebSessionCheckerForSession(SESSION1, sessionInEs) + .sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(time1) + .h2kTimestamp(time1) + .firstVisitedPage("url1") + .eventsCounter(1) + .lastEventDateTime(time1) + .lastVisitedPage("url1") + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + getWebSessionCheckerForSession(SESSION1 + "#2", sessionInEs) + .sessionId(SESSION1 + "#2") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1 + "#2") + .firstEventDateTime(time2) + .h2kTimestamp(time2) + .firstVisitedPage("url2") + .eventsCounter(2) + .lastEventDateTime(time3) + .lastVisitedPage("url3") + .sessionDuration(1L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + getWebSessionCheckerForSession(SESSION1 + "#3", sessionInEs) + .sessionId(SESSION1 + "#3") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1 + "#3") + .firstEventDateTime(time4) + .h2kTimestamp(time4) + .firstVisitedPage("url4") + .eventsCounter(2) + .lastEventDateTime(time5) + .lastVisitedPage("url5") + .sessionDuration(1L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + getWebSessionCheckerForSession(SESSION1 + "#4", sessionInEs) + .sessionId(SESSION1+ "#4") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1+ "#4") + .firstEventDateTime(time6) + .h2kTimestamp(time6) + .firstVisitedPage("url6") + .eventsCounter(2) + .lastEventDateTime(time7) + .lastVisitedPage("url7") + .sessionDuration(1L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + + } + /** + * The purpose of this test is to ensure that intempestive rewind are not triggered in nominal mode. + * Some events are delayed into next batch but that should not trigger a rewind ! + * + * Tous les évènements si dessous sont des évènements qui ont a peu près le même timestamp. + * events (chronological order): T1------T2------T3---T4-------------T5---T6-------T7--T8 + * changement de traffic: --------X------------X-------------------X-------------- + * + * batch 1: events T1,T3,T4 + * batch 2: events T5,T7 => no rewind + * batch 3: events T2,T6 => 1 rewind + * batch 4: events T6modifié, T7 => no rewind + * batch 5: events T7modifié, T8 => no rewind + * batch 6: events T7modifié => actuellement 1 rewind //TODO garder en cache des events pour eviter un rewind + * @throws Exception + */ + @Test + public void testNotTooManyRewind() throws Exception { + final TestRunner testRunner = newTestRunner(container); + testRunner.assertValid(); + //first run + final long time1 = 1601629314416L; + final long time2 = time1 + 1000L; + final long time3 = time2 + 1000L; + final long time4 = time3 + 1000L; + final long time5 = time4 + 1000L; + final long time6 = time5 + 1000L; + final long time7 = time6 + 1000L; + final long time8 = time7 + 1000L; + Record event1 = createEvent("url1", SESSION1, USER1, time1); + Record event2 = createEvent("url2", SESSION1, USER1, time2); + event2.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficSourceField(), "not direct"); + event2.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficMediumField(), "medium 1"); + Record event3 = createEvent("url3", SESSION1, USER1, time3); + Record event4 = createEvent("url4", SESSION1, USER1, time4); + event4.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficSourceField(), "not direct"); + event4.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficMediumField(), "medium 2"); + Record event5 = createEvent("url5", SESSION1, USER1, time5); + Record event6 = createEvent("url6", SESSION1, USER1, time6); + event6.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficSourceField(), "not direct"); + event6.setStringField(TestMappings.eventsInternalFields.getSourceOffTrafficMediumField(), "medium 3"); + Record event6Modifie = createEvent("url6Modifie", SESSION1, USER1, time6); + Record event7 = createEvent("url7", SESSION1, USER1, time7); + Record event7Modifie = createEvent("url7Modifie", SESSION1, USER1, time7); + Record event8 = createEvent("url7", SESSION1, USER1, time8); + + Assert.assertEquals(0, this.proc.getNumberOfRewindForProcInstance()); + testRunner.enqueue(event4, event3, event1);//T1,T3,T4 + testRunner.run(); + injectOutputIntoEsThenSleepThenRefresh(testRunner.getOutputRecords()); + Assert.assertEquals(0, this.proc.getNumberOfRewindForProcInstance()); + + testRunner.clearQueues(); + testRunner.enqueue(event5, event7);//T5,T7 => no rewind + testRunner.run(); + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + Assert.assertEquals(0, this.proc.getNumberOfRewindForProcInstance()); + + testRunner.clearQueues(); + testRunner.enqueue(event2, event6);//T2,T6 => 1 rewind + testRunner.run(); + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + Assert.assertEquals(1, this.proc.getNumberOfRewindForProcInstance()); + + testRunner.clearQueues(); + testRunner.enqueue(event6Modifie, event7);//T6modifié, T7 => no rewind + testRunner.run(); + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + Assert.assertEquals(1, this.proc.getNumberOfRewindForProcInstance()); + + testRunner.clearQueues(); + testRunner.enqueue(event7Modifie, event8);//T7modifié, T8 => no rewind + testRunner.run(); + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + Assert.assertEquals(1, this.proc.getNumberOfRewindForProcInstance()); + + testRunner.clearQueues(); + testRunner.enqueue(event7Modifie);//T7Modifie => 1 rewind ideallement no rewind + testRunner.run(); + injectOutputIntoEsWithoutRefreshing(testRunner.getOutputRecords()); + Assert.assertEquals(2, this.proc.getNumberOfRewindForProcInstance()); + } + + private WebSessionChecker getWebSessionCheckerForSession(final String divoltSession, + final List sessions) { + WebSession session = sessions.stream().filter(s -> s.getSessionId().equals(divoltSession)).findFirst().get(); + return new WebSessionChecker(session); + } + + private WebSessionChecker getWebSessionCheckerForSessionFromRecords(final String divoltSession, + final List sessions) { + Record session = sessions.stream().filter(s -> divoltSession.equals(s.getId())).findFirst().get(); + return new WebSessionChecker(session); + } + + private List createEvents(String url, String divoltSession, String user, List times) { + List events = new ArrayList<>(); + for (Long time : times) { + events.add(createEvent(url, divoltSession, user, time)); + } + return events; + } + + private Record createEvent(String url, String divoltSession, String user, Long time) { + String id = buildId(time, divoltSession); + return new WebEvent(id, divoltSession, user, time, url); + } + + private List createEventsUser1(List times) { + return createEvents(URL, SESSION1, USER1, times); + } + + private List createEventsUser2(List times) { + return createEvents(URL, SESSION2, USER2, times); + } + + private List createEventsUser3(List times) { + return createEvents(URL, SESSION3, USER3, times); + } + + private String buildId(long time, String divoltSession) { + return "event-" + time + "-" + divoltSession; + } + + private MockRecord getFirstRecordWithId(final String id, final List records) { + return records.stream().filter(record -> record.getId().equals(id)).findFirst().get(); + } + + + private void injectOutputIntoEsThenRefresh(List output) throws InitializationException { + injectOutputIntoEsWithoutRefreshing(output); + String[] indicesToWaitFor = output.stream() + .map(record -> record.getField(defaultOutputFieldNameForEsIndex).asString()) + .toArray(String[]::new); + this.elasticsearchClientService.waitUntilCollectionIsReadyAndRefreshIfAnyPendingTasks(indicesToWaitFor, 100000L); + } + + private void injectOutputIntoEsThenSleepThenRefresh(List output) throws InitializationException { + injectOutputIntoEsWithoutRefreshing(output); + try { + Thread.sleep(1500L); + } catch (InterruptedException e) { + e.printStackTrace(); + } + String[] indicesToWaitFor = output.stream() + .map(record -> record.getField(defaultOutputFieldNameForEsIndex).asString()) + .toArray(String[]::new); + this.elasticsearchClientService.waitUntilCollectionIsReadyAndRefreshIfAnyPendingTasks(indicesToWaitFor, 100000L); + } + + private void injectOutputIntoEsWithoutRefreshing(List output) { + bulkRunner.assertValid(); + bulkRunner.enqueue(output); + bulkRunner.run(); + bulkRunner.assertOutputRecordsCount(output.size()); + this.elasticsearchClientService.bulkFlush(); + bulkRunner.clearQueues(); + } + + + private void resetCache(TestRunner testRunner) { + testRunner.disableControllerService(lruCache); + testRunner.enableControllerService(lruCache); + } + + private SearchResponse getAllSessionsAfterRefreshing(RestHighLevelClient esclient) throws IOException { + try { + Thread.sleep(500L); + } catch (InterruptedException e) { + e.printStackTrace(); + } + this.elasticsearchClientService.waitUntilCollectionIsReadyAndRefreshIfAnyPendingTasks(SESSION_INDEX_PREFIX + "*", 100000L); + SearchRequest searchRequest = new SearchRequest(SESSION_INDEX_PREFIX + "*"); + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + searchSourceBuilder.query(QueryBuilders.matchAllQuery()); + searchRequest.source(searchSourceBuilder); + return esclient.search(searchRequest, RequestOptions.DEFAULT); + } + + private SearchResponse getAllEventsAfterRefreshing(RestHighLevelClient esclient) throws IOException { + try { + Thread.sleep(500L); + } catch (InterruptedException e) { + e.printStackTrace(); + } + this.elasticsearchClientService.waitUntilCollectionIsReadyAndRefreshIfAnyPendingTasks(EVENT_INDEX_PREFIX + "*", 100000L); + SearchRequest searchRequest = new SearchRequest(EVENT_INDEX_PREFIX + "*"); + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + searchSourceBuilder.query(QueryBuilders.matchAllQuery()); + searchRequest.source(searchSourceBuilder); + return esclient.search(searchRequest, RequestOptions.DEFAULT); + } + + private TestRunner newBulkAddTestRunner(DockerComposeContainer container) throws InitializationException { + return newBulkAddTestRunner(container, Collections.emptyMap()); + } + + private TestRunner newBulkAddTestRunner(DockerComposeContainer container, Map customConf) throws InitializationException { + BulkAddElasticsearch proc = new BulkAddElasticsearch(); + final TestRunner runner = TestRunners.newTestRunner(proc); + configureElasticsearchClientService(runner, container); + runner.setProperty(BulkAddElasticsearch.ELASTICSEARCH_CLIENT_SERVICE, "elasticsearchClient"); + runner.setProperty(BulkAddElasticsearch.ES_INDEX_FIELD, defaultOutputFieldNameForEsIndex); + runner.setProperty(BulkAddElasticsearch.ES_TYPE_FIELD, IncrementalWebSession.defaultOutputFieldNameForEsType); + runner.setProperty(BulkAddElasticsearch.DEFAULT_INDEX, "test"); + runner.setProperty(BulkAddElasticsearch.DEFAULT_TYPE, "test"); + customConf.forEach(runner::setProperty); + return runner; + } + /** + * Creates a new TestRunner set with the appropriate properties. + * + * @return a new TestRunner set with the appropriate properties. + * + * @throws InitializationException in case the runner could not be instantiated. + */ + private TestRunner newTestRunner(DockerComposeContainer container) throws InitializationException { + return newTestRunner(container, Collections.emptyMap()); + } + + + private TestRunner newTestRunner(DockerComposeContainer container, Map customConf) throws InitializationException { + this.proc = new IncrementalWebSession(); + final TestRunner runner = TestRunners.newTestRunner(this.proc); + final String FIELDS_TO_RETURN = Stream.of("partyId", "B2BUnit").collect(Collectors.joining(",")); +// fields.to.return: partyId,Company,remoteHost,tagOrigin,sourceOrigin,spamOrigin,referer,userAgentString,utm_source,utm_campaign,utm_medium,utm_content,utm_term,alert_match_name,alert_match_query,referer_hostname,DeviceClass,AgentName,ImportanceCode,B2BUnit,libelle_zone,Userid,customer_category,source_of_traffic_source,source_of_traffic_medium,source_of_traffic_keyword,source_of_traffic_campaign,source_of_traffic_organic_search,source_of_traffic_content,source_of_traffic_referral_path,websessionIndex + configureElasticsearchClientService(runner, container); + configureCacheService(runner); + runner.setProperty(IncrementalWebSession.CONFIG_CACHE_SERVICE, "lruCache"); + runner.setProperty(IncrementalWebSession.ELASTICSEARCH_CLIENT_SERVICE_CONF, "elasticsearchClient"); + runner.setProperty(IncrementalWebSession.ES_SESSION_INDEX_PREFIX_CONF, SESSION_INDEX_PREFIX); + runner.setProperty(IncrementalWebSession.ES_SESSION_INDEX_SUFFIX_FORMATTER_CONF, SESSION_SUFFIX_FORMATTER_STRING); + runner.setProperty(IncrementalWebSession.ES_SESSION_TYPE_NAME_CONF, "sessions"); + runner.setProperty(IncrementalWebSession.ES_EVENT_INDEX_PREFIX_CONF, EVENT_INDEX_PREFIX); + runner.setProperty(IncrementalWebSession.ES_EVENT_INDEX_SUFFIX_FORMATTER_CONF, EVENT_SUFFIX_FORMATTER_STRING); + runner.setProperty(IncrementalWebSession.ES_EVENT_TYPE_NAME_CONF, "event"); + runner.setProperty(IncrementalWebSession.SESSION_ID_FIELD_CONF, "sessionId"); + runner.setProperty(IncrementalWebSession.TIMESTAMP_FIELD_CONF, "h2kTimestamp"); + runner.setProperty(IncrementalWebSession.VISITED_PAGE_FIELD, "VISITED_PAGE"); + runner.setProperty(IncrementalWebSession.USER_ID_FIELD, "Userid"); + runner.setProperty(IncrementalWebSession.SESSION_INACTIVITY_TIMEOUT_CONF, String.valueOf(SESSION_TIMEOUT)); + runner.setProperty(IncrementalWebSession.FIELDS_TO_RETURN, FIELDS_TO_RETURN); + runner.setProperty(IncrementalWebSession.DEBUG_CONF, "true"); + customConf.forEach(runner::setProperty); + + return runner; + } + + private void configureCacheService(TestRunner runner) throws InitializationException { + final LRUKeyValueCacheService cacheService = new LRUKeyValueCacheService<>(); + runner.addControllerService("lruCache", cacheService); + runner.setProperty(cacheService, + LRUKeyValueCacheService.CACHE_SIZE, "1000"); + runner.assertValid(cacheService); + runner.enableControllerService(cacheService); + this.lruCache = cacheService; + } + + private void configureElasticsearchClientService(final TestRunner runner, + DockerComposeContainer container) throws InitializationException { + ElasticsearchClientService elasticsearchClientService; + if (this.elasticsearchClientService == null) { + elasticsearchClientService = new Elasticsearch_7_x_ClientService(); + } else { + elasticsearchClientService = this.elasticsearchClientService; + } + + runner.addControllerService("elasticsearchClient", elasticsearchClientService); + runner.setProperty(elasticsearchClientService, + Elasticsearch_7_x_ClientService.HOSTS, Es7DockerExtension.getEsHttpUrl(container)); + runner.setProperty(elasticsearchClientService, + Elasticsearch_7_x_ClientService.CLUSTER_NAME, "elasticsearch"); + runner.setProperty(elasticsearchClientService, + Elasticsearch_7_x_ClientService.BATCH_SIZE, "2000"); + runner.setProperty(elasticsearchClientService, + Elasticsearch_7_x_ClientService.FLUSH_INTERVAL, "2"); + runner.assertValid(elasticsearchClientService); + runner.enableControllerService(elasticsearchClientService); + } + + +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/integration-test/java/com/hurence/logisland/processor/webanalytics/TestFileHelper.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/integration-test/java/com/hurence/logisland/processor/webanalytics/TestFileHelper.java new file mode 100644 index 000000000..464a00217 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/integration-test/java/com/hurence/logisland/processor/webanalytics/TestFileHelper.java @@ -0,0 +1,41 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +public class TestFileHelper { + + public static String loadFromFile(String fileResource) throws IOException { + return readFromInputStream(TestFileHelper.class.getResourceAsStream(fileResource)); + } + + private static String readFromInputStream(InputStream inputStream) throws IOException { + StringBuilder resultStringBuilder = new StringBuilder(); + try (BufferedReader br + = new BufferedReader(new InputStreamReader(inputStream))) { + String line; + while ((line = br.readLine()) != null) { + resultStringBuilder.append(line).append("\n"); + } + } + return resultStringBuilder.toString(); + } + +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/CalculWebSession.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/CalculWebSession.java new file mode 100644 index 000000000..b51e674f9 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/CalculWebSession.java @@ -0,0 +1,751 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics; + +import com.hurence.logisland.annotation.documentation.*; +import com.hurence.logisland.component.InitializationException; +import com.hurence.logisland.component.PropertyDescriptor; +import com.hurence.logisland.processor.AbstractProcessor; +import com.hurence.logisland.processor.ProcessContext; +import com.hurence.logisland.processor.ProcessException; +import com.hurence.logisland.processor.webanalytics.modele.*; +import com.hurence.logisland.processor.webanalytics.util.SimpleSessionsCalculator; +import com.hurence.logisland.processor.webanalytics.util.Utils; +import com.hurence.logisland.record.Record; +import com.hurence.logisland.service.cache.CacheService; +import com.hurence.logisland.service.elasticsearch.ElasticsearchClientService; +import com.hurence.logisland.validator.StandardValidators; + +import java.time.Duration; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static com.hurence.logisland.processor.webanalytics.util.Utils.isFieldAssigned; + +@Category(ComponentCategory.ANALYTICS) +@Tags({"analytics", "web", "session"}) +@CapabilityDescription( +value = "This processor creates web-sessions based on incoming web-events.\n" + + + " Firstly, web-events are grouped by their session identifier and processed in chronological order.\n" + + " The following fields of the newly created web session are set based on the associated web event:" + + " session identifier, first timestamp, first visited page." + + + " Secondly, once created, the web session is updated by the remaining web-events.\n" + + " Updates have impacts on fields of the web session such as event counter, last visited page, " + + " session duration, ...\n" + + " Before updates are actually applied, checks are performed to detect rules that would trigger the creation" + + " of a new session:\n\n" + + "\tthe duration between the web session and the web event must not exceed the specified time-out,\n" + + "\tthe web session and the web event must have timestamps within the same day (at midnight a new web session " + + "is created),\n" + + "\tsource of traffic (campaign, ...) must be the same on the web session and the web event.\n" + + "\n" + + " When a breaking rule is detected, a new web session is created with a new session identifier where as" + + " remaining web-events still have the original session identifier. The new session identifier is the original" + + " session suffixed with the character '#' followed with an incremented counter. This new session identifier" + + " is also set on the remaining web-events.\n" + + + " Finally when all web events were applied, all web events -potentially modified with a new session" + + " identifier- And web sessions are passed to the next processor.\n" + + "\n" + + "WebSession information are:\n" + + "- first and last visited page\n" + + "- first and last timestamp of processed event \n" + + "- total number of processed events\n" + + "- the userId\n" + + "- a boolean denoting if the web-session is still active or not\n" + + "- an integer denoting the duration of the web-sessions\n" + + "- optional fields that may be retrieved from the processed events\n" + + "\n" +) +@ExtraDetailFile("./details/CalculWebSession-Detail.rst") +public class CalculWebSession + extends AbstractProcessor +{ + + /** + * The extra character added in case a missed new session is detected. In that case the original session identifier + * is suffixes with that special character and the next session number. + * Eg id-session, id-session#2, id-session#3, ... + */ + public static final String EXTRA_SESSION_DELIMITER = "#"; + + /** + * The type of the output record. + */ + public static final String OUTPUT_RECORD_TYPE = "consolidate-session"; + + //Session Elasticsearch indices + public static final String PROP_ES_SESSION_INDEX_PREFIX = "es.session.index.prefix"; + public static final String PROP_ES_SESSION_INDEX_SUFFIX_FORMATTER = "es.session.index.suffix.date"; + public static final String PROP_ES_SESSION_TYPE_NAME = "es.session.type.name"; + //Event Elasticsearch indices + public static final String PROP_ES_EVENT_INDEX_PREFIX = "es.event.index.prefix"; + public static final String PROP_ES_EVENT_INDEX_SUFFIX_FORMATTER = "es.event.index.suffix.date"; + public static final String PROP_ES_EVENT_TYPE_NAME = "es.event.type.name"; + + public static final String PROP_ES_INDEX_SUFFIX_TIMEZONE = "es.index.suffix.timezone"; + /** + * Extra fields - for convenience - avoiding to parse the human readable first and last timestamps. + */ + public static final String _FIRST_EVENT_EPOCH_SECONDS_FIELD = "firstEventEpochSeconds"; + public static final String _LAST_EVENT_EPOCH_SECONDS_FIELD = "lastEventEpochSeconds"; + + public static final PropertyDescriptor DEBUG_CONF = + new PropertyDescriptor.Builder() + .name("debug") + .description("Enable debug. If enabled, debug information are logged.") + .addValidator(StandardValidators.BOOLEAN_VALIDATOR) + .required(false) + .defaultValue("false") + .build(); + + public static final PropertyDescriptor ES_SESSION_INDEX_PREFIX_CONF = + new PropertyDescriptor.Builder() + .name(PROP_ES_SESSION_INDEX_PREFIX) + .description("Prefix of the indices containing the web session documents.") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build(); + + public static final PropertyDescriptor ES_SESSION_INDEX_SUFFIX_FORMATTER_CONF = + new PropertyDescriptor.Builder() + .name(PROP_ES_SESSION_INDEX_SUFFIX_FORMATTER) + .description("suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .addValidator(StandardValidators.DATE_TIME_FORMATTER_VALIDATOR) + .build(); + + public static final PropertyDescriptor ES_SESSION_TYPE_NAME_CONF = + new PropertyDescriptor.Builder() + .name(PROP_ES_SESSION_TYPE_NAME) + .description("Name of the ES type of web session documents.") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build(); + + public static final PropertyDescriptor SESSION_INACTIVITY_TIMEOUT_CONF = + new PropertyDescriptor.Builder() + .name("session.timeout") + .description("session timeout in sec") + .required(false) + .addValidator(StandardValidators.POSITIVE_INTEGER_VALIDATOR) + .defaultValue("1800") + .build(); + + public static final PropertyDescriptor SESSION_ID_FIELD_CONF = + new PropertyDescriptor.Builder() + .name("sessionid.field") + .description("the name of the field containing the session id => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("sessionId") + .build(); + + public static final PropertyDescriptor ES_EVENT_INDEX_PREFIX_CONF = + new PropertyDescriptor.Builder() + .name(PROP_ES_EVENT_INDEX_PREFIX) + .description("Prefix of the index containing the web event documents.") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build(); + + public static final PropertyDescriptor ES_EVENT_INDEX_SUFFIX_FORMATTER_CONF = + new PropertyDescriptor.Builder() + .name(PROP_ES_EVENT_INDEX_SUFFIX_FORMATTER) + .description("suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .addValidator(StandardValidators.DATE_TIME_FORMATTER_VALIDATOR) + .build(); + + public static final PropertyDescriptor ES_EVENT_TYPE_NAME_CONF = + new PropertyDescriptor.Builder() + .name(PROP_ES_EVENT_TYPE_NAME) + .description("Name of the ES type of web event documents.") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build(); + + public static final PropertyDescriptor TIMESTAMP_FIELD_CONF = + new PropertyDescriptor.Builder() + .name("timestamp.field") + .description("the name of the field containing the timestamp => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("h2kTimestamp") + .build(); + + public static final PropertyDescriptor VISITED_PAGE_FIELD = + new PropertyDescriptor.Builder() + .name("visitedpage.field") + .description("the name of the field containing the visited page => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("location") + .build(); + + public static final PropertyDescriptor USER_ID_FIELD = + new PropertyDescriptor.Builder() + .name("userid.field") + .description("the name of the field containing the userId => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("userId") + .build(); + + public static final PropertyDescriptor FIELDS_TO_RETURN = + new PropertyDescriptor.Builder() + .name("fields.to.return") + .description("the list of fields to return") + .required(false) + .addValidator(StandardValidators.COMMA_SEPARATED_LIST_VALIDATOR) + .build(); + + public static final PropertyDescriptor FIRST_VISITED_PAGE_FIELD = + new PropertyDescriptor.Builder() + .name("firstVisitedPage.out.field") + .description("the name of the field containing the first visited page => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("firstVisitedPage") + .build(); + + public static final PropertyDescriptor LAST_VISITED_PAGE_FIELD = + new PropertyDescriptor.Builder() + .name("lastVisitedPage.out.field") + .description("the name of the field containing the last visited page => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("lastVisitedPage") + .build(); + + public static final PropertyDescriptor IS_SESSION_ACTIVE_FIELD = + new PropertyDescriptor.Builder() + .name("isSessionActive.out.field") + .description("the name of the field stating whether the session is active or not => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("is_sessionActive") + .build(); + + public static final PropertyDescriptor IS_SINGLE_PAGE_VISIT_FIELD = + new PropertyDescriptor.Builder() + .name("isSinglePageVisit.out.field") + .description("the name of the field stating whether the session is single page visit or not => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("is_single_page_visit") + .build(); + + public static final PropertyDescriptor SESSION_DURATION_FIELD = + new PropertyDescriptor.Builder() + .name("sessionDuration.out.field") + .description("the name of the field containing the session duration => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("sessionDuration") + .build(); + + public static final PropertyDescriptor SESSION_INACTIVITY_DURATION_FIELD = + new PropertyDescriptor.Builder() + .name("sessionInactivityDuration.out.field") + .description("the name of the field containing the session inactivity duration => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("sessionInactivityDuration") + .build(); + + public static final PropertyDescriptor EVENTS_COUNTER_FIELD = + new PropertyDescriptor.Builder() + .name("eventsCounter.out.field") + .description("the name of the field containing the session duration => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("eventsCounter") + .build(); + + public static final PropertyDescriptor FIRST_EVENT_DATETIME_FIELD = + new PropertyDescriptor.Builder() + .name("firstEventDateTime.out.field") + .description("the name of the field containing the date of the first event => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("firstEventDateTime") + .build(); + + public static final PropertyDescriptor LAST_EVENT_DATETIME_FIELD = + new PropertyDescriptor.Builder() + .name("lastEventDateTime.out.field") + .description("the name of the field containing the date of the last event => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("lastEventDateTime") + .build(); + + public static final PropertyDescriptor NEW_SESSION_REASON_FIELD = + new PropertyDescriptor.Builder() + .name("newSessionReason.out.field") + .description("the name of the field containing the reason why a new session was created => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("reasonForNewSession") + .build(); + + public static final PropertyDescriptor TRANSACTION_IDS = + new PropertyDescriptor.Builder() + .name("transactionIds.out.field") + .description("the name of the field containing all transactionIds => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("transactionIds") + .build(); + + /** + * The source identified for the web session + */ + public static final String SOURCE_OF_TRAFFIC_FIELD_SOURCE = "source"; + + /** + * The medium identified for the web session + */ + public static final String SOURCE_OF_TRAFFIC_FIELD_MEDIUM = "medium"; + + /** + * The campaign identified for the web session + */ + public static final String SOURCE_OF_TRAFFIC_FIELD_CAMPAIGN = "campaign"; + + /** + * The content identified for the web session + */ + public static final String SOURCE_OF_TRAFFIC_FIELD_CONTENT = "content"; + + /** + * The term/keyword identified for the web session + */ + public static final String SOURCE_OF_TRAFFIC_FIELD_KEYWORD = "keyword"; + + protected static final String PROP_SOURCE_OF_TRAFFIC_PREFIX = "source_of_traffic.prefix"; + public static final String DEFAULT_SOURCE_OF_TRAFFIC_PREFIX = "source_of_traffic_"; + public static final String DIRECT_TRAFFIC = "direct"; + + public static final PropertyDescriptor SOURCE_OF_TRAFFIC_PREFIX = + new PropertyDescriptor.Builder() + .name(PROP_SOURCE_OF_TRAFFIC_PREFIX) + .description("Prefix for the source of the traffic related fields") + .required(false) + .defaultValue(DEFAULT_SOURCE_OF_TRAFFIC_PREFIX) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build(); + + public static final PropertyDescriptor ZONEID_CONF = + new PropertyDescriptor.Builder() + .name(PROP_ES_INDEX_SUFFIX_TIMEZONE) + .description("The timezone to use to aprse timestamp into string date (for index names). See " + + PROP_ES_EVENT_INDEX_SUFFIX_FORMATTER + " and " + PROP_ES_SESSION_INDEX_SUFFIX_FORMATTER + + ". By default the system timezone is used. Supported by current system is : " + ZoneId.getAvailableZoneIds()) + .required(false) + .addValidator(StandardValidators.ZONE_ID_VALIDATOR) + .build(); + + public static final String defaultOutputFieldNameForEsIndex = "es_index"; + public static final PropertyDescriptor OUTPUT_FIELD_NAME_FOR_ES_INDEX = + new PropertyDescriptor.Builder() + .name("record.es.index.output.field.name") + .description("The field name where index name to store record will be stored") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue(defaultOutputFieldNameForEsIndex) + .build(); + + public static final String defaultOutputFieldNameForEsType = "es_type"; + public static final PropertyDescriptor OUTPUT_FIELD_NAME_FOR_ES_TYPE = + new PropertyDescriptor.Builder() + .name("record.es.type.output.field.name") + .description("The field name where type name to store record will be stored") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue(defaultOutputFieldNameForEsType) + .build(); + + /** + * A singleton for valid check. + */ + public final static SessionCheckResult DAY_OVERLAP = new InvalidSessionCheckResult("Day overlap"); + public final static SessionCheckResult SESSION_TIMEDOUT = new InvalidSessionCheckResult("Session timed-out"); + public final static SessionCheckResult SOURCE_OF_TRAFFIC = new InvalidSessionCheckResult("Source of traffic differed"); + + //sessions calcul + private long _SESSION_INACTIVITY_TIMEOUT_IN_SECONDS; + private Collection _FIELDS_TO_RETURN; + private Collection checkers; + //elasticsearch indices + private String _ES_SESSION_INDEX_PREFIX; + private DateTimeFormatter _ES_SESSION_INDEX_SUFFIX_FORMATTER; + private String _ES_SESSION_TYPE_NAME; + private String _ES_EVENT_INDEX_PREFIX; + private DateTimeFormatter _ES_EVENT_INDEX_SUFFIX_FORMATTER; + private String _ES_EVENT_TYPE_NAME; + //events and session model + private Event.InternalFields eventsInternalFields; + private WebSession.InternalFields sessionInternalFields; + private ZoneId zoneIdToUse; + private String outputFieldNameForEsIndex; + private String outputFieldNameForEsType; + /** + * If {@code true} prints additional logs. + */ + public boolean _DEBUG = false; + + @Override + public List getSupportedPropertyDescriptors() { + return Collections.unmodifiableList(Arrays.asList( + DEBUG_CONF, + ES_SESSION_INDEX_PREFIX_CONF, + ES_SESSION_INDEX_SUFFIX_FORMATTER_CONF, + ES_SESSION_TYPE_NAME_CONF, + ES_EVENT_INDEX_PREFIX_CONF, + ES_EVENT_INDEX_SUFFIX_FORMATTER_CONF, + ES_EVENT_TYPE_NAME_CONF, + SESSION_ID_FIELD_CONF, + TIMESTAMP_FIELD_CONF, + VISITED_PAGE_FIELD, + USER_ID_FIELD, + FIELDS_TO_RETURN, + FIRST_VISITED_PAGE_FIELD, + LAST_VISITED_PAGE_FIELD, + IS_SINGLE_PAGE_VISIT_FIELD, + IS_SESSION_ACTIVE_FIELD, + SESSION_DURATION_FIELD, + SESSION_INACTIVITY_DURATION_FIELD, + SESSION_INACTIVITY_TIMEOUT_CONF, + EVENTS_COUNTER_FIELD, + FIRST_EVENT_DATETIME_FIELD, + LAST_EVENT_DATETIME_FIELD, + NEW_SESSION_REASON_FIELD, + TRANSACTION_IDS, + SOURCE_OF_TRAFFIC_PREFIX, + ZONEID_CONF, + OUTPUT_FIELD_NAME_FOR_ES_INDEX, + OUTPUT_FIELD_NAME_FOR_ES_TYPE + )); + } + + @Override + public boolean hasControllerService() + { + return false; + } + + @Override + public void init(final ProcessContext context) throws InitializationException + { + super.init(context); + this._SESSION_INACTIVITY_TIMEOUT_IN_SECONDS = context.getPropertyValue(SESSION_INACTIVITY_TIMEOUT_CONF).asLong(); + String _SESSION_ID_FIELD = context.getPropertyValue(SESSION_ID_FIELD_CONF).asString(); + String _TIMESTAMP_FIELD = context.getPropertyValue(TIMESTAMP_FIELD_CONF).asString(); + final String _VISITED_PAGE_FIELD = context.getPropertyValue(VISITED_PAGE_FIELD).asString(); + + final String fieldsToReturn = context.getPropertyValue(FIELDS_TO_RETURN).asString(); + if (fieldsToReturn != null && !fieldsToReturn.isEmpty()) { + this._FIELDS_TO_RETURN = Arrays.asList(fieldsToReturn.split(",")); + } else { + this._FIELDS_TO_RETURN = Collections.emptyList(); + } + + final String _USERID_FIELD = context.getPropertyValue(USER_ID_FIELD).asString(); + final String _FIRST_VISITED_PAGE_FIELD = context.getPropertyValue(FIRST_VISITED_PAGE_FIELD).asString(); + final String _LAST_VISITED_PAGE_FIELD = context.getPropertyValue(LAST_VISITED_PAGE_FIELD).asString(); + String _IS_SINGLE_PAGE_VISIT = context.getPropertyValue(IS_SINGLE_PAGE_VISIT_FIELD).asString(); + String _IS_SESSION_ACTIVE_FIELD = context.getPropertyValue(IS_SESSION_ACTIVE_FIELD).asString(); + String _SESSION_DURATION_FIELD = context.getPropertyValue(SESSION_DURATION_FIELD).asString(); + String _EVENTS_COUNTER_FIELD = context.getPropertyValue(EVENTS_COUNTER_FIELD).asString(); + final String _FIRST_EVENT_DATETIME_FIELD = context.getPropertyValue(FIRST_EVENT_DATETIME_FIELD).asString(); + final String _LAST_EVENT_DATETIME_FIELD = context.getPropertyValue(LAST_EVENT_DATETIME_FIELD).asString(); + String _SESSION_INACTIVITY_DURATION_FIELD = context.getPropertyValue(SESSION_INACTIVITY_DURATION_FIELD) + .asString(); + final String _NEW_SESSION_REASON_FIELD = context.getPropertyValue(NEW_SESSION_REASON_FIELD).asString(); + final String _TRANSACTION_IDS = context.getPropertyValue(TRANSACTION_IDS).asString(); + + final String sotPrefix = context.getPropertyValue(SOURCE_OF_TRAFFIC_PREFIX).asString(); + + final String _SOT_SOURCE_FIELD = sotPrefix + SOURCE_OF_TRAFFIC_FIELD_SOURCE; + final String _SOT_CAMPAIGN_FIELD = sotPrefix + SOURCE_OF_TRAFFIC_FIELD_CAMPAIGN; + final String _SOT_MEDIUM_FIELD = sotPrefix + SOURCE_OF_TRAFFIC_FIELD_MEDIUM; + final String _SOT_CONTENT_FIELD = sotPrefix + SOURCE_OF_TRAFFIC_FIELD_CONTENT; + final String _SOT_KEYWORD_FIELD = sotPrefix + SOURCE_OF_TRAFFIC_FIELD_KEYWORD; + + //Sessions indices + this._ES_SESSION_INDEX_PREFIX = context.getPropertyValue(ES_SESSION_INDEX_PREFIX_CONF).asString(); + this._ES_SESSION_INDEX_SUFFIX_FORMATTER = DateTimeFormatter.ofPattern( + context.getPropertyValue(ES_SESSION_INDEX_SUFFIX_FORMATTER_CONF).asString() + ); + this._ES_SESSION_TYPE_NAME = context.getPropertyValue(ES_SESSION_TYPE_NAME_CONF).asString(); + //Events indices + this._ES_EVENT_INDEX_PREFIX = context.getPropertyValue(ES_EVENT_INDEX_PREFIX_CONF).asString(); + this._ES_EVENT_INDEX_SUFFIX_FORMATTER = DateTimeFormatter.ofPattern( + context.getPropertyValue(ES_EVENT_INDEX_SUFFIX_FORMATTER_CONF).asString() + ); + this._ES_EVENT_TYPE_NAME = context.getPropertyValue(ES_EVENT_TYPE_NAME_CONF).asString(); + + this.outputFieldNameForEsIndex = context.getPropertyValue(OUTPUT_FIELD_NAME_FOR_ES_INDEX).asString(); + this.outputFieldNameForEsType = context.getPropertyValue(OUTPUT_FIELD_NAME_FOR_ES_TYPE).asString(); + + this.eventsInternalFields = new Event.InternalFields() + .setSessionIdField(_SESSION_ID_FIELD) + .setTimestampField(_TIMESTAMP_FIELD) + .setVisitedPageField(_VISITED_PAGE_FIELD) + .setSourceOffTrafficCampaignField(_SOT_CAMPAIGN_FIELD) + .setSourceOffTrafficContentField(_SOT_CONTENT_FIELD) + .setSourceOffTrafficKeyWordField(_SOT_KEYWORD_FIELD) + .setSourceOffTrafficMediumField(_SOT_MEDIUM_FIELD) + .setSourceOffTrafficSourceField(_SOT_SOURCE_FIELD) + .setNewSessionReasonField(_NEW_SESSION_REASON_FIELD) + .setUserIdField(_USERID_FIELD) + .setOriginalSessionIdField("originalSessionId") + .setTransactionIdField("transactionId") + .setTransactionIdsField("transactionIds"); + + this.sessionInternalFields = new WebSession.InternalFields() + .setSessionIdField(_SESSION_ID_FIELD) + .setTimestampField(_TIMESTAMP_FIELD) + .setSourceOffTrafficCampaignField(_SOT_CAMPAIGN_FIELD) + .setSourceOffTrafficContentField(_SOT_CONTENT_FIELD) + .setSourceOffTrafficKeyWordField(_SOT_KEYWORD_FIELD) + .setSourceOffTrafficMediumField(_SOT_MEDIUM_FIELD) + .setSourceOffTrafficSourceField(_SOT_SOURCE_FIELD) + .setIsSessionActiveField(_IS_SESSION_ACTIVE_FIELD) + .setSessionDurationField(_SESSION_DURATION_FIELD) + .setSessionInactivityDurationField(_SESSION_INACTIVITY_DURATION_FIELD) + .setEventsCounterField(_EVENTS_COUNTER_FIELD) + .setFirstEventDateTimeField(_FIRST_EVENT_DATETIME_FIELD) + .setFirstEventEpochSecondsField(_FIRST_EVENT_EPOCH_SECONDS_FIELD) + .setFirstVisitedPageField(_FIRST_VISITED_PAGE_FIELD) + .setLastEventDateTimeField(_LAST_EVENT_DATETIME_FIELD) + .setLastEventEpochSecondsField(_LAST_EVENT_EPOCH_SECONDS_FIELD) + .setLastVisitedPageField(_LAST_VISITED_PAGE_FIELD) + .setTransactionIdsField(_TRANSACTION_IDS) + .setUserIdField(_USERID_FIELD) + .setIsSinglePageVisit(_IS_SINGLE_PAGE_VISIT); + + this.zoneIdToUse = ZoneId.systemDefault(); + if (context.getPropertyValue(ZONEID_CONF).isSet()) { + this.zoneIdToUse = ZoneId.of(context.getPropertyValue(ZONEID_CONF).asString()); + } + this.checkers = Arrays.asList( + // Day overlap + (session, event) -> + { + final ZonedDateTime firstEvent = session.getFirstEvent(); + final ZonedDateTime lastEvent = session.getLastEvent(); + + final ZonedDateTime timestamp = event.getTimestamp(); + + boolean isValid = firstEvent.getDayOfYear() == timestamp.getDayOfYear() + && lastEvent.getDayOfYear() == timestamp.getDayOfYear() + && firstEvent.getYear() == timestamp.getYear() + && lastEvent.getYear() == timestamp.getYear(); + + if (_DEBUG && !isValid) { + debug("'Day overlap' isValid=" + isValid + " session-id=" + session.getSessionId()); + } + + return isValid ? ValidSessionCheckResult.getInstance() : DAY_OVERLAP; + }, + + // Timeout exceeded + (session, event) -> + { + final long durationInSeconds = Duration.between(session.getLastEvent(), event.getTimestamp()) + .getSeconds(); + boolean isValid = durationInSeconds <= this._SESSION_INACTIVITY_TIMEOUT_IN_SECONDS; + + if (_DEBUG && !isValid) { + debug("'Timeout exceeded' isValid=" + isValid + " seconds=" + durationInSeconds + + " timeout=" + this._SESSION_INACTIVITY_TIMEOUT_IN_SECONDS + " session-id=" + session.getSessionId()); + } + + return isValid ? ValidSessionCheckResult.getInstance() : SESSION_TIMEDOUT; + }, + + // One Campaign Per Session—Each visit to your site from a different campaign—organic or paid—triggers a + // new session, regardless of the actual time elapsed in the current session. + (session, event) -> + { + boolean isValid = Objects.equals(event.getValue(_SOT_SOURCE_FIELD), DIRECT_TRAFFIC) || + Objects.deepEquals(session.getSourceOfTraffic(), event.getSourceOfTraffic()); + + if (_DEBUG && !isValid) { + debug("'Fields of traffic' isValid=" + isValid + " session-id=" + session.getSessionId()); + } + + return isValid ? ValidSessionCheckResult.getInstance() : SOURCE_OF_TRAFFIC; + }); + } + + /** + * Processes the incoming records and returns their result. + * + * @param records the records to process. + * @return the result of the processing of the incoming records. + * @throws ProcessException if something went wrong. + */ + @Override + public Collection process(final ProcessContext context, + final Collection records) + throws ProcessException + { + return processRecords(records); + } + + public Collection processRecords(final Collection records) { + if (records == null || records.isEmpty()) return new ArrayList<>(); + final Collection groupOfEvents = toWebEvents(records); + final Collection calculatedSessions = computeSessions(groupOfEvents); + return addEsIndexInfoAndConcatOutput(groupOfEvents, calculatedSessions); + } + + public Collection computeSessions(Collection allEvents) { + // Applies all events to session documents and collect results. + return allEvents.stream() + .map(events -> { + SimpleSessionsCalculator sessionCalc = new SimpleSessionsCalculator(checkers, + _SESSION_INACTIVITY_TIMEOUT_IN_SECONDS, + sessionInternalFields, + eventsInternalFields, + _FIELDS_TO_RETURN); + return sessionCalc.processEvents(events); + }) + .collect(Collectors.toList()); + } + + private List addEsIndexInfoAndConcatOutput(Collection allEvents, + Collection calculatedSessions) { + List outputEvents = allEvents + .stream() + .flatMap(events -> events.getAll().stream()) + .map(event -> { + Record record = event.getRecord(); + record.setStringField(outputFieldNameForEsIndex, toEventIndexName(event.getTimestamp())); + record.setStringField(outputFieldNameForEsType, _ES_EVENT_TYPE_NAME); + return record; + }) + .collect(Collectors.toList()); + + final Collection flattenedSessions = calculatedSessions.stream() + .flatMap(sessionsCalculator -> sessionsCalculator.getCalculatedSessions().stream()) + .collect(Collectors.toList()); + debug("Processing done. Outcoming records size=%d ", flattenedSessions.size()); + List outputSessions = flattenedSessions.stream() + .map(session -> { + Record record = session.getRecord(); + record.setStringField(outputFieldNameForEsIndex, toSessionIndexName(session.getFirstEvent())); + record.setStringField(outputFieldNameForEsType, _ES_SESSION_TYPE_NAME); + return record; + }) + .collect(Collectors.toList()); + + return Stream.concat( + outputEvents.stream(), + outputSessions.stream() + ).collect(Collectors.toList()); + } + + /** + * Filter out record without sessionId or timestamp + * Returns the provided remaining records as a collection of Events instances. + * + * Provided records are grouped by session identifier so that each Events contains all events from a specific sessionId. + * + * @param records a collection of records representing web-events. + * @return the provided records as a collection of Events instances. + */ + private Collection toWebEvents(final Collection records) { + // Create webEvents from input records. + // A webEvents contains all webEvent instances of its session id. + final Collection result = + records.stream() + // Remove record without session Id or timestamp. + .filter(record -> isFieldAssigned(record.getField(eventsInternalFields.getSessionIdField())) + && isFieldAssigned(record.getField(eventsInternalFields.getTimestampField()))) + // Create web-event from record. + .map(record -> new Event(record, this.eventsInternalFields)) + // Group records per session Id. + .collect(Collectors.groupingBy(Event::getSessionId)) + // Ignore keys (sessionId) and stream over list of associated events. + .values() + .stream() + // Wrapped grouped web-events of sessionId in WebEvents. + .map(Events::new) + .collect(Collectors.toList()); + + return result; + } + + /** + * Returns the name of the event index corresponding to the specified date such as + * ${event-index-name}.${event-suffix}. + * Eg. openanalytics-webevents.2018.01.31 + * + * @param date the ZonedDateTime of the event to store in the index. + * @return the name of the event index corresponding to the specified date. + */ + public String toEventIndexName(final ZonedDateTime date) { + return Utils.buildIndexName(_ES_EVENT_INDEX_PREFIX, _ES_EVENT_INDEX_SUFFIX_FORMATTER, date, zoneIdToUse); + } + + /** + * Returns the name of the event index corresponding to the specified date such as + * ${session-index-name}${session-suffix}. + * Eg. openanalytics-webevents.2018.01.31 + * + * @param date the ZonedDateTime timestamp of the first event of the session. + * @return the name of the session index corresponding to the specified timestamp. + */ + public String toSessionIndexName(final ZonedDateTime date) { + return Utils.buildIndexName(_ES_SESSION_INDEX_PREFIX, _ES_SESSION_INDEX_SUFFIX_FORMATTER, date, zoneIdToUse); + } + + /** + * Facility to log debug. + * + * @param format the format of the String. + * @param args the arguments. + */ + private void debug(final String format, final Object... args) + { + if ( _DEBUG ) + { + if ( args.length == 0 ) + { + getLogger().debug(format); + } + else + { + getLogger().debug(String.format(format + "\n", args)); + } + } + } + +} + diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webAnalytics/ConsolidateSession.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/ConsolidateSession.java similarity index 99% rename from logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webAnalytics/ConsolidateSession.java rename to logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/ConsolidateSession.java index fb6d7d2fa..1de9d6c80 100644 --- a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webAnalytics/ConsolidateSession.java +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/ConsolidateSession.java @@ -13,10 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.hurence.logisland.processor.webAnalytics; +package com.hurence.logisland.processor.webanalytics; import com.hurence.logisland.annotation.documentation.CapabilityDescription; import com.hurence.logisland.annotation.documentation.ExtraDetailFile; +import com.hurence.logisland.annotation.documentation.SeeAlso; import com.hurence.logisland.annotation.documentation.Tags; import com.hurence.logisland.component.InitializationException; import com.hurence.logisland.component.PropertyDescriptor; @@ -88,6 +89,8 @@ + " - visitedpage.field: Property name containing the page visited by the customer (default: location)." + " - fields.to.return: List of fields to return in the aggregated object. (default: N/A)" ) +@Deprecated() +@SeeAlso(IncrementalWebSession.class) @ExtraDetailFile("./details/ConsolidateSession-Detail.rst") public class ConsolidateSession extends AbstractProcessor { diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/IncrementalWebSession.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/IncrementalWebSession.java new file mode 100644 index 000000000..cbeda64eb --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/IncrementalWebSession.java @@ -0,0 +1,1544 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics; + +import com.hurence.logisland.annotation.documentation.*; +import com.hurence.logisland.classloading.PluginProxy; +import com.hurence.logisland.component.InitializationException; +import com.hurence.logisland.component.PropertyDescriptor; +import com.hurence.logisland.processor.AbstractProcessor; +import com.hurence.logisland.processor.ProcessContext; +import com.hurence.logisland.processor.ProcessException; +import com.hurence.logisland.processor.webanalytics.modele.*; +import com.hurence.logisland.processor.webanalytics.util.SessionsCalculator; +import com.hurence.logisland.processor.webanalytics.util.Utils; +import com.hurence.logisland.record.FieldType; +import com.hurence.logisland.record.Record; +import com.hurence.logisland.service.cache.CacheService; +import com.hurence.logisland.service.datastore.model.*; +import com.hurence.logisland.service.datastore.model.bool.*; +import com.hurence.logisland.service.elasticsearch.ElasticsearchClientService; +import com.hurence.logisland.validator.StandardValidators; + +import java.time.Duration; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static com.hurence.logisland.processor.webanalytics.util.Utils.isFieldAssigned; + +@Category(ComponentCategory.ANALYTICS) +@Tags({"analytics", "web", "session"}) +@CapabilityDescription( +value = "This processor creates and updates web-sessions based on incoming web-events." + + " Note that both web-sessions and web-events are stored in elasticsearch.\n" + + + " Firstly, web-events are grouped by their session identifier and processed in chronological order.\n" + + " Then each web-session associated to each group is retrieved from elasticsearch.\n" + + " In case none exists yet then a new web session is created based on the first web event.\n" + + " The following fields of the newly created web session are set based on the associated web event:" + + " session identifier, first timestamp, first visited page." + + + " Secondly, once created, or retrieved, the web session is updated by the remaining web-events.\n" + + " Updates have impacts on fields of the web session such as event counter, last visited page, " + + " session duration, ...\n" + + " Before updates are actually applied, checks are performed to detect rules that would trigger the creation" + + " of a new session:\n\n" + + "\tthe duration between the web session and the web event must not exceed the specified time-out,\n" + + "\tthe web session and the web event must have timestamps within the same day (at midnight a new web session " + + "is created),\n" + + "\tsource of traffic (campaign, ...) must be the same on the web session and the web event.\n" + + "\n" + + " When a breaking rule is detected, a new web session is created with a new session identifier where as" + + " remaining web-events still have the original session identifier. The new session identifier is the original" + + " session suffixed with the character '#' followed with an incremented counter. This new session identifier" + + " is also set on the remaining web-events.\n" + + + " Finally when all web events were applied, all web events -potentially modified with a new session" + + " identifier- are save in elasticsearch. And web sessions are passed to the next processor.\n" + + "\n" + + "WebSession information are:\n" + + "- first and last visited page\n" + + "- first and last timestamp of processed event \n" + + "- total number of processed events\n" + + "- the userId\n" + + "- a boolean denoting if the web-session is still active or not\n" + + "- an integer denoting the duration of the web-sessions\n" + + "- optional fields that may be retrieved from the processed events\n" + + "\n" +) +@ExtraDetailFile("./details/IncrementalWebSession-Detail.rst") +public class IncrementalWebSession + extends AbstractProcessor +{ + + /** + * The extra character added in case a missed new session is detected. In that case the original session identifier + * is suffixes with that special character and the next session number. + * Eg id-session, id-session#2, id-session#3, ... + */ + public static final String EXTRA_SESSION_DELIMITER = "#"; + + /** + * The type of the output record. + */ + public static final String OUTPUT_RECORD_TYPE = "consolidate-session"; + + //Session Elasticsearch indices + public static final String PROP_ES_SESSION_INDEX_PREFIX = "es.session.index.prefix"; + public static final String PROP_ES_SESSION_INDEX_SUFFIX_FORMATTER = "es.session.index.suffix.date"; + public static final String PROP_ES_SESSION_TYPE_NAME = "es.session.type.name"; + //Event Elasticsearch indices + public static final String PROP_ES_EVENT_INDEX_PREFIX = "es.event.index.prefix"; + public static final String PROP_ES_EVENT_INDEX_SUFFIX_FORMATTER = "es.event.index.suffix.date"; + public static final String PROP_ES_EVENT_TYPE_NAME = "es.event.type.name"; + + public static final String PROP_ES_INDEX_SUFFIX_TIMEZONE = "es.index.suffix.timezone"; + /** + * Extra fields - for convenience - avoiding to parse the human readable first and last timestamps. + */ + public static final String _FIRST_EVENT_EPOCH_SECONDS_FIELD = "firstEventEpochSeconds"; + public static final String _LAST_EVENT_EPOCH_SECONDS_FIELD = "lastEventEpochSeconds"; + + public static final PropertyDescriptor ELASTICSEARCH_CLIENT_SERVICE_CONF = + new PropertyDescriptor.Builder() + .name("elasticsearch.client.service") + .description("The instance of the Controller Service to use for accessing Elasticsearch.") + .required(true) + .identifiesControllerService(ElasticsearchClientService.class) + .build(); + + public static final PropertyDescriptor DEBUG_CONF = + new PropertyDescriptor.Builder() + .name("debug") + .description("Enable debug. If enabled, debug information are logged.") + .addValidator(StandardValidators.BOOLEAN_VALIDATOR) + .required(false) + .defaultValue("false") + .build(); + + public static final PropertyDescriptor ES_SESSION_INDEX_PREFIX_CONF = + new PropertyDescriptor.Builder() + .name(PROP_ES_SESSION_INDEX_PREFIX) + .description("Prefix of the indices containing the web session documents.") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build(); + + public static final PropertyDescriptor ES_SESSION_INDEX_SUFFIX_FORMATTER_CONF = + new PropertyDescriptor.Builder() + .name(PROP_ES_SESSION_INDEX_SUFFIX_FORMATTER) + .description("suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .addValidator(StandardValidators.DATE_TIME_FORMATTER_VALIDATOR) + .build(); + + public static final PropertyDescriptor ES_SESSION_TYPE_NAME_CONF = + new PropertyDescriptor.Builder() + .name(PROP_ES_SESSION_TYPE_NAME) + .description("Name of the ES type of web session documents.") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build(); + + public static final PropertyDescriptor SESSION_INACTIVITY_TIMEOUT_CONF = + new PropertyDescriptor.Builder() + .name("session.timeout") + .description("session timeout in sec") + .required(false) + .addValidator(StandardValidators.POSITIVE_INTEGER_VALIDATOR) + .defaultValue("1800") + .build(); + + public static final PropertyDescriptor SESSION_ID_FIELD_CONF = + new PropertyDescriptor.Builder() + .name("sessionid.field") + .description("the name of the field containing the session id => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("sessionId") + .build(); + + public static final PropertyDescriptor ES_EVENT_INDEX_PREFIX_CONF = + new PropertyDescriptor.Builder() + .name(PROP_ES_EVENT_INDEX_PREFIX) + .description("Prefix of the index containing the web event documents.") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build(); + + public static final PropertyDescriptor ES_EVENT_INDEX_SUFFIX_FORMATTER_CONF = + new PropertyDescriptor.Builder() + .name(PROP_ES_EVENT_INDEX_SUFFIX_FORMATTER) + .description("suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .addValidator(StandardValidators.DATE_TIME_FORMATTER_VALIDATOR) + .build(); + + public static final PropertyDescriptor ES_EVENT_TYPE_NAME_CONF = + new PropertyDescriptor.Builder() + .name(PROP_ES_EVENT_TYPE_NAME) + .description("Name of the ES type of web event documents.") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build(); + + public static final PropertyDescriptor TIMESTAMP_FIELD_CONF = + new PropertyDescriptor.Builder() + .name("timestamp.field") + .description("the name of the field containing the timestamp => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("h2kTimestamp") + .build(); + + public static final PropertyDescriptor VISITED_PAGE_FIELD = + new PropertyDescriptor.Builder() + .name("visitedpage.field") + .description("the name of the field containing the visited page => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("location") + .build(); + + public static final PropertyDescriptor USER_ID_FIELD = + new PropertyDescriptor.Builder() + .name("userid.field") + .description("the name of the field containing the userId => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("userId") + .build(); + + public static final PropertyDescriptor FIELDS_TO_RETURN = + new PropertyDescriptor.Builder() + .name("fields.to.return") + .description("the list of fields to return") + .required(false) + .addValidator(StandardValidators.COMMA_SEPARATED_LIST_VALIDATOR) + .build(); + + public static final PropertyDescriptor FIRST_VISITED_PAGE_FIELD = + new PropertyDescriptor.Builder() + .name("firstVisitedPage.out.field") + .description("the name of the field containing the first visited page => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("firstVisitedPage") + .build(); + + public static final PropertyDescriptor LAST_VISITED_PAGE_FIELD = + new PropertyDescriptor.Builder() + .name("lastVisitedPage.out.field") + .description("the name of the field containing the last visited page => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("lastVisitedPage") + .build(); + + public static final PropertyDescriptor IS_SINGLE_PAGE_VISIT_FIELD = + new PropertyDescriptor.Builder() + .name("isSinglePageVisit.out.field") + .description("the name of the field stating whether the session is single page visit or not => will override default value if set") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("is_single_page_visit") + .build(); + + public static final PropertyDescriptor IS_SESSION_ACTIVE_FIELD = + new PropertyDescriptor.Builder() + .name("isSessionActive.out.field") + .description("the name of the field stating whether the session is active or not => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("is_sessionActive") + .build(); + + public static final PropertyDescriptor SESSION_DURATION_FIELD = + new PropertyDescriptor.Builder() + .name("sessionDuration.out.field") + .description("the name of the field containing the session duration => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("sessionDuration") + .build(); + + public static final PropertyDescriptor SESSION_INACTIVITY_DURATION_FIELD = + new PropertyDescriptor.Builder() + .name("sessionInactivityDuration.out.field") + .description("the name of the field containing the session inactivity duration => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("sessionInactivityDuration") + .build(); + + public static final PropertyDescriptor EVENTS_COUNTER_FIELD = + new PropertyDescriptor.Builder() + .name("eventsCounter.out.field") + .description("the name of the field containing the session duration => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("eventsCounter") + .build(); + + public static final PropertyDescriptor FIRST_EVENT_DATETIME_FIELD = + new PropertyDescriptor.Builder() + .name("firstEventDateTime.out.field") + .description("the name of the field containing the date of the first event => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("firstEventDateTime") + .build(); + + public static final PropertyDescriptor LAST_EVENT_DATETIME_FIELD = + new PropertyDescriptor.Builder() + .name("lastEventDateTime.out.field") + .description("the name of the field containing the date of the last event => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("lastEventDateTime") + .build(); + + public static final PropertyDescriptor NEW_SESSION_REASON_FIELD = + new PropertyDescriptor.Builder() + .name("newSessionReason.out.field") + .description("the name of the field containing the reason why a new session was created => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("reasonForNewSession") + .build(); + + public static final PropertyDescriptor TRANSACTION_IDS = + new PropertyDescriptor.Builder() + .name("transactionIds.out.field") + .description("the name of the field containing all transactionIds => will override default value if set") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("transactionIds") + .build(); + + protected static final String PROP_CACHE_SERVICE = "cache.service"; + + public static final PropertyDescriptor CONFIG_CACHE_SERVICE = new PropertyDescriptor.Builder() + .name(PROP_CACHE_SERVICE) + .description("The name of the cache service to use.") + .required(true) + .identifiesControllerService(CacheService.class) + .build(); + /** + * The source identified for the web session + */ + public static final String SOURCE_OF_TRAFFIC_FIELD_SOURCE = "source"; + + /** + * The medium identified for the web session + */ + public static final String SOURCE_OF_TRAFFIC_FIELD_MEDIUM = "medium"; + + /** + * The campaign identified for the web session + */ + public static final String SOURCE_OF_TRAFFIC_FIELD_CAMPAIGN = "campaign"; + + /** + * The content identified for the web session + */ + public static final String SOURCE_OF_TRAFFIC_FIELD_CONTENT = "content"; + + /** + * The term/keyword identified for the web session + */ + public static final String SOURCE_OF_TRAFFIC_FIELD_KEYWORD = "keyword"; + + protected static final String PROP_SOURCE_OF_TRAFFIC_PREFIX = "source_of_traffic.prefix"; + public static final String DEFAULT_SOURCE_OF_TRAFFIC_PREFIX = "source_of_traffic_"; + public static final String DIRECT_TRAFFIC = "direct"; + + public static final PropertyDescriptor SOURCE_OF_TRAFFIC_PREFIX_FIELD = + new PropertyDescriptor.Builder() + .name(PROP_SOURCE_OF_TRAFFIC_PREFIX) + .description("Prefix for the source of the traffic related fields") + .required(false) + .defaultValue(DEFAULT_SOURCE_OF_TRAFFIC_PREFIX) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build(); + + public static final PropertyDescriptor ZONEID_CONF = + new PropertyDescriptor.Builder() + .name(PROP_ES_INDEX_SUFFIX_TIMEZONE) + .description("The timezone to use to aprse timestamp into string date (for index names). See " + + PROP_ES_EVENT_INDEX_SUFFIX_FORMATTER + " and " + PROP_ES_SESSION_INDEX_SUFFIX_FORMATTER + + ". By default the system timezone is used. Supported by current system is : " + ZoneId.getAvailableZoneIds()) + .required(false) + .addValidator(StandardValidators.ZONE_ID_VALIDATOR) + .build(); + + public static final String defaultOutputFieldNameForEsIndex = "es_index"; + public static final PropertyDescriptor OUTPUT_FIELD_NAME_FOR_ES_INDEX = + new PropertyDescriptor.Builder() + .name("record.es.index.output.field.name") + .description("The field name where index name to store record will be stored") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue(defaultOutputFieldNameForEsIndex) + .build(); + + public static final String defaultOutputFieldNameForEsType = "es_type"; + public static final PropertyDescriptor OUTPUT_FIELD_NAME_FOR_ES_TYPE = + new PropertyDescriptor.Builder() + .name("record.es.type.output.field.name") + .description("The field name where type name to store record will be stored") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue(defaultOutputFieldNameForEsType) + .build(); + + public static final PropertyDescriptor NUMBER_OF_FUTURE_SESSION = + new PropertyDescriptor.Builder() + .name("number.of.future.session.when.event.from.past") + .description("The number of session it will look for when searching session of last events") + .required(false) + .addValidator(StandardValidators.POSITIVE_INTEGER_VALIDATOR) + .defaultValue("1") + .build(); + + public static final PropertyDescriptor PROCESSING_MODE = + new PropertyDescriptor.Builder() + .name("processing.mode") + .description("If fastMode is true the processor will not do refresh on es indices which will improve performance but\n" + + "The result may be not exact as we are not sure to query the events up to date.") + .expressionLanguageSupported(false) + .required(true) + .addValidator(new StandardValidators.EnumValidator(ProcessingMode.class)) + .allowableValues(ProcessingMode.values()) + .defaultValue(ProcessingMode.FAST.getName()) + .build(); + + public static final PropertyDescriptor ES_REFRESH_TIMEOUT = + new PropertyDescriptor.Builder() + .name("es.refresh.wait.time.ms") + .description("If fastMode is true the processor will not do refresh on es indices which will improve performance but\n" + + "The result may be not exact as we are not sure to query the events up to date.") + .expressionLanguageSupported(false) + .required(false) + .addValidator(StandardValidators.POSITIVE_LONG_VALIDATOR) + .defaultValue("100000") + .build(); + + public enum ProcessingMode { + + FAST, + MODERATE, + SLOW; + + public String toString() { + return name; + } + private String name; + + ProcessingMode() { + this.name = this.name(); + } + + public String getName() { + return name; + } + } + + /** + * A singleton for valid check. + */ + public final static SessionCheckResult DAY_OVERLAP = new InvalidSessionCheckResult("Day overlap"); + public final static SessionCheckResult SESSION_TIMEDOUT = new InvalidSessionCheckResult("Session timed-out"); + public final static SessionCheckResult SOURCE_OF_TRAFFIC = new InvalidSessionCheckResult("Source of traffic differed"); + + //services + private ElasticsearchClientService elasticsearchClientService; + private CacheService cacheService; + //sessions calcul + private long _SESSION_INACTIVITY_TIMEOUT_IN_SECONDS; + private Collection _FIELDS_TO_RETURN; + private Collection checkers; + //elasticsearch indices + private String _ES_SESSION_INDEX_PREFIX; + private DateTimeFormatter _ES_SESSION_INDEX_SUFFIX_FORMATTER; + private String _ES_SESSION_TYPE_NAME; + private String _ES_EVENT_INDEX_PREFIX; + private DateTimeFormatter _ES_EVENT_INDEX_SUFFIX_FORMATTER; + private String _ES_EVENT_TYPE_NAME; + //Tuning + private final long maxNumberOfEventForCurrentSessionRequested = 10000L; + //events and session model + private Event.InternalFields eventsInternalFields; + private WebSession.InternalFields sessionInternalFields; + private ZoneId zoneIdToUse; + private String outputFieldNameForEsIndex; + private String outputFieldNameForEsType; + private int numberOfFuturSessionToFetchWhenReceivingPastEvents; + + /** + * If fastMode is true the processor will not do refresh on es indices which will improve performance but + * The result may be unexact as we are not sure to query the event up to date. + */ + private ProcessingMode processingMode; + private long refreshTimeoutMs = 0L; + /** + * If {@code true} prints additional logs. + */ + public boolean _DEBUG = false; + private long rewindCounter = 0L; + + public long getNumberOfRewindForProcInstance() { + return rewindCounter; + } + + public void resetNumberOfRewindForProcInstance() { + rewindCounter = 0L; + } + + @Override + public List getSupportedPropertyDescriptors() { + return Collections.unmodifiableList(Arrays.asList( + DEBUG_CONF, + ES_SESSION_INDEX_PREFIX_CONF, + ES_SESSION_INDEX_SUFFIX_FORMATTER_CONF, + ES_SESSION_TYPE_NAME_CONF, + ES_EVENT_INDEX_PREFIX_CONF, + ES_EVENT_INDEX_SUFFIX_FORMATTER_CONF, + ES_EVENT_TYPE_NAME_CONF, + SESSION_ID_FIELD_CONF, + TIMESTAMP_FIELD_CONF, + VISITED_PAGE_FIELD, + USER_ID_FIELD, + FIELDS_TO_RETURN, + FIRST_VISITED_PAGE_FIELD, + LAST_VISITED_PAGE_FIELD, + IS_SINGLE_PAGE_VISIT_FIELD, + IS_SESSION_ACTIVE_FIELD, + SESSION_DURATION_FIELD, + SESSION_INACTIVITY_DURATION_FIELD, + SESSION_INACTIVITY_TIMEOUT_CONF, + EVENTS_COUNTER_FIELD, + FIRST_EVENT_DATETIME_FIELD, + LAST_EVENT_DATETIME_FIELD, + NEW_SESSION_REASON_FIELD, + TRANSACTION_IDS, + SOURCE_OF_TRAFFIC_PREFIX_FIELD, + // Service + ELASTICSEARCH_CLIENT_SERVICE_CONF, + CONFIG_CACHE_SERVICE, + ZONEID_CONF, + OUTPUT_FIELD_NAME_FOR_ES_INDEX, + OUTPUT_FIELD_NAME_FOR_ES_TYPE, + NUMBER_OF_FUTURE_SESSION, + PROCESSING_MODE, + ES_REFRESH_TIMEOUT + )); + } + + @Override + public boolean hasControllerService() + { + return true; + } + + @Override + public void init(final ProcessContext context) throws InitializationException + { + super.init(context); + this._DEBUG = context.getPropertyValue(DEBUG_CONF).asBoolean(); + this.elasticsearchClientService = PluginProxy.rewrap(context.getPropertyValue(ELASTICSEARCH_CLIENT_SERVICE_CONF) + .asControllerService()); + if (elasticsearchClientService == null) + { + getLogger().error("Elasticsearch client service is not initialized!"); + } + cacheService = PluginProxy.rewrap(context.getPropertyValue(CONFIG_CACHE_SERVICE).asControllerService()); + if (cacheService == null) { + getLogger().error("Cache service is not initialized!"); + } + this._SESSION_INACTIVITY_TIMEOUT_IN_SECONDS = context.getPropertyValue(SESSION_INACTIVITY_TIMEOUT_CONF).asLong(); + String _SESSION_ID_FIELD = context.getPropertyValue(SESSION_ID_FIELD_CONF).asString(); + String _TIMESTAMP_FIELD = context.getPropertyValue(TIMESTAMP_FIELD_CONF).asString(); + final String _VISITED_PAGE_FIELD = context.getPropertyValue(VISITED_PAGE_FIELD).asString(); + + final String fieldsToReturn = context.getPropertyValue(FIELDS_TO_RETURN).asString(); + if (fieldsToReturn != null && !fieldsToReturn.isEmpty()) { + this._FIELDS_TO_RETURN = Arrays.asList(fieldsToReturn.split(",")); + } else { + this._FIELDS_TO_RETURN = Collections.emptyList(); + } + + final String _USERID_FIELD = context.getPropertyValue(USER_ID_FIELD).asString(); + final String _FIRST_VISITED_PAGE_FIELD = context.getPropertyValue(FIRST_VISITED_PAGE_FIELD).asString(); + final String _LAST_VISITED_PAGE_FIELD = context.getPropertyValue(LAST_VISITED_PAGE_FIELD).asString(); + String _IS_SINGLE_PAGE_VISIT = context.getPropertyValue(IS_SINGLE_PAGE_VISIT_FIELD).asString(); + String _IS_SESSION_ACTIVE_FIELD = context.getPropertyValue(IS_SESSION_ACTIVE_FIELD).asString(); + String _SESSION_DURATION_FIELD = context.getPropertyValue(SESSION_DURATION_FIELD).asString(); + String _EVENTS_COUNTER_FIELD = context.getPropertyValue(EVENTS_COUNTER_FIELD).asString(); + final String _FIRST_EVENT_DATETIME_FIELD = context.getPropertyValue(FIRST_EVENT_DATETIME_FIELD).asString(); + final String _LAST_EVENT_DATETIME_FIELD = context.getPropertyValue(LAST_EVENT_DATETIME_FIELD).asString(); + String _SESSION_INACTIVITY_DURATION_FIELD = context.getPropertyValue(SESSION_INACTIVITY_DURATION_FIELD) + .asString(); + final String _NEW_SESSION_REASON_FIELD = context.getPropertyValue(NEW_SESSION_REASON_FIELD).asString(); + final String _TRANSACTION_IDS = context.getPropertyValue(TRANSACTION_IDS).asString(); + + final String sotPrefix = context.getPropertyValue(SOURCE_OF_TRAFFIC_PREFIX_FIELD).asString(); + + final String _SOT_SOURCE_FIELD = sotPrefix + SOURCE_OF_TRAFFIC_FIELD_SOURCE; + final String _SOT_CAMPAIGN_FIELD = sotPrefix + SOURCE_OF_TRAFFIC_FIELD_CAMPAIGN; + final String _SOT_MEDIUM_FIELD = sotPrefix + SOURCE_OF_TRAFFIC_FIELD_MEDIUM; + final String _SOT_CONTENT_FIELD = sotPrefix + SOURCE_OF_TRAFFIC_FIELD_CONTENT; + final String _SOT_KEYWORD_FIELD = sotPrefix + SOURCE_OF_TRAFFIC_FIELD_KEYWORD; + + //Sessions indices + this._ES_SESSION_INDEX_PREFIX = context.getPropertyValue(ES_SESSION_INDEX_PREFIX_CONF).asString(); + Objects.requireNonNull(this._ES_SESSION_INDEX_PREFIX, "Property required: " + ES_SESSION_INDEX_PREFIX_CONF); + this._ES_SESSION_INDEX_SUFFIX_FORMATTER = DateTimeFormatter.ofPattern( + context.getPropertyValue(ES_SESSION_INDEX_SUFFIX_FORMATTER_CONF).asString() + ); + Objects.requireNonNull(this._ES_SESSION_INDEX_SUFFIX_FORMATTER, "Property required: " + ES_SESSION_INDEX_SUFFIX_FORMATTER_CONF); + this._ES_SESSION_TYPE_NAME = context.getPropertyValue(ES_SESSION_TYPE_NAME_CONF).asString(); + Objects.requireNonNull(this._ES_SESSION_TYPE_NAME, "Property required: " + ES_SESSION_TYPE_NAME_CONF); + //Events indices + this._ES_EVENT_INDEX_PREFIX = context.getPropertyValue(ES_EVENT_INDEX_PREFIX_CONF).asString(); + Objects.requireNonNull(this._ES_EVENT_INDEX_PREFIX, "Property required: " + ES_EVENT_INDEX_PREFIX_CONF); + this._ES_EVENT_INDEX_SUFFIX_FORMATTER = DateTimeFormatter.ofPattern( + context.getPropertyValue(ES_EVENT_INDEX_SUFFIX_FORMATTER_CONF).asString() + ); + Objects.requireNonNull(this._ES_EVENT_INDEX_SUFFIX_FORMATTER, "Property required: " + ES_EVENT_INDEX_SUFFIX_FORMATTER_CONF); + this._ES_EVENT_TYPE_NAME = context.getPropertyValue(ES_EVENT_TYPE_NAME_CONF).asString(); + Objects.requireNonNull(this._ES_EVENT_TYPE_NAME, "Property required: " + ES_EVENT_TYPE_NAME_CONF); + + this.outputFieldNameForEsIndex = context.getPropertyValue(OUTPUT_FIELD_NAME_FOR_ES_INDEX).asString(); + this.outputFieldNameForEsType = context.getPropertyValue(OUTPUT_FIELD_NAME_FOR_ES_TYPE).asString(); + + this.numberOfFuturSessionToFetchWhenReceivingPastEvents = context.getPropertyValue(NUMBER_OF_FUTURE_SESSION).asInteger(); + + this.eventsInternalFields = new Event.InternalFields() + .setSessionIdField(_SESSION_ID_FIELD) + .setTimestampField(_TIMESTAMP_FIELD) + .setVisitedPageField(_VISITED_PAGE_FIELD) + .setSourceOffTrafficCampaignField(_SOT_CAMPAIGN_FIELD) + .setSourceOffTrafficContentField(_SOT_CONTENT_FIELD) + .setSourceOffTrafficKeyWordField(_SOT_KEYWORD_FIELD) + .setSourceOffTrafficMediumField(_SOT_MEDIUM_FIELD) + .setSourceOffTrafficSourceField(_SOT_SOURCE_FIELD) + .setNewSessionReasonField(_NEW_SESSION_REASON_FIELD) + .setUserIdField(_USERID_FIELD) + .setOriginalSessionIdField("originalSessionId") + .setTransactionIdField("transactionId") + .setTransactionIdsField("transactionIds"); + + this.sessionInternalFields = new WebSession.InternalFields() + .setSessionIdField(_SESSION_ID_FIELD) + .setTimestampField(_TIMESTAMP_FIELD) + .setSourceOffTrafficCampaignField(_SOT_CAMPAIGN_FIELD) + .setSourceOffTrafficContentField(_SOT_CONTENT_FIELD) + .setSourceOffTrafficKeyWordField(_SOT_KEYWORD_FIELD) + .setSourceOffTrafficMediumField(_SOT_MEDIUM_FIELD) + .setSourceOffTrafficSourceField(_SOT_SOURCE_FIELD) + .setIsSessionActiveField(_IS_SESSION_ACTIVE_FIELD) + .setSessionDurationField(_SESSION_DURATION_FIELD) + .setSessionInactivityDurationField(_SESSION_INACTIVITY_DURATION_FIELD) + .setEventsCounterField(_EVENTS_COUNTER_FIELD) + .setFirstEventDateTimeField(_FIRST_EVENT_DATETIME_FIELD) + .setFirstEventEpochSecondsField(_FIRST_EVENT_EPOCH_SECONDS_FIELD) + .setFirstVisitedPageField(_FIRST_VISITED_PAGE_FIELD) + .setLastEventDateTimeField(_LAST_EVENT_DATETIME_FIELD) + .setLastEventEpochSecondsField(_LAST_EVENT_EPOCH_SECONDS_FIELD) + .setLastVisitedPageField(_LAST_VISITED_PAGE_FIELD) + .setTransactionIdsField(_TRANSACTION_IDS) + .setUserIdField(_USERID_FIELD) + .setIsSinglePageVisit(_IS_SINGLE_PAGE_VISIT); + + this.zoneIdToUse = ZoneId.systemDefault(); + if (context.getPropertyValue(ZONEID_CONF).isSet()) { + this.zoneIdToUse = ZoneId.of(context.getPropertyValue(ZONEID_CONF).asString()); + } + this.processingMode = ProcessingMode.valueOf(context.getPropertyValue(PROCESSING_MODE).asString()); + this.refreshTimeoutMs = context.getPropertyValue(ES_REFRESH_TIMEOUT).asLong(); + this.checkers = Arrays.asList( + // Day overlap + (session, event) -> + { + final ZonedDateTime firstEvent = session.getFirstEvent(); + final ZonedDateTime lastEvent = session.getLastEvent(); + + final ZonedDateTime timestamp = event.getTimestamp(); + + boolean isValid = firstEvent.getDayOfYear() == timestamp.getDayOfYear() + && lastEvent.getDayOfYear() == timestamp.getDayOfYear() + && firstEvent.getYear() == timestamp.getYear() + && lastEvent.getYear() == timestamp.getYear(); + + if (_DEBUG && !isValid) { + debug("Invalid Session Check: 'Day overlap' isValid=" + isValid + " session-id=" + session.getSessionId() + + " firstEvent=" + firstEvent.format(DateTimeFormatter.ISO_ORDINAL_DATE) + + " event=" + timestamp.format(DateTimeFormatter.ISO_ORDINAL_DATE) + + " lastEvent=" + lastEvent.format(DateTimeFormatter.ISO_ORDINAL_DATE)); + } + + return isValid ? ValidSessionCheckResult.getInstance() : DAY_OVERLAP; + }, + + // Timeout exceeded + (session, event) -> + { + final long durationInSeconds = Duration.between(session.getLastEvent(), event.getTimestamp()) + .getSeconds(); + boolean isValid = durationInSeconds <= this._SESSION_INACTIVITY_TIMEOUT_IN_SECONDS; + + if (_DEBUG && !isValid) { + debug("Invalid Session Check: 'Timeout exceeded' isValid=" + isValid + " seconds=" + durationInSeconds + + " timeout=" + this._SESSION_INACTIVITY_TIMEOUT_IN_SECONDS + " session-id=" + session.getSessionId()); + } + + return isValid ? ValidSessionCheckResult.getInstance() : SESSION_TIMEDOUT; + }, + + // One Campaign Per Session—Each visit to your site from a different campaign—organic or paid—triggers a + // new session, regardless of the actual time elapsed in the current session. + (session, event) -> + { + boolean isValid = Objects.equals(event.getValue(_SOT_SOURCE_FIELD), DIRECT_TRAFFIC) || + Objects.deepEquals(session.getSourceOfTraffic(), event.getSourceOfTraffic()); + + if (_DEBUG && !isValid) { + debug("Invalid Session Check: 'Fields of traffic' isValid=" + isValid + " session-id=" + session.getSessionId()); + } + + return isValid ? ValidSessionCheckResult.getInstance() : SOURCE_OF_TRAFFIC; + }); + } + + /** + * Processes the incoming records and returns their result. + * + * @param records the records to process. + * @return the result of the processing of the incoming records. + * @throws ProcessException if something went wrong. + */ + @Override + public Collection process(final ProcessContext context, + final Collection records) + throws ProcessException + { + return processRecords(records); + } + + public Collection processRecords(final Collection records) { + if (records == null || records.isEmpty()) return new ArrayList<>(); + final Collection groupOfEvents = toWebEvents(records); + final Collection inputDivolteSessions = groupOfEvents.stream() + .map(Events::getOriginalSessionId) + .collect(Collectors.toList()); + final Map> lastSessionMapping = getMapping(inputDivolteSessions); + + //This method may update lastSessionMapping to current session (only the name will be used) when rewind is detected ! + SplittedEvents splittedEvents = handleRewindAndGetAllNeededEvents(groupOfEvents, lastSessionMapping); + + final Collection allEvents = splittedEvents.getAllEvents().collect(Collectors.toList()); + final Collection calculatedSessions = computeSessions(lastSessionMapping, splittedEvents, allEvents); + + updateCacheWithLastSessions(calculatedSessions); + return addEsIndexInfoAndConcatOutput(allEvents, calculatedSessions); + } + + public Collection computeSessions(Map> lastSessionMapping, SplittedEvents splittedEvents, Collection allEvents) { + final Collection calculatedSessions; + if (splittedEvents.isThereEventsFromPast()) { + Set sessionsInRewind = splittedEvents.getDivolteSessionsWithEventsFromPast(); + calculatedSessions = this.processEvents(allEvents, lastSessionMapping, sessionsInRewind); + } else { + calculatedSessions = this.processEvents(allEvents, lastSessionMapping); + } + return calculatedSessions; + } + + public void updateCacheWithLastSessions(Collection calculatedSessions) { + calculatedSessions + .forEach(sessionsCalculator -> { + String divolteSession = sessionsCalculator.getDivolteSessionId(); + WebSession lastSession = sessionsCalculator.getCalculatedSessions().stream() + .filter(session -> session.getSessionId().equals(sessionsCalculator.getLastSessionId())) + .findFirst().get(); + cacheService.set(divolteSession, lastSession); + }); + } + + private List addEsIndexInfoAndConcatOutput(Collection allEvents, + Collection calculatedSessions) { + List outputEvents = allEvents + .stream() + .flatMap(events -> events.getAll().stream()) + .map(event -> { + Record record = event.getRecord(); + record.setStringField(outputFieldNameForEsIndex, toEventIndexName(event.getTimestamp())); + record.setStringField(outputFieldNameForEsType, _ES_EVENT_TYPE_NAME); + return record; + }) + .collect(Collectors.toList()); + + final Collection flattenedSessions = calculatedSessions.stream() + .flatMap(sessionsCalculator -> sessionsCalculator.getCalculatedSessions().stream()) + .collect(Collectors.toList()); + debug("Processing done. Outcoming records size=%d ", flattenedSessions.size()); + List outputSessions = flattenedSessions.stream() + .map(session -> { + Record record = session.getRecord(); + record.setStringField(outputFieldNameForEsIndex, toSessionIndexName(session.getFirstEvent())); + record.setStringField(outputFieldNameForEsType, _ES_SESSION_TYPE_NAME); + return record; + }) + .collect(Collectors.toList()); + + return Stream.concat( + outputEvents.stream(), + outputSessions.stream() + ).collect(Collectors.toList()); + } + + private SplittedEvents handleRewindAndGetAllNeededEvents(final Collection groupOfEvents, + final Map> lastSessionMapping) { + + final SplittedEvents splittedEvents = getSplittedEvents(groupOfEvents, lastSessionMapping); + final Collection eventsFromPast = splittedEvents.getEventsfromPast(); + if (eventsFromPast.isEmpty()) { + return splittedEvents; + } + rewindCounter++;//may wish to only do this on a MockProcessor extending this processor +// deleteFuturSessions(eventsFromPast);//TODO remove deletion of future sessions ? + Collection eventsFromEs = getNeededEventsFromEs(splittedEvents, lastSessionMapping); + Map> eventsFromEsByDivolteSessionId = eventsFromEs + .stream() + .collect(Collectors.groupingBy(Event::getOriginalSessionIdOrSessionId)); + //merge those events into the lists + for (Events events : eventsFromPast) { + List eventsFromEsForSession = eventsFromEsByDivolteSessionId.getOrDefault(events.getOriginalSessionId(), Collections.emptyList()); + events.addAll(eventsFromEsForSession);//les events deja presents sont prioritaire. Si meme id. + } + return splittedEvents; + } + + /** + * For all Events, find current session of the first event (from ES). + * Then Find all events from this session that are before or at the same time than the first event in input. + * Return those events. + * @param splittedEvents + * @return + */ + private Collection getNeededEventsFromEs(final SplittedEvents splittedEvents, + final Map> lastSessionMapping) { + + /* + Pour chaque events trouver les evènements de la session en cour nécessaire. + C'est à dire requêter tous les events de la sessionId et timestamp <= firstEventTs(input events) + Il faut aussi récupérer tous les events de la sessionId et timestamp >= lastEventTs(input events) Attention tout les events pas que du passé + */ + //TODO in order to this to work we need to get all events in es from Tmin to Tmax plus eventSessionTimin eventSessionTmax + //la on merge seulement dans events from past + //get all events but only for events containing elements from the past + final Collection allEvents = splittedEvents.getAllEventsThatContainsEventsFromPast().collect(Collectors.toList()); + final Set divoltSessionIds = allEvents.stream().map(Events::getOriginalSessionId).collect(Collectors.toSet()); + switch (processingMode) { + case FAST: + break; + case SLOW: + try {//TODO find another solution + getLogger().trace("waiting 600ms"); + Thread.sleep(600L);//Unfortunately without this some test randomly fails. It seems that session indices are not properly refreshed.. + } catch (InterruptedException e) { + getLogger().error("error while waiting 600ms", e); + } + case MODERATE: + this.elasticsearchClientService.waitUntilCollectionIsReadyAndRefreshIfAnyPendingTasks(_ES_SESSION_INDEX_PREFIX + "*", refreshTimeoutMs); + } + final Map> sessionsOfFirstEvents = requestCurrentSessionsToEs(allEvents); + divoltSessionIds.forEach(divoltSessionId -> { + if (!sessionsOfFirstEvents.containsKey(divoltSessionId)) { + //Sinon l'event est avant tout les autres events dans ES donc on recommence à la première session... + sessionsOfFirstEvents.put(divoltSessionId, Optional.empty()); + } + }); + final Map> sessionsOfLastEvents = requestSessionsOfLastEventToEs(allEvents); + divoltSessionIds.forEach(divoltSessionId -> { + if (!sessionsOfLastEvents.containsKey(divoltSessionId)) { + //Sinon l'event est après tout les autres events dans ES donc on va de toute manière tous les récupérer... + sessionsOfLastEvents.put(divoltSessionId, Collections.emptySet()); + } + }); + uptadateLastSessionsMapping(lastSessionMapping, sessionsOfFirstEvents); + resetCacheWithSessions(sessionsOfFirstEvents);//TODO is this necessary ? as cache is updated at end of process and used only at start of process... + Collection eventsToQueryInfo = buildEventsRange(allEvents, + sessionsOfFirstEvents, + sessionsOfLastEvents); + Collection neededEventsFromEs = requestEventsFromSessionsToEs(eventsToQueryInfo); + return neededEventsFromEs; + } + + private Collection buildEventsRange(Collection events, + final Map> sessionsOfFirstEvents, + final Map> sessionsOfLastEvents) { + return events.stream() + .map(eventsForDivoltSession -> { + return buildEventsRangefromEvents(eventsForDivoltSession, + sessionsOfFirstEvents, + sessionsOfLastEvents); + }) + .collect(Collectors.toList()); + } + + public EventsToQueryInfo buildEventsRangefromEvents(Events events, + Map> sessionsOfFirstEvents, + Map> sessionsOfLastEvents) { + final long min = events.first().getEpochTimeStampMilli(); + final long max = events.last().getEpochTimeStampMilli(); + final String divoltSession = events.getOriginalSessionId();//This is divolteSessionId car viens de l'input et pas d'ES + final Optional firstSession = sessionsOfFirstEvents.get(divoltSession) + .map(WebSession::getSessionId); + final Set lastSessions = sessionsOfLastEvents.get(divoltSession).stream() + .map(WebSession::getSessionId) + .collect(Collectors.toSet()); + List indicesToQuery = events.getAll().stream() + .map(event -> { + return toEventIndexName(event.getTimestamp()); + }) + .distinct() + .collect(Collectors.toList()); + return new EventsToQueryInfo(divoltSession, firstSession, lastSessions, min, max, indicesToQuery); + } + + private static class EventsToQueryInfo { + + public final List indicesToQuery; + public final String divoltSession; + public final Optional currentSession; + public final Set lastSessions; + public final long min; + public final long max; + + public EventsToQueryInfo(String divoltSession, + Optional currentSession, + Set lastSessions, + long min, + long max, + List indicesToQuery) { + this.divoltSession = divoltSession; + this.currentSession = currentSession; + this.lastSessions = lastSessions; + this.min = min; + this.max = max; + this.indicesToQuery = indicesToQuery; + } + + + } + + /** + * update lastSessionMapping with currentSessionsOfEvents values + * @param lastSessionMapping + * @param currentSessionsOfEvents + */ + private void uptadateLastSessionsMapping(Map> lastSessionMapping, + Map> currentSessionsOfEvents) { + currentSessionsOfEvents.forEach(lastSessionMapping::put); + } + + private void resetCacheWithSessions(Map> currentSessionsOfEvents) { + currentSessionsOfEvents.forEach((divolteSessions, session) -> this.cacheService.set(divolteSessions, session.orElse(null))); + } + + +// private Collection requestEventsFromSessionsToEs(Collection currentSessionsOfEvents, +// Map divoltSessionToFirstEvent) { +// MultiQueryResponseRecord eventsRsp = getMissingEventsForSessionsFromEs(currentSessionsOfEvents, divoltSessionToFirstEvent); +// return convertEsRToEvents(eventsRsp); +// } + + private Collection requestEventsFromSessionsToEs(Collection eventsToQuery) { + MultiQueryResponseRecord eventsRsp = getMissingEventsForSessionsFromEs(eventsToQuery); + return convertEsRToEvents(eventsRsp); + } + + + private Collection convertEsRToEvents(MultiQueryResponseRecord eventsRsp) { + final List events = new ArrayList<>(); + eventsRsp.getResponses().forEach(rsp -> { + if (rsp.getTotalMatched() > maxNumberOfEventForCurrentSessionRequested) { + Event firstEvent = mapToEvent(rsp.getDocs().get(0).getRetrievedFields()); + String errorMsg = "A query to search events for current session exceeds " + maxNumberOfEventForCurrentSessionRequested + + " events ! either increases maximum expected either verify if this sessions '" + + firstEvent.getSessionId() +"' has really this much of events !"; + getLogger().error(errorMsg); + throw new IllegalStateException(errorMsg); + } + rsp.getDocs().stream().forEach(rspRecord -> { + events.add(mapToEvent(rspRecord.getRetrievedFields())); + }); + }); + return events; + } + +/* + GET webenvent_index_prefix/_search + { + "query": { + "bool": { + "should": [ + { + "term": { + "sessionId.raw": { + "value": "" + } + } + }, + { + "bool": { + "must": [ + { + "wildcard": { + "sessionId.raw": { + "value": "*" + } + } + },{ + "range": { + "h2kTimestamp": { + "lte": Tmax, + "gte": Tmin + } + } + } + ] + } + }, + { + "bool": { + "should": [ + { + "term": { + "sessionId.raw": { + "value": "" + } + } + }, + ... + { + "term": { + "sessionId.raw": { + "value": "" + } + } + } + ] + } + } + ] + } + }, + "size": 10000 + } +*/ + private MultiQueryResponseRecord getMissingEventsForSessionsFromEs(Collection eventsToQuery) { + final List queries = new ArrayList<>(); + eventsToQuery.forEach(info -> { + BoolQueryRecordRoot boolQueryForAllEventsFromMinToMax = new BoolQueryRecordRoot() + .addBoolQuery( + new WildCardQueryRecord(eventsInternalFields.getSessionIdField() + ".raw", info.divoltSession + "*"), + BoolCondition.MUST + ).addBoolQuery( + new RangeQueryRecord(eventsInternalFields.getTimestampField()) + .setFrom(info.min) + .setTo(info.max) + .setIncludeUpper(true) + .setIncludeLower(true), + BoolCondition.MUST + ); + QueryRecord query = new QueryRecord() + .addCollections(info.indicesToQuery) + .addType(_ES_EVENT_TYPE_NAME) + .addBoolQuery(boolQueryForAllEventsFromMinToMax, BoolCondition.SHOULD)//or this + .size(10000); + info.currentSession.ifPresent(session -> { + BoolQueryRecordRoot boolQueryForEventsOfFirstSession = new BoolQueryRecordRoot() + .addBoolQuery( + new TermQueryRecord(eventsInternalFields.getSessionIdField() + ".raw", session), + BoolCondition.MUST + ); + query.addBoolQuery(boolQueryForEventsOfFirstSession, BoolCondition.SHOULD); + }); + if (!info.lastSessions.isEmpty()) { + final BoolQueryRecordRoot boolQueryForEventsOfLastSession = new BoolQueryRecordRoot(); + info.lastSessions.forEach(session -> { + boolQueryForEventsOfLastSession.addBoolQuery( + new TermQueryRecord(eventsInternalFields.getSessionIdField() + ".raw", session), + BoolCondition.SHOULD + ); + }); + query.addBoolQuery(boolQueryForEventsOfLastSession, BoolCondition.SHOULD); + } + queries.add(query); + }); + MultiQueryRecord multiQuery = new MultiQueryRecord(queries); + String[] indicesToWaitFor = eventsToQuery.stream() + .flatMap(info -> { + return info.indicesToQuery.stream(); + }) + .toArray(String[]::new); + switch (processingMode) { + case FAST: + break; + case SLOW: + case MODERATE: + this.elasticsearchClientService.waitUntilCollectionIsReadyAndRefreshIfAnyPendingTasks(indicesToWaitFor, refreshTimeoutMs); + } + return elasticsearchClientService.multiQueryGet(multiQuery); + } + + private Map> requestCurrentSessionsToEs(Collection events) { + MultiQueryResponseRecord sessionEsRsp = requestSessionsOfFirstEvent(events); + return checkAndTransformToCurrentSessionMap(sessionEsRsp); + } + + private Map> requestSessionsOfLastEventToEs(Collection events) { + MultiQueryResponseRecord sessionEsRsp = requestSessionsOfLastEvent(events); + return checkAndTransformToLastSessionMap(sessionEsRsp); + } + /** + * ensure there is only one response by query and return as map with divolte session as key. + * @param sessionEsRsp + * @return + */ + private Map> checkAndTransformToCurrentSessionMap(MultiQueryResponseRecord sessionEsRsp) { + final Map> sessionMap = new HashMap<>(); + for (QueryResponseRecord rsp : sessionEsRsp.getResponses()) { + if (rsp.getTotalMatched() >= 1) { + WebSession currentSession = mapToSession(rsp.getDocs().get(0).getRetrievedFields()); + sessionMap.put(currentSession.getOriginalSessionId(), Optional.of(currentSession)); + } + } + return sessionMap; + } + + private Map> checkAndTransformToLastSessionMap(MultiQueryResponseRecord sessionEsRsp) { + final Map> sessionMap = new HashMap<>(); + for (QueryResponseRecord rsp : sessionEsRsp.getResponses()) { + if (rsp.getTotalMatched() >= 1) { + Set sessions = rsp.getDocs().stream() + .map(ResponseRecord::getRetrievedFields) + .map(this::mapToSession) + .collect(Collectors.toSet()); + sessionMap.put(sessions.stream().findFirst().get().getOriginalSessionId(), sessions); + } + } + return sessionMap; + } + + // GET new_openanalytics_websessions-*/_search +//{ +// "query": { +// "bool": { +// "must": [ +// { +// "wildcard": { +// "sessionId.raw": { +// "value": "*" +// } +// } +// }, +// { +// "range": { +// "firstEventEpochSeconds": { +// "lte": TmaxEvent +// } +// } +// } +// ] +// }, +// "sort": [ +// { +// "firstEventEpochSeconds": { +// "order": "desc" +// } +// } +// ], +// "size": 1 +//} + + /** + * find current session OR closer > + * @param events + * @return + */ + private MultiQueryResponseRecord requestSessionsOfFirstEvent(Collection events) { + final List queries = new ArrayList<>(); + events.stream().forEach(eventsForDivoltSession -> { + String divolteSession = eventsForDivoltSession.getOriginalSessionId(); + long epochSecondLastEvent = eventsForDivoltSession.first().getEpochTimeStampSeconds(); + QueryRecord query = new QueryRecord() + .addCollection(_ES_SESSION_INDEX_PREFIX + "*") + .addType(_ES_SESSION_TYPE_NAME) + .addBoolQuery( + new WildCardQueryRecord(sessionInternalFields.getSessionIdField() + ".raw", divolteSession + "*"), + BoolCondition.MUST + ) + .addBoolQuery( + new RangeQueryRecord(_FIRST_EVENT_EPOCH_SECONDS_FIELD) + .setTo(epochSecondLastEvent) + .setIncludeUpper(true), + BoolCondition.MUST + ) + .addSortQuery( + new SortQueryRecord(_FIRST_EVENT_EPOCH_SECONDS_FIELD, SortOrder.DESC) + ) + .size(1); + queries.add(query); + }); + MultiQueryRecord multiQuery = new MultiQueryRecord(queries); + MultiQueryResponseRecord rsp = elasticsearchClientService.multiQueryGet(multiQuery); + return rsp; + } + +//GET new_openanalytics_websessions-*/_search +//{ +// "query": { +// "bool": { +// "must": [ +// { +// "wildcard": { +// "sessionId.raw": { +// "value": "*" +// } +// } +// }, +// { +// "range": { +// "lastEventEpochSeconds": { +// "gte": TmaxEvent +// } +// } +// } +// ] +// }, +// "sort": [ +// { +// "lastEventEpochSeconds": { +// "order": "asc" +// } +// } +// ], +// "size": numberOfFuturSessionToFetchWhenReceivingPastEvents +//} + /** + * request current session or closer > + * @param events + * @return + */ + private MultiQueryResponseRecord requestSessionsOfLastEvent(Collection events) { + final List queries = new ArrayList<>(); + events.stream().forEach(eventsForDivoltSession -> { + String divolteSession = eventsForDivoltSession.getOriginalSessionId(); + long epochSecondLastEvent = eventsForDivoltSession.last().getEpochTimeStampSeconds(); + QueryRecord query = new QueryRecord() + .addCollection(_ES_SESSION_INDEX_PREFIX + "*") + .addType(_ES_SESSION_TYPE_NAME) + .addBoolQuery( + new WildCardQueryRecord(sessionInternalFields.getSessionIdField() + ".raw", divolteSession + "*"), + BoolCondition.MUST + ) + .addBoolQuery( + new RangeQueryRecord(_LAST_EVENT_EPOCH_SECONDS_FIELD) + .setFrom(epochSecondLastEvent) + .setIncludeLower(true), + BoolCondition.MUST + ) + .addSortQuery( + new SortQueryRecord(_LAST_EVENT_EPOCH_SECONDS_FIELD, SortOrder.ASC) + ) + .size(numberOfFuturSessionToFetchWhenReceivingPastEvents); + queries.add(query); + }); + MultiQueryRecord multiQuery = new MultiQueryRecord(queries); + MultiQueryResponseRecord rsp = elasticsearchClientService.multiQueryGet(multiQuery); + return rsp; + } + + private SplittedEvents getSplittedEvents(Collection groupOfEvents, + Map> lastSessionMapping) { + final Collection eventsFromPast = new ArrayList<>(); + final Collection eventsOk = new ArrayList<>(); + for (Events events : groupOfEvents) { + Optional lastSession = lastSessionMapping.get(events.getOriginalSessionId()); + if (lastSession.isPresent() && + lastSession.get().timestampFromPast(events.first().getTimestamp())) { + eventsFromPast.add(events); + } else { + eventsOk.add(events); + } + } + return new SplittedEvents(eventsOk, eventsFromPast); + } + + /** + * Filter out record without sessionId or timestamp + * Returns the provided remaining records as a collection of Events instances. + * + * Provided records are grouped by session identifier so that each Events contains all events from a specific sessionId. + * + * @param records a collection of records representing web-events. + * @return the provided records as a collection of Events instances. + */ + private Collection toWebEvents(final Collection records) { + // Create webEvents from input records. + // A webEvents contains all webEvent instances of its session id. + final Collection result = + records.stream() + // Remove record without session Id or timestamp. + .filter(record -> isFieldAssigned(record.getField(eventsInternalFields.getSessionIdField())) + && isFieldAssigned(record.getField(eventsInternalFields.getTimestampField()))) + // Create web-event from record. + .map(record -> new Event(record, this.eventsInternalFields)) + // Group records per session Id. + .collect(Collectors.groupingBy(Event::getSessionId)) + // Ignore keys (sessionId) and stream over list of associated events. + .values() + .stream() + // Wrapped grouped web-events of sessionId in WebEvents. + .map(Events::new) + .collect(Collectors.toList()); + + return result; + } + + /** + * Returns the name of the event index corresponding to the specified date such as + * ${event-index-name}.${event-suffix}. + * Eg. openanalytics-webevents.2018.01.31 + * + * @param date the ZonedDateTime of the event to store in the index. + * @return the name of the event index corresponding to the specified date. + */ + public String toEventIndexName(final ZonedDateTime date) { + return Utils.buildIndexName(_ES_EVENT_INDEX_PREFIX, _ES_EVENT_INDEX_SUFFIX_FORMATTER, date, zoneIdToUse); + } + + /** + * Returns the name of the event index corresponding to the specified date such as + * ${session-index-name}${session-suffix}. + * Eg. openanalytics-webevents.2018.01.31 + * + * @param date the ZonedDateTime timestamp of the first event of the session. + * @return the name of the session index corresponding to the specified timestamp. + */ + public String toSessionIndexName(final ZonedDateTime date) { + return Utils.buildIndexName(_ES_SESSION_INDEX_PREFIX, _ES_SESSION_INDEX_SUFFIX_FORMATTER, date, zoneIdToUse); + } + + /** + * Processes the provided events and returns their resulting sessions. + * All sessions are retrieved from the cache or elasticsearch and then updated with the specified web events. + * One serie of events may result into multiple sessions. + * + * @param webEvents the web events from a same session to process. + * @return web sessions resulting of the processing of the web events. + */ + private Collection processEvents(final Collection webEvents, + final Map> lastSessionMapping, + final Set sessionsInRewind) { + // Applies all events to session documents and collect results. + return webEvents.stream() + .map(events -> { + String divolteSession = events.getOriginalSessionId(); + SessionsCalculator sessionCalc = new SessionsCalculator(checkers, + _SESSION_INACTIVITY_TIMEOUT_IN_SECONDS, + sessionInternalFields, + eventsInternalFields, + _FIELDS_TO_RETURN, + divolteSession); + if (lastSessionMapping.get(divolteSession).isPresent()) { + boolean isRewind = sessionsInRewind.contains(divolteSession); + if (isRewind) {//only keep sessionId but not counters etc because we will recompute the whole session + return sessionCalc.processEvents(events, lastSessionMapping.get(divolteSession).get().getSessionId()); + } else { + return sessionCalc.processEventsKnowingLastSession(events, lastSessionMapping.get(divolteSession).get()); + } + } else { + return sessionCalc.processEventsKnowingLastSession(events, null); + } + }) + .collect(Collectors.toList()); + } + + /** + * Processes the provided events and returns their resulting sessions. + * All sessions are retrieved from the cache or elasticsearch and then updated with the specified web events. + * One serie of events may result into multiple sessions. + * + * @param webEvents the web events from a same session to process. + * @return web sessions resulting of the processing of the web events. + */ + private Collection processEvents(final Collection webEvents, + final Map> lastSessionMapping) { + // Applies all events to session documents and collect results. + return webEvents.stream() + .map(events -> { + String divolteSession = events.getOriginalSessionId(); + SessionsCalculator sessionsCalculator = new SessionsCalculator(checkers, + _SESSION_INACTIVITY_TIMEOUT_IN_SECONDS, + sessionInternalFields, + eventsInternalFields, + _FIELDS_TO_RETURN, + divolteSession); +// if (lastSessionMapping.get(divolteSession).isPresent()) { + return sessionsCalculator.processEventsKnowingLastSession(events, lastSessionMapping.get(events.getOriginalSessionId()).orElse(null)); +// } else { +// return sessionsCalculator.processEventsKnowingLastSession(events, null); +// } + }) + .collect(Collectors.toList()); + } + +// GET new_openanalytics_websessions-*/_search +//{ +// "query": { +// "wildcard": { +// "sessionId.raw": { +// "value": "*" +// } +// } +//}, +// "sort": [ +// { +// "h2kTimestamp": { +// "order": "desc" +// } +// } +// ], +// "size": 1 +//} + /** + * query all last hurence session for each divolte session in ES if it is not already present in cache. + * THen fill up cache with new data, finally return the mapping[divolte_session,last_hurence_session] + * + * if a last session is found it is filled with [divolte_session,last_hurence_session] + * If there is no session found it is filled with [divolte_session,Optional.empty] + * @param divolteSessions + * @return + */ + private Map/*lastHurenceSession*/> getMapping(final Collection divolteSessions) { + final Map> mappingToReturn = new HashMap<>(); + final List sessionsRequests = new ArrayList<>(); + divolteSessions.forEach(divoltSession -> { + WebSession cachedSession = cacheService.get(divoltSession); + if (cachedSession != null) { + mappingToReturn.put(divoltSession, Optional.of(cachedSession)); + } else { + QueryRecord request = new QueryRecord() + .addCollection(_ES_SESSION_INDEX_PREFIX + "*") + .addType(_ES_SESSION_TYPE_NAME) + .addBoolQuery( + new WildCardQueryRecord(sessionInternalFields.getSessionIdField() + ".raw", divoltSession + "*"), + BoolCondition.MUST + ) + .addSortQuery(new SortQueryRecord(sessionInternalFields.getTimestampField(), SortOrder.DESC)) + .size(1);//only need the last mapping + sessionsRequests.add(request); + } + }); + if (sessionsRequests.isEmpty()) return mappingToReturn; + switch (processingMode) { + case FAST: + break; + case SLOW: + case MODERATE: + this.elasticsearchClientService.waitUntilCollectionIsReadyAndRefreshIfAnyPendingTasks(_ES_SESSION_INDEX_PREFIX + "*", refreshTimeoutMs); + } + MultiQueryResponseRecord multiQueryResponses = this.elasticsearchClientService.multiQueryGet( + new MultiQueryRecord(sessionsRequests) + ); + Map sessionsFromEs = transformIntoWebSessions(multiQueryResponses); + + divolteSessions.forEach(divoltSession -> { + if (!mappingToReturn.containsKey(divoltSession)) { + if (!sessionsFromEs.containsKey(divoltSession)) { + mappingToReturn.put(divoltSession, Optional.empty()); + } else { + WebSession lastSessionInEs = sessionsFromEs.get(divoltSession); + cacheService.set(divoltSession, lastSessionInEs); + mappingToReturn.put(divoltSession, Optional.of(lastSessionInEs)); + } + } + }); + return mappingToReturn; + } + + private Map transformIntoWebSessions(MultiQueryResponseRecord multiQueryResponses) { + return multiQueryResponses.getDocs().stream() + .map(doc -> { + return mapToSession(doc.getRetrievedFields()); + }) + .collect(Collectors.toMap( + WebSession::getOriginalSessionId, + Function.identity() + )); + } + + /** + * Returns a new record based on the specified map that represents a web session in elasticsearch. + * + * @param sourceAsMap the web session stored in elasticsearch. + * @return a new record based on the specified map that represents a web session in elasticsearch. + */ + private WebSession mapToSession(final Map sourceAsMap) { + return WebSession.fromMap(sourceAsMap, this.sessionInternalFields, OUTPUT_RECORD_TYPE); + } + + /** + * return a new Event based on the specified map that represents a web event in elasticsearch. + * + * @param sourceAsMap the event stored in elasticsearch. + * @return a new Event based on the specified map that represents a web event in elasticsearch. + */ + private Event mapToEvent(final Map sourceAsMap) { + return Event.fromMap(sourceAsMap, this.eventsInternalFields, OUTPUT_RECORD_TYPE); + } + + /** + * Facility to log debug. + * + * @param format the format of the String. + * @param args the arguments. + */ + private void debug(final String format, final Object... args) { + if (_DEBUG) { + if (args.length == 0) { + getLogger().debug(format); + } else { + String newLineFormat = format + "\n"; + getLogger().debug(String.format(newLineFormat, args)); + } + } + } + +} + diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webAnalytics/IncrementalWebSession.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/IncrementalWebSessionOld.java similarity index 67% rename from logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webAnalytics/IncrementalWebSession.java rename to logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/IncrementalWebSessionOld.java index d8c9e025d..ddf3585f5 100644 --- a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webAnalytics/IncrementalWebSession.java +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/IncrementalWebSessionOld.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.hurence.logisland.processor.webAnalytics; +package com.hurence.logisland.processor.webanalytics; import com.hurence.logisland.annotation.documentation.*; import com.hurence.logisland.classloading.PluginProxy; @@ -22,84 +22,68 @@ import com.hurence.logisland.processor.AbstractProcessor; import com.hurence.logisland.processor.ProcessContext; import com.hurence.logisland.processor.ProcessException; -import com.hurence.logisland.record.Field; -import com.hurence.logisland.record.FieldDictionary; -import com.hurence.logisland.record.FieldType; -import com.hurence.logisland.record.Record; -import com.hurence.logisland.record.StandardRecord; +import com.hurence.logisland.record.*; +import com.hurence.logisland.service.datastore.model.MultiGetQueryRecordBuilder; +import com.hurence.logisland.service.datastore.model.MultiGetResponseRecord; +import com.hurence.logisland.service.datastore.model.exception.InvalidMultiGetQueryRecordException; import com.hurence.logisland.service.elasticsearch.ElasticsearchClientService; -import com.hurence.logisland.service.datastore.InvalidMultiGetQueryRecordException; -import com.hurence.logisland.service.datastore.MultiGetQueryRecordBuilder; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; import com.hurence.logisland.validator.StandardValidators; -import java.time.Duration; -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.ZonedDateTime; +import java.time.*; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.SortedSet; -import java.util.TreeSet; +import java.util.*; import java.util.regex.Pattern; import java.util.stream.Collectors; +/** + * + * Use IncrementalWebSession instead. This is the old version of web session calculation. It can + * make duplicate session in case of high frequency of batches (typically while rewind). + */ @Category(ComponentCategory.ANALYTICS) @Tags({"analytics", "web", "session"}) @CapabilityDescription( -value = "This processor creates and updates web-sessions based on incoming web-events." + - " Note that both web-sessions and web-events are stored in elasticsearch.\n" + - - " Firstly, web-events are grouped by their session identifier and processed in chronological order.\n" + - " Then each web-session associated to each group is retrieved from elasticsearch.\n" + - " In case none exists yet then a new web session is created based on the first web event.\n" + - " The following fields of the newly created web session are set based on the associated web event:" + - " session identifier, first timestamp, first visited page." + - - " Secondly, once created, or retrieved, the web session is updated by the remaining web-events.\n" + - " Updates have impacts on fields of the web session such as event counter, last visited page, " + - " session duration, ...\n" + - " Before updates are actually applied, checks are performed to detect rules that would trigger the creation" + - " of a new session:\n\n" + - "\tthe duration between the web session and the web event must not exceed the specified time-out,\n" + - "\tthe web session and the web event must have timestamps within the same day (at midnight a new web session " + - "is created),\n" + - "\tsource of traffic (campaign, ...) must be the same on the web session and the web event.\n" + - "\n" + - " When a breaking rule is detected, a new web session is created with a new session identifier where as" + - " remaining web-events still have the original session identifier. The new session identifier is the original" + - " session suffixed with the character '#' followed with an incremented counter. This new session identifier" + - " is also set on the remaining web-events.\n" + - - " Finally when all web events were applied, all web events -potentially modified with a new session" + - " identifier- are save in elasticsearch. And web sessions are passed to the next processor.\n" + - "\n" + - "WebSession information are:\n" + - "- first and last visited page\n" + - "- first and last timestamp of processed event \n" + - "- total number of processed events\n" + - "- the userId\n" + - "- a boolean denoting if the web-session is still active or not\n" + - "- an integer denoting the duration of the web-sessions\n" + - "- optional fields that may be retrieved from the processed events\n" + - "\n" + value = "This processor creates and updates web-sessions based on incoming web-events." + + " Note that both web-sessions and web-events are stored in elasticsearch.\n" + + + " Firstly, web-events are grouped by their session identifier and processed in chronological order.\n" + + " Then each web-session associated to each group is retrieved from elasticsearch.\n" + + " In case none exists yet then a new web session is created based on the first web event.\n" + + " The following fields of the newly created web session are set based on the associated web event:" + + " session identifier, first timestamp, first visited page." + + + " Secondly, once created, or retrieved, the web session is updated by the remaining web-events.\n" + + " Updates have impacts on fields of the web session such as event counter, last visited page, " + + " session duration, ...\n" + + " Before updates are actually applied, checks are performed to detect rules that would trigger the creation" + + " of a new session:\n\n" + + "\tthe duration between the web session and the web event must not exceed the specified time-out,\n" + + "\tthe web session and the web event must have timestamps within the same day (at midnight a new web session " + + "is created),\n" + + "\tsource of traffic (campaign, ...) must be the same on the web session and the web event.\n" + + "\n" + + " When a breaking rule is detected, a new web session is created with a new session identifier where as" + + " remaining web-events still have the original session identifier. The new session identifier is the original" + + " session suffixed with the character '#' followed with an incremented counter. This new session identifier" + + " is also set on the remaining web-events.\n" + + + " Finally when all web events were applied, all web events -potentially modified with a new session" + + " identifier- are save in elasticsearch. And web sessions are passed to the next processor.\n" + + "\n" + + "WebSession information are:\n" + + "- first and last visited page\n" + + "- first and last timestamp of processed event \n" + + "- total number of processed events\n" + + "- the userId\n" + + "- a boolean denoting if the web-session is still active or not\n" + + "- an integer denoting the duration of the web-sessions\n" + + "- optional fields that may be retrieved from the processed events\n" + + "\n" ) @ExtraDetailFile("./details/IncrementalWebSession-Detail.rst") -public class IncrementalWebSession - extends AbstractProcessor -{ +@Deprecated() +public class IncrementalWebSessionOld + extends AbstractProcessor { /** * The extra character added in case a missed new session is detected. In that case the original session identifier * is suffixes with that special character and the next session number. @@ -358,46 +342,45 @@ public class IncrementalWebSession private final String FLAT_SEPARATOR = "_"; private static final PropertyDescriptor SOURCE_OF_TRAFFIC_PREFIX_FIELD = new PropertyDescriptor.Builder() - .name(PROP_SOURCE_OF_TRAFFIC_SUFFIX) - .description("Prefix for the source of the traffic related fields") - .required(false) - .defaultValue(SOURCE_OF_TRAFFIC_SUFFIX_NAME) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .build(); + .name(PROP_SOURCE_OF_TRAFFIC_SUFFIX) + .description("Prefix for the source of the traffic related fields") + .required(false) + .defaultValue(SOURCE_OF_TRAFFIC_SUFFIX_NAME) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build(); /** * The properties of this processor. */ private final static List SUPPORTED_PROPERTY_DESCRIPTORS = Collections.unmodifiableList(Arrays.asList(DEBUG, - ES_SESSION_INDEX_FIELD, - ES_SESSION_TYPE_NAME, - ES_EVENT_INDEX_PREFIX, - ES_EVENT_TYPE_NAME, + ES_SESSION_INDEX_FIELD, + ES_SESSION_TYPE_NAME, + ES_EVENT_INDEX_PREFIX, + ES_EVENT_TYPE_NAME, ES_MAPPING_EVENT_TO_SESSION_INDEX_NAME, - SESSION_ID_FIELD, - TIMESTAMP_FIELD, - VISITED_PAGE_FIELD, - USER_ID_FIELD, - FIELDS_TO_RETURN, - FIRST_VISITED_PAGE_FIELD, - LAST_VISITED_PAGE_FIELD, - IS_SESSION_ACTIVE_FIELD, - SESSION_DURATION_FIELD, - SESSION_INACTIVITY_DURATION_FIELD, - SESSION_INACTIVITY_TIMEOUT, - EVENTS_COUNTER_FIELD, - FIRST_EVENT_DATETIME_FIELD, - LAST_EVENT_DATETIME_FIELD, - NEW_SESSION_REASON_FIELD, - TRANSACTION_IDS, - SOURCE_OF_TRAFFIC_PREFIX_FIELD, - // Service - ELASTICSEARCH_CLIENT_SERVICE)); + SESSION_ID_FIELD, + TIMESTAMP_FIELD, + VISITED_PAGE_FIELD, + USER_ID_FIELD, + FIELDS_TO_RETURN, + FIRST_VISITED_PAGE_FIELD, + LAST_VISITED_PAGE_FIELD, + IS_SESSION_ACTIVE_FIELD, + SESSION_DURATION_FIELD, + SESSION_INACTIVITY_DURATION_FIELD, + SESSION_INACTIVITY_TIMEOUT, + EVENTS_COUNTER_FIELD, + FIRST_EVENT_DATETIME_FIELD, + LAST_EVENT_DATETIME_FIELD, + NEW_SESSION_REASON_FIELD, + TRANSACTION_IDS, + SOURCE_OF_TRAFFIC_PREFIX_FIELD, + // Service + ELASTICSEARCH_CLIENT_SERVICE)); @Override - public List getSupportedPropertyDescriptors() - { + public List getSupportedPropertyDescriptors() { return SUPPORTED_PROPERTY_DESCRIPTORS; } @@ -407,19 +390,16 @@ public List getSupportedPropertyDescriptors() private ElasticsearchClientService elasticsearchClientService; @Override - public boolean hasControllerService() - { + public boolean hasControllerService() { return true; } @Override - public void init(final ProcessContext context) throws InitializationException - { + public void init(final ProcessContext context) throws InitializationException { super.init(context); this.elasticsearchClientService = PluginProxy.rewrap(context.getPropertyValue(ELASTICSEARCH_CLIENT_SERVICE) - .asControllerService()); - if (elasticsearchClientService == null) - { + .asControllerService()); + if (elasticsearchClientService == null) { getLogger().error("Elasticsearch client service is not initialized!"); } } @@ -427,8 +407,7 @@ public void init(final ProcessContext context) throws InitializationException @Override public Collection process(final ProcessContext context, final Collection records) - throws ProcessException - { + throws ProcessException { // debug("Entering processor with %s ", records); return new Execution(context).process(records); } @@ -440,16 +419,15 @@ public Collection process(final ProcessContext context, * * @return {@code true} if the provided field has a non-null value; {@code false} otherwise. */ - private static boolean isFieldAssigned(final Field field) - { - return field!=null && field.getRawValue()!=null; + private static boolean isFieldAssigned(final Field field) { + return field != null && field.getRawValue() != null; } /** * The legacy format used in Date.toString(). */ private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", - Locale.ENGLISH); + Locale.ENGLISH); /** * Returns the epoch timestamp corresponding to the specified value parsed with the default formatter. @@ -458,12 +436,11 @@ private static boolean isFieldAssigned(final Field field) * * @return the epoch timestamp corresponding to the specified value parsed with the default formatter. */ - static long toEpoch(final String string) - { + static long toEpoch(final String string) { return LocalDateTime.parse(string, DATE_FORMAT) - .atZone(ZoneId.systemDefault()) - .toInstant() - .toEpochMilli(); + .atZone(ZoneId.systemDefault()) + .toInstant() + .toEpochMilli(); } /** @@ -483,8 +460,7 @@ static long toEpoch(final String string) * * @return the provided epoch timestamp formatted with the default formatter. */ - static String toFormattedDate(final long epoch) - { + static String toFormattedDate(final long epoch) { ZonedDateTime date = Instant.ofEpochMilli(epoch).atZone(ZoneId.systemDefault()); String result = DATE_FORMAT.format(date); @@ -502,16 +478,11 @@ static String toFormattedDate(final long epoch) * @param format the format of the String. * @param args the arguments. */ - private void debug(final String format, final Object... args) - { - if ( _DEBUG ) - { - if ( args.length == 0 ) - { + private void debug(final String format, final Object... args) { + if (_DEBUG) { + if (args.length == 0) { getLogger().debug(format); - } - else - { + } else { getLogger().debug(String.format(format + "\n", args)); } } @@ -524,8 +495,7 @@ private void debug(final String format, final Object... args) * * @return the conversion of a record to a map where all {@code null} values were removed. */ - private static Map toMap(final Record record) - { + private static Map toMap(final Record record) { return toMap(record, false); } @@ -538,59 +508,46 @@ private static Map toMap(final Record record) * @return the conversion of a record to a map where all {@code null} values were removed. */ private static Map toMap(final Record record, - final boolean innerRecord) - { - try - { + final boolean innerRecord) { + try { final Map result = new HashMap<>(); record.getFieldsEntrySet() - .stream() - .forEach(entry -> - { - if ( !innerRecord || (innerRecord && ! FieldDictionary.contains(entry.getKey())) ) - { - Object value = entry.getValue().getRawValue(); - if (value != null) { - switch(entry.getValue().getType()) - { - case RECORD: - value = toMap((Record)value, true); - break; - case ARRAY: - Collection collection; - if ( value instanceof Collection ) - { - collection = (Collection)value; - } - else - { - collection = Arrays.asList(value); - } - final List list = new ArrayList(collection.size()); - for(final Object item: collection) - { - if ( item instanceof Record ) - { - list.add(toMap((Record)item, true)); - } - else - { - list.add(item); - } - } - value = list; - break; - default: - } - result.put(entry.getKey(), value); - } - } - }); + .stream() + .forEach(entry -> + { + if (!innerRecord || (innerRecord && !FieldDictionary.contains(entry.getKey()))) { + Object value = entry.getValue().getRawValue(); + if (value != null) { + switch (entry.getValue().getType()) { + case RECORD: + value = toMap((Record) value, true); + break; + case ARRAY: + Collection collection; + if (value instanceof Collection) { + collection = (Collection) value; + } else { + collection = Arrays.asList(value); + } + final List list = new ArrayList(collection.size()); + for (final Object item : collection) { + if (item instanceof Record) { + list.add(toMap((Record) item, true)); + } else { + list.add(item); + } + } + value = list; + break; + default: + } + result.put(entry.getKey(), value); + } + } + }); return result; - } - catch(Exception e) - { + } catch (Exception e) { throw new RuntimeException(e); } } @@ -600,8 +557,7 @@ private static Map toMap(final Record record, * If the result is valid then the reason is empty; otherwise the reason contains a description of why the check * is not valid. */ - interface SessionCheckResult - { + interface SessionCheckResult { /** * Returns {@code true} is the event is applicable to the session incrementally, {@code false} otherwise. * If {@code false} is returned then a new session must be created from the provided event and the provided @@ -622,28 +578,36 @@ interface SessionCheckResult /** * A singleton for valid check. */ - private final static SessionCheckResult VALID = new SessionCheckResult() - { + private final static SessionCheckResult VALID = new SessionCheckResult() { @Override - public boolean isValid() { return true; } + public boolean isValid() { + return true; + } @Override - public String reason() { return null; } + public String reason() { + return null; + } }; private static class InvalidSessionCheckResult - implements SessionCheckResult - { + implements SessionCheckResult { private final String reason; - public InvalidSessionCheckResult(final String reason) { this.reason = reason; } + public InvalidSessionCheckResult(final String reason) { + this.reason = reason; + } @Override - public boolean isValid() { return false; } + public boolean isValid() { + return false; + } @Override - public String reason() { return this.reason; } + public String reason() { + return this.reason; + } } private final static SessionCheckResult DAY_OVERLAP = new InvalidSessionCheckResult("Day overlap"); @@ -654,8 +618,7 @@ private static class InvalidSessionCheckResult * This interface defines rules to test whether an event can be applied to a session or not. In case it can not * be applied then a new session must be created. */ - interface SessionCheck - { + interface SessionCheck { /** * Returns {@code true} is the event is applicable to the session incrementally, {@code false} otherwise. * If {@code false} is returned then a new session must be created from the provided event and the provided @@ -671,8 +634,7 @@ interface SessionCheck /** * A class that performs a unique execution. */ - private class Execution - { + private class Execution { /* * Field names. */ @@ -706,20 +668,16 @@ private class Execution private final Collection checker; - private Execution(final ProcessContext context) - { + private Execution(final ProcessContext context) { this._SESSION_INACTIVITY_TIMEOUT = context.getPropertyValue(SESSION_INACTIVITY_TIMEOUT).asLong(); this._SESSION_ID_FIELD = context.getPropertyValue(SESSION_ID_FIELD).asString(); this._TIMESTAMP_FIELD = context.getPropertyValue(TIMESTAMP_FIELD).asString(); this._VISITED_PAGE_FIELD = context.getPropertyValue(VISITED_PAGE_FIELD).asString(); String fieldsToReturn = context.getPropertyValue(FIELDS_TO_RETURN).asString(); - if ( fieldsToReturn != null && !fieldsToReturn.isEmpty() ) - { + if (fieldsToReturn != null && !fieldsToReturn.isEmpty()) { this._FIELDS_TO_RETURN = Arrays.asList(fieldsToReturn.split(",")); - } - else - { + } else { this._FIELDS_TO_RETURN = Collections.emptyList(); } @@ -732,7 +690,7 @@ private Execution(final ProcessContext context) this._FIRST_EVENT_DATETIME_FIELD = context.getPropertyValue(FIRST_EVENT_DATETIME_FIELD).asString(); this._LAST_EVENT_DATETIME_FIELD = context.getPropertyValue(LAST_EVENT_DATETIME_FIELD).asString(); this._SESSION_INACTIVITY_DURATION_FIELD = context.getPropertyValue(SESSION_INACTIVITY_DURATION_FIELD) - .asString(); + .asString(); this._NEW_SESSION_REASON_FIELD = context.getPropertyValue(NEW_SESSION_REASON_FIELD).asString(); this._TRANSACTION_IDS = context.getPropertyValue(TRANSACTION_IDS).asString(); @@ -756,64 +714,61 @@ private Execution(final ProcessContext context) Objects.requireNonNull(this._ES_MAPPING_EVENT_TO_SESSION_INDEX_NAME, "Property required: " + ES_MAPPING_EVENT_TO_SESSION_INDEX_NAME); this.checker = Arrays.asList( - // Day overlap - (session, event) -> - { - final ZonedDateTime firstEvent = session.getFirstEvent(); - final ZonedDateTime lastEvent = session.getLastEvent(); + // Day overlap + (session, event) -> + { + final ZonedDateTime firstEvent = session.getFirstEvent(); + final ZonedDateTime lastEvent = session.getLastEvent(); - final ZonedDateTime timestamp = event.getTimestamp(); + final ZonedDateTime timestamp = event.getTimestamp(); - boolean isValid = firstEvent.getDayOfYear() == timestamp.getDayOfYear() - && lastEvent.getDayOfYear() == timestamp.getDayOfYear() - && firstEvent.getYear() == timestamp.getYear() - && lastEvent.getYear() == timestamp.getYear(); + boolean isValid = firstEvent.getDayOfYear() == timestamp.getDayOfYear() + && lastEvent.getDayOfYear() == timestamp.getDayOfYear() + && firstEvent.getYear() == timestamp.getYear() + && lastEvent.getYear() == timestamp.getYear(); - if ( _DEBUG && !isValid ) - { - debug("'Day overlap' isValid=" + isValid + " session-id=" + session.getSessionId()); - } + if (_DEBUG && !isValid) { + debug("'Day overlap' isValid=" + isValid + " session-id=" + session.getSessionId()); + } - return isValid? VALID : DAY_OVERLAP; - }, + return isValid ? VALID : DAY_OVERLAP; + }, - // Timeout exceeded - (session, event) -> - { - final long durationInSeconds = Duration.between(session.getLastEvent(), event.getTimestamp()) - .getSeconds(); - boolean isValid = durationInSeconds <= this._SESSION_INACTIVITY_TIMEOUT; - - if ( _DEBUG && !isValid ) + // Timeout exceeded + (session, event) -> { - debug("'Timeout exceeded' isValid=" + isValid + " seconds=" + durationInSeconds + - " timeout=" + this._SESSION_INACTIVITY_TIMEOUT + " session-id=" + session.getSessionId()); - } + final long durationInSeconds = Duration.between(session.getLastEvent(), event.getTimestamp()) + .getSeconds(); + boolean isValid = durationInSeconds <= this._SESSION_INACTIVITY_TIMEOUT; - return isValid? VALID : SESSION_TIMEDOUT; - }, + if (_DEBUG && !isValid) { + debug("'Timeout exceeded' isValid=" + isValid + " seconds=" + durationInSeconds + + " timeout=" + this._SESSION_INACTIVITY_TIMEOUT + " session-id=" + session.getSessionId()); + } - // One Campaign Per Session—Each visit to your site from a different campaign—organic or paid—triggers a - // new session, regardless of the actual time elapsed in the current session. - (session, event) -> - { - boolean isValid = Objects.equals(event.getValue(_SOT_SOURCE_FIELD), DIRECT_TRAFFIC) || - Objects.deepEquals(session.getSourceOfTraffic(), event.getSourceOfTraffic()); + return isValid ? VALID : SESSION_TIMEDOUT; + }, - if ( _DEBUG && !isValid ) + // One Campaign Per Session—Each visit to your site from a different campaign—organic or paid—triggers a + // new session, regardless of the actual time elapsed in the current session. + (session, event) -> { - debug("'Fields of traffic' isValid=" + isValid + " session-id=" + session.getSessionId()); - } + boolean isValid = Objects.equals(event.getValue(_SOT_SOURCE_FIELD), DIRECT_TRAFFIC) || + Objects.deepEquals(session.getSourceOfTraffic(), event.getSourceOfTraffic()); - return isValid? VALID : SOURCE_OF_TRAFFIC; - }); + if (_DEBUG && !isValid) { + debug("'Fields of traffic' isValid=" + isValid + " session-id=" + session.getSessionId()); + } + + return isValid ? VALID : SOURCE_OF_TRAFFIC; + }); } /** * The events' index suffix formatter. */ private final DateTimeFormatter EVENT_SUFFIX_FORMATTER = DateTimeFormatter.ofPattern("yyyy.MM.dd", - Locale.ENGLISH); + Locale.ENGLISH); /** * Returns the name of the event index corresponding to the specified date such as @@ -824,8 +779,7 @@ private Execution(final ProcessContext context) * * @return the name of the event index corresponding to the specified date. */ - private String toEventIndexName(final ZonedDateTime date) - { + private String toEventIndexName(final ZonedDateTime date) { return _ES_EVENT_INDEX_PREFIX + "." + EVENT_SUFFIX_FORMATTER.format(date); } @@ -839,8 +793,7 @@ private String toEventIndexName(final ZonedDateTime date) * @throws ProcessException if something went wrong. */ public Collection process(final Collection records) - throws ProcessException - { + throws ProcessException { // debug("\n\n--------------------------------------------------------------------"); // debug("Starting processing on %s '%s' %s. Incoming records size=%d ", // ManagementFactory.getRuntimeMXBean().getName(), @@ -858,31 +811,30 @@ public Collection process(final Collection records) // Store all events to elasticsearch through a bulk processor. events.stream() - .flatMap(event -> event.stream()) - .forEach(event -> - { - final Map map = toMap(event.cloneRecord()); - - elasticsearchClientService.bulkPut(toEventIndexName(event.getTimestamp()), - _ES_EVENT_TYPE_NAME, - map, - Optional.of((String)map.get(FieldDictionary.RECORD_ID))); - }); + .flatMap(event -> event.stream()) + .forEach(event -> + { + final Map map = toMap(event.cloneRecord()); + + elasticsearchClientService.bulkPut(toEventIndexName(event.getTimestamp()), + _ES_EVENT_TYPE_NAME, + map, + Optional.of((String) map.get(FieldDictionary.RECORD_ID))); + }); elasticsearchClientService.bulkFlush(); // Convert all created sessions to records. final Collection result = rewriters.stream() - .flatMap(rewriter -> rewriter.getSessions().stream()) - .collect(Collectors.toList()); + .flatMap(rewriter -> rewriter.getSessions().stream()) + .collect(Collectors.toList()); // Save last sessionId in mapping index. // -> #? rewriters.stream() - .forEach(sessions -> - elasticsearchClientService.bulkPut(_ES_MAPPING_EVENT_TO_SESSION_INDEX_NAME, ES_MAPPING_EVENT_TO_SESSION_TYPE_NAME, - Collections.singletonMap(MAPPING_FIELD, sessions.getLastSessionId()), - Optional.of(sessions.getSessionId()))); - + .forEach(sessions -> + elasticsearchClientService.bulkPut(_ES_MAPPING_EVENT_TO_SESSION_INDEX_NAME, ES_MAPPING_EVENT_TO_SESSION_TYPE_NAME, + Collections.singletonMap(MAPPING_FIELD, sessions.getLastSessionId()), + Optional.of(sessions.getSessionId()))); debug("Processing done. Outcoming records size=%d ", result.size()); @@ -907,13 +859,12 @@ private String concatFieldsOfTraffic(final String utmSource, final String utmMedium, final String utmCampaign, final String utmTerm, - final String utmContent) - { - return new StringBuilder().append(utmSource==null?"":utmSource).append(':') - .append(utmMedium==null?"":utmMedium).append(':') - .append(utmCampaign==null?"":utmCampaign).append(':') - .append(utmTerm==null?"":utmTerm).append(':') - .append(utmContent==null?"":utmContent).toString(); + final String utmContent) { + return new StringBuilder().append(utmSource == null ? "" : utmSource).append(':') + .append(utmMedium == null ? "" : utmMedium).append(':') + .append(utmCampaign == null ? "" : utmCampaign).append(':') + .append(utmTerm == null ? "" : utmTerm).append(':') + .append(utmContent == null ? "" : utmContent).toString(); } /** @@ -925,25 +876,24 @@ private String concatFieldsOfTraffic(final String utmSource, * * @return the provided records as a collection of Events instances. */ - private Collection toWebEvents(final Collection records) - { + private Collection toWebEvents(final Collection records) { // Create webEvents from input records. // A webEvents contains all webEvent instances of its session id. final Collection result = records.stream() - // Remove record without session Id or timestamp. - .filter(record -> isFieldAssigned(record.getField(_SESSION_ID_FIELD)) - && isFieldAssigned(record.getField(_TIMESTAMP_FIELD))) - // Create web-event from record. - .map(WebEvent::new) - // Group records per session Id. - .collect(Collectors.groupingBy(WebEvent::getSessionId)) - // Ignore keys (sessionId) and stream over list of associated events. - .values() - .stream() - // Wrapped grouped web-events of sessionId in WebEvents. - .map(Events::new) - .collect(Collectors.toList()); + // Remove record without session Id or timestamp. + .filter(record -> isFieldAssigned(record.getField(_SESSION_ID_FIELD)) + && isFieldAssigned(record.getField(_TIMESTAMP_FIELD))) + // Create web-event from record. + .map(WebEvent::new) + // Group records per session Id. + .collect(Collectors.groupingBy(WebEvent::getSessionId)) + // Ignore keys (sessionId) and stream over list of associated events. + .values() + .stream() + // Wrapped grouped web-events of sessionId in WebEvents. + .map(Events::new) + .collect(Collectors.toList()); return result; } @@ -956,41 +906,35 @@ && isFieldAssigned(record.getField(_TIMESTAMP_FIELD))) * * @return web sessions resulting of the processing of the web events. */ - private Collection processEvents(final Collection webEvents) - { + private Collection processEvents(final Collection webEvents) { // First retrieve mapping of last sessions. // Eg sessionId -> sessionId#XX final MultiGetQueryRecordBuilder mgqrBuilder = new MultiGetQueryRecordBuilder(); webEvents.forEach(events -> mgqrBuilder.add(_ES_MAPPING_EVENT_TO_SESSION_INDEX_NAME, ES_MAPPING_EVENT_TO_SESSION_TYPE_NAME, - null, events.getSessionId())); + null, events.getSessionId())); List esResponse = null; - try - { + try { esResponse = elasticsearchClientService.multiGet(mgqrBuilder.build()); - } - catch (final InvalidMultiGetQueryRecordException e) - { + } catch (final InvalidMultiGetQueryRecordException e) { // should never happen getLogger().error("error while executing multiGet elasticsearch", e); } // Documents have only one field "sessionId" that corresponds to last session. Map*/> _mappings = Collections.emptyMap(); - if ( ! esResponse.isEmpty() ) - { + if (!esResponse.isEmpty()) { _mappings = - esResponse.stream() - .collect(Collectors.toMap(response -> response.getDocumentId(), - response -> response.getRetrievedFields().get(MAPPING_FIELD))); + esResponse.stream() + .collect(Collectors.toMap(response -> response.getDocumentId(), + response -> response.getRetrievedFields().get(MAPPING_FIELD))); } final Map*/> mappings = _mappings; // Retrieve all last sessionId from elasticsearch. final MultiGetQueryRecordBuilder sessionBuilder = new MultiGetQueryRecordBuilder(); - if ( ! mappings.isEmpty() ) - { + if (!mappings.isEmpty()) { webEvents.forEach(events -> { String sessionId = events.getSessionId(); @@ -999,17 +943,14 @@ private Collection processEvents(final Collection webEvents) // The chaining calls are on purpose as any NPE would mean something is wrong. final String sessionIndexName = events.first().getValue(_ES_SESSION_INDEX_FIELD).toString(); sessionBuilder.add(sessionIndexName, _ES_SESSION_TYPE_NAME, - null, mappedSessionId!=null?mappedSessionId:sessionId); + null, mappedSessionId != null ? mappedSessionId : sessionId); }); } esResponse = null; - try - { + try { esResponse = elasticsearchClientService.multiGet(sessionBuilder.build()); - } - catch (final InvalidMultiGetQueryRecordException e) - { + } catch (final InvalidMultiGetQueryRecordException e) { // should never happen getLogger().error("error while executing multiGet elasticsearch", e); } @@ -1018,20 +959,20 @@ private Collection processEvents(final Collection webEvents) // Grouped all retrieved elasticsearch documents by their session identifier. final Map/*session-id or session-id#0,...,session-id#N*/> sessionDocs = - esResponse.isEmpty() - ? Collections.emptyMap() - : esResponse.stream() - .map(response -> new WebSession(esDoc2Record(response.getRetrievedFields()))) - .collect(Collectors.groupingBy(record-> record.getSessionId() - .split(EXTRA_SESSION_DELIMITER)[0])); + List/*session-id or session-id#0,...,session-id#N*/> sessionDocs = + esResponse.isEmpty() + ? Collections.emptyMap() + : esResponse.stream() + .map(response -> new WebSession(esDoc2Record(response.getRetrievedFields()))) + .collect(Collectors.groupingBy(record -> record.getSessionId() + .split(EXTRA_SESSION_DELIMITER)[0])); // Applies all events to session documents and collect results. final Collection result = webEvents.stream() - .map(events -> new Sessions(events.getSessionId(), - sessionDocs.get(events.getSessionId())).processEvents(events)) - .collect(Collectors.toList()); + .map(events -> new Sessions(events.getSessionId(), + sessionDocs.get(events.getSessionId())).processEvents(events)) + .collect(Collectors.toList()); return result; } @@ -1043,34 +984,28 @@ private Collection processEvents(final Collection webEvents) * * @return a new record based on the specified map that represents a web session in elasticsearch. */ - public Record esDoc2Record(final Map sourceAsMap) - { + public Record esDoc2Record(final Map sourceAsMap) { final Record record = new StandardRecord(OUTPUT_RECORD_TYPE); sourceAsMap.forEach((key, value) -> - { - if ( _IS_SESSION_ACTIVE_FIELD.equals(key) ) - { - // Boolean - record.setField(key, FieldType.BOOLEAN, Boolean.valueOf(value)); - } - else if ( _SESSION_DURATION_FIELD.equals(key) - || _EVENTS_COUNTER_FIELD.equals(key) - || _TIMESTAMP_FIELD.equals(key) - || _SESSION_INACTIVITY_DURATION_FIELD.equals(key) - || _FIRST_EVENT_EPOCH_FIELD.equals(key) - || _LAST_EVENT_EPOCH_FIELD.equals(key) - || _SESSION_INACTIVITY_DURATION_FIELD.equals(key) - || "record_time".equals(key)) - { - // Long - record.setField(key, FieldType.LONG, Long.valueOf(value)); - } - else - { - // String - record.setField(key, FieldType.STRING, value); - } - }); + { + if (_IS_SESSION_ACTIVE_FIELD.equals(key)) { + // Boolean + record.setField(key, FieldType.BOOLEAN, Boolean.valueOf(value)); + } else if (_SESSION_DURATION_FIELD.equals(key) + || _EVENTS_COUNTER_FIELD.equals(key) + || _TIMESTAMP_FIELD.equals(key) + || _SESSION_INACTIVITY_DURATION_FIELD.equals(key) + || _FIRST_EVENT_EPOCH_FIELD.equals(key) + || _LAST_EVENT_EPOCH_FIELD.equals(key) + || _SESSION_INACTIVITY_DURATION_FIELD.equals(key) + || "record_time".equals(key)) { + // Long + record.setField(key, FieldType.LONG, Long.valueOf(value)); + } else { + // String + record.setField(key, FieldType.STRING, value); + } + }); record.setId(record.getField(_SESSION_ID_FIELD).asString()); @@ -1089,14 +1024,11 @@ else if ( _SESSION_DURATION_FIELD.equals(key) * {@code false} otherwise. */ private SessionCheckResult isEventApplicable(final WebSession webSession, - final WebEvent webEvent) - { + final WebEvent webEvent) { SessionCheckResult result = VALID; - for (final SessionCheck check : checker) - { + for (final SessionCheck check : checker) { result = check.isValid(webSession, webEvent); - if (!result.isValid()) - { + if (!result.isValid()) { break; } } @@ -1107,8 +1039,7 @@ private SessionCheckResult isEventApplicable(final WebSession webSession, /** * This class represents one or more sessions resulting of the processing of web events. */ - private class Sessions - { + private class Sessions { private final String sessionId; // Last processed web session retrieved from datastore. @@ -1127,20 +1058,18 @@ private class Sessions * @param storedSessions the sessions stored in the datastore. */ public Sessions(final String sessionId, - final Collection storedSessions) - { + final Collection storedSessions) { this.sessionId = sessionId; - this.lastSession = storedSessions==null ? null : Collections.max(storedSessions); + this.lastSession = storedSessions == null ? null : Collections.max(storedSessions); - if ( _DEBUG ) - { + if (_DEBUG) { debug("storedSessions=" + - (storedSessions == null ? null : - storedSessions.stream() - .map(webSession -> webSession.record.getId()) - .collect(Collectors.joining(" "))) + - ", last=" + (lastSession == null ? null : lastSession.record.getId())); + (storedSessions == null ? null : + storedSessions.stream() + .map(webSession -> webSession.record.getId()) + .collect(Collectors.joining(" "))) + + ", last=" + (lastSession == null ? null : lastSession.record.getId())); } } @@ -1149,8 +1078,7 @@ public Sessions(final String sessionId, * * @return the session identifier of this session. */ - public String getSessionId() - { + public String getSessionId() { return this.sessionId; } @@ -1161,12 +1089,10 @@ public String getSessionId() * * @return this object for convenience. */ - public Sessions processEvents(final Events events) - { + public Sessions processEvents(final Events events) { debug("Applying %d events to session '%s'", events.size(), events.getSessionId()); - if ( this.lastSession != null ) - { + if (this.lastSession != null) { // One or more sessions were already stored in datastore. final Iterator eventIterator = events.iterator(); @@ -1175,18 +1101,15 @@ public Sessions processEvents(final Events events) // Skip all events that have their timestamp in the range of the [first, last] timestamps of the // web session. This happens in case the kafka topic was re-read from earliest than the last // processed messages. - while (eventIterator.hasNext()) - { + while (eventIterator.hasNext()) { event = eventIterator.next(); outsideTimeWindow = !lastSession.containsTimestamp(event.timestamp); - if (outsideTimeWindow) - { + if (outsideTimeWindow) { break; } } - if (outsideTimeWindow) - { + if (outsideTimeWindow) { // Event iterator points to first event outside of session's time window. // Recreates a list from the first event outside of the time window included. final Events nextEvents = new Events(events.tailSet(event)); @@ -1197,9 +1120,7 @@ public Sessions processEvents(final Events events) // Resume from first session. this.processEvents(lastSession, nextEvents); } - } - else - { + } else { // No web session yet exists for this session identifier. Create a new one. this.processEvents(null, events); } @@ -1216,19 +1137,16 @@ public Sessions processEvents(final Events events) * @return this object for convenience. */ private void processEvents(WebSession session, - final Events events) - { - if (events.isEmpty()) - { + final Events events) { + if (events.isEmpty()) { // No event. Paranoid. return; } final Iterator iterator = events.iterator(); - debug("Processing event sessionId="+events.getSessionId() + " eventCount="+eventCount); + debug("Processing event sessionId=" + events.getSessionId() + " eventCount=" + eventCount); - if (session == null) - { + if (session == null) { // No web-session yet in datastore. WebEvent event = iterator.next(); eventCount++; @@ -1238,26 +1156,22 @@ private void processEvents(WebSession session, this.processedSessions.add(session); - while (iterator.hasNext()) - { + while (iterator.hasNext()) { final WebEvent event = iterator.next(); eventCount++; final SessionCheckResult isSessionValid = isEventApplicable(session, event); - if ( isSessionValid.isValid() ) - { + if (isSessionValid.isValid()) { // No invalid check found. session.add(event); - } - else - { + } else { // Invalid check found: // 1. keep current web-session untouched (and save it) // 2. create a new web-session from the current web-event and rename/increase session-id. final String[] oldSessionId = event.getSessionId().split(EXTRA_SESSION_DELIMITER); final int index = (oldSessionId.length == 1) ? 2 // only one web session so far => create 2nd one - : Integer.valueOf(oldSessionId[1]) + 1; // +1 on web session + : Integer.valueOf(oldSessionId[1]) + 1; // +1 on web session final String newSessionId = oldSessionId[0] + EXTRA_SESSION_DELIMITER + index; final Collection renamedEvents = events.tailSet(event); // Rewrite all remaining web-events with new session identifier. @@ -1278,11 +1192,10 @@ private void processEvents(WebSession session, * * @return the processed sessions as records. */ - public Collection getSessions() - { + public Collection getSessions() { return processedSessions.stream() - .map(item -> item.record) - .collect(Collectors.toSet()); + .map(item -> item.record) + .collect(Collectors.toSet()); } /** @@ -1290,17 +1203,14 @@ public Collection getSessions() * * @return the last sessionId (#?) of this session container. */ - public String getLastSessionId() - { + public String getLastSessionId() { String result = this.sessionId; - if ( !this.processedSessions.isEmpty() ) - { - result = this.processedSessions.get(this.processedSessions.size()-1).getSessionId(); - } - else { + if (!this.processedSessions.isEmpty()) { + result = this.processedSessions.get(this.processedSessions.size() - 1).getSessionId(); + } else { getLogger().error("Invalid state: session container for '" + this.sessionId + "' is empty. " + - "At least one session is expected"); + "At least one session is expected"); } return result; @@ -1311,131 +1221,109 @@ public String getLastSessionId() * This class represents a collection of events and is provided for convenience. */ private class Events - implements SortedSet - { + implements SortedSet { private final SortedSet set; - public Events(Collection events) - { + public Events(Collection events) { this.set = new TreeSet<>(events); } - public String getSessionId() - { + public String getSessionId() { return this.first().getSessionId(); } @Override - public Comparator comparator() - { + public Comparator comparator() { return this.set.comparator(); } @Override - public SortedSet subSet(WebEvent fromElement, WebEvent toElement) - { + public SortedSet subSet(WebEvent fromElement, WebEvent toElement) { return this.set.subSet(fromElement, toElement); } @Override - public SortedSet headSet(WebEvent toElement) - { + public SortedSet headSet(WebEvent toElement) { return this.set.headSet(toElement); } @Override - public SortedSet tailSet(WebEvent fromElement) - { + public SortedSet tailSet(WebEvent fromElement) { return this.set.tailSet(fromElement); } @Override - public WebEvent first() - { + public WebEvent first() { return this.set.first(); } @Override - public WebEvent last() - { + public WebEvent last() { return this.set.last(); } @Override - public int size() - { + public int size() { return this.set.size(); } @Override - public boolean isEmpty() - { + public boolean isEmpty() { return this.set.isEmpty(); } @Override - public boolean contains(Object o) - { + public boolean contains(Object o) { return this.set.contains(o); } @Override - public Iterator iterator() - { + public Iterator iterator() { return this.set.iterator(); } @Override - public Object[] toArray() - { + public Object[] toArray() { return this.set.toArray(); } @Override - public T[] toArray(T[] a) - { + public T[] toArray(T[] a) { return this.set.toArray(a); } @Override - public boolean add(WebEvent t) - { + public boolean add(WebEvent t) { return this.set.add(t); } @Override - public boolean remove(Object o) - { + public boolean remove(Object o) { return this.set.remove(o); } @Override - public boolean containsAll(Collection c) - { + public boolean containsAll(Collection c) { return this.set.containsAll(c); } @Override - public boolean addAll(Collection c) - { + public boolean addAll(Collection c) { return this.set.addAll(c); } @Override - public boolean retainAll(Collection c) - { + public boolean retainAll(Collection c) { return this.set.retainAll(c); } @Override - public boolean removeAll(Collection c) - { + public boolean removeAll(Collection c) { return this.set.removeAll(c); } @Override - public void clear() - { + public void clear() { this.set.clear(); } } @@ -1446,8 +1334,7 @@ public void clear() */ private class WebSession extends RecordItem - implements Comparable - { + implements Comparable { /** * Creates a new instance of this class with: * - the session identifier set from the web event's session identifier @@ -1455,8 +1342,7 @@ private class WebSession * * @param webEvent the web event to fetch information from. */ - public WebSession(final WebEvent webEvent) - { + public WebSession(final WebEvent webEvent) { super(new StandardRecord(OUTPUT_RECORD_TYPE)); this.record.setId(webEvent.getSessionId()); this.record.setField(_SESSION_ID_FIELD, FieldType.STRING, webEvent.getSessionId()); @@ -1465,13 +1351,10 @@ public WebSession(final WebEvent webEvent) this.setFirstEvent(eventTimestamp); this.setLastEvent(eventTimestamp); - if ( (_FIELDS_TO_RETURN != null) && (!_FIELDS_TO_RETURN.isEmpty()) ) - { - for(final String fieldnameToAdd: _FIELDS_TO_RETURN) - { + if ((_FIELDS_TO_RETURN != null) && (!_FIELDS_TO_RETURN.isEmpty())) { + for (final String fieldnameToAdd : _FIELDS_TO_RETURN) { final Field field = webEvent.record.getField(fieldnameToAdd); - if ( isFieldAssigned(field) ) - { + if (isFieldAssigned(field)) { record.setField(field); // Field immutable. } } @@ -1483,8 +1366,7 @@ public WebSession(final WebEvent webEvent) * * @param saveSession the embedded record. */ - public WebSession(final Record saveSession) - { + public WebSession(final Record saveSession) { super(saveSession); } @@ -1493,8 +1375,7 @@ public WebSession(final Record saveSession) * * @param event the event to apply. */ - public void add(final WebEvent event) - { + public void add(final WebEvent event) { // Handle case where web-event is older that first event of session. // In case there are few events older than the current web-session, all those events must // be taken into account despite the fact that setting the timestamp of the first event @@ -1505,12 +1386,10 @@ public void add(final WebEvent event) // Sanity check. final Field lastEventField = record.getField(_LAST_EVENT_EPOCH_FIELD); - if ( lastEventField != null ) - { + if (lastEventField != null) { final long lastEvent = lastEventField.asLong(); - if (lastEvent > 0 && eventTimestamp > 0 && eventTimestamp 0 && eventTimestamp > 0 && eventTimestamp < lastEvent) { // The event is older that current web session; ignore. return; } @@ -1518,7 +1397,7 @@ public void add(final WebEvent event) // EVENTS_COUNTER Field field = record.getField(_EVENTS_COUNTER_FIELD); - long eventsCounter = field==null ? 0 : field.asLong(); + long eventsCounter = field == null ? 0 : field.asLong(); eventsCounter++; record.setField(_EVENTS_COUNTER_FIELD, FieldType.LONG, eventsCounter); @@ -1526,103 +1405,85 @@ public void add(final WebEvent event) // Set the session create timestamp to the create timestamp of the first event on the session. long creationTimestamp; field = record.getField(_TIMESTAMP_FIELD); - if ( !isFieldAssigned(field) ) - { + if (!isFieldAssigned(field)) { record.setField(_TIMESTAMP_FIELD, FieldType.LONG, eventTimestamp); creationTimestamp = eventTimestamp; - } - else - { + } else { creationTimestamp = field.asLong(); } final Field visitedPage = event.record.getField(_VISITED_PAGE_FIELD); // FIRST_VISITED_PAGE - if ( !isFieldAssigned(record.getField(_FIRST_VISITED_PAGE_FIELD)) ) - { + if (!isFieldAssigned(record.getField(_FIRST_VISITED_PAGE_FIELD))) { record.setField(_FIRST_VISITED_PAGE_FIELD, FieldType.STRING, visitedPage.asString()); } // LAST_VISITED_PAGE - if ( isFieldAssigned(visitedPage) ) - { + if (isFieldAssigned(visitedPage)) { record.setField(_LAST_VISITED_PAGE_FIELD, FieldType.STRING, visitedPage.asString()); } // FIRST_EVENT_DATETIME - if ( !isFieldAssigned(record.getField(_FIRST_EVENT_DATETIME_FIELD)) ) - { + if (!isFieldAssigned(record.getField(_FIRST_EVENT_DATETIME_FIELD))) { this.setFirstEvent(eventTimestamp); } // LAST_EVENT_DATETIME - if ( isFieldAssigned(eventTimestampField) ) - { + if (isFieldAssigned(eventTimestampField)) { this.setLastEvent(eventTimestamp); } // USERID // Add the userid record if available final Field userIdField = record.getField(_USERID_FIELD); - if ( (!isFieldAssigned(userIdField) || "undefined".equalsIgnoreCase(userIdField.asString())) - && isFieldAssigned(event.record.getField(_USERID_FIELD)) ) - { + if ((!isFieldAssigned(userIdField) || "undefined".equalsIgnoreCase(userIdField.asString())) + && isFieldAssigned(event.record.getField(_USERID_FIELD))) { final String userId = event.record.getField(_USERID_FIELD).asString(); - if ( userId != null ) - { + if (userId != null) { record.setField(_USERID_FIELD, FieldType.STRING, userId); } } LocalDateTime now = LocalDateTime.now(); LocalDateTime eventLocalDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(eventTimestamp), - ZoneId.systemDefault()); + ZoneId.systemDefault()); // Compute session inactivity duration (in milliseconds) final long sessionInactivityDuration = Duration.between(eventLocalDateTime, now).getSeconds(); - if ( sessionInactivityDuration > _SESSION_INACTIVITY_TIMEOUT ) - { + if (sessionInactivityDuration > _SESSION_INACTIVITY_TIMEOUT) { // Mark the session as closed record.setField(_IS_SESSION_ACTIVE_FIELD, FieldType.BOOLEAN, Boolean.FALSE); // Max out the sessionInactivityDuration - only pertinent in case of topic rewind. record.setField(_SESSION_INACTIVITY_DURATION_FIELD, FieldType.LONG, _SESSION_INACTIVITY_TIMEOUT); - } - else - { + } else { record.setField(_IS_SESSION_ACTIVE_FIELD, FieldType.BOOLEAN, Boolean.TRUE); } final long sessionDuration = Duration.between(Instant.ofEpochMilli(creationTimestamp), - Instant.ofEpochMilli(eventTimestamp)).getSeconds(); - if ( sessionDuration > 0 ) - { + Instant.ofEpochMilli(eventTimestamp)).getSeconds(); + if (sessionDuration > 0) { record.setField(_SESSION_DURATION_FIELD, FieldType.LONG, sessionDuration); } // Extra final Field transactionIdField = event.record.getField("transactionId"); - if ( isFieldAssigned(transactionIdField) - && (!"undefined".equalsIgnoreCase(transactionIdField.asString())) - && (!transactionIdField.asString().isEmpty()) ) - { + if (isFieldAssigned(transactionIdField) + && (!"undefined".equalsIgnoreCase(transactionIdField.asString())) + && (!transactionIdField.asString().isEmpty())) { final Field transactionIdsField = this.record.getField("transactionIds"); Collection transactionIds; - if ( !isFieldAssigned(transactionIdField) ) - { - transactionIds = (Collection)transactionIdsField.getRawValue(); - } - else - { + if (!isFieldAssigned(transactionIdField)) { + transactionIds = (Collection) transactionIdsField.getRawValue(); + } else { transactionIds = new ArrayList<>(); this.record.setField(_TRANSACTION_IDS, FieldType.ARRAY, transactionIds); } transactionIds.add(transactionIdField.asString()); } - if ( ! record.isValid() ) - { + if (!record.isValid()) { record.getFieldsEntrySet().forEach(entry -> { final Field f = entry.getValue(); @@ -1640,77 +1501,62 @@ && isFieldAssigned(event.record.getField(_USERID_FIELD)) ) * @return {@code true} if the specified timestamp is enclosed within the first and last timestamp of this * session; {@code false} otherwise. */ - public boolean containsTimestamp(final ZonedDateTime timestamp) - { + public boolean containsTimestamp(final ZonedDateTime timestamp) { return this.getFirstEvent().compareTo(timestamp) <= 0 && timestamp.compareTo(this.getLastEvent()) <= 0; } @Override - public int compareTo(final WebSession session) - { - if ( this.getLastEvent().compareTo(session.getFirstEvent()) < 0) - { + public int compareTo(final WebSession session) { + if (this.getLastEvent().compareTo(session.getFirstEvent()) < 0) { return -1; - } - else if ( session.getLastEvent().compareTo(this.getFirstEvent()) < 0) - { + } else if (session.getLastEvent().compareTo(this.getFirstEvent()) < 0) { return 1; - } - else - { + } else { throw new IllegalStateException("Two sessions can no share same timestamp:" + this.toString() - +" vs " + session.toString()); + + " vs " + session.toString()); } } - public ZonedDateTime getFirstEvent() - { + public ZonedDateTime getFirstEvent() { final Field field = record.getField(_FIRST_EVENT_EPOCH_FIELD); - if ( field == null ) - { + if (field == null) { // Fallback by parsing the equivalent human readable field. return fromEpoch(toEpoch(record.getField(_FIRST_EVENT_DATETIME_FIELD).asString())); } - return fromEpoch(field.asLong()*1000); + return fromEpoch(field.asLong() * 1000); } - private void setFirstEvent(final long eventTimestamp) - { + private void setFirstEvent(final long eventTimestamp) { this.record.setField(_FIRST_EVENT_DATETIME_FIELD, FieldType.STRING, toFormattedDate(eventTimestamp)); - this.record.setField(_FIRST_EVENT_EPOCH_FIELD, FieldType.LONG, eventTimestamp/1000); + this.record.setField(_FIRST_EVENT_EPOCH_FIELD, FieldType.LONG, eventTimestamp / 1000); } - private void setLastEvent(final long eventTimestamp) - { + private void setLastEvent(final long eventTimestamp) { this.record.setField(_LAST_EVENT_DATETIME_FIELD, FieldType.STRING, toFormattedDate(eventTimestamp)); - this.record.setField(_LAST_EVENT_EPOCH_FIELD, FieldType.LONG, eventTimestamp/1000); + this.record.setField(_LAST_EVENT_EPOCH_FIELD, FieldType.LONG, eventTimestamp / 1000); } - public ZonedDateTime getLastEvent() - { + public ZonedDateTime getLastEvent() { final Field field = record.getField(_LAST_EVENT_EPOCH_FIELD); - if ( field == null ) - { + if (field == null) { // Fallback by parsing the equivalent human readable field. return fromEpoch(toEpoch(record.getField(_LAST_EVENT_DATETIME_FIELD).asString())); } - return fromEpoch(field.asLong()*1000); + return fromEpoch(field.asLong() * 1000); } - public String getSourceOfTraffic() - { - return concatFieldsOfTraffic((String)this.getValue(_SOT_SOURCE_FIELD), - (String)this.getValue(_SOT_MEDIUM_FIELD), - (String)this.getValue(_SOT_CAMPAIGN_FIELD), - (String)this.getValue(_SOT_KEYWORD_FIELD), - (String)this.getValue(_SOT_CONTENT_FIELD)); + public String getSourceOfTraffic() { + return concatFieldsOfTraffic((String) this.getValue(_SOT_SOURCE_FIELD), + (String) this.getValue(_SOT_MEDIUM_FIELD), + (String) this.getValue(_SOT_CAMPAIGN_FIELD), + (String) this.getValue(_SOT_KEYWORD_FIELD), + (String) this.getValue(_SOT_CONTENT_FIELD)); } @Override - public String toString() - { + public String toString() { return "WebSession{" + record.getField(_FIRST_EVENT_DATETIME_FIELD).asString() + - "-" + record.getField(_LAST_EVENT_DATETIME_FIELD).asString() + "}"; + "-" + record.getField(_LAST_EVENT_DATETIME_FIELD).asString() + "}"; } } @@ -1720,8 +1566,7 @@ public String toString() */ private class WebEvent extends RecordItem - implements Comparable - { + implements Comparable { private String sessionId; /** @@ -1729,15 +1574,13 @@ private class WebEvent */ private final ZonedDateTime timestamp; - public WebEvent(final Record record) - { + public WebEvent(final Record record) { super(record); this.timestamp = this.fromEpoch(record.getField(_TIMESTAMP_FIELD).asLong()); } @Override - public int compareTo(final WebEvent webEvent) - { + public int compareTo(final WebEvent webEvent) { return this.timestamp.compareTo(webEvent.getTimestamp()); } @@ -1746,36 +1589,31 @@ public int compareTo(final WebEvent webEvent) * * @return the timestamp of this event. */ - public ZonedDateTime getTimestamp() - { + public ZonedDateTime getTimestamp() { return this.timestamp; } - public String getVisitedPage() - { + public String getVisitedPage() { return record.getField(_VISITED_PAGE_FIELD).asString(); } @Override - public String getSessionId() - { - return this.sessionId==null?super.getSessionId():this.sessionId; + public String getSessionId() { + return this.sessionId == null ? super.getSessionId() : this.sessionId; } - public void rename(final String sessionId) - { + public void rename(final String sessionId) { debug("Rename " + this.record.getId() + " from " + super.getSessionId() + " to " + sessionId); this.sessionId = sessionId; this.record.setField("originalSessionId", FieldType.STRING, super.getSessionId()); } - public String getSourceOfTraffic() - { - return concatFieldsOfTraffic((String)this.getValue(_SOT_SOURCE_FIELD), - (String)this.getValue(_SOT_MEDIUM_FIELD), - (String)this.getValue(_SOT_CAMPAIGN_FIELD), - (String)this.getValue(_SOT_KEYWORD_FIELD), - (String)this.getValue(_SOT_CONTENT_FIELD)); + public String getSourceOfTraffic() { + return concatFieldsOfTraffic((String) this.getValue(_SOT_SOURCE_FIELD), + (String) this.getValue(_SOT_MEDIUM_FIELD), + (String) this.getValue(_SOT_CAMPAIGN_FIELD), + (String) this.getValue(_SOT_KEYWORD_FIELD), + (String) this.getValue(_SOT_CONTENT_FIELD)); } /** @@ -1783,17 +1621,15 @@ public String getSourceOfTraffic() * * @return a copy of the inner record. */ - public Record cloneRecord() - { + public Record cloneRecord() { final Record result = new StandardRecord(); this.record.getFieldsEntrySet() - .forEach(entry -> - { - if ( entry.getValue() != null ) - { - result.setField(entry.getValue()); - } - }); + .forEach(entry -> + { + if (entry.getValue() != null) { + result.setField(entry.getValue()); + } + }); result.setField(_SESSION_ID_FIELD, FieldType.STRING, this.getSessionId()); @@ -1801,8 +1637,7 @@ public Record cloneRecord() } @Override - public String toString() - { + public String toString() { return "WebEvent{sessionId='" + this.getSessionId() + "', timestamp=" + timestamp + '}'; } } @@ -1810,8 +1645,7 @@ public String toString() /** * This class is a basic WebItem that wraps an inner record. */ - private class RecordItem - { + private class RecordItem { /** * The record actually computed by this processor and returned at the end of the processing. */ @@ -1822,13 +1656,11 @@ private class RecordItem * * @param record the wrapped record. */ - public RecordItem(final Record record) - { + public RecordItem(final Record record) { this.record = record; } - public String getSessionId() - { + public String getSessionId() { return (String) this.getValue(_SESSION_ID_FIELD); } @@ -1840,10 +1672,9 @@ public String getSessionId() * * @return the value of the specified field name. */ - public Object getValue(final String fieldname) - { + public Object getValue(final String fieldname) { final Field field = this.record.getField(fieldname); - return field==null ? null : field.getRawValue(); + return field == null ? null : field.getRawValue(); } /** @@ -1853,8 +1684,7 @@ public Object getValue(final String fieldname) * * @return a ZonedDateTime corresponding to the provided epoch parameter with the system default timezone. */ - ZonedDateTime fromEpoch(final long epoch) - { + ZonedDateTime fromEpoch(final long epoch) { return ZonedDateTime.ofInstant(Instant.ofEpochMilli(Long.valueOf(epoch)), ZoneId.systemDefault()); } } diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webAnalytics/SetSourceOfTraffic.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/SetSourceOfTraffic.java similarity index 88% rename from logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webAnalytics/SetSourceOfTraffic.java rename to logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/SetSourceOfTraffic.java index e0484f41f..4a9608d9b 100644 --- a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webAnalytics/SetSourceOfTraffic.java +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/SetSourceOfTraffic.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.hurence.logisland.processor.webAnalytics; +package com.hurence.logisland.processor.webanalytics; import com.hurence.logisland.annotation.documentation.*; import com.hurence.logisland.classloading.PluginProxy; @@ -25,21 +25,21 @@ import com.hurence.logisland.record.FieldType; import com.hurence.logisland.record.Record; import com.hurence.logisland.service.cache.CacheService; +import com.hurence.logisland.service.datastore.model.MultiGetQueryRecord; +import com.hurence.logisland.service.datastore.model.MultiGetQueryRecordBuilder; +import com.hurence.logisland.service.datastore.model.MultiGetResponseRecord; +import com.hurence.logisland.service.datastore.model.exception.InvalidMultiGetQueryRecordException; import com.hurence.logisland.service.elasticsearch.ElasticsearchClientService; -import com.hurence.logisland.service.datastore.InvalidMultiGetQueryRecordException; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetQueryRecordBuilder; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; import com.hurence.logisland.validator.StandardValidators; import org.apache.commons.collections.map.HashedMap; import java.io.UnsupportedEncodingException; -import java.net.*; import java.net.URLDecoder; +import java.net.*; import java.util.*; import java.util.regex.Pattern; -import static com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic.*; +import static com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic.*; @Category(ComponentCategory.ANALYTICS) @Tags({"session", "traffic", "source", "web", "analytics"}) @@ -49,7 +49,7 @@ "To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available\n" + "i-e: **" + PROP_UTM_SOURCE + "**, **" + PROP_UTM_MEDIUM + "**, **" + PROP_UTM_CAMPAIGN + "**, **" + PROP_UTM_CONTENT + "**, **" + PROP_UTM_TERM + "**)\n" + ", the referer (**" + PROP_REFERER + "** property) and the first visited page of the session (**" + PROP_FIRST_VISITED_PAGE + "** property).\n" + - "By default the source of traffic information are placed in a flat structure (specified by the **" + PROP_SOURCE_OF_TRAFFIC_SUFFIX + "** property\n" + + "By default the source of traffic information are placed in a flat structure (specified by the **" + PROP_SOURCE_OF_TRAFFIC_PREFIX + "** property\n" + "with a default value of " + SOURCE_OF_TRAFFIC_SUFFIX_NAME + "). To work properly the SetSourceOfTraffic processor needs to have access to an \n" + "Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **" + PROP_ES_INDEX + "** property) " + "should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field " + @@ -72,7 +72,7 @@ public class SetSourceOfTraffic extends AbstractProcessor { protected static final String PROP_UTM_TERM = "utm_term.field"; protected static final String PROP_REFERER = "referer.field"; protected static final String PROP_FIRST_VISITED_PAGE = "first.visited.page.field"; - protected static final String PROP_SOURCE_OF_TRAFFIC_SUFFIX = "source_of_traffic.suffix"; + protected static final String PROP_SOURCE_OF_TRAFFIC_PREFIX = "source_of_traffic.prefix"; protected static final String PROP_DEBUG = "debug"; protected static final String DEFAULT_CACHE_VALIDITY_PERIOD = "0"; protected static final String SOURCE_OF_TRAFFIC_SUFFIX_NAME = "source_of_traffic"; @@ -87,6 +87,8 @@ public class SetSourceOfTraffic extends AbstractProcessor { private static final String ADWORDS = "adwords"; private static final String DOUBLECLICK = "DoubleClick"; protected boolean debug = false; + private final static String UTF8_PERCENT_ENCODED_CHAR = "%25"; + private String percentEncodedChar = UTF8_PERCENT_ENCODED_CHAR; public static final PropertyDescriptor ELASTICSEARCH_CLIENT_SERVICE = new PropertyDescriptor.Builder() .name("elasticsearch.client.service") @@ -205,9 +207,9 @@ public class SetSourceOfTraffic extends AbstractProcessor { .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) .build(); - private static final PropertyDescriptor SOURCE_OF_TRAFFIC_SUFFIX_FIELD = new PropertyDescriptor.Builder() - .name(PROP_SOURCE_OF_TRAFFIC_SUFFIX) - .description("Suffix for the source of the traffic related fields") + private static final PropertyDescriptor SOURCE_OF_TRAFFIC_PREFIX_FIELD = new PropertyDescriptor.Builder() + .name(PROP_SOURCE_OF_TRAFFIC_PREFIX) + .description("Prefix for the source of the traffic related fields") .required(false) .defaultValue(SOURCE_OF_TRAFFIC_SUFFIX_NAME) .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) @@ -277,7 +279,7 @@ public List getSupportedPropertyDescriptors() { descriptors.add(UTM_CAMPAIGN_FIELD); descriptors.add(UTM_CONTENT_FIELD); descriptors.add(UTM_TERM_FIELD); - descriptors.add(SOURCE_OF_TRAFFIC_SUFFIX_FIELD); + descriptors.add(SOURCE_OF_TRAFFIC_PREFIX_FIELD); descriptors.add(HIERARCHICAL); descriptors.add(ELASTICSEARCH_CLIENT_SERVICE); descriptors.add(CONFIG_CACHE_SERVICE); @@ -365,7 +367,7 @@ public void processSession(ProcessContext context, Record record) { final String utm_content_field = context.getPropertyValue(UTM_CONTENT_FIELD).asString(); final String utm_term_field = context.getPropertyValue(UTM_TERM_FIELD).asString(); final String first_visited_page_field = context.getPropertyValue(FIRST_VISITED_PAGE_FIELD).asString(); - final String SOURCE_OF_TRAFFIC_SUFFIX = context.getPropertyValue(SOURCE_OF_TRAFFIC_SUFFIX_FIELD).asString(); + final String SOURCE_OF_TRAFFIC_PREFIX = context.getPropertyValue(SOURCE_OF_TRAFFIC_PREFIX_FIELD).asString(); final String FLAT_SEPARATOR = "_"; final String referer_field = context.getPropertyValue(REFERER_FIELD).asString(); final boolean hierarchical = context.getPropertyValue(HIERARCHICAL).asBoolean(); @@ -379,60 +381,33 @@ public void processSession(ProcessContext context, Record record) { final Field referenceField = record.getField(referer_field); final String referer = referenceField!=null ? referenceField.asString() : null; + debug("Input record: %s", record); + if (adwords(location, sourceOfTraffic) || adwords(referer, sourceOfTraffic)) { // Already processed. } // Check if this is a custom campaign - else if (record.getField(utm_source_field) != null) { - String utm_source = null; - try { - utm_source = URLDecoder.decode(record.getField(utm_source_field).asString(), "UTF-8"); - } catch (UnsupportedEncodingException e) { - getLogger().error("UnsupportedEncodingException", e); - utm_source = record.getField(utm_source_field).asString(); - } + else if (record.checkFieldIsSet(utm_source_field)) { + String utm_source = decode_UTF8(record.getField(utm_source_field).asString()); sourceOfTraffic.setSource(utm_source); - if (record.getField(utm_campaign_field) != null) { - String utm_campaign = null; - try { - utm_campaign = URLDecoder.decode(record.getField(utm_campaign_field).asString(), "UTF-8"); - } catch (UnsupportedEncodingException e) { - getLogger().error("UnsupportedEncodingException", e); - utm_campaign = record.getField(utm_campaign_field).asString(); - } + if (record.checkFieldIsSet(utm_campaign_field)) { + String utm_campaign = decode_UTF8(record.getField(utm_campaign_field).asString()); sourceOfTraffic.setCampaign(utm_campaign); } - if (record.getField(utm_medium_field) != null) { - String utm_medium = null; - try { - utm_medium = URLDecoder.decode(record.getField(utm_medium_field).asString(), "UTF-8"); - } catch (UnsupportedEncodingException e) { - getLogger().error("UnsupportedEncodingException", e); - utm_medium = record.getField(utm_medium_field).asString(); - } + if (record.checkFieldIsSet(utm_medium_field)) { + String utm_medium = decode_UTF8(record.getField(utm_medium_field).asString()); sourceOfTraffic.setMedium(utm_medium); } - if (record.getField(utm_content_field) != null) { - String utm_content = null; - try { - utm_content = URLDecoder.decode(record.getField(utm_content_field).asString(), "UTF-8"); - } catch (UnsupportedEncodingException e) { - getLogger().error("UnsupportedEncodingException", e); - utm_content = record.getField(utm_content_field).asString(); - } + if (record.checkFieldIsSet(utm_content_field)) { + String utm_content = decode_UTF8(record.getField(utm_content_field).asString()); sourceOfTraffic.setContent(utm_content); } - if (record.getField(utm_term_field) != null) { - String utm_term = null; - try { - utm_term = URLDecoder.decode(record.getField(utm_term_field).asString(), "UTF-8"); - } catch (UnsupportedEncodingException e) { - getLogger().error("UnsupportedEncodingException", e); - utm_term = record.getField(utm_term_field).asString(); - } + if (record.checkFieldIsSet(utm_term_field)) { + String utm_term = decode_UTF8(record.getField(utm_term_field).asString()); sourceOfTraffic.setKeyword(utm_term); } } else if (referer != null) { + debug("%s", referer); String hostname; try { hostname = new URL(referer).getHost(); @@ -458,8 +433,10 @@ else if (record.getField(utm_source_field) != null) { } else { return; } + debug("%s", domain); // Is referer under the webshop domain ? if (is_refer_under_site_domain(domain, context, record)) { + debug("This is a direct access"); // This is a direct access sourceOfTraffic.setSource(DIRECT_TRAFFIC); sourceOfTraffic.setMedium(""); @@ -468,11 +445,13 @@ else if (record.getField(utm_source_field) != null) { } else { // Is the referer a known search engine ? if (is_search_engine(domain, context, record)) { + debug("This is an organic search engine"); // This is an organic search engine sourceOfTraffic.setSource(domain); sourceOfTraffic.setMedium(SEARCH_ENGINE_SITE); sourceOfTraffic.setOrganic_searches(Boolean.TRUE); } else if (is_social_network(domain, context, record)) { + debug("This is social network"); // This is social network sourceOfTraffic.setSource(domain); sourceOfTraffic.setMedium(SOCIAL_NETWORK_SITE); @@ -481,30 +460,26 @@ else if (record.getField(utm_source_field) != null) { // then it is a referring site sourceOfTraffic.setSource(domain); sourceOfTraffic.setMedium(REFERRING_SITE); - String referral_path = null; - try { - referral_path = URLDecoder.decode(referer, "UTF-8"); - } catch (UnsupportedEncodingException e) { - getLogger().error("UnsupportedEncodingException", e); - referral_path = referer; - } + String referral_path = decode_UTF8(referer); sourceOfTraffic.setReferral_path(referral_path); } } } else { + debug("This is a direct access"); // Direct access sourceOfTraffic.setSource(DIRECT_TRAFFIC); sourceOfTraffic.setMedium(""); sourceOfTraffic.setCampaign(DIRECT_TRAFFIC); } if (hierarchical) { - record.setField(SOURCE_OF_TRAFFIC_SUFFIX, FieldType.MAP, sourceOfTraffic.getSourceOfTrafficMap()); + record.setField(SOURCE_OF_TRAFFIC_PREFIX, FieldType.MAP, sourceOfTraffic.getSourceOfTrafficMap()); } else { Map sot = sourceOfTraffic.getSourceOfTrafficMap(); sot.forEach((k, v) -> { - record.setField(SOURCE_OF_TRAFFIC_SUFFIX + FLAT_SEPARATOR + k, supportedSourceOfTrafficFieldNames.get(k), v); + record.setField(SOURCE_OF_TRAFFIC_PREFIX + FLAT_SEPARATOR + k, supportedSourceOfTrafficFieldNames.get(k), v); }); } + debug("Output record: %s", record); } private boolean is_refer_under_site_domain(String domain, ProcessContext context, Record record) { @@ -568,7 +543,7 @@ private boolean is_search_engine(String domain, ProcessContext context, Record r } private boolean has_domain_flag(String domain, String flag, ProcessContext context, Record record) { - final String source_of_traffic_suffix = context.getPropertyValue(SOURCE_OF_TRAFFIC_SUFFIX_FIELD).asString(); + final String source_of_traffic_prefix = context.getPropertyValue(SOURCE_OF_TRAFFIC_PREFIX_FIELD).asString(); final long cacheValidityPeriodSec = context.getPropertyValue(CONFIG_CACHE_VALIDITY_TIMEOUT).asLong(); boolean has_flag = false; /** @@ -664,7 +639,7 @@ private boolean has_domain_flag(String domain, String flag, ProcessContext conte if (debug) { // Add some debug fields - record.setField(source_of_traffic_suffix + DEBUG_FROM_CACHE_SUFFIX, FieldType.BOOLEAN, fromCache); + record.setField(source_of_traffic_prefix + DEBUG_FROM_CACHE_SUFFIX, FieldType.BOOLEAN, fromCache); } return has_flag; } @@ -734,5 +709,51 @@ public SourceOfTrafficMap() { } } + /* + * Decode URL using UTF-8 charset + */ + private String decode_UTF8(String encodedValue){ + return decode_UTF8(encodedValue, true); + } + + private String decode_UTF8(String encodedValue, boolean tryTrick){ + String decodedValue = null; + try { + decodedValue = URLDecoder.decode(encodedValue, "UTF-8"); + } catch (UnsupportedEncodingException e) { + getLogger().error("UnsupportedEncodingException", e); + decodedValue = encodedValue; + } catch (IllegalArgumentException e) { + if (tryTrick) { + encodedValue = encodedValue.replaceAll("%(?![0-9a-fA-F]{2})", "UTF-8"); + decodedValue = decode_UTF8(encodedValue, false); + } + else { + getLogger().error("IllegalArgumentException", e); + decodedValue = encodedValue; + } + } catch (Exception e) { + getLogger().error("Exception", e); + decodedValue = encodedValue; + } + return decodedValue; + } + + /** + * Facility to log debug. + * + * @param format the format of the String. + * @param args the arguments. + */ + private void debug(final String format, final Object... args) { + if (debug) { + if (args.length == 0) { + getLogger().debug(format); + } else { + String newLineFormat = format + "\n"; + getLogger().debug(String.format(newLineFormat, args)); + } + } + } } diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/URIDecoder.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/URIDecoder.java new file mode 100644 index 000000000..2c8d8c5b9 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/URIDecoder.java @@ -0,0 +1,123 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics; + +import com.hurence.logisland.annotation.documentation.CapabilityDescription; +import com.hurence.logisland.annotation.documentation.ExtraDetailFile; +import com.hurence.logisland.annotation.documentation.Tags; +import com.hurence.logisland.component.InitializationException; +import com.hurence.logisland.component.PropertyDescriptor; +import com.hurence.logisland.processor.AbstractProcessor; +import com.hurence.logisland.processor.ProcessContext; +import com.hurence.logisland.processor.ProcessError; +import com.hurence.logisland.record.FieldType; +import com.hurence.logisland.record.Record; +import com.hurence.logisland.validator.StandardValidators; + +import java.net.URI; +import java.util.*; + +@Tags({"record", "fields", "Decode"}) +@CapabilityDescription("Decode one or more field containing an URI with possibly special chars encoded\n" + + "...") +@ExtraDetailFile("./details/URLDecoder-Detail.rst") +public class URIDecoder extends AbstractProcessor { + + private static final PropertyDescriptor FIELDS_TO_DECODE_PROP = new PropertyDescriptor.Builder() + .name("decode.fields") + .description("List of fields (URL) to decode") + .required(true) + .addValidator(StandardValidators.COMMA_SEPARATED_LIST_VALIDATOR) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build(); + + private Set fieldsToDecode; + + @Override + public List getSupportedPropertyDescriptors() { + final List descriptors = new ArrayList<>(); + descriptors.add(FIELDS_TO_DECODE_PROP); + return Collections.unmodifiableList(descriptors); + } + + + public void init(ProcessContext context) throws InitializationException { + super.init(context); + initFieldsToDecode(context); + } + + public void initFieldsToDecode(ProcessContext context) { + String commaSeparatedFields = context.getPropertyValue(FIELDS_TO_DECODE_PROP).asString(); + String[] fieldsArr = commaSeparatedFields.split("\\s*,\\s*"); + fieldsToDecode = new HashSet(); + Collections.addAll(fieldsToDecode, fieldsArr); + } + + @Override + public Collection process(ProcessContext context, Collection records) { + for (Record record : records) { + updateRecord(record); + } + return records; + } + + + private void updateRecord(Record record) { + fieldsToDecode.forEach(fieldName -> { + if (record.hasField(fieldName)) { + String uriStr = record.getField(fieldName).asString(); + if (uriStr != null && !uriStr.isEmpty()) { + decode(uriStr, record, fieldName); + } + } + }); + } + + private void decode(String uriStr, Record record, String fieldNameToSetDecodedUri) + { + try { + String decodedURI = uriToDecodedString(new URI(uriStr)); + if (!decodedURI.equals(uriStr)) { + final FieldType fieldType = record.getField(fieldNameToSetDecodedUri).getType(); + record.removeField(fieldNameToSetDecodedUri); + record.setField(fieldNameToSetDecodedUri, fieldType, decodedURI); + } + } catch (Exception e){ + getLogger().error("Error while trying to decode uri {}, for record {}.", new Object[]{uriStr, record.getId()}, e); + String msg = "Could not process uri : '" + uriStr + "'.\n Cause: " + e.getMessage(); + record.addError(ProcessError.STRING_FORMAT_ERROR.toString(), getLogger(), msg); + } + } + + + /**A URI is like + [:][#] + @see URI + */ + private String uriToDecodedString(URI uri) { + String uriStr = ""; + if (uri.getScheme() != null && !uri.getScheme().isEmpty()) { + uriStr += uri.getScheme() + ":"; + } + if (uri.getSchemeSpecificPart() != null && !uri.getSchemeSpecificPart().isEmpty()) { + uriStr += uri.getSchemeSpecificPart(); + } + if (uri.getFragment() != null && !uri.getFragment().isEmpty()) { + uriStr += "#" + uri.getFragment(); + } + return uriStr; + } +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/URLCleaner.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/URLCleaner.java new file mode 100644 index 000000000..86557fcd5 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/URLCleaner.java @@ -0,0 +1,261 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics; + +import com.hurence.logisland.annotation.documentation.CapabilityDescription; +import com.hurence.logisland.annotation.documentation.ExtraDetailFile; +import com.hurence.logisland.annotation.documentation.Tags; +import com.hurence.logisland.component.AllowableValue; +import com.hurence.logisland.component.InitializationException; +import com.hurence.logisland.component.PropertyDescriptor; +import com.hurence.logisland.processor.AbstractProcessor; +import com.hurence.logisland.processor.ProcessContext; +import com.hurence.logisland.processor.ProcessError; +import com.hurence.logisland.processor.webanalytics.modele.AllQueryParameterRemover; +import com.hurence.logisland.processor.webanalytics.modele.KeepSomeQueryParameterRemover; +import com.hurence.logisland.processor.webanalytics.modele.QueryParameterRemover; +import com.hurence.logisland.processor.webanalytics.modele.RemoveSomeQueryParameterRemover; +import com.hurence.logisland.record.FieldType; +import com.hurence.logisland.record.Record; +import com.hurence.logisland.validator.Configuration; +import com.hurence.logisland.validator.StandardValidators; +import com.hurence.logisland.validator.ValidationResult; + +import java.util.*; + +@Tags({"record", "fields", "url", "params", "param", "remove", "keep", "query", "uri", "parameter", "clean", "decoded", "raw"}) +@CapabilityDescription("Remove some or all query parameters from one or more field containing an uri which should be preferably encoded.\n" + + "If the uri is not encoded the behaviour is not defined in case the decoded uri contains '#', '?', '=', '&' which were encoded.\n" + + "Indeed this processor assumes that the start of query part of the uri start at the first '?' then end at the first '#' or at the end of the uri as\n"+ + "specified by rfc3986 available at https://tools.ietf.org/html/rfc3986#section-3.4. \n" + + "We assume as well that key value pairs are separed by '=', and are separed by '&': exemple 'param1=value1¶m2=value2'.\n" + + "The processor can remove also parameters that have only a name and no value. The character used to separate the key and the value '=' is configurable.\n" + + "The character used to separate two parameters '&' is also configurable.") +//Another solution could be to use the regex specified here https://tools.ietf.org/html/rfc3986#appendix-B +//to get the query part. +//the query part can be anything ! and is not necessary a list of key value apram... +//exemple http://host.com/path?mysyntax&pretty&size=2#anchor +@ExtraDetailFile("./details/URLDecoder-Detail.rst") +public class URLCleaner extends AbstractProcessor { + + public static final AllowableValue OVERWRITE_EXISTING = + new AllowableValue("overwrite_existing", "overwrite existing field", "if field already exist"); + + public static final AllowableValue KEEP_OLD_FIELD = + new AllowableValue("keep_only_old_field", "keep only old field value", "keep only old field"); + + public static final PropertyDescriptor CONFLICT_RESOLUTION_POLICY = new PropertyDescriptor.Builder() + .name("conflict.resolution.policy") + .description("What to do when a field with the same name already exists ?") + .required(false) + .defaultValue(KEEP_OLD_FIELD.getValue()) + .allowableValues(OVERWRITE_EXISTING, KEEP_OLD_FIELD) + .build(); + + public static final PropertyDescriptor URL_FIELDS = new PropertyDescriptor.Builder() + .name("url.fields") + .description("List of fields (URL) to decode and optionnaly the output field for the url modified. Syntax should be " + + ",,...,. So fields name can not contain ',' nor ':'") + .required(true) + .addValidator(StandardValidators.COMMA_SEPARATED_LIST_COLON_SUB_SEPARATOR_VALIDATOR) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build(); + + public static final String PARAM_NAMES_INCLUDE_PROP_NAME = "url.keep.params"; + public static final String REMOVE_PARAMS_PROP_NAME = "url.remove.params"; + public static final String REMOVE_ALL_PARAMS_PROP_NAME = "url.remove.all"; + + public static final PropertyDescriptor KEEP_PARAMS = new PropertyDescriptor.Builder() + .name(PARAM_NAMES_INCLUDE_PROP_NAME) + .description("List of param names to keep in the input url (others will be removed). Can not be given at the same time as " + + REMOVE_PARAMS_PROP_NAME + " or " + REMOVE_ALL_PARAMS_PROP_NAME) + .required(false) + .addValidator(StandardValidators.COMMA_SEPARATED_LIST_VALIDATOR) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build(); + + public static final PropertyDescriptor REMOVE_PARAMS = new PropertyDescriptor.Builder() + .name(REMOVE_PARAMS_PROP_NAME) + .description("List of param names to remove from the input url (others will be kept). Can not be given at the same time as " + + PARAM_NAMES_INCLUDE_PROP_NAME + " or " + REMOVE_ALL_PARAMS_PROP_NAME) + .required(false) + .addValidator(StandardValidators.COMMA_SEPARATED_LIST_VALIDATOR) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build(); + + public static final PropertyDescriptor REMOVE_ALL_PARAMS = new PropertyDescriptor.Builder() + .name(REMOVE_ALL_PARAMS_PROP_NAME) + .description("Remove all params if true.") + .required(false) + .addValidator(StandardValidators.BOOLEAN_VALIDATOR) + .build(); + + public static final PropertyDescriptor PARAMETER_SEPARATOR = new PropertyDescriptor.Builder() + .name("parameter.separator") + .description("the character to use to separate the parameters in the query part of the uris") + .required(false) + .defaultValue("&") + .addValidator(StandardValidators.CHAR_VALIDATOR) + .build(); + + public static final PropertyDescriptor KEY_VALUE_SEPARATOR = new PropertyDescriptor.Builder() + .name("key.value.separator") + .description("the character to use to separate the parameter name from the parameter value in the query part of the uris") + .required(false) + .defaultValue("=") + .addValidator(StandardValidators.CHAR_VALIDATOR) + .build(); + + private final Map fieldsToDecodeToOutputField = new HashMap<>(); + private String conflictPolicy; + private QueryParameterRemover remover; + + @Override + public List getSupportedPropertyDescriptors() { + final List descriptors = new ArrayList<>(); + descriptors.add(URL_FIELDS); + descriptors.add(CONFLICT_RESOLUTION_POLICY); + descriptors.add(KEEP_PARAMS); + descriptors.add(REMOVE_PARAMS); + descriptors.add(REMOVE_ALL_PARAMS); + descriptors.add(PARAMETER_SEPARATOR); + descriptors.add(KEY_VALUE_SEPARATOR); + return Collections.unmodifiableList(descriptors); + } + + @Override + protected Collection customValidate(Configuration context) { + final List validationResults = new ArrayList<>(super.customValidate(context)); + /** + * Only one of both properties may be set. + */ + if (context.getPropertyValue(REMOVE_ALL_PARAMS).isSet()) { + if (context.getPropertyValue(REMOVE_ALL_PARAMS).asBoolean()) { + if (context.getPropertyValue(KEEP_PARAMS).isSet() || context.getPropertyValue(REMOVE_PARAMS).isSet()) + { + validationResults.add( + new ValidationResult.Builder() + .explanation(KEEP_PARAMS.getName() + " and " + REMOVE_PARAMS.getName() + + " properties are mutually exclusive and can not be set if " + REMOVE_ALL_PARAMS.getName() + " is set to true") + .valid(false) + .build()); + } + } else { + if (!context.getPropertyValue(KEEP_PARAMS).isSet() && !context.getPropertyValue(REMOVE_PARAMS).isSet()) { + validationResults.add( + new ValidationResult.Builder() + .explanation(KEEP_PARAMS.getName() + " or " + REMOVE_PARAMS.getName() + + " properties is required when " + REMOVE_ALL_PARAMS.getName() + " is set to false") + .valid(false) + .build()); + } + } + } + if (context.getPropertyValue(KEEP_PARAMS).isSet() && context.getPropertyValue(REMOVE_PARAMS).isSet()) + { + validationResults.add( + new ValidationResult.Builder() + .explanation(KEEP_PARAMS.getName() + " and " + REMOVE_PARAMS.getName() + + " properties are mutually exclusive so it can not be set both at the same time.") + .valid(false) + .build()); + } + return validationResults; + } + + public void init(ProcessContext context) throws InitializationException { + super.init(context); + initFieldsToDecodeToOutputFiles(context); + this.conflictPolicy = context.getPropertyValue(CONFLICT_RESOLUTION_POLICY).asString(); + initRemover(context); + } + + public void initFieldsToDecodeToOutputFiles(ProcessContext context) { + fieldsToDecodeToOutputField.clear(); + String commaSeparatedFields = context.getPropertyValue(URL_FIELDS).asString(); + String[] fieldsArr = commaSeparatedFields.split("\\s*,\\s*"); + for (String field : fieldsArr) { + if (field.contains(":")) { + String[] fieldPair = field.split("\\s*:\\s*"); + fieldsToDecodeToOutputField.put(fieldPair[0], fieldPair[1]); + } else { + fieldsToDecodeToOutputField.put(field, field); + } + } + } + + public void initRemover(ProcessContext context) throws InitializationException { + char keyValueSeparator = context.getPropertyValue(KEY_VALUE_SEPARATOR).asChar(); + char parameterSeparator = context.getPropertyValue(PARAMETER_SEPARATOR).asChar(); + if (context.getPropertyValue(KEEP_PARAMS).isSet()) { + String commaSeparatedKeepParams = context.getPropertyValue(KEEP_PARAMS).asString(); + String[] keepParamsArr = commaSeparatedKeepParams.split("\\s*,\\s*"); + final Set keepParams = new HashSet<>(Arrays.asList(keepParamsArr)); + this.remover = new KeepSomeQueryParameterRemover(keepParams, keyValueSeparator, parameterSeparator); + return; + } + if (context.getPropertyValue(REMOVE_PARAMS).isSet()) { + String commaSeparatedRemoveParam = context.getPropertyValue(REMOVE_PARAMS).asString(); + String[] removeParamsArr = commaSeparatedRemoveParam.split("\\s*,\\s*"); + final Set removeParams = new HashSet<>(Arrays.asList(removeParamsArr)); + this.remover = new RemoveSomeQueryParameterRemover(removeParams, keyValueSeparator, parameterSeparator); + return; + } + if (!context.getPropertyValue(REMOVE_ALL_PARAMS).isSet() || context.getPropertyValue(REMOVE_ALL_PARAMS).asBoolean()) { + this.remover = new AllQueryParameterRemover(); + } else { + throw new InitializationException("No remover was built, should never happen !" + + "Problem with configuration checking in processor."); + } + } + + @Override + public Collection process(ProcessContext context, Collection records) { + for (Record record : records) { + updateRecord(record); + } + return records; + } + + + private void updateRecord(Record record) { + fieldsToDecodeToOutputField.entrySet().forEach(kv -> { + tryUpdatingRecord(record, kv); + }); + } + + private void tryUpdatingRecord(Record record, Map.Entry kv) { + String inputFieldName = kv.getKey(); + String outputFieldName = kv.getValue(); + if (record.hasField(inputFieldName)) { + String value = record.getField(inputFieldName).asString(); + if (value != null) { + String cleanedUrl = null; + try { + cleanedUrl = remover.removeQueryParameters(value); + } catch (Exception e) { + getLogger().error("Error for url {}, for record {}.", new Object[]{value, record.getId()}, e); + String msg = "Could not process url : '" + value + "'.\n Cause: " + e.getMessage(); + record.addError(ProcessError.STRING_FORMAT_ERROR.toString(), getLogger(), msg); + return; + } + if (!record.hasField(outputFieldName) || conflictPolicy.equals(OVERWRITE_EXISTING.getValue())) { + record.setField(outputFieldName, FieldType.STRING, cleanedUrl); + } + } + } + } +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webAnalytics/URLDecoder.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/URLDecoder.java similarity index 82% rename from logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webAnalytics/URLDecoder.java rename to logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/URLDecoder.java index b153ecece..fd1827fe5 100644 --- a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webAnalytics/URLDecoder.java +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/URLDecoder.java @@ -13,9 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.hurence.logisland.processor.webAnalytics; +package com.hurence.logisland.processor.webanalytics; -import com.hurence.logisland.annotation.behavior.DynamicProperty; import com.hurence.logisland.annotation.documentation.CapabilityDescription; import com.hurence.logisland.annotation.documentation.ExtraDetailFile; import com.hurence.logisland.annotation.documentation.Tags; @@ -23,11 +22,10 @@ import com.hurence.logisland.component.PropertyDescriptor; import com.hurence.logisland.processor.AbstractProcessor; import com.hurence.logisland.processor.ProcessContext; +import com.hurence.logisland.processor.ProcessError; import com.hurence.logisland.record.FieldType; import com.hurence.logisland.record.Record; import com.hurence.logisland.validator.StandardValidators; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.io.UnsupportedEncodingException; import java.util.*; @@ -35,14 +33,9 @@ @Tags({"record", "fields", "Decode"}) @CapabilityDescription("Decode one or more field containing an URL with possibly special chars encoded\n" + "...") -@DynamicProperty(name = "fields to decode", - supportsExpressionLanguage = false, - value = "a default value", - description = "Decode one or more fields from the record ") @ExtraDetailFile("./details/URLDecoder-Detail.rst") public class URLDecoder extends AbstractProcessor { - private static final Logger logger = LoggerFactory.getLogger(URLDecoder.class); private static final String UTF8_CHARSET = "UTF-8"; private final HashSet fieldsToDecode = new HashSet(); private final static String UTF8_PERCENT_ENCODED_CHAR = "%25"; @@ -71,18 +64,6 @@ public List getSupportedPropertyDescriptors() { return Collections.unmodifiableList(descriptors); } - - @Override - protected PropertyDescriptor getSupportedDynamicPropertyDescriptor(final String propertyDescriptorName) { - return new PropertyDescriptor.Builder() - .name(propertyDescriptorName) - .expressionLanguageSupported(true) - .addValidator(StandardValidators.COMMA_SEPARATED_LIST_VALIDATOR) - .required(false) - .dynamic(true) - .build(); - } - public void init(ProcessContext context) throws InitializationException { super.init(context); String commaSeparatedFields = context.getPropertyValue(FIELDS_TO_DECODE_PROP).asString(); @@ -97,7 +78,7 @@ public void init(ProcessContext context) throws InitializationException { percentEncodedChar = java.net.URLEncoder.encode("%", charset); } catch (UnsupportedEncodingException e1) { percentEncodedChar=UTF8_PERCENT_ENCODED_CHAR; // Default to UTF-8 encoded char - logger.warn(e1.toString()); + getLogger().warn("Error while initializing percentEncodedChar", e1); } } @@ -111,7 +92,6 @@ public Collection process(ProcessContext context, Collection rec private void updateRecord(ProcessContext context, Record record, HashSet fields) { - String charset = context.getPropertyValue(CHARSET_PROP).asString(); if ((fields == null) || fields.isEmpty()) { return; @@ -139,12 +119,15 @@ private void decode (String value, String charset, Record record, String fieldNa if (tryTrick) { value = value.replaceAll("%(?![0-9a-fA-F]{2})", percentEncodedChar); decode(value, charset, record, fieldName, false); + } else { + getLogger().error("Error while trying to decode url {}, for record {}.", new Object[]{value, record.getId()}, e); + String msg = "Could not process url : '" + value + "'.\n Cause: " + e.getMessage(); + record.addError(ProcessError.STRING_FORMAT_ERROR.toString(), getLogger(), msg); } - else { - logger.warn(e.toString()); - } - } catch (Exception e){ - logger.warn(e.toString()); + } catch (Exception e) { + getLogger().error("Error while trying to decode url {}, for record {}.", new Object[]{value, record.getId()}, e); + String msg = "Could not process url : '" + value + "'.\n Cause: " + e.getMessage(); + record.addError(ProcessError.STRING_FORMAT_ERROR.toString(), getLogger(), msg); } } diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/AbstractQueryParameterRemover.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/AbstractQueryParameterRemover.java new file mode 100644 index 000000000..33f8be3a8 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/AbstractQueryParameterRemover.java @@ -0,0 +1,76 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.modele; + +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public abstract class AbstractQueryParameterRemover implements QueryParameterRemover { + private final char keyValueSeparator; + private final char parameterSeparator; + + public AbstractQueryParameterRemover(char keyValueSeparator, char parameterSeparator) { + this.keyValueSeparator = keyValueSeparator; + this.parameterSeparator = parameterSeparator; + } + + public String removeQueryParameters(String urlStr) { + SplittedURI guessSplittedURI = SplittedURI.fromMalFormedURI(urlStr); + if (guessSplittedURI.getQuery().isEmpty()) return urlStr; + Map paramsNameValue = Arrays.stream(guessSplittedURI.getQuery().split(String.valueOf(parameterSeparator))) + .map(queryString -> { + String[] split = queryString.split(String.valueOf(keyValueSeparator)); + if (split.length==1 && queryString.contains(String.valueOf(keyValueSeparator))) { + return new String[]{split[0], ""}; + } else { + return split; + } + }) + .collect(LinkedHashMap::new, + (map, keyValueArr) -> { + String[] values = Arrays.copyOfRange(keyValueArr, 1, keyValueArr.length); + if (values.length == 0) { + map.put(keyValueArr[0], null); + } else { + map.put(keyValueArr[0], String.join("", values)); + } + }, + LinkedHashMap::putAll); + + List> paramsNameValueFiltred = filterParams(paramsNameValue); + if (paramsNameValueFiltred.isEmpty()) { + return guessSplittedURI.getBeforeQueryWithoutQuestionMark() + guessSplittedURI.getAfterQuery(); + } else { + String newQueryString = paramsNameValueFiltred.stream() + .map(entry -> { + if (entry.getValue() == null) { + return entry.getKey(); + } else { + return entry.getKey() + keyValueSeparator + entry.getValue(); + } + }) + .collect(Collectors.joining(String.valueOf(parameterSeparator))); + return guessSplittedURI.getBeforeQuery() + + newQueryString + + guessSplittedURI.getAfterQuery(); + } + } + + protected abstract List> filterParams(Map paramsNameValue); +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/AllQueryParameterRemover.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/AllQueryParameterRemover.java new file mode 100644 index 000000000..f6abe7e8e --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/AllQueryParameterRemover.java @@ -0,0 +1,24 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.modele; + +public class AllQueryParameterRemover implements QueryParameterRemover { + + public String removeQueryParameters(String urlStr) { + SplittedURI guessSplittedURI = SplittedURI.fromMalFormedURI(urlStr); + return guessSplittedURI.getBeforeQueryWithoutQuestionMark() + guessSplittedURI.getAfterQuery(); + } +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/Event.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/Event.java new file mode 100644 index 000000000..c628acd89 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/Event.java @@ -0,0 +1,304 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.modele; + +import com.hurence.logisland.processor.webanalytics.IncrementalWebSession; +import com.hurence.logisland.record.FieldType; +import com.hurence.logisland.record.Record; +import com.hurence.logisland.record.StandardRecord; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.time.ZonedDateTime; +import java.util.Map; + +/** + * This class represents a web event that can be optionally renamed if a new session should have + * been created. + */ +public class Event + extends RecordItem + implements Comparable { + + private static Logger logger = LoggerFactory.getLogger(Event.class); + + /** + * return a new Event based on the specified map that represents a web event in elasticsearch. + * + * @param sourceAsMap the event stored in elasticsearch. + * @param recordType the recordType value for record. + * @return a new Event based on the specified map that represents a web event in elasticsearch. + */ + public static Event fromMap(final Map sourceAsMap, InternalFields eventsInternalFields, String recordType) { + final Record record = new StandardRecord(recordType); + sourceAsMap.forEach((key, value) -> { + record.setField(key, FieldType.STRING, value); + }); + return new Event(record, eventsInternalFields); + } + + + /** + * The timestamp to sort web event from. + */ + private final ZonedDateTime timestamp; + private final InternalFields fieldsNames; + + public Event(final Record record, InternalFields fieldsNames) { + super(record); + this.fieldsNames = fieldsNames; + this.timestamp = this.fromEpochMilli(getEpochTimeStampMilli()); + } + + public long getEpochTimeStampMilli() { + return record.getField(fieldsNames.getTimestampField()).asLong(); + } + + public long getEpochTimeStampSeconds() { + return record.getField(fieldsNames.getTimestampField()).asLong() / 1000L; + } + + @Override + public int compareTo(final Event webEvent) { + if (this.getId() != null && webEvent.getId() != null) { + int idDiff = this.getId().compareTo(webEvent.getId()); + if (idDiff == 0) { + return 0; + } else { + int timestampDiff = this.timestamp.compareTo(webEvent.getTimestamp()); + if (timestampDiff != 0) return timestampDiff; + return idDiff; + } + } + int timestampDiff = this.timestamp.compareTo(webEvent.getTimestamp()); + if (timestampDiff != 0) return timestampDiff; + if (this.getId() == null && webEvent.getId() == null) { + return 0; + } + if (this.getId() == null) { + return -1; + } else { + return 1; + } + } + + public String getId() { + return this.getRecord().getId(); + } + + + /** + * Returns the timestamp of this event. + * + * @return the timestamp of this event. + */ + public ZonedDateTime getTimestamp() { + return this.timestamp; + } + + public String getVisitedPage() { + return this.getStringValue(fieldsNames.visitedPageField); + } + + public void setSessionId(final String sessionId) { + if (getSessionId().equals(sessionId)) return;//do nothing if not changing + logger.debug("change sessionId of event " + this.record.getId() + " from " + getSessionId() + " to " + sessionId); + this.record.setField(fieldsNames.originalSessionIdField, FieldType.STRING, calculOriginalSessionId(sessionId)); + this.record.setField(fieldsNames.sessionIdField, FieldType.STRING, sessionId); + } + + private String calculOriginalSessionId(String sessionId) { + final String[] sessionIdSplitted = sessionId.split(IncrementalWebSession.EXTRA_SESSION_DELIMITER); + return sessionIdSplitted[0]; + } + + public String getSessionId() { + return this.getStringValue(fieldsNames.sessionIdField); + } + + /** + * May be null + * @return + */ + public String getOriginalSessionId() { + return this.getStringValue(fieldsNames.originalSessionIdField); + } + + public String getOriginalSessionIdOrSessionId() { + String orignalSessionId = getOriginalSessionId(); + if (orignalSessionId==null) return getSessionId(); + return orignalSessionId; + } + + + public String getSourceOfTraffic() { + return concatFieldsOfTraffic(this.getStringValue(fieldsNames.sourceOffTrafficSourceField), + this.getStringValue(fieldsNames.sourceOffTrafficMediumField), + this.getStringValue(fieldsNames.sourceOffTrafficCampaignField), + this.getStringValue(fieldsNames.sourceOffTrafficKeyWordField), + this.getStringValue(fieldsNames.sourceOffTrafficContentField)); + } + + /** + * Returns a copy of the inner record. + * + * @return a copy of the inner record. + */ + public Record cloneRecord() { + return new StandardRecord(this.record); + } + + @Override + public String toString() { + return "WebEvent{sessionId='" + this.getSessionId() + "', timestamp=" + timestamp + '}'; + } + + public static class InternalFields { + private String timestampField; + private String visitedPageField; + private String sessionIdField; + private String originalSessionIdField; + private String sourceOffTrafficSourceField; + private String sourceOffTrafficMediumField; + private String sourceOffTrafficCampaignField; + private String sourceOffTrafficKeyWordField; + private String sourceOffTrafficContentField; + private String newSessionReasonField; + private String userIdField; + private String transactionIdField; + private String transactionIdsField; + + + public InternalFields() { } + + public String getTimestampField() { + return timestampField; + } + + public InternalFields setTimestampField(String timestampField) { + this.timestampField = timestampField; + return this; + } + + public String getVisitedPageField() { + return visitedPageField; + } + + public InternalFields setVisitedPageField(String visitedPageField) { + this.visitedPageField = visitedPageField; + return this; + } + + public String getSessionIdField() { + return sessionIdField; + } + + public InternalFields setSessionIdField(String sessionIdField) { + this.sessionIdField = sessionIdField; + return this; + } + + public String getSourceOffTrafficSourceField() { + return sourceOffTrafficSourceField; + } + + public InternalFields setSourceOffTrafficSourceField(String sourceOffTrafficSourceField) { + this.sourceOffTrafficSourceField = sourceOffTrafficSourceField; + return this; + } + + public String getSourceOffTrafficMediumField() { + return sourceOffTrafficMediumField; + } + + public InternalFields setSourceOffTrafficMediumField(String sourceOffTrafficMediumField) { + this.sourceOffTrafficMediumField = sourceOffTrafficMediumField; + return this; + } + + public String getSourceOffTrafficCampaignField() { + return sourceOffTrafficCampaignField; + } + + public InternalFields setSourceOffTrafficCampaignField(String sourceOffTrafficCampaignField) { + this.sourceOffTrafficCampaignField = sourceOffTrafficCampaignField; + return this; + } + + public String getSourceOffTrafficKeyWordField() { + return sourceOffTrafficKeyWordField; + } + + public InternalFields setSourceOffTrafficKeyWordField(String sourceOffTrafficKeyWordField) { + this.sourceOffTrafficKeyWordField = sourceOffTrafficKeyWordField; + return this; + } + + public String getSourceOffTrafficContentField() { + return sourceOffTrafficContentField; + } + + public InternalFields setSourceOffTrafficContentField(String sourceOffTrafficContentField) { + this.sourceOffTrafficContentField = sourceOffTrafficContentField; + return this; + } + + public String getNewSessionReasonField() { + return newSessionReasonField; + } + + public InternalFields setNewSessionReasonField(String newSessionReasonField) { + this.newSessionReasonField = newSessionReasonField; + return this; + } + + public String getUserIdField() { + return userIdField; + } + + public InternalFields setUserIdField(String userIdField) { + this.userIdField = userIdField; + return this; + } + + public String getOriginalSessionIdField() { + return originalSessionIdField; + } + + public InternalFields setOriginalSessionIdField(String originalSessionIdField) { + this.originalSessionIdField = originalSessionIdField; + return this; + } + + public String getTransactionIdField() { + return transactionIdField; + } + + public InternalFields setTransactionIdField(String transactionId) { + this.transactionIdField = transactionId; + return this; + } + + public String getTransactionIdsField() { + return transactionIdsField; + } + + public InternalFields setTransactionIdsField(String transactionIdsField) { + this.transactionIdsField = transactionIdsField; + return this; + } + } +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/Events.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/Events.java new file mode 100644 index 000000000..cf25973bf --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/Events.java @@ -0,0 +1,137 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.modele; + +import java.util.*; + +/** + * This class represents a collection of events and is provided for convenience. + */ +public class Events + implements SortedSet { + private final SortedSet set; + + public Events(Collection events) { + this.set = new TreeSet<>(events); + } + + @Override + public Comparator comparator() { + return this.set.comparator(); + } + + @Override + public SortedSet subSet(Event fromElement, Event toElement) { + return this.set.subSet(fromElement, toElement); + } + + @Override + public SortedSet headSet(Event toElement) { + return this.set.headSet(toElement); + } + + @Override + public SortedSet tailSet(Event fromElement) { + return this.set.tailSet(fromElement); + } + + @Override + public Event first() { + return this.set.first(); + } + + @Override + public Event last() { + return this.set.last(); + } + + @Override + public int size() { + return this.set.size(); + } + + @Override + public boolean isEmpty() { + return this.set.isEmpty(); + } + + @Override + public boolean contains(Object o) { + return this.set.contains(o); + } + + @Override + public Iterator iterator() { + return this.set.iterator(); + } + + public Collection getAll() { + return this.set; + } + + @Override + public Object[] toArray() { + return this.set.toArray(); + } + + @Override + public T[] toArray(T[] a) { + return this.set.toArray(a); + } + + @Override + public boolean add(Event t) { + return this.set.add(t); + } + + @Override + public boolean remove(Object o) { + return this.set.remove(o); + } + + @Override + public boolean containsAll(Collection c) { + return this.set.containsAll(c); + } + + @Override + public boolean addAll(Collection c) { + return this.set.addAll(c); + } + + @Override + public boolean retainAll(Collection c) { + return this.set.retainAll(c); + } + + @Override + public boolean removeAll(Collection c) { + return this.set.removeAll(c); + } + + @Override + public void clear() { + this.set.clear(); + } + + + public String getOriginalSessionId() { + Event firstEvent = this.first(); + if (firstEvent == null) return null; + return firstEvent.getOriginalSessionId() != null ? firstEvent.getOriginalSessionId() : firstEvent.getSessionId() ; + } + +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/InvalidSessionCheckResult.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/InvalidSessionCheckResult.java new file mode 100644 index 000000000..a6042bdc5 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/InvalidSessionCheckResult.java @@ -0,0 +1,30 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.modele; + +public class InvalidSessionCheckResult implements SessionCheckResult { + + private final String reason; + + public InvalidSessionCheckResult(final String reason) { this.reason = reason; } + + @Override + public boolean isValid() { return false; } + + @Override + public String reason() { return this.reason; } + +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/KeepSomeQueryParameterRemover.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/KeepSomeQueryParameterRemover.java new file mode 100644 index 000000000..d2ec54db3 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/KeepSomeQueryParameterRemover.java @@ -0,0 +1,38 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.modele; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +public class KeepSomeQueryParameterRemover extends AbstractQueryParameterRemover implements QueryParameterRemover { + + private final Set parameterToKeep; + + public KeepSomeQueryParameterRemover(Set parameterToKeep, char keyValueSeparator, char parameterSeparator) { + super(keyValueSeparator, parameterSeparator); + this.parameterToKeep = parameterToKeep; + } + + protected List> filterParams(Map paramsNameValue) { + List> paramsNameValueFiltred = paramsNameValue.entrySet().stream() + .filter(p -> parameterToKeep.contains(p.getKey())) + .collect(Collectors.toList()); + return paramsNameValueFiltred; + } +} diff --git a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase-api/src/main/java/com/hurence/logisland/service/hbase/scan/ResultHandler.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/QueryParameterRemover.java similarity index 76% rename from logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase-api/src/main/java/com/hurence/logisland/service/hbase/scan/ResultHandler.java rename to logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/QueryParameterRemover.java index 5c118d23b..0fb36ff3b 100644 --- a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase-api/src/main/java/com/hurence/logisland/service/hbase/scan/ResultHandler.java +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/QueryParameterRemover.java @@ -13,13 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.hurence.logisland.service.hbase.scan; - -/** - * Handles a single row from an HBase scan. - */ -public interface ResultHandler { - - void handle(byte[] row, ResultCell[] resultCells); +package com.hurence.logisland.processor.webanalytics.modele; +public interface QueryParameterRemover { + String removeQueryParameters(String url); } diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/RecordItem.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/RecordItem.java new file mode 100644 index 000000000..c21d22834 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/RecordItem.java @@ -0,0 +1,113 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.modele; + +import com.hurence.logisland.record.Field; +import com.hurence.logisland.record.Record; + +import java.time.Instant; +import java.time.ZoneId; +import java.time.ZonedDateTime; + +/** + * This class is a basic WebItem that wraps an inner record. + */ +public class RecordItem { + /** + * The record actually computed by this processor and returned at the end of the processing. + */ + protected final Record record; + + + /** + * Creates a new instance of this class with the associated parameter. + * + * @param record the wrapped record. + */ + public RecordItem(final Record record) { + this.record = record; + } + + /** + * Returns the value of the specified field name. {@code null} is returned if the field does not exists or + * if the value of the field is {@code null}. + * + * @param fieldname the name of the field to retrieve. + * @return the value of the specified field name. + */ + public Object getValue(final String fieldname) { + final Field field = this.record.getField(fieldname); + return field == null ? null : field.asString(); + } + + public String getStringValue(final String fieldname) { + return (String) this.getValue(fieldname); + } + + /** + * Returns a ZonedDateTime corresponding to the provided epoch parameter with the system default timezone. + * + * @param epoch the time to convert. + * @return a ZonedDateTime corresponding to the provided epoch parameter with the system default timezone. + */ + ZonedDateTime fromEpochMilli(final long epoch) { + /* we use system default here but if we decide to print with a different zone it is overriden latter. + * As this is a date from an epoch, the only thing that timezone is changing is the string representation of the date. + * */ + return ZonedDateTime.ofInstant(Instant.ofEpochMilli(epoch), ZoneId.systemDefault()); + } + + /** + * Returns a ZonedDateTime corresponding to the provided epoch parameter with the system default timezone. + * + * @param epoch the time to convert. + * @return a ZonedDateTime corresponding to the provided epoch parameter with the system default timezone. + */ + ZonedDateTime fromEpochSecond(final long epoch) { + /* we use system default here but if we decide to print with a different zone it is overriden latter. + * As this is a date from an epoch, the only thing that timezone is changing is the string representation of the date. + * */ + return ZonedDateTime.ofInstant(Instant.ofEpochSecond(epoch), ZoneId.systemDefault()); + } + + /** + * Returns a concatenation of the form ${utmSource}:${utmMedium}:${utmCampaign}:${utmTerm}:${utmContent} with + * the provided parameters. + * + * @param utmSource the utm source + * @param utmMedium the medium source + * @param utmCampaign the campaign source + * @param utmTerm the utm term + * @param utmContent the utm content + * @return a concatenation of the form ${utmSource}:${utmMedium}:${utmCampaign}:${utmTerm}:${utmContent} + * with the provided parameters. + */ + protected String concatFieldsOfTraffic(final String utmSource, + final String utmMedium, + final String utmCampaign, + final String utmTerm, + final String utmContent) { + return new StringBuilder().append(utmSource == null ? "" : utmSource).append(':') + .append(utmMedium == null ? "" : utmMedium).append(':') + .append(utmCampaign == null ? "" : utmCampaign).append(':') + .append(utmTerm == null ? "" : utmTerm).append(':') + .append(utmContent == null ? "" : utmContent).toString(); + } + + public Record getRecord() { + return record; + } +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/RemoveSomeQueryParameterRemover.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/RemoveSomeQueryParameterRemover.java new file mode 100644 index 000000000..9f0342616 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/RemoveSomeQueryParameterRemover.java @@ -0,0 +1,40 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.modele; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +public class RemoveSomeQueryParameterRemover extends AbstractQueryParameterRemover implements QueryParameterRemover { + + private final Set parameterToRemove; + + + public RemoveSomeQueryParameterRemover(Set parameterToRemove, char keyValueSeparator, char parameterSeparator) { + super(keyValueSeparator, parameterSeparator); + this.parameterToRemove = parameterToRemove; + } + + @Override + protected List> filterParams(Map paramsNameValue) { + List> paramsNameValueFiltred = paramsNameValue.entrySet().stream() + .filter(p -> !parameterToRemove.contains(p.getKey())) + .collect(Collectors.toList()); + return paramsNameValueFiltred; + } +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/SessionCheck.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/SessionCheck.java new file mode 100644 index 000000000..098f409ad --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/SessionCheck.java @@ -0,0 +1,33 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.modele; + +/** + * This interface defines rules to test whether an event can be applied to a session or not. In case it can not + * be applied then a new session must be created. + */ +public interface SessionCheck { + /** + * Returns {@code true} is the event is applicable to the session incrementally, {@code false} otherwise. + * If {@code false} is returned then a new session must be created from the provided event and the provided + * session close. + * + * @param session the session to apply the event onto. + * @param event the event to apply to the session. + * @return {@code true} is the event is applicable to the session, {@code false} otherwise. + */ + SessionCheckResult isValid(WebSession session, Event event); +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/SessionCheckResult.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/SessionCheckResult.java new file mode 100644 index 000000000..47f06ef94 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/SessionCheckResult.java @@ -0,0 +1,41 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.modele; + +import java.io.Serializable; + +/** + * This interface defines the result of a check a of session against an event. + * If the result is valid then the reason is empty; otherwise the reason contains a description of why the check + * is not valid.oduire des trucs + */ +public interface SessionCheckResult extends Serializable { + /** + * Returns {@code true} is the event is applicable to the session incrementally, {@code false} otherwise. + * If {@code false} is returned then a new session must be created from the provided event and the provided + * session closed. + * + * @return {@code true} is the event is applicable to the session, {@code false} otherwise. + */ + boolean isValid(); + + /** + * The reason why the check is not valid. + * + * @return the reason why the check is not valid. + */ + String reason(); +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/SplittedEvents.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/SplittedEvents.java new file mode 100644 index 000000000..e95f3dc3c --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/SplittedEvents.java @@ -0,0 +1,68 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.modele; + +import java.util.Collection; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class SplittedEvents { + final private Collection eventsInNominalMode; + final private Collection eventsfromPast; + + public SplittedEvents(Collection eventsInNominalMode, Collection eventsFromPast) { + this.eventsInNominalMode = eventsInNominalMode; + this.eventsfromPast = eventsFromPast; + } + + public Collection getEventsInNominalMode() { + return eventsInNominalMode; + } + + public Collection getEventsfromPast() { + return eventsfromPast; + } + + public Stream getAllEvents() { + return Stream.concat( + getEventsfromPast().stream(), + getEventsInNominalMode().stream() + ); + } + + public Stream getAllEventsThatContainsEventsFromPast() { + return getAllEvents().filter(events -> { + String dilvotSession = events.getOriginalSessionId(); + return dilvotSession != null && containEventsFromPast(dilvotSession); + }); + } + + public boolean isThereEventsFromPast() { + return !getEventsfromPast().isEmpty(); + } + + public Set getDivolteSessionsWithEventsFromPast() { + return getEventsfromPast().stream() + .map(Events::getOriginalSessionId) + .collect(Collectors.toSet()); + } + + private boolean containEventsFromPast(String dilvotSession) { + return this.eventsfromPast.stream() + .anyMatch(events -> { return dilvotSession.equals(events.getOriginalSessionId()) && !events.isEmpty(); }); + } +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/SplittedURI.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/SplittedURI.java new file mode 100644 index 000000000..54748298f --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/SplittedURI.java @@ -0,0 +1,82 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.modele; + +public class SplittedURI { + private String beforeQuery; + private String query; + private String afterQuery; + + private SplittedURI(String beforeQuery, String query, String afterQuery) { + this.beforeQuery = beforeQuery; + this.query = query; + this.afterQuery = afterQuery; + } + + public String getBeforeQuery() { + return beforeQuery; + } + + public String getBeforeQueryWithoutQuestionMark() { + if (beforeQuery.isEmpty()) return beforeQuery; + char lastChar = beforeQuery.charAt(beforeQuery.length() - 1); + if (lastChar == '?') return beforeQuery.substring(0, beforeQuery.length() - 1); + return beforeQuery; + } + + public String getQuery() { + return query; + } + + public String getAfterQuery() { + return afterQuery; + } + + public static SplittedURI fromMalFormedURI(String malformedUri) { + if (malformedUri.isEmpty()) return new SplittedURI("", "", ""); + //select from first ? to # or end + String beforeQueryString = ""; + String queryString = ""; + String afterQueryString = ""; + int indexStr = 0; + int urlSize = malformedUri.length(); + char currentChar = malformedUri.charAt(0); + while(currentChar != '?' && currentChar != '#') { + beforeQueryString += currentChar; + indexStr++; + if (indexStr >= urlSize) return new SplittedURI(beforeQueryString, queryString, afterQueryString); + currentChar=malformedUri.charAt(indexStr); + } + if (currentChar == '?') { + beforeQueryString += currentChar; + indexStr++; + if (indexStr >= urlSize) return new SplittedURI(beforeQueryString, queryString, afterQueryString); + currentChar=malformedUri.charAt(indexStr); + while(currentChar != '#') { + queryString += currentChar; + indexStr++; + if (indexStr >= urlSize) return new SplittedURI(beforeQueryString, queryString, afterQueryString); + currentChar=malformedUri.charAt(indexStr); + } + } + while(true) { + afterQueryString += currentChar; + indexStr++; + if (indexStr >= urlSize) return new SplittedURI(beforeQueryString, queryString, afterQueryString); + currentChar=malformedUri.charAt(indexStr); + } + } +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/ValidSessionCheckResult.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/ValidSessionCheckResult.java new file mode 100644 index 000000000..a610f205a --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/ValidSessionCheckResult.java @@ -0,0 +1,47 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.modele; + +import java.io.Serializable; + +public class ValidSessionCheckResult implements SessionCheckResult, Serializable +{ + + /** Holder */ + private static class SingletonHolder { + /** Instance unique non préinitialisée */ + private final static ValidSessionCheckResult instance = new ValidSessionCheckResult(); + } + + /** Point d'accès pour l'instance unique du singleton */ + public static ValidSessionCheckResult getInstance() { + return SingletonHolder.instance; + } + + /** Constructeur privé */ + private ValidSessionCheckResult() {} + + @Override + public boolean isValid() { return true; } + + @Override + public String reason() { return null; } + + /** Sécurité anti-désérialisation */ + private Object readResolve() { + return getInstance(); + } +} \ No newline at end of file diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/WebSession.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/WebSession.java new file mode 100644 index 000000000..8d7c179c0 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/modele/WebSession.java @@ -0,0 +1,435 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.modele; + +import com.hurence.logisland.processor.webanalytics.IncrementalWebSession; +import com.hurence.logisland.processor.webanalytics.util.DateUtils; +import com.hurence.logisland.processor.webanalytics.util.SessionsCalculator; +import com.hurence.logisland.record.*; + +import java.time.*; +import java.util.Collection; +import java.util.Map; + +import static com.hurence.logisland.processor.webanalytics.util.Utils.isFieldAssigned; + +/** + * This class represents a session which can be created from a given web-event or an existing session + * represented by a record. + */ +public class WebSession + extends RecordItem + implements Comparable { + + + private final InternalFields fieldsNames; + /** + * Creates a new instance of this class with: + * - the session identifier set from the web event's session identifier + * - the first and last timestamps set from the web event's timestamp. + * + * @param webEvent the web event to fetch information from. + */ + public static WebSession fromWebEvent(final Event webEvent, + InternalFields fieldsNames, + Collection fieldsToCopyToWebSession) { + WebSession webSession = fromWebEvent(webEvent, fieldsNames); + if ((fieldsToCopyToWebSession != null) && (!fieldsToCopyToWebSession.isEmpty())) { + for (final String fieldnameToAdd : fieldsToCopyToWebSession) { + final Field field = webEvent.record.getField(fieldnameToAdd); + if (isFieldAssigned(field)) { + webSession.getRecord().setField(field); + } + } + } + return webSession; + } + /** + * Creates a new instance of this class with: + * - the session identifier set from the web event's session identifier + * - the first and last timestamps set from the web event's timestamp. + * + * @param webEvent the web event to fetch information from. + */ + public static WebSession fromWebEvent(final Event webEvent, + InternalFields fieldsNames) { + + StandardRecord record = new StandardRecord(IncrementalWebSession.OUTPUT_RECORD_TYPE); + record.setId(webEvent.getSessionId()); + record.setField(fieldsNames.sessionIdField, FieldType.STRING, webEvent.getSessionId()); + final long eventTimestamp = webEvent.getEpochTimeStampMilli(); + + WebSession webSession = new WebSession(record, fieldsNames); + webSession.setFirstEvent(eventTimestamp); + webSession.setLastEvent(eventTimestamp); + webSession.setIsSinglePageVisit(true); + return webSession; + } + + + + /** + * Returns a new WebSession based on the specified map that represents a web session in elasticsearch. + * + * @param sourceAsMap the web session stored in elasticsearch. + * @param recordType the recordType value for record. + * @return a new WebSession based on the specified map that represents a web session in elasticsearch. + */ + public static WebSession fromMap(final Map sourceAsMap, + InternalFields sessionInternalFields, + String recordType) { + final Record record = new StandardRecord(recordType); + sourceAsMap.forEach((key, value) -> + { + record.setField(key, FieldType.STRING, value); + }); + record.setId(record.getField(sessionInternalFields.getSessionIdField()).asString()); + return new WebSession(record, sessionInternalFields); + } + + + /** + * Creates a new instance of this class that wraps the provided record. + * + * @param recordRepresentingSession the embedded record. + */ + public WebSession(final Record recordRepresentingSession, + InternalFields fieldsNames) { + super(recordRepresentingSession); + this.fieldsNames = fieldsNames; + record.getAllFields().forEach(field -> { + String key = field.getName(); + String value = field.asString(); + if (value != null) { + if (fieldsNames.getIsSessionActiveField().equals(key) + || fieldsNames.getIsSinglePageVisit().equals(key)) { + record.setField(key, FieldType.BOOLEAN, Boolean.valueOf(value)); + } else if (fieldsNames.getSessionDurationField().equals(key) + || fieldsNames.getEventsCounterField().equals(key) + || fieldsNames.getTimestampField().equals(key) + || fieldsNames.getSessionInactivityDurationField().equals(key) + || fieldsNames.getFirstEventEpochSecondsField().equals(key) + || fieldsNames.getLastEventEpochSecondsField().equals(key) + || FieldDictionary.RECORD_TIME.equals(key)) { + record.setField(key, FieldType.LONG, Long.valueOf(value)); + } else { + record.setField(key, FieldType.STRING, value); + } + } + }); + } + + public String getSessionId() { + return this.getStringValue(fieldsNames.sessionIdField); + } + + public String getOriginalSessionId() { + String sessionsId = getSessionId(); + return SessionsCalculator.extractOrignalSessionsId(sessionsId); + } + + /** + * Returns {@code true} if the specified timestamp is enclosed within the first and last timestamp of this + * session; {@code false} otherwise. + * + * @param timestamp the timestamp to check against this session. + * @return {@code true} if the specified timestamp is enclosed within the first and last timestamp of this + * session; {@code false} otherwise. + */ + public boolean containsTimestamp(final ZonedDateTime timestamp) { + return this.getFirstEvent().compareTo(timestamp) <= 0 && timestamp.compareTo(this.getLastEvent()) <= 0; + } + + public boolean timestampFromPast(final ZonedDateTime timestamp) { + return timestamp.compareTo(this.getLastEvent()) < 0; + } + + @Override + public int compareTo(final WebSession session) { + if (this.getLastEvent().compareTo(session.getFirstEvent()) < 0) { + return -1; + } else if (session.getLastEvent().compareTo(this.getFirstEvent()) < 0) { + return 1; + } else { + throw new IllegalStateException("Two sessions can no share same timestamp:" + this.toString() + + " vs " + session.toString()); + } + } + + public ZonedDateTime getFirstEvent() { + return fromEpochSecond(getFirstEventEpochSeconds()); + } + + public long getFirstEventEpochSeconds() { + final Field field = record.getField(fieldsNames.firstEventEpochSecondsField); + if (field == null) { + // Fallback by parsing the equivalent human readable field. + return DateUtils.toEpochSecond(record.getField(fieldsNames.firstEventDateTimeField).asString()); + } + return field.asLong(); + } + + public ZonedDateTime getLastEvent() { + return fromEpochSecond(getLastEventEpochSeconds()); + } + + public long getLastEventEpochSeconds() { + final Field field = record.getField(fieldsNames.lastEventEpochSecondsField); + if (field == null) { + // Fallback by parsing the equivalent human readable field. + return DateUtils.toEpochSecond(record.getField(fieldsNames.lastEventDateTimeField).asString()); + } + return field.asLong(); + } + + public String getSourceOfTraffic() { + return concatFieldsOfTraffic((String) this.getValue(fieldsNames.sourceOffTrafficSourceField), + (String) this.getValue(fieldsNames.sourceOffTrafficMediumField), + (String) this.getValue(fieldsNames.sourceOffTrafficCampaignField), + (String) this.getValue(fieldsNames.sourceOffTrafficKeyWordField), + (String) this.getValue(fieldsNames.sourceOffTrafficContentField)); + } + + @Override + public String toString() { + return "WebSession{" + record.getField(fieldsNames.firstEventDateTimeField).asString() + + "-" + record.getField(fieldsNames.lastEventDateTimeField).asString() + "}"; + } + + public void setFirstEvent(final long eventTimestamp) { + this.record.setField(fieldsNames.firstEventDateTimeField, FieldType.STRING, DateUtils.toFormattedDate(eventTimestamp)); + this.record.setField(fieldsNames.firstEventEpochSecondsField, FieldType.LONG, eventTimestamp / 1000); + } + + public void setLastEvent(final long eventTimestamp) { + this.record.setField(fieldsNames.lastEventDateTimeField, FieldType.STRING, DateUtils.toFormattedDate(eventTimestamp)); + this.record.setField(fieldsNames.lastEventEpochSecondsField, FieldType.LONG, eventTimestamp / 1000); + } + + public void setIsSinglePageVisit(final Boolean isSinglePageVisit) { + this.record.setField(fieldsNames.isSinglePageVisit, FieldType.BOOLEAN, isSinglePageVisit); + } + + public static class InternalFields { + private String timestampField; + private String sessionIdField; + private String sourceOffTrafficSourceField; + private String sourceOffTrafficMediumField; + private String sourceOffTrafficCampaignField; + private String sourceOffTrafficKeyWordField; + private String sourceOffTrafficContentField; + + private String eventsCounterField; + private String firstVisitedPageField; + private String lastVisitedPageField; + private String firstEventDateTimeField; + private String lastEventDateTimeField; + + private String firstEventEpochSecondsField; + private String lastEventEpochSecondsField; + + private String userIdField; + + private String isSinglePageVisit; + private String isSessionActiveField; + private String sessionInactivityDurationField; + private String sessionDurationField; + + private String transactionIdsField; + + public InternalFields() { } + + public String getTimestampField() { + return timestampField; + } + + public WebSession.InternalFields setTimestampField(String timestampField) { + this.timestampField = timestampField; + return this; + } + + public String getSessionIdField() { + return sessionIdField; + } + + public WebSession.InternalFields setSessionIdField(String sessionIdField) { + this.sessionIdField = sessionIdField; + return this; + } + + public String getSourceOffTrafficSourceField() { + return sourceOffTrafficSourceField; + } + + public WebSession.InternalFields setSourceOffTrafficSourceField(String sourceOffTrafficSourceField) { + this.sourceOffTrafficSourceField = sourceOffTrafficSourceField; + return this; + } + + public String getSourceOffTrafficMediumField() { + return sourceOffTrafficMediumField; + } + + public WebSession.InternalFields setSourceOffTrafficMediumField(String sourceOffTrafficMediumField) { + this.sourceOffTrafficMediumField = sourceOffTrafficMediumField; + return this; + } + + public String getSourceOffTrafficCampaignField() { + return sourceOffTrafficCampaignField; + } + + public WebSession.InternalFields setSourceOffTrafficCampaignField(String sourceOffTrafficCampaignField) { + this.sourceOffTrafficCampaignField = sourceOffTrafficCampaignField; + return this; + } + + public String getSourceOffTrafficKeyWordField() { + return sourceOffTrafficKeyWordField; + } + + public WebSession.InternalFields setSourceOffTrafficKeyWordField(String sourceOffTrafficKeyWordField) { + this.sourceOffTrafficKeyWordField = sourceOffTrafficKeyWordField; + return this; + } + + public String getSourceOffTrafficContentField() { + return sourceOffTrafficContentField; + } + + public WebSession.InternalFields setSourceOffTrafficContentField(String sourceOffTrafficContentField) { + this.sourceOffTrafficContentField = sourceOffTrafficContentField; + return this; + } + + public String getEventsCounterField() { + return eventsCounterField; + } + + public InternalFields setEventsCounterField(String eventsCounterField) { + this.eventsCounterField = eventsCounterField; + return this; + } + + public String getFirstVisitedPageField() { + return firstVisitedPageField; + } + + public InternalFields setFirstVisitedPageField(String firstVisitedPageField) { + this.firstVisitedPageField = firstVisitedPageField; + return this; + } + + public String getLastVisitedPageField() { + return lastVisitedPageField; + } + + public InternalFields setLastVisitedPageField(String lastVisitedPageField) { + this.lastVisitedPageField = lastVisitedPageField; + return this; + } + + public String getFirstEventDateTimeField() { + return firstEventDateTimeField; + } + + public InternalFields setFirstEventDateTimeField(String firstEventDateTimeField) { + this.firstEventDateTimeField = firstEventDateTimeField; + return this; + } + + public String getLastEventDateTimeField() { + return lastEventDateTimeField; + } + + public InternalFields setLastEventDateTimeField(String lastEventDateTimeField) { + this.lastEventDateTimeField = lastEventDateTimeField; + return this; + } + + public String getUserIdField() { + return userIdField; + } + + public InternalFields setUserIdField(String userIdField) { + this.userIdField = userIdField; + return this; + } + + public String getIsSinglePageVisit() { + return isSinglePageVisit; + } + + public InternalFields setIsSinglePageVisit(String isSinglePageVisit) { + this.isSinglePageVisit = isSinglePageVisit; + return this; + } + + public String getIsSessionActiveField() { + return isSessionActiveField; + } + + public InternalFields setIsSessionActiveField(String isSessionActiveField) { + this.isSessionActiveField = isSessionActiveField; + return this; + } + + public String getSessionInactivityDurationField() { + return sessionInactivityDurationField; + } + + public InternalFields setSessionInactivityDurationField(String sessionInactivityDurationField) { + this.sessionInactivityDurationField = sessionInactivityDurationField; + return this; + } + + public String getSessionDurationField() { + return sessionDurationField; + } + + public InternalFields setSessionDurationField(String sessionDurationField) { + this.sessionDurationField = sessionDurationField; + return this; + } + + public String getTransactionIdsField() { + return transactionIdsField; + } + + public InternalFields setTransactionIdsField(String transactionIdsField) { + this.transactionIdsField = transactionIdsField; + return this; + } + + public String getFirstEventEpochSecondsField() { + return firstEventEpochSecondsField; + } + + public InternalFields setFirstEventEpochSecondsField(String firstEventEpochSecondsField) { + this.firstEventEpochSecondsField = firstEventEpochSecondsField; + return this; + } + + public String getLastEventEpochSecondsField() { + return lastEventEpochSecondsField; + } + + public InternalFields setLastEventEpochSecondsField(String lastEventEpochSecondsField) { + this.lastEventEpochSecondsField = lastEventEpochSecondsField; + return this; + } + } +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/util/DateUtils.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/util/DateUtils.java new file mode 100644 index 000000000..ceca2091b --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/util/DateUtils.java @@ -0,0 +1,77 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.util; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Locale; + +public class DateUtils { + + /** + * The legacy format used in Date.toString(). + */ + private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", + Locale.ENGLISH); + + /** + * Returns the epoch timestamp corresponding to the specified value parsed with the default formatter. + * + * @param string the value to parse with the default formatter. + * + * @return the epoch timestamp corresponding to the specified value parsed with the default formatter. + */ + public static long toEpochMilli(final String string) + { + return LocalDateTime.parse(string, DATE_FORMAT) + .atZone(ZoneId.systemDefault()) + .toInstant() + .toEpochMilli(); + } + + /** + * Returns the epoch timestamp corresponding to the specified value parsed with the default formatter. + * + * @param string the value to parse with the default formatter. + * + * @return the epoch timestamp corresponding to the specified value parsed with the default formatter. + */ + public static long toEpochSecond(final String string) + { + return LocalDateTime.parse(string, DATE_FORMAT) + .atZone(ZoneId.systemDefault()) + .toInstant() + .getEpochSecond(); + } + + /** + * Returns the provided epoch timestamp formatted with the default formatter. + * + * @param epoch the timestamp in milliseconds. + * + * @return the provided epoch timestamp formatted with the default formatter. + */ + public static String toFormattedDate(final long epoch) + { + ZonedDateTime date = Instant.ofEpochMilli(epoch).atZone(ZoneId.systemDefault()); + String result = DATE_FORMAT.format(date); + + return result; + } +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/util/SessionsCalculator.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/util/SessionsCalculator.java new file mode 100644 index 000000000..0744debae --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/util/SessionsCalculator.java @@ -0,0 +1,355 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.util; + +import com.hurence.logisland.processor.webanalytics.IncrementalWebSession; +import com.hurence.logisland.processor.webanalytics.modele.*; +import com.hurence.logisland.record.Field; +import com.hurence.logisland.record.FieldType; +import com.hurence.logisland.record.Record; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.time.Duration; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import static com.hurence.logisland.processor.webanalytics.util.Utils.isFieldAssigned; + +/** + * This class represents one or more sessions resulting of the processing of web events. + */ +public class SessionsCalculator { + + private static Logger logger = LoggerFactory.getLogger(SessionsCalculator.class); + + private final String divolteSessionId; +// private final WebSession lastSessionBeforeProcessing; + // The resulting sessions from the processed web events. + // MAKE SURE LAST SESSION IS AT LAST POSITION!!! + private final List calculatedSessions = new ArrayList<>(); + private final Collection checkers; + + private long eventProcessedCounter = 0; +// private final String _NEW_SESSION_REASON_FIELD; + private final WebSession.InternalFields webSessionInternalFields; + private final Event.InternalFields eventInternalFields; + private final long sessionInactivityTimeoutInSeconds; + private final Collection fieldsToCopyFromEventsToSessions; + + + public static String extractOrignalSessionsId(String sessionId) { + final String[] splittedSessionId = sessionId.split(IncrementalWebSession.EXTRA_SESSION_DELIMITER); + return splittedSessionId[0]; + } + + public SessionsCalculator(Collection checkers, + long sessionInactivityTimeoutInSeconds, + WebSession.InternalFields webSessionInternalFields, + Event.InternalFields eventInternalFields, + Collection fieldsToCopyFromEventsToSessions, + String divolteSessionId) { + + this.checkers = checkers; + this.sessionInactivityTimeoutInSeconds = sessionInactivityTimeoutInSeconds; + this.webSessionInternalFields = webSessionInternalFields; + this.eventInternalFields = eventInternalFields; + this.fieldsToCopyFromEventsToSessions = fieldsToCopyFromEventsToSessions; + this.divolteSessionId = divolteSessionId; + } + + /** + * Returns the session identifier of this session. + * + * @return the session identifier of this session. + */ + public String getDivolteSessionId() { + return this.divolteSessionId; + } + + + /** + * Returns the processed web sessions. + * + * @return the processed web sessions. + */ + public Collection getCalculatedSessions() { + return calculatedSessions; + } + + /** + * Returns the last sessionId (#?) of this session container. + * + * @return the last sessionId (#?) of this session container. + */ + public String getLastSessionId() { + String result = this.divolteSessionId; + + if (!this.calculatedSessions.isEmpty()) { + result = this.calculatedSessions.get(this.calculatedSessions.size() - 1).getSessionId(); + } else { + logger.error("Invalid state: session container for '" + this.divolteSessionId + "' is empty. " + + "At least one session is expected"); + } + + return result; + } + + /** + * Processes the provided events against the first session (if any). + * + * @param events the events to process. + * @return this object for convenience. + */ + public SessionsCalculator processEventsKnowingLastSession(final Events events, final WebSession currentWebSession) { + logger.debug("Applying {} events to session '{}'", events.size(), events.getOriginalSessionId()); + if (currentWebSession != null) { + events.forEach(event -> event.setSessionId(currentWebSession.getSessionId())); + } else { + //considered as first session + events.forEach(event -> event.setSessionId(divolteSessionId)); + } + this.processEvents(currentWebSession, events); + return this; + } + + public SessionsCalculator processEvents(final Events events, final String currentSessionId) { + logger.debug("Applying {} events to session '{}'", events.size(), events.getOriginalSessionId()); + if (currentSessionId != null) { + events.forEach(event -> event.setSessionId(currentSessionId)); + } else { + //considered as first session + events.forEach(event -> event.setSessionId(divolteSessionId)); + } + this.processEvents(null, events); + return this; + } + /** + * Returns {@code true} if the specified web-event checked against the provided web-session is valid; + * {@code false} otherwise. + * In case the returned value is {@code false} then a new session must be created. + * + * @param webSession the web-session to check the web-event against. + * @param webEvent the web-event to validate. + * @return {@code true} if the specified web-event checked against the provided web-session is valid; + * {@code false} otherwise. + */ + private SessionCheckResult isEventApplicable(final WebSession webSession, + final Event webEvent) { + SessionCheckResult result = ValidSessionCheckResult.getInstance(); + for (final SessionCheck check : checkers) { + result = check.isValid(webSession, webEvent); + if (!result.isValid()) { + break; + } + } + + return result; + } + + /** + * Processes the provided events against the provided session (can be {@code null}). + * + * @param session the session to update. If {@code null} is provided a new session is created. + * @param events the events to process. + * @return this object for convenience. + */ + private void processEvents(WebSession session, + final Events events) { + if (events.isEmpty()) { + // No event. Paranoid. + return; + } + + final Iterator iterator = events.iterator(); + logger.debug("Processing event sessionId=" + events.getOriginalSessionId() + " eventCount=" + eventProcessedCounter); + + if (session == null) { + // No web-session yet in datastore. + Event event = iterator.next(); + eventProcessedCounter++; + session = WebSession.fromWebEvent(event, + webSessionInternalFields, + fieldsToCopyFromEventsToSessions); + add(session, event); + } + + this.calculatedSessions.add(session); + + while (iterator.hasNext()) { + final Event event = iterator.next(); + eventProcessedCounter++; + + final SessionCheckResult isSessionValid = isEventApplicable(session, event); + + if (isSessionValid.isValid()) { + // No invalid check found. + add(session, event); + } else { + // Invalid check found: + // 1. keep current web-session untouched (and save it) + // 2. create a new web-session from the current web-event and rename/increase session-id. + final String[] oldSessionIdSplitted = event.getSessionId().split(IncrementalWebSession.EXTRA_SESSION_DELIMITER); + final int index = (oldSessionIdSplitted.length == 1) ? 2 // only one web session so far => create 2nd one + : Integer.valueOf(oldSessionIdSplitted[1]) + 1; // +1 on web session + final String newSessionId = oldSessionIdSplitted[0] + IncrementalWebSession.EXTRA_SESSION_DELIMITER + index; + final Collection eventsForNextSession = events.tailSet(event); + // Rewrite all remaining web-events with new session identifier. + eventsForNextSession.forEach(eventToChangeSession -> eventToChangeSession.setSessionId(newSessionId)); + // Mark event that triggered the new sessions with the reason. + event.getRecord().setField(eventInternalFields.getNewSessionReasonField(), FieldType.STRING, isSessionValid.reason()); + + final Events nextEvents = new Events(eventsForNextSession); + + this.processEvents(null/*force new web-session*/, nextEvents); + break; + } + } + } + + /** + * Adds the specified event to this sessions by updating fields such as lastVisitedPage. + * + * @param event the event to apply. + */ + private void add(final WebSession session, + final Event event) { + // Handle case where web-event is older that first event of session. + // In case there are few events older than the current web-session, all those events must + // be taken into account despite the fact that setting the timestamp of the first event + // will 'hide' the next ones. + final Field eventTimestampField = event.getRecord().getField(eventInternalFields.getTimestampField()); + final long eventTimestamp = eventTimestampField.asLong(); + + // Sanity check. + final Field lastEventField = session.getRecord().getField(webSessionInternalFields.getLastEventEpochSecondsField()); + if (lastEventField != null) { + final long lastEvent = lastEventField.asLong(); + if (lastEvent > 0 && eventTimestamp > 0 && eventTimestamp < lastEvent) { + // The event is older that current web session; ignore. + return; + } + } + + Record sessionInternalRecord = session.getRecord(); + // EVENTS_COUNTER + Field field = sessionInternalRecord.getField(webSessionInternalFields.getEventsCounterField()); + long eventsCounter = field == null ? 0 : field.asLong(); + eventsCounter++; + sessionInternalRecord.setField(webSessionInternalFields.getEventsCounterField(), FieldType.LONG, eventsCounter); + + // TIMESTAMP + // Set the session create timestamp to the create timestamp of the first event on the session. + long creationTimestamp; + field = sessionInternalRecord.getField(webSessionInternalFields.getTimestampField()); + if (!isFieldAssigned(field)) { + sessionInternalRecord.setField(webSessionInternalFields.getTimestampField(), FieldType.LONG, eventTimestamp); + creationTimestamp = eventTimestamp; + } else { + creationTimestamp = field.asLong(); + } + + final Field visitedPage = event.getRecord().getField(eventInternalFields.getVisitedPageField()); + // FIRST_VISITED_PAGE + if (!isFieldAssigned(sessionInternalRecord.getField(webSessionInternalFields.getFirstVisitedPageField()))) { + sessionInternalRecord.setField(webSessionInternalFields.getFirstVisitedPageField(), FieldType.STRING, visitedPage.asString()); + } + + // LAST_VISITED_PAGE + if (isFieldAssigned(visitedPage)) { + sessionInternalRecord.setField(webSessionInternalFields.getLastVisitedPageField(), FieldType.STRING, visitedPage.asString()); + } + + // FIRST_EVENT_DATETIME + if (!isFieldAssigned(sessionInternalRecord.getField(webSessionInternalFields.getFirstEventDateTimeField()))) { + session.setFirstEvent(eventTimestamp); + } + + // LAST_EVENT_DATETIME + if (isFieldAssigned(eventTimestampField)) { + session.setLastEvent(eventTimestamp); + } + + // USERID + // Add the userid sessionInternalRecord if available + final Field userIdField = sessionInternalRecord.getField(webSessionInternalFields.getUserIdField()); + if ((!isFieldAssigned(userIdField) || "undefined".equalsIgnoreCase(userIdField.asString())) + && isFieldAssigned(event.getRecord().getField(eventInternalFields.getUserIdField()))) { + final String userId = event.getRecord().getField(eventInternalFields.getUserIdField()).asString(); + if (userId != null) { + sessionInternalRecord.setField(webSessionInternalFields.getUserIdField(), FieldType.STRING, userId); + } + } + + // IS_SINGLE_PAGE + final Boolean currentIsSinglePageVisit = sessionInternalRecord.getField(webSessionInternalFields.getIsSinglePageVisit()).asBoolean(); + final String sessionFirstVisitedPage = sessionInternalRecord.getField(webSessionInternalFields.getFirstVisitedPageField()).asString(); + session.setIsSinglePageVisit(currentIsSinglePageVisit && sessionFirstVisitedPage.equals(visitedPage.asString())); + + LocalDateTime now = LocalDateTime.now(); + LocalDateTime eventLocalDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(eventTimestamp), + ZoneId.systemDefault()); + + // Compute session inactivity duration (in milliseconds) + final long sessionInactivityDuration = Duration.between(eventLocalDateTime, now).getSeconds(); + + if (sessionInactivityDuration > sessionInactivityTimeoutInSeconds) {//it is a value not a field here + // Mark the session as closed + sessionInternalRecord.setField(webSessionInternalFields.getIsSessionActiveField(), FieldType.BOOLEAN, Boolean.FALSE); + + // Max out the sessionInactivityDuration - only pertinent in case of topic rewind. + sessionInternalRecord.setField(webSessionInternalFields.getSessionInactivityDurationField(), FieldType.LONG, sessionInactivityTimeoutInSeconds); + } else { + sessionInternalRecord.setField(webSessionInternalFields.getIsSessionActiveField(), FieldType.BOOLEAN, Boolean.TRUE); + } + + final long sessionDuration = Duration.between(Instant.ofEpochMilli(creationTimestamp), + Instant.ofEpochMilli(eventTimestamp)).getSeconds(); + if (sessionDuration > 0) { + sessionInternalRecord.setField(webSessionInternalFields.getSessionDurationField(), FieldType.LONG, sessionDuration); + } + + // Extra + final Field transactionIdField = event.getRecord().getField(eventInternalFields.getTransactionIdField()); + if (isFieldAssigned(transactionIdField) + && (!"undefined".equalsIgnoreCase(transactionIdField.asString())) + && (!transactionIdField.asString().isEmpty())) { + final Field transactionIdsField = sessionInternalRecord.getField(eventInternalFields.getTransactionIdsField()); + Collection transactionIds; + if (!isFieldAssigned(transactionIdField)) { + transactionIds = (Collection) transactionIdsField.getRawValue(); + } else { + transactionIds = new ArrayList<>(); + sessionInternalRecord.setField(webSessionInternalFields.getTransactionIdsField(), FieldType.ARRAY, transactionIds); + } + transactionIds.add(transactionIdField.asString()); + } + + if (!sessionInternalRecord.isValid()) { + sessionInternalRecord.getFieldsEntrySet().forEach(entry -> + { + final Field f = entry.getValue(); + logger.debug("INVALID field {} type={}, class={}", f.getName(), f.getType(), f.getRawValue().getClass()); + }); + } + } + +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/util/SimpleSessionsCalculator.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/util/SimpleSessionsCalculator.java new file mode 100644 index 000000000..a14914246 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/util/SimpleSessionsCalculator.java @@ -0,0 +1,297 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.util; + +import com.hurence.logisland.processor.webanalytics.IncrementalWebSession; +import com.hurence.logisland.processor.webanalytics.modele.*; +import com.hurence.logisland.record.Field; +import com.hurence.logisland.record.FieldType; +import com.hurence.logisland.record.Record; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.time.Duration; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import static com.hurence.logisland.processor.webanalytics.util.Utils.isFieldAssigned; + +/** + * This class represents one or more sessions resulting of the processing of web events. + */ +public class SimpleSessionsCalculator { + + private static Logger logger = LoggerFactory.getLogger(SimpleSessionsCalculator.class); + + // The resulting sessions from the processed web events. + // MAKE SURE LAST SESSION IS AT LAST POSITION!!! + private final List calculatedSessions = new ArrayList<>(); + private final Collection checkers; + private long eventProcessedCounter = 0; + private final WebSession.InternalFields webSessionInternalFields; + private final Event.InternalFields eventInternalFields; + private final long sessionInactivityTimeoutInSeconds; + private final Collection fieldsToCopyFromEventsToSessions; + + + public static String extractOrignalSessionsId(String sessionId) { + final String[] splittedSessionId = sessionId.split(IncrementalWebSession.EXTRA_SESSION_DELIMITER); + return splittedSessionId[0]; + } + + public SimpleSessionsCalculator(Collection checkers, + long sessionInactivityTimeoutInSeconds, + WebSession.InternalFields webSessionInternalFields, + Event.InternalFields eventInternalFields, + Collection fieldsToCopyFromEventsToSessions) { + + this.checkers = checkers; + this.sessionInactivityTimeoutInSeconds = sessionInactivityTimeoutInSeconds; + this.webSessionInternalFields = webSessionInternalFields; + this.eventInternalFields = eventInternalFields; + this.fieldsToCopyFromEventsToSessions = fieldsToCopyFromEventsToSessions; + } + + /** + * Returns the processed web sessions. + * + * @return the processed web sessions. + */ + public Collection getCalculatedSessions() { + return calculatedSessions; + } + + /** + * Returns the last sessionId (#?) of this session container. + * + * @return the last sessionId (#?) of this session container. + */ + public String getLastSessionId() { + if (!this.calculatedSessions.isEmpty()) { + return this.calculatedSessions.get(this.calculatedSessions.size() - 1).getSessionId(); + } else { + logger.error("Invalid state: session container is empty. " + + "At least one session is expected"); + return null; + } + } + + /** + * Returns {@code true} if the specified web-event checked against the provided web-session is valid; + * {@code false} otherwise. + * In case the returned value is {@code false} then a new session must be created. + * + * @param webSession the web-session to check the web-event against. + * @param webEvent the web-event to validate. + * @return {@code true} if the specified web-event checked against the provided web-session is valid; + * {@code false} otherwise. + */ + private SessionCheckResult isEventApplicable(final WebSession webSession, + final Event webEvent) { + SessionCheckResult result = ValidSessionCheckResult.getInstance(); + for (final SessionCheck check : checkers) { + result = check.isValid(webSession, webEvent); + if (!result.isValid()) { + break; + } + } + + return result; + } + + /** + * Processes the provided events against the provided session (can be {@code null}). + * + * @param events the events to process. + * @return this object for convenience. + */ + public SimpleSessionsCalculator processEvents(final Events events) { + logger.debug("Applying {} events to session '{}'", events.size(), events.getOriginalSessionId()); + if (events.isEmpty()) return this; + + final Iterator iterator = events.iterator(); + logger.debug("Processing event sessionId=" + events.getOriginalSessionId() + " eventCount=" + eventProcessedCounter); + + Event firstEvent = iterator.next(); + eventProcessedCounter++; + + WebSession session = WebSession.fromWebEvent(firstEvent, + webSessionInternalFields, + fieldsToCopyFromEventsToSessions); + add(session, firstEvent); + + this.calculatedSessions.add(session); + + while (iterator.hasNext()) { + final Event event = iterator.next(); + eventProcessedCounter++; + + final SessionCheckResult isSessionValid = isEventApplicable(session, event); + + if (isSessionValid.isValid()) { + // No invalid check found. + add(session, event); + } else { + // Invalid check found: + // 1. keep current web-session untouched (and save it) + // 2. create a new web-session from the current web-event and rename/increase session-id. + final String[] oldSessionIdSplitted = event.getSessionId().split(IncrementalWebSession.EXTRA_SESSION_DELIMITER); + final int index = (oldSessionIdSplitted.length == 1) ? 2 // only one web session so far => create 2nd one + : Integer.valueOf(oldSessionIdSplitted[1]) + 1; // +1 on web session + final String newSessionId = oldSessionIdSplitted[0] + IncrementalWebSession.EXTRA_SESSION_DELIMITER + index; + final Collection eventsForNextSession = events.tailSet(event); + // Rewrite all remaining web-events with new session identifier. + eventsForNextSession.forEach(eventToChangeSession -> eventToChangeSession.setSessionId(newSessionId)); + // Mark event that triggered the new sessions with the reason. + event.getRecord().setField(eventInternalFields.getNewSessionReasonField(), FieldType.STRING, isSessionValid.reason()); + + final Events nextEvents = new Events(eventsForNextSession); + + this.processEvents(nextEvents); + break; + } + } + return this; + } + + /** + * Adds the specified event to this sessions by updating fields such as lastVisitedPage. + * + * @param event the event to apply. + */ + private void add(final WebSession session, + final Event event) { + // Handle case where web-event is older that first event of session. + // In case there are few events older than the current web-session, all those events must + // be taken into account despite the fact that setting the timestamp of the first event + // will 'hide' the next ones. + final Field eventTimestampField = event.getRecord().getField(eventInternalFields.getTimestampField()); + final long eventTimestamp = eventTimestampField.asLong(); + + // Sanity check. + final Field lastEventField = session.getRecord().getField(webSessionInternalFields.getLastEventEpochSecondsField()); + if (lastEventField != null) { + final long lastEvent = lastEventField.asLong(); + if (lastEvent > 0 && eventTimestamp > 0 && eventTimestamp < lastEvent) { + // The event is older that current web session; ignore. + return; + } + } + + Record sessionInternalRecord = session.getRecord(); + // EVENTS_COUNTER + Field field = sessionInternalRecord.getField(webSessionInternalFields.getEventsCounterField()); + long eventsCounter = field == null ? 0 : field.asLong(); + eventsCounter++; + sessionInternalRecord.setField(webSessionInternalFields.getEventsCounterField(), FieldType.LONG, eventsCounter); + + // TIMESTAMP + // Set the session create timestamp to the create timestamp of the first event on the session. + long creationTimestamp; + field = sessionInternalRecord.getField(webSessionInternalFields.getTimestampField()); + if (!isFieldAssigned(field)) { + sessionInternalRecord.setField(webSessionInternalFields.getTimestampField(), FieldType.LONG, eventTimestamp); + creationTimestamp = eventTimestamp; + } else { + creationTimestamp = field.asLong(); + } + + final Field visitedPage = event.getRecord().getField(eventInternalFields.getVisitedPageField()); + // FIRST_VISITED_PAGE + if (!isFieldAssigned(sessionInternalRecord.getField(webSessionInternalFields.getFirstVisitedPageField()))) { + sessionInternalRecord.setField(webSessionInternalFields.getFirstVisitedPageField(), FieldType.STRING, visitedPage.asString()); + } + + // LAST_VISITED_PAGE + if (isFieldAssigned(visitedPage)) { + sessionInternalRecord.setField(webSessionInternalFields.getLastVisitedPageField(), FieldType.STRING, visitedPage.asString()); + } + + // FIRST_EVENT_DATETIME + if (!isFieldAssigned(sessionInternalRecord.getField(webSessionInternalFields.getFirstEventDateTimeField()))) { + session.setFirstEvent(eventTimestamp); + } + + // LAST_EVENT_DATETIME + if (isFieldAssigned(eventTimestampField)) { + session.setLastEvent(eventTimestamp); + } + + // USERID + // Add the userid sessionInternalRecord if available + final Field userIdField = sessionInternalRecord.getField(webSessionInternalFields.getUserIdField()); + if ((!isFieldAssigned(userIdField) || "undefined".equalsIgnoreCase(userIdField.asString())) + && isFieldAssigned(event.getRecord().getField(eventInternalFields.getUserIdField()))) { + final String userId = event.getRecord().getField(eventInternalFields.getUserIdField()).asString(); + if (userId != null) { + sessionInternalRecord.setField(webSessionInternalFields.getUserIdField(), FieldType.STRING, userId); + } + } + + LocalDateTime now = LocalDateTime.now(); + LocalDateTime eventLocalDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(eventTimestamp), + ZoneId.systemDefault()); + + // Compute session inactivity duration (in milliseconds) + final long sessionInactivityDuration = Duration.between(eventLocalDateTime, now).getSeconds(); + + if (sessionInactivityDuration > sessionInactivityTimeoutInSeconds) {//it is a value not a field here + // Mark the session as closed + sessionInternalRecord.setField(webSessionInternalFields.getIsSessionActiveField(), FieldType.BOOLEAN, Boolean.FALSE); + + // Max out the sessionInactivityDuration - only pertinent in case of topic rewind. + sessionInternalRecord.setField(webSessionInternalFields.getSessionInactivityDurationField(), FieldType.LONG, sessionInactivityTimeoutInSeconds); + } else { + sessionInternalRecord.setField(webSessionInternalFields.getIsSessionActiveField(), FieldType.BOOLEAN, Boolean.TRUE); + } + + final long sessionDuration = Duration.between(Instant.ofEpochMilli(creationTimestamp), + Instant.ofEpochMilli(eventTimestamp)).getSeconds(); + if (sessionDuration > 0) { + sessionInternalRecord.setField(webSessionInternalFields.getSessionDurationField(), FieldType.LONG, sessionDuration); + } + + // Extra + final Field transactionIdField = event.getRecord().getField(eventInternalFields.getTransactionIdField()); + if (isFieldAssigned(transactionIdField) + && (!"undefined".equalsIgnoreCase(transactionIdField.asString())) + && (!transactionIdField.asString().isEmpty())) { + final Field transactionIdsField = sessionInternalRecord.getField(eventInternalFields.getTransactionIdsField()); + Collection transactionIds; + if (!isFieldAssigned(transactionIdField)) { + transactionIds = (Collection) transactionIdsField.getRawValue(); + } else { + transactionIds = new ArrayList<>(); + sessionInternalRecord.setField(webSessionInternalFields.getTransactionIdsField(), FieldType.ARRAY, transactionIds); + } + transactionIds.add(transactionIdField.asString()); + } + + if (!sessionInternalRecord.isValid()) { + sessionInternalRecord.getFieldsEntrySet().forEach(entry -> + { + final Field f = entry.getValue(); + logger.debug("INVALID field type={}, class={}", f.getType(), f.getRawValue().getClass()); + }); + } + } + +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/util/Utils.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/util/Utils.java new file mode 100644 index 000000000..627e0de9f --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/main/java/com/hurence/logisland/processor/webanalytics/util/Utils.java @@ -0,0 +1,53 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.util; + +import com.hurence.logisland.record.Field; + +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; + +public class Utils { + + /** + * Return {@code true} if the provided field has a non-null value; {@code false} otherwise. + * + * @param field the field to check. + * + * @return {@code true} if the provided field has a non-null value; {@code false} otherwise. + */ + public static boolean isFieldAssigned(final Field field) + { + return field!=null && field.getRawValue()!=null; + } + + /** + * Returns the name of the event index corresponding to the specified date such as + * ${event-index-name}.${event-suffix}. + * Eg. openanalytics-webevents.2018.01.31 + * + * @param date the ZonedDateTime of the event to store in the index. + * @return the name of the event index corresponding to the specified date. + */ + public static String buildIndexName(final String indexPrefix, + final DateTimeFormatter formatterSuffix, + final ZonedDateTime date, + final ZoneId zoneIdToUse) { + return indexPrefix + formatterSuffix.format(date.withZoneSameInstant(zoneIdToUse)); + } + +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webAnalytics/IncrementalWebSessionTest.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webAnalytics/IncrementalWebSessionTest.java deleted file mode 100644 index d13c1a66c..000000000 --- a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webAnalytics/IncrementalWebSessionTest.java +++ /dev/null @@ -1,1418 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.processor.webAnalytics; - -import com.hurence.logisland.component.InitializationException; -import com.hurence.logisland.component.PropertyDescriptor; -import com.hurence.logisland.controller.AbstractControllerService; -import com.hurence.logisland.record.Field; -import com.hurence.logisland.record.FieldDictionary; -import com.hurence.logisland.record.FieldType; -import com.hurence.logisland.record.Record; -import com.hurence.logisland.record.StandardRecord; -import com.hurence.logisland.service.datastore.DatastoreClientServiceException; -import com.hurence.logisland.service.elasticsearch.ElasticsearchClientService; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; -import com.hurence.logisland.util.runner.MockRecord; -import com.hurence.logisland.util.runner.TestRunner; -import com.hurence.logisland.util.runner.TestRunners; -import org.joda.time.format.DateTimeFormatter; -import org.joda.time.format.ISODateTimeFormat; -import org.junit.Assert; -import org.junit.Test; - -import javax.management.MalformedObjectNameException; -import javax.management.ObjectName; -import java.text.SimpleDateFormat; -import java.time.Duration; -import java.time.Instant; -import java.time.ZoneId; -import java.time.ZonedDateTime; -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - * Test incremental web-session processor. - */ -public class IncrementalWebSessionTest -{ - Object[] data = new Object[]{ - new Object[]{"sessionId", "0;jiq0aaj2;6osgJiqVwdTq8CGHpIRXdeufGD71mxCW", - "partyId", "0:jiq0aaj2:plz07Fik~eNyLzMsxTk6tg00YqKkgBvd", - "location", "https://orexad.preprod.group-iph.com/fr/entretien-de-fluides/c-20-50-10", - "h2kTimestamp", 1529673800671L, - "userId", null}, - new Object[]{"sessionId", "0;jiq0aaj2;6osgJiqVwdTq8CGHpIRXdeufGD71mxCW", - "partyId", "0:jiq0aaj2:plz07Fik~eNyLzMsxTk6tg00YqKkgBvd", - "location", "https://orexad.preprod.group-iph.com/fr/entretien-de-fluides/c-20-50-10?utm_source=TEST&utm_medium=email&utm_campaign=HT", - "h2kTimestamp", 1529673855863L, - "userId", null}, - new Object[]{"sessionId", "0;jiq0aaj2;6osgJiqVwdTq8CGHpIRXdeufGD71mxCW", - "partyId", "0:jiq0aaj2:plz07Fik~eNyLzMsxTk6tg00YqKkgBvd", - "location", "https://orexad.preprod.group-iph.com/fr/entretien-de-fluides/c-20-50-10", - "h2kTimestamp", 1529673912936L, - "userId", null}}; - - Object[] data2 = new Object[]{ - new Object[]{ - "h2kTimestamp" , 1538753339113L, - "location" , "https://www.zitec-shop.com/en/", - "sessionId" , "SESSIONID" // "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" - }, new Object[]{ - "h2kTimestamp" , 1538753689109L, - "location" , "https://www.zitec-shop.com/en/", - "sessionId" , "SESSIONID" - }, new Object[]{ - "h2kTimestamp" , 1538753753964L, - "location" , "https://www.zitec-shop.com/en/", - "sessionId" , "SESSIONID" - }, new Object[]{ - "h2kTimestamp" , 1538753768489L, - "location" , "https://www.zitec-shop.com/en/schragkugellager-718-tn/p-G1156005137", - "sessionId" , "SESSIONID" - }, new Object[]{ - "h2kTimestamp" , 1538756201154L, // timeout - "location" , "https://www.zitec-shop.com/en/schragkugellager-718-tn/p-G1156005137", - "sessionId" , "SESSIONID" - }, new Object[]{ - "h2kTimestamp" , 1538756215043L, - "location" , "https://www.zitec-shop.com/en/search/?text=rotex%2Cgg%2C48", - "sessionId" , "SESSIONID" - }, new Object[]{ - "h2kTimestamp" , 1538756216242L, - "location" , "https://www.zitec-shop.com/en/search/?text=rotex%2Cgg%2C48", - "sessionId" , "SESSIONID" - }, new Object[]{ - "h2kTimestamp" , 1538756232483L, - "location" , "https://www.zitec-shop.com/en/rotex-48-gg/p-G1184000392", - "sessionId" , "SESSIONID" - }, new Object[]{ - "h2kTimestamp" , 1538756400671L, - "location" , "https://www.zitec-shop.com/en/rotex-48-gg/p-G1184000392", - "sessionId" , "SESSIONID" - }, new Object[]{ - "h2kTimestamp" , 1538756417237L, - "location" , "https://www.zitec-shop.com/en/kugelfuhrungswagen-vierreihig/p-G1156007584", - "sessionId" , "SESSIONID" - }, new Object[]{ - "h2kTimestamp" , 1538767062429L, // timeout - "location" , "https://www.zitec-shop.com/en/kugelfuhrungswagen-vierreihig/p-G1156007584", - "sessionId" , "SESSIONID" - }, new Object[]{ - "h2kTimestamp" , 1538767070188L, - "location" , "https://www.zitec-shop.com/en/search/?text=nah25", - "sessionId" , "SESSIONID" - }, new Object[]{ - "h2kTimestamp" , 1538767073907L, - "location" , "https://www.zitec-shop.com/en/search/?text=nah25", - "sessionId" , "SESSIONID" - }, new Object[]{ - "h2kTimestamp" , 1538767077273L, - "location" , "https://www.zitec-shop.com/en/search/?text=nah", - "sessionId" , "SESSIONID" - }, new Object[]{ - "h2kTimestamp" , 1538780539746L, // timeout - "location" , "https://www.zitec-shop.com/en/search/?text=nah", - "sessionId" , "SESSIONID" - }, new Object[]{ - "h2kTimestamp" , 1538780546243L, - "location" , "https://www.zitec-shop.com/en/search/?text=hj234", - "sessionId" , "SESSIONID" - }, new Object[]{ - "h2kTimestamp" , 1538780578259L, - "location" , "https://www.zitec-shop.com/en/search/?text=hj234", - "sessionId" , "SESSIONID" - }, new Object[]{ - "h2kTimestamp" , 1538780595932L, - "location" , "https://www.zitec-shop.com/en/search/?text=hj+234", - "sessionId" , "SESSIONID" - }, new Object[]{ - "h2kTimestamp" , 1538780666747L, - "location" , "https://www.zitec-shop.com/en/search/?text=hj+234", - "sessionId" , "SESSIONID" - }, new Object[]{ - "h2kTimestamp" , 1538780680777L, - "location" , "https://www.zitec-shop.com/en/sealed-spherical-roller-bearings-ws222-e1/p-G1112006937", - "sessionId" , "SESSIONID" - }, new Object[]{ - "h2kTimestamp" , 1538780684232L, - "location" , "https://www.zitec-shop.com/en/login", - "sessionId" , "SESSIONID" - }, new Object[]{ - "h2kTimestamp" , 1538780691752L, - "location" , "https://www.zitec-shop.com/en/sealed-spherical-roller-bearings-ws222-e1/p-G1112006937", - "sessionId" , "SESSIONID" - }, new Object[]{ - "h2kTimestamp" , 1538780748044L, - "location" , "https://www.zitec-shop.com/en/sealed-spherical-roller-bearings-ws222-e1/p-G1112006937", - "sessionId" , "SESSIONID" - }, new Object[]{ - "h2kTimestamp" , 1538780763016L, - "location" , "https://www.zitec-shop.com/en/roller-bearing-spherical-radial-multi-row/p-G1321019550", - "sessionId" , "SESSIONID"}}; - - - Object[] data3 = new Object[]{ - new Object[]{ - "h2kTimestamp" , 1538753753964L, - "location" , "https://www.zitec-shop.com/en/", - "sessionId" , "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" - }, new Object[]{ - "h2kTimestamp" , 1538753768489L, - "location" , "https://www.zitec-shop.com/en/schragkugellager-718-tn/p-G1156005137", - "sessionId" , "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" - }, new Object[]{ - "h2kTimestamp" , 1538767062429L, - "location" , "https://www.zitec-shop.com/en/kugelfuhrungswagen-vierreihig/p-G1156007584", - "sessionId" , "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" - }, new Object[]{ - "h2kTimestamp" , 1538756216242L, - "location" , "https://www.zitec-shop.com/en/search/?text=rotex%2Cgg%2C48", - "sessionId" , "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" - }, new Object[]{ - "h2kTimestamp" , 1538756215043L, - "location" , "https://www.zitec-shop.com/en/search/?text=rotex%2Cgg%2C48", - "sessionId" , "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" - }, new Object[]{ - "h2kTimestamp" , 1538753689109L, - "location" , "https://www.zitec-shop.com/en/", - "sessionId" , "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" - }, new Object[]{ - "h2kTimestamp" , 1538756417237L, - "location" , "https://www.zitec-shop.com/en/kugelfuhrungswagen-vierreihig/p-G1156007584", - "sessionId" , "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" - }, new Object[]{ - "h2kTimestamp" , 1538753339113L, - "location" , "https://www.zitec-shop.com/en/", - "sessionId" , "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" - }, new Object[]{ - "h2kTimestamp" , 1538756201154L, - "location" , "https://www.zitec-shop.com/en/schragkugellager-718-tn/p-G1156005137", - "sessionId" , "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" - }, new Object[]{ - "h2kTimestamp" , 1538767070188L, - "location" , "https://www.zitec-shop.com/en/search/?text=nah25", - "sessionId" , "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" - }, new Object[]{ - "h2kTimestamp" , 1538756232483L, - "location" , "https://www.zitec-shop.com/en/rotex-48-gg/p-G1184000392", - "sessionId" , "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" - }, new Object[]{ - "h2kTimestamp" , 1538756400671L, - "location" , "https://www.zitec-shop.com/en/rotex-48-gg/p-G1184000392", - "sessionId" , "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" - }, new Object[]{ - "h2kTimestamp" , 1538767073907L, - "location" , "https://www.zitec-shop.com/en/search/?text=nah25", - "sessionId" , "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" - }, new Object[]{ - "h2kTimestamp" , 1538767077273L, - "location" , "https://www.zitec-shop.com/en/search/?text=nah", - "sessionId" , "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" - }, new Object[]{ - "h2kTimestamp" , 1538780595932L, - "location" , "https://www.zitec-shop.com/en/search/?text=hj+234", - "sessionId" , "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" - }, new Object[]{ - "h2kTimestamp" , 1538780680777L, - "location" , "https://www.zitec-shop.com/en/sealed-spherical-roller-bearings-ws222-e1/p-G1112006937", - "sessionId" , "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" - }, new Object[]{ - "h2kTimestamp" , 1538780666747L, - "location" , "https://www.zitec-shop.com/en/search/?text=hj+234", - "sessionId" , "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" - }, new Object[]{ - "h2kTimestamp" , 1538780539746L, - "location" , "https://www.zitec-shop.com/en/search/?text=nah", - "sessionId" , "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" - }, new Object[]{ - "h2kTimestamp" , 1538780546243L, - "location" , "https://www.zitec-shop.com/en/search/?text=hj234", - "sessionId" , "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" - }, new Object[]{ - "h2kTimestamp" , 1538780578259L, - "location" , "https://www.zitec-shop.com/en/search/?text=hj234", - "sessionId" , "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" - }, new Object[]{ - "h2kTimestamp" , 1538780691752L, - "location" , "https://www.zitec-shop.com/en/sealed-spherical-roller-bearings-ws222-e1/p-G1112006937", - "sessionId" , "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" - }, new Object[]{ - "h2kTimestamp" , 1538780684232L, - "location" , "https://www.zitec-shop.com/en/login", - "sessionId" , "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" - }, new Object[]{ - "h2kTimestamp" , 1538780763016L, - "location" , "https://www.zitec-shop.com/en/roller-bearing-spherical-radial-multi-row/p-G1321019550", - "sessionId" , "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" - }, new Object[]{ - "h2kTimestamp" , 1538780748044L, - "location" , "https://www.zitec-shop.com/en/sealed-spherical-roller-bearings-ws222-e1/p-G1112006937", - "sessionId" , "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP"} - }; - - private static final String SESSION_INDEX = "openanalytics_websessions"; - private static final String SESSION_TYPE = "sessions"; - private static final String EVENT_INDEX = "openanalytics_webevents"; - private static final String EVENT_TYPE = "event"; - private static final String MAPPING_INDEX = "openanalytics_mappings"; - - private static final String SESSION_ID = "sessionId"; - private static final String TIMESTAMP = "h2kTimestamp"; - private static final String VISITED_PAGE = "VISITED_PAGE"; - private static final String CURRENT_CART = "currentCart"; - private static final String USER_ID = "Userid"; - - private static final String SESSION1 = "session1"; - private static final String SESSION2 = "session2"; - - private static final long SESSION_TIMEOUT = 10; // but should be 30*60; - - private static final String URL1 = "http://page1"; - private static final String URL2 = "http://page2"; - private static final String URL3 = "http://page3"; - - private static final String USER1 = "user1"; - private static final String USER2 = "user2"; - - private static final String PARTY_ID1 = "partyId1"; - - private static final Long DAY1 = 1493197966584L; // Wed Apr 26 11:12:46 CEST 2017 - private static final Long DAY2 = 1493297966584L; // Thu Apr 27 14:59:26 CEST 2017 - - private static final String PARTY_ID = "partyId"; - private static final String B2BUNIT = "B2BUnit"; - - private static final String FIELDS_TO_RETURN = Stream.of(PARTY_ID, B2BUNIT).collect(Collectors.joining(",")); - - private final ESC elasticsearchClient = new ESC(); - - private MockRecord getRecord(final String session, final List records) - { - return records.stream().filter(record -> record.getId().equals(session)).findFirst().get(); - } - - @Test - public void testCreateOneSessionOneEvent() - throws Exception - { - this.elasticsearchClient.documents.clear(); - int eventCount = 0; - - TestRunner testRunner = newTestRunner(); - testRunner.assertValid(); - testRunner.enqueue(Arrays.asList(new WebEvent(eventCount++, SESSION1, USER1, DAY1, URL1))); - testRunner.run(); - testRunner.assertAllInputRecordsProcessed(); - testRunner.assertOutputErrorCount(0); - - // One webSession expected. - testRunner.assertOutputRecordsCount(1); - final MockRecord doc = getRecord(SESSION1, testRunner.getOutputRecords()); - - - new WebSessionChecker(doc).sessionId(SESSION1) - .Userid(USER1) - .record_type("consolidate-session") - .record_id(SESSION1) - .firstEventDateTime(DAY1) - .h2kTimestamp(DAY1) - .firstVisitedPage(URL1) - .eventsCounter(1) - .lastEventDateTime(DAY1) - .lastVisitedPage(URL1) - .sessionDuration(null) - .is_sessionActive(false) - .sessionInactivityDuration(SESSION_TIMEOUT); - } - - @Test - public void testCreateOneSessionMultipleEvents() - throws Exception - { - this.elasticsearchClient.documents.clear(); - int eventCount = 0; - - TestRunner testRunner = newTestRunner(); - testRunner.assertValid(); - testRunner.enqueue(Arrays.asList(new WebEvent(eventCount++, SESSION1, null, DAY1, URL1), - new WebEvent(eventCount++, SESSION1, USER1, DAY1+1000L, URL2), - new WebEvent(eventCount++, SESSION1, null, DAY1+2000L, URL3))); - testRunner.run(); - testRunner.assertAllInputRecordsProcessed(); - testRunner.assertOutputErrorCount(0); - - // One webSession expected. - testRunner.assertOutputRecordsCount(1); - final MockRecord doc = getRecord(SESSION1, testRunner.getOutputRecords()); - - new WebSessionChecker(doc).sessionId(SESSION1) - .Userid(USER1) - .record_type("consolidate-session") - .record_id(SESSION1) - .firstEventDateTime(DAY1) - .h2kTimestamp(DAY1) - .firstVisitedPage(URL1) - .eventsCounter(3) - .lastEventDateTime(DAY1+2000L) - .lastVisitedPage(URL3) - .sessionDuration(2L) - .is_sessionActive(false) - .sessionInactivityDuration(SESSION_TIMEOUT); - } - - @Test - public void testCreateOneSessionMultipleEventsData2() - throws Exception - { - this.elasticsearchClient.documents.clear(); - int eventCount = 0; - - TestRunner testRunner = newTestRunner(); - testRunner.setProperty(IncrementalWebSession.SESSION_INACTIVITY_TIMEOUT, "1800"); - testRunner.assertValid(); - List events = new ArrayList<>(3); - for(final Object line: data2) - { - final Iterator iterator = Arrays.asList((Object[])line).iterator(); - final Map fields = new HashMap(); - while (iterator.hasNext()) - { - Object name = iterator.next(); - Object value = iterator.next(); - fields.put(name, value); - } - events.add(new WebEvent(eventCount++, - (String)fields.get("sessionId"), - (String)fields.get("userId"), - (Long)fields.get("h2kTimestamp"), - (String)fields.get("location"))); - } - testRunner.enqueue(events); - testRunner.run(); - testRunner.assertAllInputRecordsProcessed(); - testRunner.assertOutputErrorCount(0); - - // One webSession expected. - testRunner.assertOutputRecordsCount(4); - } - - // @Test - public void testCreateOneSessionMultipleEventsData() - throws Exception - { - this.elasticsearchClient.documents.clear(); - int eventCount = 0; - - TestRunner testRunner = newTestRunner(); - testRunner.assertValid(); - List events = new ArrayList<>(3); - for(final Object line: data) - { - final Iterator iterator = Arrays.asList((Object[])line).iterator(); - final Map fields = new HashMap(); - while (iterator.hasNext()) - { - Object name = iterator.next(); - Object value = iterator.next(); - fields.put(name, value); - } - events.add(new WebEvent(eventCount++, - (String)fields.get("sessionId"), - (String)fields.get("userId"), - (Long)fields.get("h2kTimestamp"), - (String)fields.get("location"))); - } - testRunner.enqueue(events); - testRunner.run(); - testRunner.assertAllInputRecordsProcessed(); - testRunner.assertOutputErrorCount(0); - - // One webSession expected. - testRunner.assertOutputRecordsCount(1); - - final Record firstEvent = events.get(0); - final Record lastEvent = events.get(2); - final String user = firstEvent.getField(USER_ID)==null?null:firstEvent.getField(USER_ID).asString(); - - final MockRecord doc = getRecord((String)firstEvent.getField(SESSION_ID).getRawValue(), testRunner.getOutputRecords()); - - new WebSessionChecker(doc).sessionId(firstEvent.getField(SESSION_ID).getRawValue()) - .Userid(user) - .record_type("consolidate-session") - .record_id(firstEvent.getField(SESSION_ID).getRawValue()) - .firstEventDateTime(firstEvent.getField(TIMESTAMP).asLong()) - .h2kTimestamp((Long)firstEvent.getField(TIMESTAMP).getRawValue()) - .firstVisitedPage(firstEvent.getField(VISITED_PAGE).getRawValue()) - .eventsCounter(3) - .lastEventDateTime(lastEvent.getField(TIMESTAMP).asLong()) - .lastVisitedPage(lastEvent.getField(VISITED_PAGE).getRawValue()) - .sessionDuration((lastEvent.getField(TIMESTAMP).asLong() // lastEvent.getField(TIMESTAMP) - -firstEvent.getField(TIMESTAMP).asLong())/1000) - .is_sessionActive((Instant.now().toEpochMilli() - -lastEvent.getField(TIMESTAMP).asLong())/1000 events = Arrays.asList( - new WebEvent(eventCount++, SESSION1, USER1, DAY1, - URL1), - new WebEvent(eventCount++, SESSION1, USER1, 1531492435034L, - "https://orexad.preprod.group-iph.com/fr/cart"), - new WebEvent(eventCount++, SESSION1, USER1, 1531493380029L, - "https://orexad.preprod.group-iph.com/fr/search/?text=Vis"), - new WebEvent(eventCount++, SESSION1, USER1, 1531493805028L, - "https://orexad.preprod.group-iph.com/fr/search/?text=Vis"), - new WebEvent(eventCount++, SESSION1, USER1, 1531493810026L, - "https://orexad.preprod.group-iph.com/fr/vis-traction-complete-p-kit-k300/p-G1296007152?l=G1296007152"), - new WebEvent(eventCount++, SESSION1, USER1, 1531494175027L, - "https://orexad.preprod.group-iph.com/fr/cart"), - new WebEvent(eventCount++, SESSION1, USER1, 1531494180026L, - "https://orexad.preprod.group-iph.com/fr/cart"), - new WebEvent(eventCount++, SESSION1, USER1, 1531494480026L, - "https://orexad.preprod.group-iph.com/fr/cart"), - new WebEvent(eventCount++, SESSION1, USER1, TIME2, - URL2)); - - TestRunner testRunner = newTestRunner(); - testRunner.setProperty(IncrementalWebSession.SESSION_INACTIVITY_TIMEOUT, String.valueOf(SESSION_TIMEOUT)); - testRunner.assertValid(); - testRunner.enqueue(events); - - testRunner.run(); - testRunner.assertAllInputRecordsProcessed(); - testRunner.assertOutputErrorCount(0); - - // One webSession expected . - testRunner.assertOutputRecordsCount(1); - final MockRecord doc = getRecord(SESSION1, testRunner.getOutputRecords()); - - new WebSessionChecker(doc).sessionId(SESSION1) - .Userid(USER1) - .record_type("consolidate-session") - .record_id(SESSION1) - .firstEventDateTime(DAY1) - .h2kTimestamp(DAY1) - .firstVisitedPage(URL1) - .eventsCounter(events.size()) - .lastEventDateTime(TIME2) - .lastVisitedPage(URL2) - .sessionDuration((TIME2-DAY1)/1000) - .is_sessionActive(false) - .sessionInactivityDuration(SESSION_TIMEOUT); - } - - @Test - public void testCreateGrabOneFieldPresentEveryWhere() - throws Exception - { - this.elasticsearchClient.documents.clear(); - int eventCount = 0; - - TestRunner testRunner = newTestRunner(); - testRunner.assertValid(); - testRunner.enqueue(Arrays.asList(new WebEvent(eventCount++, SESSION1, USER1, DAY1, URL1).add(PARTY_ID, PARTY_ID1))); - testRunner.run(); - testRunner.assertAllInputRecordsProcessed(); - testRunner.assertOutputErrorCount(0); - - // One webSession expected. - testRunner.assertOutputRecordsCount(1); - final MockRecord doc = getRecord(SESSION1, testRunner.getOutputRecords()); - - new WebSessionChecker(doc).sessionId(SESSION1) - .Userid(USER1) - .record_type("consolidate-session") - .record_id(SESSION1) - .firstEventDateTime(DAY1) - .h2kTimestamp(DAY1) - .firstVisitedPage(URL1) - .eventsCounter(1) - .lastEventDateTime(DAY1) - .lastVisitedPage(URL1) - .sessionDuration(null) - .is_sessionActive(false) - .sessionInactivityDuration(SESSION_TIMEOUT) - .check(PARTY_ID, PARTY_ID1) - .check(B2BUNIT, null); - } - - @Test - public void testCreateGrabTwoFieldsPresentEveryWhere() - throws Exception - { - this.elasticsearchClient.documents.clear(); - int eventCount = 0; - - TestRunner testRunner = newTestRunner(); - testRunner.assertValid(); - testRunner.enqueue(Arrays.asList(new WebEvent(eventCount++, SESSION1, USER1, DAY1, URL1).add(PARTY_ID, PARTY_ID1))); - testRunner.run(); - testRunner.assertAllInputRecordsProcessed(); - testRunner.assertOutputErrorCount(0); - - // One webSession expected. - testRunner.assertOutputRecordsCount(1); - final MockRecord doc = getRecord(SESSION1, testRunner.getOutputRecords()); - - new WebSessionChecker(doc).sessionId(SESSION1) - .Userid(USER1) - .record_type("consolidate-session") - .record_id(SESSION1) - .firstEventDateTime(DAY1) - .h2kTimestamp(DAY1) - .firstVisitedPage(URL1) - .eventsCounter(1) - .lastEventDateTime(DAY1) - .lastVisitedPage(URL1) - .sessionDuration(null) - .is_sessionActive(false) - .sessionInactivityDuration(SESSION_TIMEOUT) - .check(PARTY_ID, PARTY_ID1) - .check(B2BUNIT, null); - } - - - @Test - public void testUpdateOneWebSessionNow() - throws Exception - { - this.elasticsearchClient.documents.clear(); - int eventCount = 0; - - Instant firstEvent = Instant.now().minusSeconds(8); - TestRunner testRunner = newTestRunner(); - testRunner.assertValid(); - testRunner.enqueue(Arrays.asList(new WebEvent(eventCount++, SESSION1, USER1, firstEvent.toEpochMilli(), URL1))); - testRunner.run(); - testRunner.assertAllInputRecordsProcessed(); - testRunner.assertOutputRecordsCount(1); - testRunner.getOutputRecords().forEach(record -> this.elasticsearchClient.save(record)); - - Instant lastEvent = firstEvent.plusSeconds(2); - testRunner = newTestRunner(); - testRunner.enqueue(Arrays.asList(new WebEvent(eventCount++, SESSION1, USER1, lastEvent.toEpochMilli(), URL2))); - testRunner.run(); - testRunner.assertAllInputRecordsProcessed(); - testRunner.assertOutputRecordsCount(1); - testRunner.getOutputRecords().forEach(record -> this.elasticsearchClient.save(record)); - - lastEvent = lastEvent.plusSeconds(4); - testRunner = newTestRunner(); - testRunner.enqueue(Arrays.asList(new WebEvent(eventCount++, SESSION1, USER1, lastEvent.toEpochMilli(), URL3))); - testRunner.run(); - testRunner.assertAllInputRecordsProcessed(); - testRunner.getOutputRecords().forEach(record -> this.elasticsearchClient.save(record)); - - // One webSession expected. - Assert.assertEquals(1+1+eventCount, this.elasticsearchClient.documents.size()); - testRunner.assertOutputRecordsCount(1); - Set ids = this.elasticsearchClient.documents.keySet().stream().map(id->id.getKeyProperty("id")).collect(Collectors.toSet()); - Assert.assertTrue(ids.contains(SESSION1)); - - final MockRecord doc = getRecord(SESSION1, testRunner.getOutputRecords()); - - new WebSessionChecker(doc).sessionId(SESSION1) - .Userid(USER1) - .record_type("consolidate-session") - .record_id(SESSION1) - .firstEventDateTime(firstEvent.toEpochMilli()) - .h2kTimestamp(firstEvent.toEpochMilli()) - .firstVisitedPage(URL1) - .eventsCounter(3) - .lastEventDateTime(lastEvent.toEpochMilli()) - .lastVisitedPage(URL3) - .sessionDuration(Duration.between(firstEvent, lastEvent).getSeconds()) - .is_sessionActive(true) - .sessionInactivityDuration(null); - - testRunner.assertOutputErrorCount(0); - } - - @Test - public void testUpdateOneWebSessionInactive() - throws Exception - { - this.elasticsearchClient.documents.clear(); - int eventCount = 0; - - // Create a web session with timestamp 2s before timeout. - Instant firstEvent = Instant.now().minusSeconds(SESSION_TIMEOUT-2); - TestRunner testRunner = newTestRunner(); - testRunner.assertValid(); - testRunner.enqueue(Arrays.asList(new WebEvent(eventCount++, SESSION1, USER1, firstEvent.toEpochMilli(), URL1))); - testRunner.run(); - testRunner.assertAllInputRecordsProcessed(); - testRunner.assertOutputRecordsCount(1); - testRunner.getOutputRecords().forEach(record -> this.elasticsearchClient.save(record)); - - Record doc = this.elasticsearchClient.getSession(SESSION1); - new WebSessionChecker(doc).lastVisitedPage(URL1); - - // Update web session with timestamp 1s before timeout. - Instant event = firstEvent.plusSeconds(1); - testRunner = newTestRunner(); - testRunner.enqueue(Arrays.asList(new WebEvent(eventCount++, SESSION1, USER1, event.toEpochMilli(), URL2))); - testRunner.run(); - testRunner.assertAllInputRecordsProcessed(); - testRunner.assertOutputRecordsCount(1); - testRunner.getOutputRecords().forEach(record -> this.elasticsearchClient.save(record)); - - doc = this.elasticsearchClient.getSession(SESSION1); - new WebSessionChecker(doc).lastVisitedPage(URL2); - - Thread.sleep(5000); // Make sure the Instant.now performed in the processor will exceed timeout. - - // Update web session with NOW+2s+SESSION_TIMEOUT. - Instant lastEvent = event.plusSeconds(1); - testRunner = newTestRunner(); - testRunner.enqueue(Arrays.asList(new WebEvent(eventCount++, SESSION1, USER1, lastEvent.toEpochMilli(), URL3))); - testRunner.run(); - testRunner.assertAllInputRecordsProcessed(); - testRunner.getOutputRecords().forEach(record -> this.elasticsearchClient.save(record)); - - // One webSession + 2 webEvents + 1 mapping expected in elasticsearch. - Assert.assertEquals(1+eventCount+1, this.elasticsearchClient.documents.size()); - Set ids = this.elasticsearchClient.documents.keySet().stream().map(id->id.getKeyProperty("id")).collect(Collectors.toSet()); - Assert.assertTrue(ids.contains(SESSION1)); - - doc = this.elasticsearchClient.getSession(SESSION1); - - new WebSessionChecker(doc).sessionId(SESSION1) - .Userid(USER1) - .record_type("consolidate-session") - .record_id(SESSION1) - .firstEventDateTime(firstEvent.toEpochMilli()) - .h2kTimestamp(firstEvent.toEpochMilli()) - .firstVisitedPage(URL1) - .eventsCounter(3) - .lastEventDateTime(lastEvent.toEpochMilli()) - .lastVisitedPage(URL3) - .sessionDuration(Duration.between(firstEvent, lastEvent).getSeconds()) - .is_sessionActive(false) - .sessionInactivityDuration(SESSION_TIMEOUT); - - testRunner.assertOutputRecordsCount(1); - testRunner.assertOutputErrorCount(0); - } - - @Test - public void testUpdateOneWebSessionTimedout() - throws Exception - { - this.elasticsearchClient.documents.clear(); - int eventCount = 0; - - // Create a web session with timestamp 2s before timeout. - Instant firstEvent = Instant.now().minusSeconds(SESSION_TIMEOUT+2); - TestRunner testRunner = newTestRunner(); - testRunner.assertValid(); - testRunner.enqueue(Arrays.asList(new WebEvent(eventCount++, SESSION1, USER1, firstEvent.toEpochMilli(), URL1))); - testRunner.run(); - testRunner.assertAllInputRecordsProcessed(); - testRunner.assertOutputRecordsCount(1); - testRunner.getOutputRecords().forEach(record -> this.elasticsearchClient.save(record)); - - // Update web session with a timestamp that is timeout. - Instant timedoutEvent = Instant.now(); - testRunner = newTestRunner(); - testRunner.enqueue(Arrays.asList(new WebEvent(eventCount++, SESSION1, USER1, timedoutEvent.toEpochMilli(), URL2))); - testRunner.run(); - testRunner.assertAllInputRecordsProcessed(); - testRunner.assertOutputRecordsCount(2); - testRunner.getOutputRecords().forEach(record -> this.elasticsearchClient.save(record)); - - // 2 webSessions + 2 webEvents + 1 mapping expected in elasticsearch. - Assert.assertEquals(2+eventCount+1, this.elasticsearchClient.documents.size()); - Set ids = this.elasticsearchClient.documents.keySet().stream().map(id->id.getKeyProperty("id")).collect(Collectors.toSet()); - Assert.assertTrue(ids.contains(SESSION1)); - - Record doc = this.elasticsearchClient.getSession(SESSION1); - new WebSessionChecker(doc).sessionId(SESSION1) - .Userid(USER1) - .record_type("consolidate-session") - .record_id(SESSION1) - .firstEventDateTime(firstEvent.toEpochMilli()) - .h2kTimestamp(firstEvent.toEpochMilli()) - .firstVisitedPage(URL1) - .eventsCounter(1) - .lastEventDateTime(firstEvent.toEpochMilli()) - .lastVisitedPage(URL1) - .is_sessionActive(false) - .sessionInactivityDuration(SESSION_TIMEOUT); - - final String EXTRA_SESSION = SESSION1+"#2"; - doc = this.elasticsearchClient.getSession(EXTRA_SESSION); - new WebSessionChecker(doc).sessionId(EXTRA_SESSION) - .Userid(USER1) - .record_type("consolidate-session") - .record_id(EXTRA_SESSION) - .firstEventDateTime(timedoutEvent.toEpochMilli()) - .h2kTimestamp(timedoutEvent.toEpochMilli()) - .firstVisitedPage(URL2) - .eventsCounter(1) - .lastEventDateTime(timedoutEvent.toEpochMilli()) - .lastVisitedPage(URL2) - .is_sessionActive(true); - - testRunner.assertOutputRecordsCount(2); - testRunner.assertOutputErrorCount(0); - } - - @Test - public void testAdword() - throws Exception - { - this.elasticsearchClient.documents.clear(); - int eventCount = 0; - - String URL = URL1+"?gclid=XXX"; - - TestRunner testRunner = newTestRunner(); - testRunner.assertValid(); - testRunner.enqueue(Arrays.asList(new WebEvent(eventCount++, SESSION1, USER1, DAY1, URL), - new WebEvent(eventCount++, SESSION1, USER1, DAY2, URL2))); - testRunner.run(); - testRunner.assertAllInputRecordsProcessed(); - testRunner.assertOutputErrorCount(0); - - // Two webSessions expected . - testRunner.assertOutputRecordsCount(2); - testRunner.getOutputRecords().forEach(record -> this.elasticsearchClient.save(record)); - Record doc = this.elasticsearchClient.getSession(SESSION1); - - new WebSessionChecker(doc).sessionId(SESSION1) - .Userid(USER1) - .record_type("consolidate-session") - .record_id(SESSION1) - .firstEventDateTime(DAY1) - .h2kTimestamp(DAY1) - .firstVisitedPage(URL) - .eventsCounter(1) - .lastEventDateTime(DAY1) - .lastVisitedPage(URL) - .sessionDuration(null) - .is_sessionActive(false) - .sessionInactivityDuration(SESSION_TIMEOUT); - - String SESSION = SESSION1+"#2"; - doc = this.elasticsearchClient.getSession(SESSION); - - new WebSessionChecker(doc).sessionId(SESSION) - .Userid(USER1) - .record_type("consolidate-session") - .record_id(SESSION) - .firstEventDateTime(DAY2) - .h2kTimestamp(DAY2) - .firstVisitedPage(URL2) - .eventsCounter(1) - .lastEventDateTime(DAY2) - .lastVisitedPage(URL2) - .sessionDuration(null) - .is_sessionActive(false) - .sessionInactivityDuration(SESSION_TIMEOUT); - - } - - - @Test - public void testEventHandleCorrectlyNullArrays() - throws Exception - { - this.elasticsearchClient.documents.clear(); - int eventCount = 0; - - TestRunner testRunner = newTestRunner(); - testRunner.assertValid(); - testRunner.enqueue(Arrays.asList(new WebEvent(eventCount++, SESSION1, USER1, DAY1, URL1))); - testRunner.run(); - testRunner.assertAllInputRecordsProcessed(); - testRunner.assertOutputErrorCount(0); - - // One webSession expected. - testRunner.assertOutputRecordsCount(1); - Map event = this.elasticsearchClient.documents.get(ESC.toId( - EVENT_INDEX + "." + java.time.format.DateTimeFormatter.ofPattern("yyyy.MM.dd", - Locale.ENGLISH).format(ZonedDateTime.ofInstant(Instant.ofEpochMilli(DAY1), - ZoneId.systemDefault())), EVENT_TYPE, "0")); - - Assert.assertNull(event.get(CURRENT_CART)); - - final MockRecord doc = getRecord(SESSION1, testRunner.getOutputRecords()); - - - new WebSessionChecker(doc).sessionId(SESSION1) - .Userid(USER1) - .record_type("consolidate-session") - .record_id(SESSION1) - .firstEventDateTime(DAY1) - .h2kTimestamp(DAY1) - .currentCart(null) - .firstVisitedPage(URL1) - .eventsCounter(1) - .lastEventDateTime(DAY1) - .lastVisitedPage(URL1) - .sessionDuration(null) - .is_sessionActive(false) - .sessionInactivityDuration(SESSION_TIMEOUT); - } - - /** - * Creates a new TestRunner set with the appropriate properties. - * - * @return a new TestRunner set with the appropriate properties. - * - * @throws InitializationException in case the runner could not be instantiated. - */ - private TestRunner newTestRunner() - throws InitializationException - { - final TestRunner runner = TestRunners.newTestRunner(new IncrementalWebSession()); - - runner.addControllerService("elasticsearchClient", elasticsearchClient); - runner.enableControllerService(elasticsearchClient); - runner.setProperty(SetSourceOfTraffic.ELASTICSEARCH_CLIENT_SERVICE, "elasticsearchClient"); - - runner.setProperty(IncrementalWebSession.ES_SESSION_INDEX_FIELD, SESSION_INDEX); - runner.setProperty(IncrementalWebSession.ES_SESSION_TYPE_NAME, SESSION_TYPE); - runner.setProperty(IncrementalWebSession.ES_EVENT_INDEX_PREFIX, EVENT_INDEX); - runner.setProperty(IncrementalWebSession.ES_EVENT_TYPE_NAME, EVENT_TYPE); - runner.setProperty(IncrementalWebSession.ES_MAPPING_EVENT_TO_SESSION_INDEX_NAME, MAPPING_INDEX); - - runner.setProperty(IncrementalWebSession.SESSION_ID_FIELD, SESSION_ID); - runner.setProperty(IncrementalWebSession.TIMESTAMP_FIELD, TIMESTAMP); - runner.setProperty(IncrementalWebSession.VISITED_PAGE_FIELD, VISITED_PAGE); - runner.setProperty(IncrementalWebSession.USER_ID_FIELD, USER_ID); - runner.setProperty(IncrementalWebSession.SESSION_INACTIVITY_TIMEOUT, String.valueOf(SESSION_TIMEOUT)); - - runner.setProperty(IncrementalWebSession.FIELDS_TO_RETURN, FIELDS_TO_RETURN); - return runner; - } - - /** - * The class represents a web event. - */ - private static class WebEvent extends StandardRecord - { - /** - * Creates a new instance of this class with the provided parameter. - * - * @param id the event identifier. - * @param sessionId the session identifier. - * @param userId the user identifier. - * @param timestamp the h2kTimestamp. - * @param url the visited address. - */ - public WebEvent(final int id, final String sessionId, final String userId, final Long timestamp, - final String url) - { - this.setField(SESSION_ID, FieldType.STRING, sessionId) - .setField(USER_ID, FieldType.STRING, userId) - .setField(TIMESTAMP, FieldType.STRING, timestamp) - .setField(SESSION_INDEX, FieldType.STRING, SESSION_INDEX) - .setField(VISITED_PAGE, FieldType.STRING, url) - .setField(CURRENT_CART, FieldType.ARRAY, null) - .setField("record_id", FieldType.STRING, String.valueOf(id)); - } - - public WebEvent add(final String name, final String value) - { - this.setStringField(name, value); - return this; - } - } - - /** - * A class for testing web session. - */ - private static class WebSessionChecker - { - private final Record record; - - /** - * Creates a new instance of this class with the provided parameter. - * - * @param record the fields to check. - */ - public WebSessionChecker(final Record record) - { - this.record = record; - } - - public WebSessionChecker sessionId(final Object value) { return check("sessionId", value); } - public WebSessionChecker Userid(final Object value) { return check("Userid", value); } - public WebSessionChecker record_type(final Object value) { return check("record_type", value); } - public WebSessionChecker record_id(final Object value) { return check("record_id", value); } - public WebSessionChecker currentCart(final Object value) { return check(CURRENT_CART, value); } - public WebSessionChecker firstEventDateTime(final long value) { return check("firstEventDateTime", new Date(value).toString()); } - public WebSessionChecker h2kTimestamp(final long value) { return check("h2kTimestamp", value); } - public WebSessionChecker firstVisitedPage(final Object value) { return check("firstVisitedPage", value); } - public WebSessionChecker eventsCounter(final long value) { return check("eventsCounter", value); } - public WebSessionChecker lastEventDateTime(final long value) { return check("lastEventDateTime", new Date(value).toString()); } - public WebSessionChecker lastVisitedPage(final Object value) { return check("lastVisitedPage", value); } - public WebSessionChecker sessionDuration(final Object value) { return check("sessionDuration", value); } - public WebSessionChecker is_sessionActive(final Object value) { return check("is_sessionActive", value); } - public WebSessionChecker sessionInactivityDuration(final Object value) { return check("sessionInactivityDuration", value); } - public WebSessionChecker record_time(final Object value) { return check("record_time", value); } - - /** - * Checks the value associated to the specified name against the provided expected value. - * An exception is thrown if the check fails. - * - * @param name the name of the field to check. - * @param expectedValue the expected value. - * - * @return this object for convenience. - */ - public WebSessionChecker check(final String name, final Object expectedValue) - { - final Field field = this.record.getField(name); - Assert.assertEquals(expectedValue, - field!=null?field.getRawValue():null); - return this; - } - } - - /** - * A test implementation of ElasticsearchClientService that performs read/write in a map. - */ - public static final class ESC - extends AbstractControllerService - implements ElasticsearchClientService - { - /** - * A map that stores elasticsearch documents as sourceAsMap. - */ - private final Map/*sourceAsMap*/> documents = new HashMap<>(); - - /** - * Returns the concatenation of provided parameters as docIndex/docType/optionalId. - * - * @param docIndex the elasticsearch index - * @param docType the elasticsearch type - * @param optionalId the elasticsearch document identifier. - * - * @return the concatenation of provided parameters as docIndex/docType/optionalId. - */ - private static ObjectName toId(String docIndex, String docType, String optionalId) - { - try - { - return new ObjectName(String.format("es:index=%s,type=%s,id=%s", - docIndex, docType, optionalId)); - } - catch(MalformedObjectNameException e) - { - throw new RuntimeException(e); - } - } - - private Record getSession(final String sessionId) - { - final ObjectName filter = toId(SESSION_INDEX, SESSION_TYPE, sessionId); - - Map doc = documents.entrySet().stream().filter(entry-> filter.apply(entry.getKey())) - .map(entry-> entry.getValue()).findFirst().get(); - - Record result = new StandardRecord(); - doc.entrySet().stream() - .forEach(entry-> - { - final Object value = entry.getValue(); - if ( value instanceof Long ) - { - result.setField(entry.getKey(), FieldType.LONG, value); - } - else if ( value instanceof Boolean ) - { - result.setField(entry.getKey(), FieldType.BOOLEAN, value); - } - else - { - result.setStringField(entry.getKey(), (String)value); - } - - }); - - return result; - } - - private void save(final Record record) - { - final String sessionId = record.getId(); - final String index = SESSION_INDEX; - final Map sourceAsMap = record.getFieldsEntrySet().stream() - .map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey(), - entry.getValue()==null?null:entry.getValue().getRawValue())) - .collect(Collectors.toMap(Map.Entry::getKey, - Map.Entry::getValue)); - - this.documents.put(toId(index, SESSION_TYPE, sessionId), sourceAsMap); - } - - @Override - public List multiGet(List multiGetQueryRecords) - { - final List result = new ArrayList<>(); - - for(final MultiGetQueryRecord request: multiGetQueryRecords) - { - for(final String id: request.getDocumentIds()) - { - final String index = request.getIndexName(); - final String type = request.getTypeName(); - final ObjectName filter = toId(index, type, id); - - documents.entrySet().forEach(entry-> - { - if (filter.apply(entry.getKey())) - { - Map map = new HashMap<>(); - entry.getValue().entrySet().stream().forEach(kv -> map.put(kv.getKey(), kv.getValue().toString())); - result.add(new MultiGetResponseRecord(index, type, id, map)); - } - }); -// System.out.println("Requested document _id="+_id+" present="+(document!=null)); - } - } - - return result; - } - - @Override - public Record get(String collectionName, Record record) throws DatastoreClientServiceException { - return null; - } - - @Override - public Collection query(String query) { - return null; - } - - @Override - public long queryCount(String query) { - return 0; - } - - @Override - public void bulkPut(String docIndex, String docType, String document, Optional OptionalId) - { - throw new UnsupportedOperationException(); - } - - @Override - public void bulkPut(String docIndex, String docType, Map document, Optional optionalId) - { - optionalId.orElseThrow(IllegalArgumentException::new); - -// final Map map = document.entrySet().stream() -// .map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey(), -// entry.getValue()==null?null:entry.getValue())) -// .collect(Collectors.toMap(Map.Entry::getKey, -// Map.Entry::getValue)); - -// System.out.println(String.format("Saving index=%s,type=%s,id=%s", -// docIndex, docType, optionalId.get())); - documents.put(toId(docIndex, docType, optionalId.get()), document); - } - - @Override - public void bulkFlush() {} - - @Override - public boolean existsCollection(String indexName) throws DatastoreClientServiceException { return false; } - - @Override - public void refreshCollection(String indexName) throws DatastoreClientServiceException {} - - @Override - public void saveSync(String indexName, String doctype, Map doc) throws Exception {} - - @Override - public long countCollection(String indexName) throws DatastoreClientServiceException { return 0; } - - @Override - public void createCollection(String indexName, int numShards, int numReplicas) throws DatastoreClientServiceException {} - - @Override - public void dropCollection(String indexName) throws DatastoreClientServiceException {} - - @Override - public void copyCollection(String reindexScrollTimeout, String srcIndex, String dstIndex) throws DatastoreClientServiceException {} - - @Override - public void createAlias(String indexName, String aliasName) throws DatastoreClientServiceException {} - - @Override - public boolean putMapping(String indexName, String doctype, String mappingAsJsonString) throws DatastoreClientServiceException { return false; } - - - @Override - public void bulkPut(String collectionName, Record record) throws DatastoreClientServiceException { - - } - - @Override - public void put(String collectionName, Record record, boolean asynchronous) throws DatastoreClientServiceException { - - } - - @Override - public void remove(String collectionName, Record record, boolean asynchronous) throws DatastoreClientServiceException { - - } - - @Override - public long searchNumberOfHits(String docIndex, String docType, String docName, String docValue) { return 0; } - - @Override - public String convertRecordToString(Record record) { return convertToString(record);} - - @Override - public List getSupportedPropertyDescriptors(){ return Collections.emptyList(); } - } - - /** - * Converts an Event into an Elasticsearch document - * to be indexed later - * - * @param record - * @return - */ - public static String convertToString(Record record) { - try { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); - sdf.setTimeZone(TimeZone.getTimeZone("UTC")); - String document = ""; - - // convert event_time as ISO for ES - if (record.hasField(FieldDictionary.RECORD_TIME)) { - try { - DateTimeFormatter dateParser = ISODateTimeFormat.dateTimeNoMillis(); - document += "@timestamp : "; - document += dateParser.print(record.getField(FieldDictionary.RECORD_TIME).asLong()) + ", "; - } catch (Exception ex) { - System.err.println(String.format("unable to parse record_time iso date for {}", record)); - } - } - - // add all other records - for (Iterator i = record.getAllFieldsSorted().iterator(); i.hasNext();) { - Field field = i.next(); - String fieldName = field.getName().replaceAll("\\.", "_"); - - switch (field.getType()) { - - case STRING: - document += fieldName + " : " + field.asString(); - break; - case INT: - document += fieldName + " : " + field.asInteger().toString(); - break; - case LONG: - document += fieldName + " : " + field.asLong().toString(); - break; - case FLOAT: - document += fieldName + " : " + field.asFloat().toString(); - break; - case DOUBLE: - document += fieldName + " : " + field.asDouble().toString(); - break; - case BOOLEAN: - document += fieldName + " : " + field.asBoolean().toString(); - break; - default: - document += fieldName + " : " + field.getRawValue().toString(); - break; - } - } - - return document; - } catch (Throwable ex) { - System.err.println(String.format("unable to convert record : %s, %s", record, ex.toString())); - } - return null; - } -} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/CalculWebSessionTest.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/CalculWebSessionTest.java new file mode 100644 index 000000000..06f580530 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/CalculWebSessionTest.java @@ -0,0 +1,89 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics; + +import com.hurence.logisland.util.runner.TestRunner; +import com.hurence.logisland.util.runner.TestRunners; +import org.junit.jupiter.api.Test; + +import static com.hurence.logisland.processor.webanalytics.util.ElasticsearchServiceUtil.EVENT_INDEX_PREFIX; +import static com.hurence.logisland.processor.webanalytics.util.ElasticsearchServiceUtil.SESSION_INDEX_PREFIX; + +public class CalculWebSessionTest { + + @Test + public void testValidity() + { + CalculWebSession proc = new CalculWebSession(); + final TestRunner runner = TestRunners.newTestRunner(proc); + runner.assertNotValid(); + + runner.setProperty(IncrementalWebSession.ES_EVENT_INDEX_PREFIX_CONF, EVENT_INDEX_PREFIX); + runner.setProperty(IncrementalWebSession.ES_SESSION_INDEX_PREFIX_CONF, SESSION_INDEX_PREFIX); + runner.setProperty(IncrementalWebSession.ES_SESSION_INDEX_SUFFIX_FORMATTER_CONF, "yyyy.MM"); + runner.setProperty(IncrementalWebSession.ES_EVENT_INDEX_SUFFIX_FORMATTER_CONF, "yyyy.MM.dd"); + runner.setProperty(IncrementalWebSession.ES_SESSION_TYPE_NAME_CONF, "sessions"); + runner.setProperty(IncrementalWebSession.ES_EVENT_TYPE_NAME_CONF, "event"); + runner.assertValid(); + + runner.removeProperty(IncrementalWebSession.ES_EVENT_INDEX_PREFIX_CONF); + runner.assertNotValid(); + runner.setProperty(IncrementalWebSession.ES_EVENT_INDEX_PREFIX_CONF, EVENT_INDEX_PREFIX); + runner.removeProperty(IncrementalWebSession.ES_SESSION_INDEX_PREFIX_CONF); + runner.assertNotValid(); + runner.setProperty(IncrementalWebSession.ES_SESSION_INDEX_PREFIX_CONF, SESSION_INDEX_PREFIX); + runner.removeProperty(IncrementalWebSession.ES_SESSION_INDEX_SUFFIX_FORMATTER_CONF); + runner.assertNotValid(); + runner.setProperty(IncrementalWebSession.ES_SESSION_INDEX_SUFFIX_FORMATTER_CONF, "yyyy.MM"); + runner.removeProperty(IncrementalWebSession.ES_EVENT_INDEX_SUFFIX_FORMATTER_CONF); + runner.assertNotValid(); + runner.setProperty(IncrementalWebSession.ES_EVENT_INDEX_SUFFIX_FORMATTER_CONF, "yyyy.MM.dd"); + runner.removeProperty(IncrementalWebSession.ES_SESSION_TYPE_NAME_CONF); + runner.assertNotValid(); + runner.setProperty(IncrementalWebSession.ES_SESSION_TYPE_NAME_CONF, "sessions"); + runner.removeProperty(IncrementalWebSession.ES_EVENT_TYPE_NAME_CONF); + runner.assertNotValid(); + runner.setProperty(IncrementalWebSession.ES_EVENT_TYPE_NAME_CONF, "event"); + runner.assertValid(); + + runner.setProperty(IncrementalWebSession.ZONEID_CONF, "aba"); + runner.assertNotValid(); + runner.setProperty(IncrementalWebSession.ZONEID_CONF, "Canada/Yukon"); + runner.assertValid(); + runner.setProperty(IncrementalWebSession.ZONEID_CONF, "CaNAda/YuKON"); + runner.assertNotValid(); + runner.setProperty(IncrementalWebSession.ZONEID_CONF, "UTC"); + runner.assertValid(); + runner.setProperty(IncrementalWebSession.ZONEID_CONF, "Japan"); + runner.assertValid(); + } + + @Test + public void testValidity2() + { + CalculWebSession proc = new CalculWebSession(); + final TestRunner runner = TestRunners.newTestRunner(proc); + runner.assertNotValid(); + + runner.setProperty(IncrementalWebSession.ES_EVENT_INDEX_PREFIX_CONF, "TODO"); + runner.setProperty(IncrementalWebSession.ES_SESSION_INDEX_PREFIX_CONF, SESSION_INDEX_PREFIX); + runner.setProperty(IncrementalWebSession.ES_SESSION_INDEX_SUFFIX_FORMATTER_CONF, "TODO"); + runner.setProperty(IncrementalWebSession.ES_EVENT_INDEX_SUFFIX_FORMATTER_CONF, "TODO"); + runner.setProperty(IncrementalWebSession.ES_SESSION_TYPE_NAME_CONF, "sessions"); + runner.setProperty(IncrementalWebSession.ES_EVENT_TYPE_NAME_CONF, "event"); + runner.assertNotValid(); + } +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webAnalytics/ConsolidateSessionTest.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/ConsolidateSessionTest.java similarity index 99% rename from logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webAnalytics/ConsolidateSessionTest.java rename to logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/ConsolidateSessionTest.java index bfdf66f94..a65d1cc4a 100644 --- a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webAnalytics/ConsolidateSessionTest.java +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/ConsolidateSessionTest.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.hurence.logisland.processor.webAnalytics; +package com.hurence.logisland.processor.webanalytics; import com.hurence.logisland.record.FieldType; import com.hurence.logisland.record.Record; diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/IncrementalWebSessionTest.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/IncrementalWebSessionTest.java new file mode 100644 index 000000000..e4bf32586 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/IncrementalWebSessionTest.java @@ -0,0 +1,1201 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics; + +import com.hurence.logisland.component.InitializationException; +import com.hurence.logisland.component.PropertyDescriptor; +import com.hurence.logisland.controller.ControllerServiceInitializationContext; +import com.hurence.logisland.processor.webanalytics.modele.TestMappings; +import com.hurence.logisland.processor.webanalytics.modele.WebSession; +import com.hurence.logisland.processor.webanalytics.util.WebEvent; +import com.hurence.logisland.processor.webanalytics.util.WebSessionChecker; +import com.hurence.logisland.record.Record; +import com.hurence.logisland.record.StandardRecord; +import com.hurence.logisland.service.cache.LRUKeyValueCacheService; +import com.hurence.logisland.service.datastore.DatastoreClientServiceException; +import com.hurence.logisland.service.datastore.model.*; +import com.hurence.logisland.service.elasticsearch.ElasticsearchClientService; +import com.hurence.logisland.util.runner.MockRecord; +import com.hurence.logisland.util.runner.TestRunner; +import com.hurence.logisland.util.runner.TestRunners; +import com.hurence.logisland.validator.Configuration; +import com.hurence.logisland.validator.ValidationResult; +import org.junit.jupiter.api.Test; + +import java.time.Instant; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static com.hurence.logisland.processor.webanalytics.util.ElasticsearchServiceUtil.*; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class IncrementalWebSessionTest { + + private static final String SESSIONID = "SESSIONID"; + private static final String SESSION_ID = "sessionId"; + private static final String TIMESTAMP = "h2kTimestamp"; + private static final String VISITED_PAGE = "VISITED_PAGE"; + private static final String CURRENT_CART = "currentCart"; + private static final String USER_ID = "Userid"; + + private static final String SESSION1 = "session1"; + private static final String SESSION2 = "session2"; + + private static final long SESSION_TIMEOUT_SECONDS = 1800L; // but should be 30*60; + + private static final String URL1 = "http://page1"; + private static final String URL2 = "http://page2"; + private static final String URL3 = "http://page3"; + + private static final String USER1 = "user1"; + private static final String USER2 = "user2"; + + private static final String PARTY_ID1 = "partyId1"; + + private static final Long DAY1 = 1493197966584L; // Wed Apr 26 11:12:46 CEST 2017 + private static final Long DAY2 = 1493297966584L; // Thu Apr 27 14:59:26 CEST 2017 + + private static final String PARTY_ID = "partyId"; + private static final String B2BUNIT = "B2BUnit"; + + private static final String INDEX_SESSION_DAY1 = SESSION_INDEX_PREFIX + "2017.04.26"; + private static final String INDEX_SESSION_DAY2 = SESSION_INDEX_PREFIX + "2017.04.27"; + private static final String INDEX_EVENT_DAY1 = EVENT_INDEX_PREFIX + "2017.04.26"; + private static final String INDEX_EVENT_DAY2 = EVENT_INDEX_PREFIX + "2017.04.27"; + private static final String SESSION_TYPE = "sessions"; + private static final String EVENT_TYPE = "event"; + public static final int EVENT_NUMBER_OF_FIELD_ORIGINAL_SESSION = 7; + public static final int EVENT_NUMBER_OF_FIELD_NEW_SESSION = 9; + + @Test + public void testValidity() + { + IncrementalWebSession proc = new IncrementalWebSession(); + final TestRunner runner = TestRunners.newTestRunner(proc); + runner.assertNotValid(); + + runner.setProperty(IncrementalWebSession.ES_EVENT_INDEX_PREFIX_CONF, EVENT_INDEX_PREFIX); + runner.setProperty(IncrementalWebSession.ES_SESSION_INDEX_PREFIX_CONF, SESSION_INDEX_PREFIX); + runner.setProperty(IncrementalWebSession.ES_SESSION_INDEX_SUFFIX_FORMATTER_CONF, "yyyy.MM"); + runner.setProperty(IncrementalWebSession.ES_EVENT_INDEX_SUFFIX_FORMATTER_CONF, "yyyy.MM.dd"); + runner.setProperty(IncrementalWebSession.ES_SESSION_TYPE_NAME_CONF, "sessions"); + runner.setProperty(IncrementalWebSession.ES_EVENT_TYPE_NAME_CONF, "event"); + runner.setProperty(IncrementalWebSession.CONFIG_CACHE_SERVICE, "lruCache"); + runner.setProperty(IncrementalWebSession.ELASTICSEARCH_CLIENT_SERVICE_CONF, "elasticsearchClient"); + runner.assertValid(); + + runner.removeProperty(IncrementalWebSession.ES_EVENT_INDEX_PREFIX_CONF); + runner.assertNotValid(); + runner.setProperty(IncrementalWebSession.ES_EVENT_INDEX_PREFIX_CONF, EVENT_INDEX_PREFIX); + runner.removeProperty(IncrementalWebSession.ES_SESSION_INDEX_PREFIX_CONF); + runner.assertNotValid(); + runner.setProperty(IncrementalWebSession.ES_SESSION_INDEX_PREFIX_CONF, SESSION_INDEX_PREFIX); + runner.removeProperty(IncrementalWebSession.ES_SESSION_INDEX_SUFFIX_FORMATTER_CONF); + runner.assertNotValid(); + runner.setProperty(IncrementalWebSession.ES_SESSION_INDEX_SUFFIX_FORMATTER_CONF, "yyyy.MM"); + runner.removeProperty(IncrementalWebSession.ES_EVENT_INDEX_SUFFIX_FORMATTER_CONF); + runner.assertNotValid(); + runner.setProperty(IncrementalWebSession.ES_EVENT_INDEX_SUFFIX_FORMATTER_CONF, "yyyy.MM.dd"); + runner.removeProperty(IncrementalWebSession.ES_SESSION_TYPE_NAME_CONF); + runner.assertNotValid(); + runner.setProperty(IncrementalWebSession.ES_SESSION_TYPE_NAME_CONF, "sessions"); + runner.removeProperty(IncrementalWebSession.ES_EVENT_TYPE_NAME_CONF); + runner.assertNotValid(); + runner.setProperty(IncrementalWebSession.ES_EVENT_TYPE_NAME_CONF, "event"); + runner.removeProperty(IncrementalWebSession.CONFIG_CACHE_SERVICE); + runner.assertNotValid(); + runner.setProperty(IncrementalWebSession.CONFIG_CACHE_SERVICE, "lruCache"); + runner.removeProperty(IncrementalWebSession.ELASTICSEARCH_CLIENT_SERVICE_CONF); + runner.assertNotValid(); + runner.setProperty(IncrementalWebSession.ELASTICSEARCH_CLIENT_SERVICE_CONF, "elasticsearchClient"); + runner.assertValid(); + + runner.setProperty(IncrementalWebSession.ZONEID_CONF, "aba"); + runner.assertNotValid(); + runner.setProperty(IncrementalWebSession.ZONEID_CONF, "Canada/Yukon"); + runner.assertValid(); + runner.setProperty(IncrementalWebSession.ZONEID_CONF, "CaNAda/YuKON"); + runner.assertNotValid(); + runner.setProperty(IncrementalWebSession.ZONEID_CONF, "UTC"); + runner.assertValid(); + runner.setProperty(IncrementalWebSession.ZONEID_CONF, "Japan"); + runner.assertValid(); + runner.setProperty(IncrementalWebSession.PROCESSING_MODE, IncrementalWebSession.ProcessingMode.FAST.getName()); + runner.assertValid(); + runner.setProperty(IncrementalWebSession.PROCESSING_MODE, "FAST"); + runner.assertValid(); + runner.setProperty(IncrementalWebSession.PROCESSING_MODE, "MODERATE"); + runner.assertValid(); + runner.setProperty(IncrementalWebSession.PROCESSING_MODE, "SLOW"); + runner.assertValid(); + runner.setProperty(IncrementalWebSession.PROCESSING_MODE, "SLOW2"); + runner.assertNotValid(); + runner.setProperty(IncrementalWebSession.PROCESSING_MODE, "SLOW"); + runner.setProperty(IncrementalWebSession.ES_REFRESH_TIMEOUT, "100"); + runner.assertValid(); + runner.setProperty(IncrementalWebSession.ES_REFRESH_TIMEOUT, "-1"); + runner.assertNotValid(); + } + + + // @Test + public void testChoosingTheZoneId() { + // 1575158400000 1/12/2019 à 0:00:00 "1/12/2019 à 1:00:00 +0100" in LOCAL english + // 1577836799000 31/12/2019 à 23:59:59 "1/1/2020 à 0:59:59 +0100" in LOCAL english + // 1577836800000 1/1/2020 à 0:00:00 "1/1/2020 à 1:00:00 +0100" in LOCAL english + // 1577840399000 1/1/2020 à 0:59:59 "1/1/2020 à 1:59:59 +0100" in LOCAL english + // 1580515199000 31/1/2020 à 23:59:59 "1/2/2020 à 0:59:59 +0100" in LOCAL english + // 1580515200000 1/2/2020 à 0:00:00 "1/2/2020 à 1:00:00 +0100" in LOCAL english + // 1583020799000 29/2/2020 à 23:59:59 "1/3/2020 à 0:59:59 +0100" in LOCAL english + final long time1 = 1575158400000L; + final long time2 = 1577836799000L; + final long time3 = 1577836800000L; + final long time4 = 1577840399000L; + final long time5 = 1580515199000L; + final long time6 = 1580515200000L; + final long time7 = 1583020799000L; + IncrementalWebSession proc = new IncrementalWebSession(); + final TestRunner runner = TestRunners.newTestRunner(proc); + runner.setProperty(IncrementalWebSession.ES_EVENT_INDEX_PREFIX_CONF, EVENT_INDEX_PREFIX); + runner.setProperty(IncrementalWebSession.ES_SESSION_INDEX_PREFIX_CONF, SESSION_INDEX_PREFIX); + runner.setProperty(IncrementalWebSession.ES_SESSION_INDEX_SUFFIX_FORMATTER_CONF, "yyyy.MM.dd HH:mm:ss Z"); + runner.setProperty(IncrementalWebSession.ES_EVENT_INDEX_SUFFIX_FORMATTER_CONF, "yyyy.MM.dd HH:mm:ss Z"); + runner.setProperty(IncrementalWebSession.ES_SESSION_TYPE_NAME_CONF, SESSION_TYPE); + runner.setProperty(IncrementalWebSession.ES_EVENT_TYPE_NAME_CONF, EVENT_TYPE); + runner.setProperty(IncrementalWebSession.CONFIG_CACHE_SERVICE, "lruCache"); + runner.setProperty(IncrementalWebSession.ELASTICSEARCH_CLIENT_SERVICE_CONF, "elasticsearchClient"); + runner.setProperty(IncrementalWebSession.ZONEID_CONF, "GMT"); + runner.assertValid(); + runner.run(); + // 1/12/2019 à 1:00:00 +0100 + assertEquals(EVENT_INDEX_PREFIX+ "2019.12.01 01:00:00 +0100", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time1))); + assertEquals(SESSION_INDEX_PREFIX +"2019.12.01 01:00:00 +0100", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time1))); + //"1/1/2020 à 0:59:59 +0100" + assertEquals(EVENT_INDEX_PREFIX+ "2020.01.01 00:59:59 +0100", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time2))); + assertEquals(SESSION_INDEX_PREFIX +"2020.01.01 00:59:59 +0100", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time2))); + //1/1/2020 à 1:00:00 +0100 + assertEquals(EVENT_INDEX_PREFIX+ "2020.01.01 01:00:00 +0100", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time3))); + assertEquals(SESSION_INDEX_PREFIX +"2020.01.01 01:00:00 +0100", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time3))); + //1/1/2020 à 1:59:59 +0100 + assertEquals(EVENT_INDEX_PREFIX+ "2020.01.01 01:59:59 +0100", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time4))); + assertEquals(SESSION_INDEX_PREFIX +"2020.01.01 01:59:59 +0100", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time4))); + //1/2/2020 à 0:59:59 +0100 + assertEquals(EVENT_INDEX_PREFIX+ "2020.02.01 00:59:59 +0100", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time5))); + assertEquals(SESSION_INDEX_PREFIX +"2020.02.01 00:59:59 +0100", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time5))); + //"1/2/2020 à 1:00:00 +0100" + assertEquals(EVENT_INDEX_PREFIX+ "2020.02.01 01:00:00 +0100", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time6))); + assertEquals(SESSION_INDEX_PREFIX +"2020.02.01 01:00:00 +0100", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time6))); + //1/3/2020 à 0:59:59 +0100 + assertEquals(EVENT_INDEX_PREFIX+ "2020.03.01 00:59:59 +0100", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time7))); + assertEquals(SESSION_INDEX_PREFIX +"2020.03.01 00:59:59 +0100", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time7))); + + + runner.setProperty(IncrementalWebSession.PROP_ES_INDEX_SUFFIX_TIMEZONE, "Japan"); + runner.run(); + // 1/12/2019 à 1:00:00 +0100 + assertEquals(EVENT_INDEX_PREFIX+ "2019.12.01 09:00:00 +0900", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time1))); + assertEquals(SESSION_INDEX_PREFIX +"2019.12.01 09:00:00 +0900", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time1))); + //"1/1/2020 à 0:59:59 +0100" + assertEquals(EVENT_INDEX_PREFIX+ "2020.01.01 08:59:59 +0900", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time2))); + assertEquals(SESSION_INDEX_PREFIX +"2020.01.01 08:59:59 +0900", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time2))); + //1/1/2020 à 1:00:00 +0100 + assertEquals(EVENT_INDEX_PREFIX+ "2020.01.01 09:00:00 +0900", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time3))); + assertEquals(SESSION_INDEX_PREFIX +"2020.01.01 09:00:00 +0900", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time3))); + //1/1/2020 à 1:59:59 +0100 + assertEquals(EVENT_INDEX_PREFIX+ "2020.01.01 09:59:59 +0900", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time4))); + assertEquals(SESSION_INDEX_PREFIX +"2020.01.01 09:59:59 +0900", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time4))); + //1/2/2020 à 0:59:59 +0100 + assertEquals(EVENT_INDEX_PREFIX+ "2020.02.01 08:59:59 +0900", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time5))); + assertEquals(SESSION_INDEX_PREFIX +"2020.02.01 08:59:59 +0900", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time5))); + //"1/2/2020 à 1:00:00 +0100" + assertEquals(EVENT_INDEX_PREFIX+ "2020.02.01 09:00:00 +0900", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time6))); + assertEquals(SESSION_INDEX_PREFIX +"2020.02.01 09:00:00 +0900", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time6))); + //1/3/2020 à 0:59:59 +0100 + assertEquals(EVENT_INDEX_PREFIX+ "2020.03.01 08:59:59 +0900", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time7))); + assertEquals(SESSION_INDEX_PREFIX +"2020.03.01 08:59:59 +0900", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time7))); + + runner.setProperty(IncrementalWebSession.PROP_ES_INDEX_SUFFIX_TIMEZONE, "Canada/Yukon"); + runner.run(); + // 1/12/2019 à 1:00:00 +0100 + assertEquals(EVENT_INDEX_PREFIX+ "2019.11.30 16:00:00 -0800", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time1))); + assertEquals(SESSION_INDEX_PREFIX +"2019.11.30 16:00:00 -0800", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time1))); + //"1/1/2020 à 0:59:59 +0100" + assertEquals(EVENT_INDEX_PREFIX+ "2019.12.31 15:59:59 -0800", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time2))); + assertEquals(SESSION_INDEX_PREFIX +"2019.12.31 15:59:59 -0800", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time2))); + //1/1/2020 à 1:00:00 +0100 + assertEquals(EVENT_INDEX_PREFIX+ "2019.12.31 16:00:00 -0800", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time3))); + assertEquals(SESSION_INDEX_PREFIX +"2019.12.31 16:00:00 -0800", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time3))); + //1/1/2020 à 1:59:59 +0100 + assertEquals(EVENT_INDEX_PREFIX+ "2019.12.31 16:59:59 -0800", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time4))); + assertEquals(SESSION_INDEX_PREFIX +"2019.12.31 16:59:59 -0800", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time4))); + //1/2/2020 à 0:59:59 +0100 + assertEquals(EVENT_INDEX_PREFIX+ "2020.01.31 15:59:59 -0800", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time5))); + assertEquals(SESSION_INDEX_PREFIX +"2020.01.31 15:59:59 -0800", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time5))); + //"1/2/2020 à 1:00:00 +0100" + assertEquals(EVENT_INDEX_PREFIX+ "2020.01.31 16:00:00 -0800", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time6))); + assertEquals(SESSION_INDEX_PREFIX +"2020.01.31 16:00:00 -0800", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time6))); + //1/3/2020 à 0:59:59 +0100 + assertEquals(EVENT_INDEX_PREFIX+ "2020.02.29 15:59:59 -0800", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time7))); + assertEquals(SESSION_INDEX_PREFIX +"2020.02.29 15:59:59 -0800", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time7))); + + runner.setProperty(IncrementalWebSession.PROP_ES_INDEX_SUFFIX_TIMEZONE, "UTC"); + runner.run(); + // 1/12/2019 à 1:00:00 +0100 + assertEquals(EVENT_INDEX_PREFIX+ "2019.12.01 00:00:00 +0000", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time1))); + assertEquals(SESSION_INDEX_PREFIX +"2019.12.01 00:00:00 +0000", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time1))); + //"1/1/2020 à 0:59:59 +0100" + assertEquals(EVENT_INDEX_PREFIX+ "2019.12.31 23:59:59 +0000", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time2))); + assertEquals(SESSION_INDEX_PREFIX +"2019.12.31 23:59:59 +0000", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time2))); + //1/1/2020 à 1:00:00 +0100 + assertEquals(EVENT_INDEX_PREFIX+ "2020.01.01 00:00:00 +0000", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time3))); + assertEquals(SESSION_INDEX_PREFIX +"2020.01.01 00:00:00 +0000", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time3))); + //1/1/2020 à 1:59:59 +0100 + assertEquals(EVENT_INDEX_PREFIX+ "2020.01.01 00:59:59 +0000", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time4))); + assertEquals(SESSION_INDEX_PREFIX +"2020.01.01 00:59:59 +0000", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time4))); + //1/2/2020 à 0:59:59 +0100 + assertEquals(EVENT_INDEX_PREFIX+ "2020.01.31 23:59:59 +0000", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time5))); + assertEquals(SESSION_INDEX_PREFIX +"2020.01.31 23:59:59 +0000", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time5))); + //"1/2/2020 à 1:00:00 +0100" + assertEquals(EVENT_INDEX_PREFIX+ "2020.02.01 00:00:00 +0000", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time6))); + assertEquals(SESSION_INDEX_PREFIX +"2020.02.01 00:00:00 +0000", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time6))); + //1/3/2020 à 0:59:59 +0100 + assertEquals(EVENT_INDEX_PREFIX+ "2020.02.29 23:59:59 +0000", proc.toEventIndexName(GetZonedDateTimeFromEpochMili(time7))); + assertEquals(SESSION_INDEX_PREFIX +"2020.02.29 23:59:59 +0000", proc.toSessionIndexName(GetZonedDateTimeFromEpochMili(time7))); + } + + @Test + public void testAdword() + throws Exception + { + String URL = URL1+"?gclid=XXX"; + WebEvent event1 = new WebEvent("1", SESSION1, USER1, DAY1, URL); + WebEvent event2 = new WebEvent("2", SESSION1, USER1, DAY2, URL2); + + TestRunner testRunner = newTestRunner(); + testRunner.assertValid(); + testRunner.enqueue(Arrays.asList(event1, event2)); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + // Two webSessions expected . + testRunner.assertOutputRecordsCount(4); + List outputRecords = testRunner.getOutputRecords(); + MockRecord session1 = getFirstRecordWithId(SESSION1, outputRecords); + session1.assertFieldEquals(IncrementalWebSession.defaultOutputFieldNameForEsIndex, INDEX_SESSION_DAY1); + session1.assertFieldEquals(IncrementalWebSession.defaultOutputFieldNameForEsType, SESSION_TYPE); + new WebSessionChecker(session1).sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(DAY1) + .h2kTimestamp(DAY1) + .firstVisitedPage(URL) + .eventsCounter(1) + .lastEventDateTime(DAY1) + .lastVisitedPage(URL) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT_SECONDS); + MockRecord session2 = getFirstRecordWithId(SESSION1+"#2", outputRecords); + session2.assertFieldEquals(IncrementalWebSession.defaultOutputFieldNameForEsIndex, INDEX_SESSION_DAY2); + session2.assertFieldEquals(IncrementalWebSession.defaultOutputFieldNameForEsType, SESSION_TYPE); + new WebSessionChecker(session2).sessionId(SESSION1+"#2") + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1+"#2") + .firstEventDateTime(DAY2) + .h2kTimestamp(DAY2) + .firstVisitedPage(URL2) + .eventsCounter(1) + .lastEventDateTime(DAY2) + .lastVisitedPage(URL2) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT_SECONDS); + + + MockRecord event1Output = getFirstRecordWithId("1", outputRecords); + MockRecord event2Output = getFirstRecordWithId("2", outputRecords); + + event1Output.assertFieldEquals(TestMappings.eventsInternalFields.getSessionIdField(), SESSION1); + event1Output.assertFieldEquals(TestMappings.eventsInternalFields.getUserIdField(), USER1); + event1Output.assertFieldEquals(TestMappings.eventsInternalFields.getVisitedPageField(), URL); + event1Output.assertNullField(WebEvent.CURRENT_CART); + event1Output.assertFieldEquals(IncrementalWebSession.defaultOutputFieldNameForEsIndex, INDEX_EVENT_DAY1); + event1Output.assertFieldEquals(IncrementalWebSession.defaultOutputFieldNameForEsType, EVENT_TYPE); + event1Output.assertFieldEquals(TestMappings.eventsInternalFields.getTimestampField(), DAY1); + event1Output.assertRecordSizeEquals(EVENT_NUMBER_OF_FIELD_ORIGINAL_SESSION); + + event2Output.assertFieldEquals(TestMappings.eventsInternalFields.getOriginalSessionIdField(), SESSION1); + event2Output.assertFieldEquals(TestMappings.eventsInternalFields.getSessionIdField(), SESSION1+"#2"); + event2Output.assertFieldEquals(TestMappings.eventsInternalFields.getNewSessionReasonField(), IncrementalWebSession.DAY_OVERLAP.reason()); + event2Output.assertFieldEquals(TestMappings.eventsInternalFields.getUserIdField(), USER1); + event2Output.assertFieldEquals(TestMappings.eventsInternalFields.getVisitedPageField(), URL2); + event2Output.assertNullField(WebEvent.CURRENT_CART); + event2Output.assertFieldEquals(IncrementalWebSession.defaultOutputFieldNameForEsIndex, INDEX_EVENT_DAY2); + event2Output.assertFieldEquals(IncrementalWebSession.defaultOutputFieldNameForEsType, EVENT_TYPE); + event2Output.assertFieldEquals(TestMappings.eventsInternalFields.getTimestampField(), DAY2); + event2Output.assertRecordSizeEquals(EVENT_NUMBER_OF_FIELD_NEW_SESSION); + } + + @Test + public void testEventHandleCorrectlyNullArrays() + throws Exception + { + + TestRunner testRunner = newTestRunner(); + testRunner.assertValid(); + WebEvent inputEvent = new WebEvent("1", SESSION1, USER1, DAY1, URL1); + testRunner.enqueue(Arrays.asList(inputEvent)); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(2); + + final MockRecord session = getFirstRecordWithId(SESSION1, testRunner.getOutputRecords()); + session.assertFieldEquals(IncrementalWebSession.defaultOutputFieldNameForEsIndex, INDEX_SESSION_DAY1); + session.assertFieldEquals(IncrementalWebSession.defaultOutputFieldNameForEsType, SESSION_TYPE); + new WebSessionChecker(session).sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(DAY1) + .h2kTimestamp(DAY1) + .currentCart(null) + .firstVisitedPage(URL1) + .eventsCounter(1) + .lastEventDateTime(DAY1) + .lastVisitedPage(URL1) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT_SECONDS); + + MockRecord event1Output = getFirstRecordWithId("1", testRunner.getOutputRecords()); + event1Output.assertFieldEquals(TestMappings.eventsInternalFields.getSessionIdField(), SESSION1); + event1Output.assertFieldEquals(TestMappings.eventsInternalFields.getUserIdField(), USER1); + event1Output.assertFieldEquals(TestMappings.eventsInternalFields.getVisitedPageField(), URL1); + event1Output.assertNullField(WebEvent.CURRENT_CART); + event1Output.assertFieldEquals(IncrementalWebSession.defaultOutputFieldNameForEsIndex, INDEX_EVENT_DAY1); + event1Output.assertFieldEquals(IncrementalWebSession.defaultOutputFieldNameForEsType, EVENT_TYPE); + event1Output.assertFieldEquals(TestMappings.eventsInternalFields.getTimestampField(), DAY1); + event1Output.assertRecordSizeEquals(EVENT_NUMBER_OF_FIELD_ORIGINAL_SESSION); + } + + + @Test + public void testCreateOneSessionOneEvent() + throws Exception + { + TestRunner testRunner = newTestRunner(); + testRunner.assertValid(); + testRunner.enqueue(Arrays.asList(new WebEvent("1", SESSION1, USER1, DAY1, URL1))); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + + // One webSession expected. + testRunner.assertOutputRecordsCount(2); + final MockRecord session = getFirstRecordWithId(SESSION1, testRunner.getOutputRecords()); + session.assertFieldEquals(IncrementalWebSession.defaultOutputFieldNameForEsIndex, INDEX_SESSION_DAY1); + session.assertFieldEquals(IncrementalWebSession.defaultOutputFieldNameForEsType, SESSION_TYPE); + new WebSessionChecker(session).sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(DAY1) + .h2kTimestamp(DAY1) + .firstVisitedPage(URL1) + .eventsCounter(1) + .lastEventDateTime(DAY1) + .lastVisitedPage(URL1) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT_SECONDS); + + MockRecord event1Output = getFirstRecordWithId("1", testRunner.getOutputRecords()); + event1Output.assertFieldEquals(TestMappings.eventsInternalFields.getSessionIdField(), SESSION1); + event1Output.assertFieldEquals(TestMappings.eventsInternalFields.getUserIdField(), USER1); + event1Output.assertFieldEquals(TestMappings.eventsInternalFields.getVisitedPageField(), URL1); + event1Output.assertNullField(WebEvent.CURRENT_CART); + event1Output.assertFieldEquals(IncrementalWebSession.defaultOutputFieldNameForEsIndex, INDEX_EVENT_DAY1); + event1Output.assertFieldEquals(IncrementalWebSession.defaultOutputFieldNameForEsType, EVENT_TYPE); + event1Output.assertFieldEquals(TestMappings.eventsInternalFields.getTimestampField(), DAY1); + event1Output.assertRecordSizeEquals(EVENT_NUMBER_OF_FIELD_ORIGINAL_SESSION); + } + + @Test + public void testCreateOneSessionMultipleEvents() + throws Exception + { + TestRunner testRunner = newTestRunner(); + testRunner.assertValid(); + testRunner.enqueue(Arrays.asList(new WebEvent("1", SESSION1, null, DAY1, URL1), + new WebEvent("2", SESSION1, USER1, DAY1+1000L, URL2), + new WebEvent("3", SESSION1, null, DAY1+2000L, URL3))); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + // One webSession expected. + testRunner.assertOutputRecordsCount(4); + final MockRecord doc = getFirstRecordWithId(SESSION1, testRunner.getOutputRecords()); + new WebSessionChecker(doc).sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(DAY1) + .h2kTimestamp(DAY1) + .firstVisitedPage(URL1) + .eventsCounter(3) + .lastEventDateTime(DAY1+2000L) + .lastVisitedPage(URL3) + .sessionDuration(2L) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT_SECONDS); + + MockRecord event1Output = getFirstRecordWithId("1", testRunner.getOutputRecords()); + event1Output.assertFieldEquals(TestMappings.eventsInternalFields.getSessionIdField(), SESSION1); + event1Output.assertNullField(TestMappings.eventsInternalFields.getUserIdField()); + event1Output.assertFieldEquals(TestMappings.eventsInternalFields.getVisitedPageField(), URL1); + event1Output.assertNullField(WebEvent.CURRENT_CART); + event1Output.assertFieldEquals(IncrementalWebSession.defaultOutputFieldNameForEsIndex, INDEX_EVENT_DAY1); + event1Output.assertFieldEquals(IncrementalWebSession.defaultOutputFieldNameForEsType, EVENT_TYPE); + event1Output.assertFieldEquals(TestMappings.eventsInternalFields.getTimestampField(), DAY1); + event1Output.assertRecordSizeEquals(EVENT_NUMBER_OF_FIELD_ORIGINAL_SESSION); + + MockRecord event2Output = getFirstRecordWithId("2", testRunner.getOutputRecords()); + event2Output.assertFieldEquals(TestMappings.eventsInternalFields.getSessionIdField(), SESSION1); + event2Output.assertFieldEquals(TestMappings.eventsInternalFields.getUserIdField(), USER1); + event2Output.assertFieldEquals(TestMappings.eventsInternalFields.getVisitedPageField(), URL2); + event2Output.assertNullField(WebEvent.CURRENT_CART); + event2Output.assertFieldEquals(IncrementalWebSession.defaultOutputFieldNameForEsIndex, INDEX_EVENT_DAY1); + event2Output.assertFieldEquals(IncrementalWebSession.defaultOutputFieldNameForEsType, EVENT_TYPE); + event2Output.assertFieldEquals(TestMappings.eventsInternalFields.getTimestampField(), DAY1+1000L); + event2Output.assertRecordSizeEquals(EVENT_NUMBER_OF_FIELD_ORIGINAL_SESSION); + + MockRecord event3Output = getFirstRecordWithId("3", testRunner.getOutputRecords()); + event3Output.assertFieldEquals(TestMappings.eventsInternalFields.getSessionIdField(), SESSION1); + event3Output.assertNullField(TestMappings.eventsInternalFields.getUserIdField()); + event3Output.assertFieldEquals(TestMappings.eventsInternalFields.getVisitedPageField(), URL3); + event3Output.assertNullField(WebEvent.CURRENT_CART); + event3Output.assertFieldEquals(IncrementalWebSession.defaultOutputFieldNameForEsIndex, INDEX_EVENT_DAY1); + event3Output.assertFieldEquals(IncrementalWebSession.defaultOutputFieldNameForEsType, EVENT_TYPE); + event3Output.assertFieldEquals(TestMappings.eventsInternalFields.getTimestampField(), DAY1+2000L); + event3Output.assertRecordSizeEquals(EVENT_NUMBER_OF_FIELD_ORIGINAL_SESSION); + } + + @Test + public void testCreateOneSessionMultipleEventsData2() + throws Exception + { + Object[] data = new Object[]{ + new Object[]{ + "h2kTimestamp" , 1538753339113L, + "location" , "https://www.zitec-shop.com/en/", + "sessionId" , SESSIONID // "0:jmw62hh3:ef5kWpbpKDNBG5IyGBARUQLemW3JP0PP" + }, new Object[]{ + "h2kTimestamp" , 1538753689109L, + "location" , "https://www.zitec-shop.com/en/", + "sessionId" , SESSIONID + }, new Object[]{ + "h2kTimestamp" , 1538753753964L, + "location" , "https://www.zitec-shop.com/en/", + "sessionId" , SESSIONID + }, new Object[]{ + "h2kTimestamp" , 1538753768489L, + "location" , "https://www.zitec-shop.com/en/schragkugellager-718-tn/p-G1156005137", + "sessionId" , SESSIONID + }, new Object[]{ + "h2kTimestamp" , 1538756201154L, // timeout + "location" , "https://www.zitec-shop.com/en/schragkugellager-718-tn/p-G1156005137", + "sessionId" , SESSIONID + }, new Object[]{ + "h2kTimestamp" , 1538756215043L, + "location" , "https://www.zitec-shop.com/en/search/?text=rotex%2Cgg%2C48", + "sessionId" , SESSIONID + }, new Object[]{ + "h2kTimestamp" , 1538756216242L, + "location" , "https://www.zitec-shop.com/en/search/?text=rotex%2Cgg%2C48", + "sessionId" , SESSIONID + }, new Object[]{ + "h2kTimestamp" , 1538756232483L, + "location" , "https://www.zitec-shop.com/en/rotex-48-gg/p-G1184000392", + "sessionId" , SESSIONID + }, new Object[]{ + "h2kTimestamp" , 1538756400671L, + "location" , "https://www.zitec-shop.com/en/rotex-48-gg/p-G1184000392", + "sessionId" , SESSIONID + }, new Object[]{ + "h2kTimestamp" , 1538756417237L, + "location" , "https://www.zitec-shop.com/en/kugelfuhrungswagen-vierreihig/p-G1156007584", + "sessionId" , SESSIONID + }, new Object[]{ + "h2kTimestamp" , 1538767062429L, // timeout + "location" , "https://www.zitec-shop.com/en/kugelfuhrungswagen-vierreihig/p-G1156007584", + "sessionId" , SESSIONID + }, new Object[]{ + "h2kTimestamp" , 1538767070188L, + "location" , "https://www.zitec-shop.com/en/search/?text=nah25", + "sessionId" , SESSIONID + }, new Object[]{ + "h2kTimestamp" , 1538767073907L, + "location" , "https://www.zitec-shop.com/en/search/?text=nah25", + "sessionId" , SESSIONID + }, new Object[]{ + "h2kTimestamp" , 1538767077273L, + "location" , "https://www.zitec-shop.com/en/search/?text=nah", + "sessionId" , SESSIONID + }, new Object[]{ + "h2kTimestamp" , 1538780539746L, // timeout + "location" , "https://www.zitec-shop.com/en/search/?text=nah", + "sessionId" , SESSIONID + }, new Object[]{ + "h2kTimestamp" , 1538780546243L, + "location" , "https://www.zitec-shop.com/en/search/?text=hj234", + "sessionId" , SESSIONID + }, new Object[]{ + "h2kTimestamp" , 1538780578259L, + "location" , "https://www.zitec-shop.com/en/search/?text=hj234", + "sessionId" , SESSIONID + }, new Object[]{ + "h2kTimestamp" , 1538780595932L, + "location" , "https://www.zitec-shop.com/en/search/?text=hj+234", + "sessionId" , SESSIONID + }, new Object[]{ + "h2kTimestamp" , 1538780666747L, + "location" , "https://www.zitec-shop.com/en/search/?text=hj+234", + "sessionId" , SESSIONID + }, new Object[]{ + "h2kTimestamp" , 1538780680777L, + "location" , "https://www.zitec-shop.com/en/sealed-spherical-roller-bearings-ws222-e1/p-G1112006937", + "sessionId" , SESSIONID + }, new Object[]{ + "h2kTimestamp" , 1538780684232L, + "location" , "https://www.zitec-shop.com/en/login", + "sessionId" , SESSIONID + }, new Object[]{ + "h2kTimestamp" , 1538780691752L, + "location" , "https://www.zitec-shop.com/en/sealed-spherical-roller-bearings-ws222-e1/p-G1112006937", + "sessionId" , SESSIONID + }, new Object[]{ + "h2kTimestamp" , 1538780748044L, + "location" , "https://www.zitec-shop.com/en/sealed-spherical-roller-bearings-ws222-e1/p-G1112006937", + "sessionId" , SESSIONID + }, new Object[]{ + "h2kTimestamp" , 1538780763016L, + "location" , "https://www.zitec-shop.com/en/roller-bearing-spherical-radial-multi-row/p-G1321019550", + "sessionId" , SESSIONID}}; + + TestRunner testRunner = newTestRunner(); + testRunner.setProperty(IncrementalWebSession.SESSION_INACTIVITY_TIMEOUT_CONF, "1800"); + testRunner.assertValid(); + List events = new ArrayList<>(3); + int eventCounter = 0; + for(final Object line: data) + { + final Iterator iterator = Arrays.asList((Object[])line).iterator(); + final Map fields = new HashMap(); + while (iterator.hasNext()) + { + Object name = iterator.next(); + Object value = iterator.next(); + fields.put(name, value); + } + events.add(new WebEvent(String.valueOf(eventCounter++), + (String)fields.get("sessionId"), + (String)fields.get("userId"), + (Long)fields.get("h2kTimestamp"), + (String)fields.get("location"))); + } + testRunner.enqueue(events); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + testRunner.assertOutputRecordsCount(data.length + 4); + + final MockRecord session1 = getFirstRecordWithId(SESSIONID, testRunner.getOutputRecords()); + new WebSessionChecker(session1).sessionId(SESSIONID) + .Userid(null) + .record_type("consolidate-session") + .record_id(SESSIONID) + .firstEventDateTime(1538753339113L) + .h2kTimestamp(1538753339113L) + .firstVisitedPage("https://www.zitec-shop.com/en/") + .eventsCounter(4) + .lastEventDateTime(1538753768489L) + .lastVisitedPage("https://www.zitec-shop.com/en/schragkugellager-718-tn/p-G1156005137") + .sessionDuration(429L) + .is_sessionActive(false) + .sessionInactivityDuration(1800L); + final MockRecord session2 = getFirstRecordWithId(SESSIONID+ "#2", testRunner.getOutputRecords()); + new WebSessionChecker(session2).sessionId(SESSIONID + "#2") + .Userid(null) + .record_type("consolidate-session") + .record_id(SESSIONID + "#2") + .firstEventDateTime(1538756201154L) + .h2kTimestamp(1538756201154L) + .firstVisitedPage("https://www.zitec-shop.com/en/schragkugellager-718-tn/p-G1156005137") + .eventsCounter(6) + .lastEventDateTime(1538756417237L) + .lastVisitedPage("https://www.zitec-shop.com/en/kugelfuhrungswagen-vierreihig/p-G1156007584") + .sessionDuration(216L) + .is_sessionActive(false) + .sessionInactivityDuration(1800L); + final MockRecord session3 = getFirstRecordWithId(SESSIONID+ "#3", testRunner.getOutputRecords()); + new WebSessionChecker(session3).sessionId(SESSIONID + "#3") + .Userid(null) + .record_type("consolidate-session") + .record_id(SESSIONID + "#3") + .firstEventDateTime(1538767062429L) + .h2kTimestamp(1538767062429L) + .firstVisitedPage("https://www.zitec-shop.com/en/kugelfuhrungswagen-vierreihig/p-G1156007584") + .eventsCounter(4) + .lastEventDateTime(1538767077273L) + .lastVisitedPage("https://www.zitec-shop.com/en/search/?text=nah") + .sessionDuration(14L) + .is_sessionActive(false) + .sessionInactivityDuration(1800L); + final MockRecord session4 = getFirstRecordWithId(SESSIONID+ "#4", testRunner.getOutputRecords()); + new WebSessionChecker(session4).sessionId(SESSIONID + "#4") + .Userid(null) + .record_type("consolidate-session") + .record_id(SESSIONID + "#4") + .firstEventDateTime(1538780539746L) + .h2kTimestamp(1538780539746L) + .firstVisitedPage("https://www.zitec-shop.com/en/search/?text=nah") + .eventsCounter(10) + .lastEventDateTime(1538780763016L) + .lastVisitedPage("https://www.zitec-shop.com/en/roller-bearing-spherical-radial-multi-row/p-G1321019550") + .sessionDuration(223L) + .is_sessionActive(false) + .sessionInactivityDuration(1800L); + } + + @Test + public void testCreateOneSessionMultipleEventsData() + throws Exception + { + Object[] data = new Object[]{ + new Object[]{"sessionId", SESSION1, + "partyId", PARTY_ID1, + "location", "https://orexad.preprod.group-iph.com/fr/entretien-de-fluides/c-20-50-10", + "h2kTimestamp", 1529673800671L, + "userId", null}, + new Object[]{"sessionId", SESSION1, + "partyId", PARTY_ID1, + "location", "https://orexad.preprod.group-iph.com/fr/entretien-de-fluides/c-20-50-10?utm_source=TEST&utm_medium=email&utm_campaign=HT", + "h2kTimestamp", 1529673855863L, + "userId", null}, + new Object[]{"sessionId", SESSION1, + "partyId", PARTY_ID1, + "location", "https://orexad.preprod.group-iph.com/fr/entretien-de-fluides/c-20-50-10", + "h2kTimestamp", 1529673912936L, + "userId", null}}; + int eventCount = 0; + TestRunner testRunner = newTestRunner(); + testRunner.assertValid(); + List events = new ArrayList<>(3); + for(final Object line: data) + { + final Iterator iterator = Arrays.asList((Object[])line).iterator(); + final Map fields = new HashMap(); + while (iterator.hasNext()) + { + Object name = iterator.next(); + Object value = iterator.next(); + fields.put(name, value); + } + events.add(new WebEvent(String.valueOf(eventCount++), + (String)fields.get("sessionId"), + (String)fields.get("userId"), + (Long)fields.get("h2kTimestamp"), + (String)fields.get("location"))); + } + testRunner.enqueue(events); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + // One webSession expected. + testRunner.assertOutputRecordsCount(data.length + 1); + + final Record firstEvent = getFirstRecordWithId("0", testRunner.getOutputRecords()); + final Record lastEvent = getFirstRecordWithId(String.valueOf(data.length - 1), testRunner.getOutputRecords());; + + final MockRecord session = getFirstRecordWithId(SESSION1, testRunner.getOutputRecords()); + new WebSessionChecker(session).sessionId(firstEvent.getField(SESSION_ID).getRawValue()) + .Userid(null) + .record_type("consolidate-session") + .record_id(firstEvent.getField(SESSION_ID).getRawValue()) + .firstEventDateTime(firstEvent.getField(TIMESTAMP).asLong()) + .h2kTimestamp((Long)firstEvent.getField(TIMESTAMP).getRawValue()) + .firstVisitedPage(firstEvent.getField(VISITED_PAGE).getRawValue()) + .eventsCounter(3) + .lastEventDateTime(lastEvent.getField(TIMESTAMP).asLong()) + .lastVisitedPage(lastEvent.getField(VISITED_PAGE).getRawValue()) + .sessionDuration((lastEvent.getField(TIMESTAMP).asLong() // lastEvent.getField(TIMESTAMP) + -firstEvent.getField(TIMESTAMP).asLong())/1000) + .is_sessionActive((Instant.now().toEpochMilli() + -lastEvent.getField(TIMESTAMP).asLong())/1000< SESSION_TIMEOUT_SECONDS) + .sessionInactivityDuration(SESSION_TIMEOUT_SECONDS); + } + + @Test + public void testCreateTwoSessionTwoEvents() + throws Exception + { + TestRunner testRunner = newTestRunner(); + testRunner.assertValid(); + testRunner.enqueue(Arrays.asList(new WebEvent("1", SESSION1, USER1, DAY1, URL1), + new WebEvent("2", SESSION2, USER2, DAY2, URL2))); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + // Two webSession expected. + testRunner.assertOutputRecordsCount(4); + + final MockRecord session1 = getFirstRecordWithId(SESSION1, testRunner.getOutputRecords()); + new WebSessionChecker(session1).sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(DAY1) + .h2kTimestamp(DAY1) + .firstVisitedPage(URL1) + .eventsCounter(1) + .lastEventDateTime(DAY1) + .lastVisitedPage(URL1) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT_SECONDS); + final MockRecord session2 = getFirstRecordWithId(SESSION2, testRunner.getOutputRecords()); + new WebSessionChecker(session2).sessionId(SESSION2) + .Userid(USER2) + .record_type("consolidate-session") + .record_id(SESSION2) + .firstEventDateTime(DAY2) + .h2kTimestamp(DAY2) + .firstVisitedPage(URL2) + .eventsCounter(1) + .lastEventDateTime(DAY2) + .lastVisitedPage(URL2) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT_SECONDS); + } + + @Test + public void testCreateOneActiveSessionOneEvent() + throws Exception + { + final long now = Instant.now().toEpochMilli(); + TestRunner testRunner = newTestRunner(); + testRunner.assertValid(); + testRunner.enqueue(Arrays.asList(new WebEvent("0", SESSION1, USER1, now, URL1))); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + + // One webSession expected. + testRunner.assertOutputRecordsCount(2); + final MockRecord session = getFirstRecordWithId(SESSION1, testRunner.getOutputRecords()); + new WebSessionChecker(session).sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(now) + .h2kTimestamp(now) + .firstVisitedPage(URL1) + .eventsCounter(1) + .lastEventDateTime(now) + .lastVisitedPage(URL1) + .sessionDuration(null) + .is_sessionActive(true) + .sessionInactivityDuration(null); + } + + @Test + public void testCreateIgnoreOneEventWithoutSessionId() + throws Exception + { + TestRunner testRunner = newTestRunner(); + testRunner.assertValid(); + testRunner.enqueue(Arrays.asList(new WebEvent("1", SESSION1, USER1, DAY1, URL1), + new WebEvent("2", null, USER1, DAY1, URL1))); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + // One webSession expected. Ignoring event without sessionId + testRunner.assertOutputRecordsCount(2); + final MockRecord session = getFirstRecordWithId(SESSION1, testRunner.getOutputRecords()); + new WebSessionChecker(session).sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(DAY1) + .h2kTimestamp(DAY1) + .firstVisitedPage(URL1) + .eventsCounter(1) + .lastEventDateTime(DAY1) + .lastVisitedPage(URL1) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT_SECONDS); + + } + + @Test + public void testCreateIgnoreOneEventWithoutTimestamp() + throws Exception + { + TestRunner testRunner = newTestRunner(); + testRunner.assertValid(); + testRunner.enqueue(Arrays.asList(new WebEvent("1", SESSION1, USER1, DAY1, URL1), + new WebEvent("2", SESSION1, USER1, null, URL2))); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + + // One webSession expected . + testRunner.assertOutputRecordsCount(2); + final MockRecord session = getFirstRecordWithId(SESSION1, testRunner.getOutputRecords()); + new WebSessionChecker(session).sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(DAY1) + .h2kTimestamp(DAY1) + .firstVisitedPage(URL1) + .eventsCounter(1) + .lastEventDateTime(DAY1) + .lastVisitedPage(URL1) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT_SECONDS); + + } + + @Test + public void testBuggyResume() + throws Exception + { + int eventCount = 0; + final long DAY1 = 1531492035025L; + final long TIME2 = 1531494495026L; + final String URL1 = "https://orexad.preprod.group-iph.com/fr/cart"; + final String URL2 = "https://orexad.preprod.group-iph.com/fr/checkout/single/summary"; + final long SESSION_TIMEOUT = 1800; + final Collection events = Arrays.asList( + new WebEvent(String.valueOf(eventCount++), SESSION1, USER1, DAY1, + URL1), + new WebEvent(String.valueOf(eventCount++), SESSION1, USER1, 1531492435034L, + "https://orexad.preprod.group-iph.com/fr/cart"), + new WebEvent(String.valueOf(eventCount++), SESSION1, USER1, 1531493380029L, + "https://orexad.preprod.group-iph.com/fr/search/?text=Vis"), + new WebEvent(String.valueOf(eventCount++), SESSION1, USER1, 1531493805028L, + "https://orexad.preprod.group-iph.com/fr/search/?text=Vis"), + new WebEvent(String.valueOf(eventCount++), SESSION1, USER1, 1531493810026L, + "https://orexad.preprod.group-iph.com/fr/vis-traction-complete-p-kit-k300/p-G1296007152?l=G1296007152"), + new WebEvent(String.valueOf(eventCount++), SESSION1, USER1, 1531494175027L, + "https://orexad.preprod.group-iph.com/fr/cart"), + new WebEvent(String.valueOf(eventCount++), SESSION1, USER1, 1531494180026L, + "https://orexad.preprod.group-iph.com/fr/cart"), + new WebEvent(String.valueOf(eventCount++), SESSION1, USER1, 1531494480026L, + "https://orexad.preprod.group-iph.com/fr/cart"), + new WebEvent(String.valueOf(eventCount++), SESSION1, USER1, TIME2, + URL2)); + + TestRunner testRunner = newTestRunner(); + testRunner.setProperty(IncrementalWebSession.SESSION_INACTIVITY_TIMEOUT_CONF, String.valueOf(SESSION_TIMEOUT)); + testRunner.assertValid(); + testRunner.enqueue(events); + + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + + // One webSession expected . + testRunner.assertOutputRecordsCount(events.size() + 1); + final MockRecord session = getFirstRecordWithId(SESSION1, testRunner.getOutputRecords()); + new WebSessionChecker(session).sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(DAY1) + .h2kTimestamp(DAY1) + .firstVisitedPage(URL1) + .eventsCounter(events.size()) + .lastEventDateTime(TIME2) + .lastVisitedPage(URL2) + .sessionDuration((TIME2-DAY1)/1000) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT); + } + + @Test + public void testCreateGrabOneFieldPresentEveryWhere() + throws Exception + { + TestRunner testRunner = newTestRunner(); + testRunner.assertValid(); + testRunner.enqueue(Arrays.asList(new WebEvent("1", SESSION1, USER1, DAY1, URL1).add(PARTY_ID, PARTY_ID1))); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputErrorCount(0); + + // One webSession expected. + testRunner.assertOutputRecordsCount(2); + final MockRecord session = getFirstRecordWithId(SESSION1, testRunner.getOutputRecords()); + new WebSessionChecker(session).sessionId(SESSION1) + .Userid(USER1) + .record_type("consolidate-session") + .record_id(SESSION1) + .firstEventDateTime(DAY1) + .h2kTimestamp(DAY1) + .firstVisitedPage(URL1) + .eventsCounter(1) + .lastEventDateTime(DAY1) + .lastVisitedPage(URL1) + .sessionDuration(null) + .is_sessionActive(false) + .sessionInactivityDuration(SESSION_TIMEOUT_SECONDS) + .check(PARTY_ID, PARTY_ID1) + .check(B2BUNIT, null); + } + + private MockRecord getFirstRecordWithId(final String id, final List records) + { + return records.stream().filter(record -> record.getId().equals(id)).findFirst().get(); + } + + private ZonedDateTime GetZonedDateTimeFromEpochMili(long time1) { + return ZonedDateTime.ofInstant(Instant.ofEpochMilli(time1), ZoneId.systemDefault()); + } + + /** + * Creates a new TestRunner set with the appropriate properties. + * + * @return a new TestRunner set with the appropriate properties. + * + * @throws InitializationException in case the runner could not be instantiated. + */ + private TestRunner newTestRunner() + throws InitializationException + { + IncrementalWebSession proc = new IncrementalWebSession(); + final TestRunner runner = TestRunners.newTestRunner(proc); + final String FIELDS_TO_RETURN = Stream.of("partyId", "B2BUnit").collect(Collectors.joining(",")); +// fields.to.return: partyId,Company,remoteHost,tagOrigin,sourceOrigin,spamOrigin,referer,userAgentString,utm_source,utm_campaign,utm_medium,utm_content,utm_term,alert_match_name,alert_match_query,referer_hostname,DeviceClass,AgentName,ImportanceCode,B2BUnit,libelle_zone,Userid,customer_category,source_of_traffic_source,source_of_traffic_medium,source_of_traffic_keyword,source_of_traffic_campaign,source_of_traffic_organic_search,source_of_traffic_content,source_of_traffic_referral_path,websessionIndex + configureElasticsearchClientService(runner); + configureCacheService(runner); + runner.setProperty(IncrementalWebSession.CONFIG_CACHE_SERVICE, "lruCache"); + runner.setProperty(IncrementalWebSession.ELASTICSEARCH_CLIENT_SERVICE_CONF, "elasticsearchClient"); + runner.setProperty(IncrementalWebSession.ES_SESSION_INDEX_PREFIX_CONF, SESSION_INDEX_PREFIX); + runner.setProperty(IncrementalWebSession.ES_SESSION_INDEX_SUFFIX_FORMATTER_CONF, SESSION_SUFFIX_FORMATTER_STRING); + runner.setProperty(IncrementalWebSession.ES_SESSION_TYPE_NAME_CONF, "sessions"); + runner.setProperty(IncrementalWebSession.ES_EVENT_INDEX_PREFIX_CONF, EVENT_INDEX_PREFIX); + runner.setProperty(IncrementalWebSession.ES_EVENT_INDEX_SUFFIX_FORMATTER_CONF, EVENT_SUFFIX_FORMATTER_STRING); + runner.setProperty(IncrementalWebSession.ES_EVENT_TYPE_NAME_CONF, "event"); + runner.setProperty(IncrementalWebSession.SESSION_ID_FIELD_CONF, "sessionId"); + runner.setProperty(IncrementalWebSession.TIMESTAMP_FIELD_CONF, "h2kTimestamp"); + runner.setProperty(IncrementalWebSession.VISITED_PAGE_FIELD, "VISITED_PAGE"); + runner.setProperty(IncrementalWebSession.USER_ID_FIELD, "Userid"); + runner.setProperty(IncrementalWebSession.SESSION_INACTIVITY_TIMEOUT_CONF, String.valueOf(SESSION_TIMEOUT_SECONDS)); + runner.setProperty(IncrementalWebSession.FIELDS_TO_RETURN, FIELDS_TO_RETURN); + runner.setProperty(IncrementalWebSession.IS_SINGLE_PAGE_VISIT_FIELD, "is_single_page_visit"); + return runner; + } + + private void configureCacheService(TestRunner runner) throws InitializationException { + final LRUKeyValueCacheService cacheService = new LRUKeyValueCacheService<>(); + runner.addControllerService("lruCache", cacheService); + runner.setProperty(cacheService, + LRUKeyValueCacheService.CACHE_SIZE, "1000"); + runner.assertValid(cacheService); + runner.enableControllerService(cacheService); + } + + private void configureElasticsearchClientService(final TestRunner runner) throws InitializationException { + final ElasticsearchClientService elasticsearchClientService = new MockEsService(); + runner.addControllerService("elasticsearchClient", elasticsearchClientService); + runner.assertValid(elasticsearchClientService); + runner.enableControllerService(elasticsearchClientService); + } + + public static class MockEsService implements ElasticsearchClientService { + + @Override + public void bulkPut(String docIndex, String docType, String document, Optional OptionalId) { + + } + + @Override + public void bulkPut(String docIndex, String docType, Map document, Optional OptionalId) { + + } + + @Override + public void bulkDelete(String docIndex, String docType, String id) { + + } + + @Override + public void deleteByQuery(QueryRecord queryRecord) throws DatastoreClientServiceException { + + } + + @Override + public QueryResponseRecord queryGet(QueryRecord queryRecord) throws DatastoreClientServiceException { + return new QueryResponseRecord(0, Collections.emptyList()); + } + + @Override + public MultiQueryResponseRecord multiQueryGet(MultiQueryRecord queryRecords) throws DatastoreClientServiceException { + return new MultiQueryResponseRecord(Collections.emptyList()); + } + + @Override + public void waitUntilCollectionIsReadyAndRefreshIfAnyPendingTasks(String[] indices, long timeoutMilli) throws DatastoreClientServiceException { + + } + + @Override + public void saveSync(String indexName, String doctype, Map doc) throws Exception { + + } + + @Override + public long searchNumberOfHits(String docIndex, String docType, String docName, String docValue) { + return 0; + } + + @Override + public String convertRecordToString(Record record) { + return ""; + } + + @Override + public void waitUntilCollectionReady(String name, long timeoutMilli) throws DatastoreClientServiceException { + + } + + @Override + public void createCollection(String name, int partitionsCount, int replicationFactor) throws DatastoreClientServiceException { + + } + + @Override + public void dropCollection(String name) throws DatastoreClientServiceException { + + } + + @Override + public long countCollection(String name) throws DatastoreClientServiceException { + return 0; + } + + @Override + public boolean existsCollection(String name) throws DatastoreClientServiceException { + return false; + } + + @Override + public void copyCollection(String reindexScrollTimeout, String src, String dst) throws DatastoreClientServiceException { + + } + + @Override + public void createAlias(String collection, String alias) throws DatastoreClientServiceException { + + } + + @Override + public boolean putMapping(String indexName, String doctype, String mappingAsJsonString) throws DatastoreClientServiceException { + return false; + } + + @Override + public void bulkFlush() throws DatastoreClientServiceException { + + } + + @Override + public void bulkPut(String collectionName, Record record) throws DatastoreClientServiceException { + + } + + @Override + public void put(String collectionName, Record record, boolean asynchronous) throws DatastoreClientServiceException { + + } + + @Override + public void remove(String collectionName, Record record, boolean asynchronous) throws DatastoreClientServiceException { + + } + + @Override + public List multiGet(List multiGetQueryRecords) throws DatastoreClientServiceException { + return Collections.emptyList(); + } + + @Override + public Record get(String collectionName, Record record) throws DatastoreClientServiceException { + return new StandardRecord(); + } + + @Override + public Collection query(String query) { + return Collections.emptyList(); + } + + @Override + public long queryCount(String query) { + return 0; + } + + @Override + public void initialize(ControllerServiceInitializationContext context) throws InitializationException { + + } + + @Override + public Collection validate(Configuration context) { + return Collections.emptyList(); + } + + @Override + public PropertyDescriptor getPropertyDescriptor(String name) { + return null; + } + + @Override + public void onPropertyModified(PropertyDescriptor descriptor, String oldValue, String newValue) { + + } + + @Override + public List getPropertyDescriptors() { + return Collections.emptyList(); + } + + @Override + public String getIdentifier() { + return "elasticsearchClient"; + } + } +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webAnalytics/MockCacheService.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/MockCacheService.java similarity index 96% rename from logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webAnalytics/MockCacheService.java rename to logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/MockCacheService.java index f4f7b26b7..879598586 100644 --- a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webAnalytics/MockCacheService.java +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/MockCacheService.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.hurence.logisland.processor.webAnalytics; +package com.hurence.logisland.processor.webanalytics; import com.hurence.logisland.component.PropertyDescriptor; import com.hurence.logisland.controller.AbstractControllerService; diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webAnalytics/MockElasticsearchClientService.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/MockElasticsearchClientService.java similarity index 85% rename from logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webAnalytics/MockElasticsearchClientService.java rename to logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/MockElasticsearchClientService.java index d4229af09..79db1a7fb 100644 --- a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webAnalytics/MockElasticsearchClientService.java +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/MockElasticsearchClientService.java @@ -13,17 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.hurence.logisland.processor.webAnalytics; +package com.hurence.logisland.processor.webanalytics; import com.hurence.logisland.component.PropertyDescriptor; import com.hurence.logisland.controller.AbstractControllerService; import com.hurence.logisland.record.Record; -import com.hurence.logisland.service.datastore.DatastoreClientServiceException; +import com.hurence.logisland.service.datastore.*; +import com.hurence.logisland.service.datastore.model.*; import com.hurence.logisland.service.elasticsearch.ElasticsearchClientService; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; -import java.io.IOException; import java.util.*; public class MockElasticsearchClientService extends AbstractControllerService implements ElasticsearchClientService { @@ -107,6 +105,36 @@ public void bulkPut(String docIndex, String docType, Map document, Op this.mapDocuments.add(mapDocument); } + @Override + public void bulkDelete(String docIndex, String docType, String id) { + + } + + @Override + public void deleteByQuery(QueryRecord queryRecord) throws DatastoreClientServiceException { + + } + + @Override + public QueryResponseRecord queryGet(QueryRecord queryRecord) throws DatastoreClientServiceException { + return null; + } + + @Override + public MultiQueryResponseRecord multiQueryGet(MultiQueryRecord queryRecords) throws DatastoreClientServiceException { + return null; + } + + @Override + public void waitUntilCollectionIsReadyAndRefreshIfAnyPendingTasks(String index, long timeoutMilli) throws DatastoreClientServiceException { + + } + + @Override + public void waitUntilCollectionIsReadyAndRefreshIfAnyPendingTasks(String[] indices, long timeoutMilli) throws DatastoreClientServiceException { + + } + @Override public List multiGet(List multiGetQueryRecords) { @@ -167,6 +195,11 @@ public long countCollection(String indexName) throws DatastoreClientServiceExcep return stringDocuments.size() + mapDocuments.size(); } + @Override + public void waitUntilCollectionReady(String name, long timeoutMilli) throws DatastoreClientServiceException { + + } + @Override public void createCollection(String indexName, int numShards, int numReplicas) throws DatastoreClientServiceException { } diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/URIDecoderTest.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/URIDecoderTest.java new file mode 100644 index 000000000..7706f22d4 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/URIDecoderTest.java @@ -0,0 +1,218 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics; + +import com.hurence.logisland.processor.Processor; +import com.hurence.logisland.record.FieldType; +import com.hurence.logisland.record.Record; +import com.hurence.logisland.record.StandardRecord; +import com.hurence.logisland.util.runner.MockRecord; +import com.hurence.logisland.util.runner.TestRunner; +import com.hurence.logisland.util.runner.TestRunners; +import org.junit.Assert; +import org.junit.Test; + +public class URIDecoderTest { + + private static final String urlVal1 = "https://www.test.com/de/search/?text=toto"; + private static final String expectedDecodedUrlVal1 = urlVal1; + + private static final String urlVal2 = "https://www.test.com/de/search/?text=calendrier%20%20%202019"; + private static final String expectedDecodedUrlVal2 = "https://www.test.com/de/search/?text=calendrier 2019"; + + private static final String urlVal3 = "https://www.test.com/en/search/?text=key1+%20key2%20+%28key3-key4%29"; + private static final String expectedDecodedUrlVal3 = "https://www.test.com/en/search/?text=key1+ key2 +(key3-key4)"; + + private static final String val4 = "key1+%20key2%20+%28key3-key4%29"; + private static final String expectedDecodedVal4 = "key1+ key2 +(key3-key4)"; + + private static final String val5 = "%co"; + + private static final String val6 = "%%"; + + private static final String value1 = "value1"; + private static final String value2 = "value2"; + + public Processor getDecoder() { + return new URIDecoder(); + } + + private Record getRecord1() { + Record record1 = new StandardRecord(); + record1.setField("string1", FieldType.STRING, value1); + record1.setField("string2", FieldType.STRING, value2); + record1.setField("long1", FieldType.LONG, 1); + record1.setField("long2", FieldType.LONG, 2); + record1.setField("url1", FieldType.STRING, urlVal1); + record1.setField("url2", FieldType.STRING, urlVal2); + record1.setField("url3", FieldType.STRING, urlVal3); + record1.setField("val4", FieldType.STRING, val4); + return record1; + } + + private Record getRecord2() { + Record record1 = new StandardRecord(); + record1.setField("string1", FieldType.STRING, value1); + record1.setField("string2", FieldType.STRING, value2); + record1.setField("long1", FieldType.LONG, 1); + record1.setField("long2", FieldType.LONG, 2); + record1.setField("url1", FieldType.STRING, urlVal1); + record1.setField("url2", FieldType.STRING, urlVal2); + record1.setField("val5", FieldType.STRING, val5); + record1.setField("val6", FieldType.STRING, val6); + return record1; + } + + + @Test + public void testNoURLValueField() { + + Record record1 = getRecord1(); + + TestRunner testRunner = TestRunners.newTestRunner(getDecoder()); + testRunner.setProperty("decode.fields", "string1"); + testRunner.assertValid(); + testRunner.enqueue(record1); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(record1.size()); + out.assertFieldEquals("string1", value1); + out.assertFieldTypeEquals("string1", FieldType.STRING); + } + + @Test + public void testBasicURLValueField() { + + Record record1 = getRecord1(); + + TestRunner testRunner = TestRunners.newTestRunner(getDecoder()); + testRunner.setProperty("decode.fields", "string1, url1"); + testRunner.assertValid(); + testRunner.enqueue(record1); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(record1.size()); + out.assertFieldEquals("string1", value1); + out.assertFieldEquals("url1", expectedDecodedUrlVal1); + } + + @Test + public void testEncodedURLValueField() { + + Record record1 = getRecord1(); + + TestRunner testRunner = TestRunners.newTestRunner(getDecoder()); + testRunner.setProperty("decode.fields", "url2,string1, url1"); + testRunner.assertValid(); + testRunner.enqueue(record1); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(record1.size()); + out.assertFieldEquals("string1", value1); + out.assertFieldEquals("url1", expectedDecodedUrlVal1); + out.assertFieldEquals("url2", expectedDecodedUrlVal2); + } + + @Test + public void testComplexEncodedURLValueField() { + + Record record1 = getRecord1(); + + TestRunner testRunner = TestRunners.newTestRunner(getDecoder()); + testRunner.setProperty("decode.fields", "url2,string1, url1, url3"); + testRunner.assertValid(); + testRunner.enqueue(record1); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(record1.size()); + out.assertFieldEquals("string1", value1); + out.assertFieldEquals("url1", expectedDecodedUrlVal1); + out.assertFieldEquals("url2", expectedDecodedUrlVal2); + out.assertFieldEquals("url3", expectedDecodedUrlVal3); + } + + @Test + public void testComplexEncodedValueField() { + + Record record1 = getRecord1(); + + TestRunner testRunner = TestRunners.newTestRunner(getDecoder()); + testRunner.setProperty("decode.fields", "url2,string1, url1, val4"); + testRunner.assertValid(); + testRunner.enqueue(record1); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(record1.size()); + out.assertFieldEquals("string1", value1); + out.assertFieldEquals("url1", expectedDecodedUrlVal1); + out.assertFieldEquals("url2", expectedDecodedUrlVal2); + out.assertFieldEquals("val4", expectedDecodedVal4); + } + + @Test + public void testNoMatchingField() { + + Record record1 = getRecord1(); + + TestRunner testRunner = TestRunners.newTestRunner(getDecoder()); + testRunner.setProperty("decode.fields", "nonExistingField"); + testRunner.assertValid(); + testRunner.enqueue(record1); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(record1.size()); + out.assertFieldEquals("string1", value1); + out.assertFieldEquals("url1", urlVal1); + out.assertFieldEquals("url2", urlVal2); + out.assertFieldEquals("val4", val4); + } + + @Test + public void testPercentButNotHexaField() { + + Record record2 = getRecord2(); + + TestRunner testRunner = TestRunners.newTestRunner(getDecoder()); + testRunner.setProperty("decode.fields", "val5,val6"); + testRunner.assertValid(); + testRunner.enqueue(record2); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(0); + testRunner.assertOutputErrorCount(1); + + MockRecord out = testRunner.getErrorRecords().get(0); + Assert.assertEquals(2, out.getErrors().size()); + } +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/URLCleanerTest.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/URLCleanerTest.java new file mode 100644 index 000000000..37c429025 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/URLCleanerTest.java @@ -0,0 +1,1111 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics; + +import com.hurence.logisland.component.PropertyDescriptor; +import com.hurence.logisland.processor.webanalytics.modele.SplittedURI; +import com.hurence.logisland.record.FieldType; +import com.hurence.logisland.record.Record; +import com.hurence.logisland.record.StandardRecord; +import com.hurence.logisland.util.runner.MockRecord; +import com.hurence.logisland.util.runner.TestRunner; +import com.hurence.logisland.util.runner.TestRunners; +import org.junit.Assert; +import org.junit.Test; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class URLCleanerTest { + + private static final String url1 = "https://www.test.com/de/search/?text=toto"; + private static final String expectedUrl1WithoutParams = "https://www.test.com/de/search/"; + private static final String expectedUrl1KeepText = url1; + private static final String expectedUrl1RemoveText = expectedUrl1WithoutParams; + + private static final String url2 = "https://www.t%888est%20.com/de/search/?text=calendrier%20%20%202019"; + private static final String expectedUrl2WithoutParams = "https://www.t%888est%20.com/de/search/"; + private static final String expectedUrl2KeepText = url2; + private static final String expectedUrl2RemoveText = expectedUrl2WithoutParams; + + private static final String url3 = "https://www.test.com/en/search/?text=key1+%20key2%20+%28key3-key4%29"; + private static final String expectedUrl3WithoutParams = "https://www.test.com/en/search/"; + private static final String expectedUrl3KeepText = url3; + private static final String expectedUrl3RemoveText = expectedUrl3WithoutParams; + + private static final String url4Decoded = "https://www.orexad.com/fr/search?q=sauterelle||relevance&page=2&sort=relevance"; + private static final String expectedUrl4DecodedWithoutParams = "https://www.orexad.com/fr/search"; + private static final String expectedUrl4DecodedKeepQ = "https://www.orexad.com/fr/search?q=sauterelle||relevance"; + private static final String expectedUrl4DecodedKeepPage = "https://www.orexad.com/fr/search?page=2"; + private static final String expectedUrl4DecodedRemoveQ = "https://www.orexad.com/fr/search?page=2&sort=relevance"; + private static final String expectedUrl4DecodedRemovePage = "https://www.orexad.com/fr/search?q=sauterelle||relevance&sort=relevance"; + + private static final String url4 = "https://www.orexad.com/fr/search?q=sauterelle%7C%7Crelevance&page=2&sort=relevance"; + private static final String expectedUrl4WithoutParams = "https://www.orexad.com/fr/search"; + private static final String expectedUrl4KeepQ = "https://www.orexad.com/fr/search?q=sauterelle%7C%7Crelevance"; + private static final String expectedUrl4KeepPage = "https://www.orexad.com/fr/search?page=2"; + private static final String expectedUrl4RemoveQ = "https://www.orexad.com/fr/search?page=2&sort=relevance"; + private static final String expectedUrl4RemovePage = "https://www.orexad.com/fr/search?q=sauterelle%7C%7Crelevance&sort=relevance"; + + private static final String url5 = "https://www.orexad.com/fr/sauterelle-inox-a-crochet-et-attache-a-levier-vertical/r-PR_G1050050542"; + private static final String expectedUrl5WithoutParams = "https://www.orexad.com/fr/sauterelle-inox-a-crochet-et-attache-a-levier-vertical/r-PR_G1050050542"; + + private static final String val1 = "key1+%20key2%20+%28key3-key4%29"; + private static final String expectedVal1WithoutParams = "key1+%20key2%20+%28key3-key4%29"; + + private static final String val2 = "%co"; + private static final String val3 = "%%"; + + + @Test + public void testSplittedUri() { + SplittedURI url = SplittedURI.fromMalFormedURI("https://www.orexad.com/fr/search?q=sauterelle%7C%7Crelevance&page=2&sort=relevance"); + Assert.assertEquals("https://www.orexad.com/fr/search?", url.getBeforeQuery()); + Assert.assertEquals("q=sauterelle%7C%7Crelevance&page=2&sort=relevance", url.getQuery()); + Assert.assertEquals("", url.getAfterQuery()); + + SplittedURI urlDecoded = SplittedURI.fromMalFormedURI("https://www.orexad.com/fr/search?q=sauterelle||relevance&page=2&sort=relevance"); + Assert.assertEquals("https://www.orexad.com/fr/search?", urlDecoded.getBeforeQuery()); + Assert.assertEquals("q=sauterelle||relevance&page=2&sort=relevance", urlDecoded.getQuery()); + Assert.assertEquals("", urlDecoded.getAfterQuery()); + + SplittedURI urlWithHashTag = SplittedURI.fromMalFormedURI("https://www.orexad.com/fr/search?q=sauterelle||relevance&page=2&sort=relevance#myTitle"); + Assert.assertEquals("https://www.orexad.com/fr/search?", urlWithHashTag.getBeforeQuery()); + Assert.assertEquals("q=sauterelle||relevance&page=2&sort=relevance", urlWithHashTag.getQuery()); + Assert.assertEquals("#myTitle", urlWithHashTag.getAfterQuery()); + + SplittedURI simpleUrl = SplittedURI.fromMalFormedURI("https://www.orexad.com/fr/"); + Assert.assertEquals("https://www.orexad.com/fr/", simpleUrl.getBeforeQuery()); + Assert.assertEquals("", simpleUrl.getQuery()); + Assert.assertEquals("", simpleUrl.getAfterQuery()); + + SplittedURI simpleUrlWithFragment = SplittedURI.fromMalFormedURI("https://www.orexad.com/fr/#gggg"); + Assert.assertEquals("https://www.orexad.com/fr/", simpleUrlWithFragment.getBeforeQuery()); + Assert.assertEquals("", simpleUrlWithFragment.getQuery()); + Assert.assertEquals("#gggg", simpleUrlWithFragment.getAfterQuery()); + } + + + private Record getRecord1() { + Record record1 = new StandardRecord(); + record1.setField("string1", FieldType.STRING, "value1"); + record1.setField("string2", FieldType.STRING, "value2"); + record1.setField("long1", FieldType.LONG, 1); + record1.setField("long2", FieldType.LONG, 2); + record1.setField("url1", FieldType.STRING, url1); + record1.setField("url2", FieldType.STRING, url2); + record1.setField("url3", FieldType.STRING, url3); + record1.setField("url4", FieldType.STRING, url4); + record1.setField("url4Decoded", FieldType.STRING, url4Decoded); + record1.setField("url5", FieldType.STRING, url5); + record1.setField("val1", FieldType.STRING, val1); + record1.setField("val2", FieldType.STRING, val2); + record1.setField("val3", FieldType.STRING, val3); + return record1; + } + + @Test + public void testValidity() { + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.assertNotValid(); + testRunner.setProperty(URLCleaner.URL_FIELDS, "string1"); + testRunner.assertValid(); + testRunner.setProperty(URLCleaner.REMOVE_ALL_PARAMS, "false"); + testRunner.assertNotValid(); + testRunner.setProperty(URLCleaner.REMOVE_ALL_PARAMS, "true"); + testRunner.assertValid(); + testRunner.setProperty(URLCleaner.CONFLICT_RESOLUTION_POLICY, URLCleaner.OVERWRITE_EXISTING.getValue()); + testRunner.assertValid(); + testRunner.setProperty(URLCleaner.REMOVE_PARAMS, "a,b"); + testRunner.assertNotValid(); + testRunner.removeProperty(URLCleaner.REMOVE_PARAMS); + testRunner.assertValid(); + testRunner.setProperty(URLCleaner.KEEP_PARAMS, "a,b"); + testRunner.assertNotValid(); + testRunner.removeProperty(URLCleaner.KEEP_PARAMS); + testRunner.assertValid(); + testRunner.removeProperty(URLCleaner.REMOVE_ALL_PARAMS); + testRunner.assertValid(); + testRunner.setProperty(URLCleaner.KEEP_PARAMS, "a,b"); + testRunner.assertValid(); + testRunner.setProperty(URLCleaner.REMOVE_PARAMS, "a,b"); + testRunner.assertNotValid(); + testRunner.removeProperty(URLCleaner.KEEP_PARAMS); + testRunner.assertValid(); + testRunner.setProperty(URLCleaner.REMOVE_PARAMS, ""); + testRunner.assertNotValid(); + testRunner.removeProperty(URLCleaner.REMOVE_PARAMS); + testRunner.assertValid(); + testRunner.setProperty(URLCleaner.URL_FIELDS, ""); + testRunner.assertNotValid(); + testRunner.setProperty(URLCleaner.URL_FIELDS, "a:g:v"); + testRunner.assertNotValid(); + testRunner.setProperty(URLCleaner.URL_FIELDS, "a:b,g:b,t"); + testRunner.assertValid(); + testRunner.setProperty(URLCleaner.URL_FIELDS, "b,g:b,t"); + testRunner.assertValid(); + testRunner.setProperty(URLCleaner.URL_FIELDS, "a,g,t"); + testRunner.assertValid(); + testRunner.setProperty(URLCleaner.URL_FIELDS, "a,b,g:b:h,t"); + testRunner.assertNotValid(); + } + + @Test + public void testNoURLValueField() { + Record record1 = getRecord1(); + int inputSize = record1.size(); + + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.setProperty(URLCleaner.URL_FIELDS, "string1:newstring1"); + testRunner.assertValid(); + testRunner.enqueue(record1); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(inputSize + 1); + out.assertFieldEquals("string1", "value1"); + out.assertFieldTypeEquals("string1", FieldType.STRING); + out.assertFieldEquals("newstring1", "value1"); + out.assertFieldTypeEquals("newstring1", FieldType.STRING); + } + + @Test + public void testNoURLValueField2() { + Record record1 = getRecord1(); + int inputSize = record1.size(); + + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.setProperty(URLCleaner.URL_FIELDS, "string1"); + testRunner.assertValid(); + testRunner.enqueue(record1); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(inputSize); + out.assertFieldEquals("string1", "value1"); + out.assertFieldTypeEquals("string1", FieldType.STRING); + } + + @Test + public void testBasicURLValueField() { + Record record1 = getRecord1(); + int inputSize = record1.size(); + + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.setProperty(URLCleaner.URL_FIELDS, "string1:newstring1,url1: new_url1"); + testRunner.assertValid(); + testRunner.enqueue(record1); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(inputSize + 2); + out.assertFieldEquals("string1", "value1"); + out.assertFieldTypeEquals("string1", FieldType.STRING); + out.assertFieldEquals("newstring1", "value1"); + out.assertFieldTypeEquals("newstring1", FieldType.STRING); + out.assertFieldEquals("url1", url1); + out.assertFieldTypeEquals("url1", FieldType.STRING); + out.assertFieldEquals("new_url1", expectedUrl1WithoutParams); + out.assertFieldTypeEquals("new_url1", FieldType.STRING); + } + + @Test + public void testBasicURLValueField2() { + Record record1 = getRecord1(); + int inputSize = record1.size(); + + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.setProperty(URLCleaner.URL_FIELDS, "string1,url1"); + testRunner.assertValid(); + testRunner.enqueue(record1); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(inputSize); + out.assertFieldEquals("string1", "value1"); + out.assertFieldTypeEquals("string1", FieldType.STRING); + out.assertFieldEquals("url1", url1); + out.assertFieldTypeEquals("url1", FieldType.STRING); + } + + @Test + public void testEncodedURLValueField() { + Record record1 = getRecord1(); + int inputSize = record1.size(); + + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.setProperty(URLCleaner.URL_FIELDS, "url2,url1"); + testRunner.setProperty(URLCleaner.CONFLICT_RESOLUTION_POLICY, URLCleaner.OVERWRITE_EXISTING); + testRunner.assertValid(); + testRunner.enqueue(record1); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(inputSize); + out.assertFieldEquals("url2", expectedUrl2WithoutParams); + out.assertFieldTypeEquals("url2", FieldType.STRING); + out.assertFieldEquals("url1", expectedUrl1WithoutParams); + out.assertFieldTypeEquals("url1", FieldType.STRING); + } + + + @Test + public void testComplexField() { + Record record1 = getRecord1(); + int inputSize = record1.size(); + + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.setProperty(URLCleaner.URL_FIELDS, "url3,url4,url5,val1"); + testRunner.setProperty(URLCleaner.CONFLICT_RESOLUTION_POLICY, URLCleaner.OVERWRITE_EXISTING); + testRunner.assertValid(); + testRunner.enqueue(record1); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(inputSize); + out.assertFieldEquals("url3", expectedUrl3WithoutParams); + out.assertFieldEquals("url4", expectedUrl4WithoutParams); + out.assertFieldEquals("url5", expectedUrl5WithoutParams); + out.assertFieldEquals("val1", expectedVal1WithoutParams); + } + + @Test + public void testWithAlreadyDecodedUrls() { + Record record1 = getRecord1(); + int inputSize = record1.size(); + + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.setProperty(URLCleaner.URL_FIELDS, "url4,url4Decoded,val2,val3"); + testRunner.setProperty(URLCleaner.CONFLICT_RESOLUTION_POLICY, URLCleaner.OVERWRITE_EXISTING); + testRunner.assertValid(); + testRunner.enqueue(record1); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord errorRecord = testRunner.getOutputRecords().get(0); + errorRecord.assertRecordSizeEquals(inputSize); + errorRecord.assertFieldEquals("url4", expectedUrl4WithoutParams); + errorRecord.assertFieldEquals("val2", val2); + errorRecord.assertFieldEquals("val3", val3); + errorRecord.assertFieldEquals("url4Decoded", expectedUrl4DecodedWithoutParams); + } + + @Test + public void testNoMatchingField() { + Record record1 = getRecord1(); + + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.setProperty(URLCleaner.URL_FIELDS, "nonExistingField"); + testRunner.setProperty(URLCleaner.CONFLICT_RESOLUTION_POLICY, URLCleaner.OVERWRITE_EXISTING); + testRunner.assertValid(); + testRunner.enqueue(record1); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(record1.size()); + out.assertContentEquals(record1); + } + + + @Test + public void testPercentButNotHexaField() { + Record record = getRecord1(); + + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.setProperty(URLCleaner.URL_FIELDS, "val2,val3"); + testRunner.setProperty(URLCleaner.CONFLICT_RESOLUTION_POLICY, URLCleaner.OVERWRITE_EXISTING); + testRunner.assertValid(); + testRunner.enqueue(record); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(record.size()); + out.assertFieldEquals("val2", val2); + out.assertFieldEquals("val3", val3); + } + + @Test + public void testKeepText() { + Record record = getRecord1(); + + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.setProperty(URLCleaner.URL_FIELDS, "url1,url2,url3,url4,url4Decoded"); + testRunner.setProperty(URLCleaner.CONFLICT_RESOLUTION_POLICY, URLCleaner.OVERWRITE_EXISTING); + testRunner.setProperty(URLCleaner.KEEP_PARAMS, "text"); + testRunner.assertValid(); + testRunner.enqueue(record); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(record.size()); + out.assertFieldEquals("url1", expectedUrl1KeepText); + out.assertFieldEquals("url2", expectedUrl2KeepText); + out.assertFieldEquals("url3", expectedUrl3KeepText); + out.assertFieldEquals("url4", expectedUrl4WithoutParams); + out.assertFieldEquals("url4Decoded", expectedUrl4DecodedWithoutParams); + } + + @Test + public void testKeepQ() { + Record record = getRecord1(); + + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.setProperty(URLCleaner.URL_FIELDS, "url1,url2,url3,url4,url4Decoded"); + testRunner.setProperty(URLCleaner.CONFLICT_RESOLUTION_POLICY, URLCleaner.OVERWRITE_EXISTING); + testRunner.setProperty(URLCleaner.KEEP_PARAMS, "q"); + testRunner.assertValid(); + testRunner.enqueue(record); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(record.size()); + out.assertFieldEquals("url1", expectedUrl1WithoutParams); + out.assertFieldEquals("url2", expectedUrl2WithoutParams); + out.assertFieldEquals("url3", expectedUrl3WithoutParams); + out.assertFieldEquals("url4", expectedUrl4KeepQ); + out.assertFieldEquals("url4Decoded", expectedUrl4DecodedKeepQ); + } + + @Test + public void testKeepPage() { + Record record = getRecord1(); + + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.setProperty(URLCleaner.URL_FIELDS, "url1,url2,url3,url4,url4Decoded"); + testRunner.setProperty(URLCleaner.CONFLICT_RESOLUTION_POLICY, URLCleaner.OVERWRITE_EXISTING); + testRunner.setProperty(URLCleaner.KEEP_PARAMS, "page"); + testRunner.assertValid(); + testRunner.enqueue(record); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(record.size()); + out.assertFieldEquals("url1", expectedUrl1WithoutParams); + out.assertFieldEquals("url2", expectedUrl2WithoutParams); + out.assertFieldEquals("url3", expectedUrl3WithoutParams); + out.assertFieldEquals("url4", expectedUrl4KeepPage); + out.assertFieldEquals("url4Decoded", expectedUrl4DecodedKeepPage); + } + + @Test + public void testKeepTextAndQ() { + Record record = getRecord1(); + + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.setProperty(URLCleaner.URL_FIELDS, "url1,url2,url3,url4,url4Decoded"); + testRunner.setProperty(URLCleaner.CONFLICT_RESOLUTION_POLICY, URLCleaner.OVERWRITE_EXISTING); + testRunner.setProperty(URLCleaner.KEEP_PARAMS, "text, q"); + testRunner.assertValid(); + testRunner.enqueue(record); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(record.size()); + out.assertFieldEquals("url1", expectedUrl1KeepText); + out.assertFieldEquals("url2", expectedUrl2KeepText); + out.assertFieldEquals("url3", expectedUrl3KeepText); + out.assertFieldEquals("url4", expectedUrl4KeepQ); + out.assertFieldEquals("url4Decoded", expectedUrl4DecodedKeepQ); + } + + + @Test + public void testRemoveText() { + Record record = getRecord1(); + + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.setProperty(URLCleaner.URL_FIELDS, "url1,url2,url3,url4,url4Decoded"); + testRunner.setProperty(URLCleaner.CONFLICT_RESOLUTION_POLICY, URLCleaner.OVERWRITE_EXISTING); + testRunner.setProperty(URLCleaner.REMOVE_PARAMS, "text"); + testRunner.assertValid(); + testRunner.enqueue(record); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(record.size()); + out.assertFieldEquals("url1", expectedUrl1RemoveText); + out.assertFieldEquals("url2", expectedUrl2RemoveText); + out.assertFieldEquals("url3", expectedUrl3RemoveText); + out.assertFieldEquals("url4", url4); + out.assertFieldEquals("url4Decoded", url4Decoded); + } + + @Test + public void testRemoveQ() { + Record record = getRecord1(); + + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.setProperty(URLCleaner.URL_FIELDS, "url1,url2,url3,url4,url4Decoded"); + testRunner.setProperty(URLCleaner.CONFLICT_RESOLUTION_POLICY, URLCleaner.OVERWRITE_EXISTING); + testRunner.setProperty(URLCleaner.REMOVE_PARAMS, "q"); + testRunner.assertValid(); + testRunner.enqueue(record); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(record.size()); + out.assertFieldEquals("url1", expectedUrl1KeepText); + out.assertFieldEquals("url2", expectedUrl2KeepText); + out.assertFieldEquals("url3", expectedUrl3KeepText); + out.assertFieldEquals("url4", expectedUrl4RemoveQ); + out.assertFieldEquals("url4Decoded", expectedUrl4DecodedRemoveQ); + } + + @Test + public void testRemovePage() { + Record record = getRecord1(); + + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.setProperty(URLCleaner.URL_FIELDS, "url1,url2,url3,url4,url4Decoded"); + testRunner.setProperty(URLCleaner.CONFLICT_RESOLUTION_POLICY, URLCleaner.OVERWRITE_EXISTING); + testRunner.setProperty(URLCleaner.REMOVE_PARAMS, "page"); + testRunner.assertValid(); + testRunner.enqueue(record); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(record.size()); + out.assertFieldEquals("url1", expectedUrl1KeepText); + out.assertFieldEquals("url2", expectedUrl2KeepText); + out.assertFieldEquals("url3", expectedUrl3KeepText); + out.assertFieldEquals("url4", expectedUrl4RemovePage); + out.assertFieldEquals("url4Decoded", expectedUrl4DecodedRemovePage); + } + + @Test + public void testRemoveTextAndQ() { + Record record = getRecord1(); + + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.setProperty(URLCleaner.URL_FIELDS, "url1,url2,url3,url4,url4Decoded"); + testRunner.setProperty(URLCleaner.CONFLICT_RESOLUTION_POLICY, URLCleaner.OVERWRITE_EXISTING); + testRunner.setProperty(URLCleaner.REMOVE_PARAMS, "text, q"); + testRunner.assertValid(); + testRunner.enqueue(record); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(record.size()); + out.assertFieldEquals("url1", expectedUrl1RemoveText); + out.assertFieldEquals("url2", expectedUrl2RemoveText); + out.assertFieldEquals("url3", expectedUrl3RemoveText); + out.assertFieldEquals("url4", expectedUrl4RemoveQ); + out.assertFieldEquals("url4Decoded", expectedUrl4DecodedRemoveQ); + } + + @Test + public void specialTestDecodedQueryValuesInUrl() throws UnsupportedEncodingException { + Record record = new StandardRecord(); + record.setField("url", FieldType.STRING, "https://mydomain.com/my/path/to/file.html?a=kaka&b=robl&oc&h=on#myfragment"); + record.setField("urlEncode", FieldType.STRING, "https://mydomain.com/my/path/to/file.html?a=kaka&b=" + URLEncoder.encode("robl&oc", StandardCharsets.UTF_8.toString()) + "&h=on#myfragment"); + + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.setProperty(URLCleaner.URL_FIELDS, "url, urlEncode"); + testRunner.setProperty(URLCleaner.CONFLICT_RESOLUTION_POLICY, URLCleaner.OVERWRITE_EXISTING); + testRunner.setProperty(URLCleaner.REMOVE_PARAMS, "b"); + testRunner.assertValid(); + testRunner.enqueue(record); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(record.size()); + out.assertFieldEquals("url", "https://mydomain.com/my/path/to/file.html?a=kaka&oc&h=on#myfragment"); + out.assertFieldEquals("urlEncode", "https://mydomain.com/my/path/to/file.html?a=kaka&h=on#myfragment"); + } + + + @Test + public void testNullField() { + Record record = new StandardRecord(); + record.setField("url", FieldType.STRING, null); + + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.setProperty(URLCleaner.URL_FIELDS, "url"); + testRunner.setProperty(URLCleaner.CONFLICT_RESOLUTION_POLICY, URLCleaner.OVERWRITE_EXISTING); + testRunner.setProperty(URLCleaner.REMOVE_PARAMS, "b"); + testRunner.assertValid(); + testRunner.enqueue(record); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(record.size()); + out.assertNullField("url"); + } + + @Test + public void testEmptyField() { + Record record = new StandardRecord(); + record.setField("url", FieldType.STRING, ""); + + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.setProperty(URLCleaner.URL_FIELDS, "url"); + testRunner.setProperty(URLCleaner.CONFLICT_RESOLUTION_POLICY, URLCleaner.OVERWRITE_EXISTING); + testRunner.setProperty(URLCleaner.REMOVE_PARAMS, "b"); + testRunner.assertValid(); + testRunner.enqueue(record); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(record.size()); + out.assertFieldEquals("url",""); + } + + @Test + public void testJustKeyInQuery() { + Record record = new StandardRecord(); + record.setField("url", FieldType.STRING, "http://host.com/path?mysyntax&pretty&size=2#anchor"); + + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.setProperty(URLCleaner.URL_FIELDS, "url"); + testRunner.setProperty(URLCleaner.CONFLICT_RESOLUTION_POLICY, URLCleaner.OVERWRITE_EXISTING); + testRunner.setProperty(URLCleaner.REMOVE_PARAMS, "mysyntax"); + testRunner.assertValid(); + testRunner.enqueue(record); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(record.size()); + out.assertFieldEquals("url","http://host.com/path?pretty&size=2#anchor"); + } + + @Test + public void testJustKeyInQuery2() { + Record record = new StandardRecord(); + record.setField("url", FieldType.STRING, "http://host.com/path?mysyntax&pretty&size=2#anchor"); + + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.setProperty(URLCleaner.URL_FIELDS, "url"); + testRunner.setProperty(URLCleaner.CONFLICT_RESOLUTION_POLICY, URLCleaner.OVERWRITE_EXISTING); + testRunner.setProperty(URLCleaner.REMOVE_PARAMS, "pretty"); + testRunner.assertValid(); + testRunner.enqueue(record); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(record.size()); + out.assertFieldEquals("url","http://host.com/path?mysyntax&size=2#anchor"); + } + + @Test + public void testQuerywithoutValueAndEmptyValue() { + Record record = new StandardRecord(); + record.setField("url", FieldType.STRING, "http://host.com/path?a=b&c=&d&z=w"); + + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.setProperty(URLCleaner.URL_FIELDS, "url"); + testRunner.setProperty(URLCleaner.CONFLICT_RESOLUTION_POLICY, URLCleaner.OVERWRITE_EXISTING); + testRunner.setProperty(URLCleaner.REMOVE_PARAMS, "pretty"); + testRunner.assertValid(); + testRunner.enqueue(record); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(record.size()); + out.assertFieldEquals("url","http://host.com/path?a=b&c=&d&z=w"); + } + + @Test + public void bulkRemoveAllTest() { + Map inputUrlToExpectedUrl = new HashMap(); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/search/?text=loupe+las33300", + "https://mydomain.com/fr/search/" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/elingue-ronde-haute-resistance/r-PR_G1408003386?q=elingue%7C%7Crelevance%7C%7CmanufacturerNameFacet%7C%7CGISS&text=elingue&classif=", + "https://mydomain.com/fr/elingue-ronde-haute-resistance/r-PR_G1408003386" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/protection-usage-court/c-40-10-21?q=%7C%7Crelevance&page=6", + "https://mydomain.com/fr/protection-usage-court/c-40-10-21" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/ensemble-ebavurage-chanfreinage-en-coffret/p-G1111003763", + "https://mydomain.com/fr/ensemble-ebavurage-chanfreinage-en-coffret/p-G1111003763" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/bac-a-bec/r-PR_G1408000200?q=||||attribute157||Gris||attribute228||225x150x125%20mm||&classif=45&sortAttribute=&sortOrder=", + "https://mydomain.com/fr/bac-a-bec/r-PR_G1408000200" + ); +// decoded -> https://mydomain.com/fr/bac-a-bec/r-PR_G1408000200?q=||||attribute157||Gris||attribute228||225x150x125 mm||&classif=45&sortAttribute=&sortOrder= + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/search/?text=Chaine+9.25+inox", + "https://mydomain.com/fr/search/" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/moraillon-porte-cadenas/p-G1164000013?t=cadenas+pompier", + "https://mydomain.com/fr/moraillon-porte-cadenas/p-G1164000013" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/facom/c-1111?q=%7C%7C%7C%7CcategoryLevel1%7C%7C45&page=5", + "https://mydomain.com/fr/facom/c-1111" + ); + inputUrlToExpectedUrl.put( + "https://www.btshop.nl/nl/veiligheidsschoen-sl-80-blue-esd-s2/r-PR_G1021004878?q=||relevance||attribute891||43&sortAttribute=attribute891,attribute109,attribute5041,attribute157&sortOrder=asc", + "https://www.btshop.nl/nl/veiligheidsschoen-sl-80-blue-esd-s2/r-PR_G1021004878" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/cart#", + "https://mydomain.com/fr/cart#" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/search/?text=smc+aq+240f-06-00", + "https://mydomain.com/fr/search/" + ); + inputUrlToExpectedUrl.put( + "https://es.world.com/es/herramientas-de-mano/c-35-10?q=||relevance||manufacturerNameFacet||Roebuck||categoryLevel3%7C%7C35-10-20", + "https://es.world.com/es/herramientas-de-mano/c-35-10" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/search/?text=piquage%20&q=piquage%20||relevance||manufacturerNameFacet||Parker%20Legris||attribute1875%7C%7CM5%20%27%27", + "https://mydomain.com/search/" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/MyESC/modules/congress/Abstract/AbstractContent.aspx?abstractID=9GrIawodOyWmVAXM%2b9Bq3eJFWUiAKhB2Toh3Oct0zIH%2fCbISTIls4l4Ox45ROTAWHCUzXjOonos%3d", + "https://mydomain.com/MyESC/modules/congress/Abstract/AbstractContent.aspx" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/Congress/ESC-CONGRESS-2019/Expert-Advice-Tips-and-tricks-in-imaging-your-patient-with-valvular-heart-d/189866-tips-and-tricks-for-imaging-in-aortic-stenosis#video", + "https://mydomain.com/Congress/ESC-CONGRESS-2019/Expert-Advice-Tips-and-tricks-in-imaging-your-patient-with-valvular-heart-d/189866-tips-and-tricks-for-imaging-in-aortic-stenosis#video" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/Councils/Council-on-Hypertension-(CHT)/News/position-statement-of-the-world-council-on-hypertension-on-ace-inhibitors-and-ang", + "https://mydomain.com/Councils/Council-on-Hypertension-(CHT)/News/position-statement-of-the-world-council-on-hypertension-on-ace-inhibitors-and-ang" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/Journals/E-Journal-of-Cardiology-Practice/Volume-14/Treatment-of-right-heart-failure-is-there-a-solution-to-the-problem", + "https://mydomain.com/Journals/E-Journal-of-Cardiology-Practice/Volume-14/Treatment-of-right-heart-failure-is-there-a-solution-to-the-problem" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/Congress/EuroCMR-2019/Special-Course-8-how-to-read-CMR-for-extra-cardiac-findings/187189-how-to-interpret-common-organ-specific-findings-in-the-lungs-skeletal-system-liver-kidneys-breast-case-based-interactive-discussion#slide", + "https://mydomain.com/Congress/EuroCMR-2019/Special-Course-8-how-to-read-CMR-for-extra-cardiac-findings/187189-how-to-interpret-common-organ-specific-findings-in-the-lungs-skeletal-system-liver-kidneys-breast-case-based-interactive-discussion#slide" + ); + inputUrlToExpectedUrl.put( + "https://my--domain.force.org/apex/ESCUserProfileInfo", + "https://my--domain.force.org/apex/ESCUserProfileInfo" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/Education/COVID-19-and-Cardiology/ESC-COVID-19-Guidance?hit=home&urlorig=/vgn-ext-templating/#tbl07", + "https://mydomain.com/Education/COVID-19-and-Cardiology/ESC-COVID-19-Guidance#tbl07" + ); + inputUrlToExpectedUrl.put( + "https://my--domain.force.org/ESCMyProfile?utm_medium=Email&utm_source=&utm_campaign=ESC+-+ESC+Congress+2020+-+registration+confirmation#", + "https://my--domain.force.org/ESCMyProfile#" + ); + inputUrlToExpectedUrl.put( + "http://spo.hurence.org/default.aspx?eevtid=1482&showResults=False&_ga=2.267591435.481963044.1578999296-479375258.1578999295", + "http://spo.hurence.org/default.aspx" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/Congresses-&-Events/Frontiers-in-Cardiovascular-Biomedicine/Registration?utm_medium=Email&utm_source=Councils&utm_campaign=Councils+-+FCVB+2020+-+Early+registration+fee+-++Last+call", + "https://mydomain.com/Congresses-&-Events/Frontiers-in-Cardiovascular-Biomedicine/Registration" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/MyESC/modules/congress/Abstract/AbstractAuthors.aspx?abstractID=9GrIawodOyXZLPpXgJHtvCxG5gTt5TznJt97rA1Jy%2bzH7V5eLZVqUnyoo903fiw9nf7mbxKuI14%3d", + "https://mydomain.com/MyESC/modules/congress/Abstract/AbstractAuthors.aspx" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/Congresses-&-Events/ESC-Congress/Scientific-sessions", + "https://mydomain.com/Congresses-&-Events/ESC-Congress/Scientific-sessions" + ); + inputUrlToExpectedUrl.put( + "https://idp.hurence.org/idp/login.jsp?loginFailed=true&actionUrl=%2Fidp%2FAuthn%2FESCUserPassword", + "https://idp.hurence.org/idp/login.jsp" + ); + inputUrlToExpectedUrl.put( + "https://aa.net/2016/formulaResult.aspx?model=europelow&exam=&patient=370532", + "https://aa.net/2016/formulaResult.aspx" + ); + inputUrlToExpectedUrl.put( + "https://aa.net/login.aspx?ReturnUrl=%2fpercutaneous-interventions%2fhomepage.aspx", + "https://aa.net/login.aspx" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/Education/Practice-Tools/EACVI-toolboxes/3D-Echo/Atlas-of-Three%E2%80%93dimensional-Echocardiography/Volumes-and-Ejection-Fraction", + "https://mydomain.com/Education/Practice-Tools/EACVI-toolboxes/3D-Echo/Atlas-of-Three%E2%80%93dimensional-Echocardiography/Volumes-and-Ejection-Fraction" + ); + inputUrlToExpectedUrl.put( + "https://my--domain.force.org/ESCMyPublications", + "https://my--domain.force.org/ESCMyPublications" + ); + runTestWithRemoveAll(inputUrlToExpectedUrl); + } + + @Test + public void bulkRemoveQTest() { + Map inputUrlToExpectedUrl = new HashMap(); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/search/?text=loupe+las33300", + "https://mydomain.com/fr/search/?text=loupe+las33300" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/elingue-ronde-haute-resistance/r-PR_G1408003386?q=elingue%7C%7Crelevance%7C%7CmanufacturerNameFacet%7C%7CGISS&text=elingue&classif=", + "https://mydomain.com/fr/elingue-ronde-haute-resistance/r-PR_G1408003386?text=elingue&classif=" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/protection-usage-court/c-40-10-21?q=%7C%7Crelevance&page=6", + "https://mydomain.com/fr/protection-usage-court/c-40-10-21?page=6" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/ensemble-ebavurage-chanfreinage-en-coffret/p-G1111003763", + "https://mydomain.com/fr/ensemble-ebavurage-chanfreinage-en-coffret/p-G1111003763" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/bac-a-bec/r-PR_G1408000200?q=||||attribute157||Gris||attribute228||225x150x125%20mm||&classif=45&sortAttribute=&sortOrder=", + "https://mydomain.com/fr/bac-a-bec/r-PR_G1408000200?classif=45&sortAttribute=&sortOrder=" + ); +// decoded -> https://mydomain.com/fr/bac-a-bec/r-PR_G1408000200?q=||||attribute157||Gris||attribute228||225x150x125 mm||&classif=45&sortAttribute=&sortOrder= + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/search/?text=Chaine+9.25+inox", + "https://mydomain.com/fr/search/?text=Chaine+9.25+inox" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/moraillon-porte-cadenas/p-G1164000013?t=cadenas+pompier", + "https://mydomain.com/fr/moraillon-porte-cadenas/p-G1164000013?t=cadenas+pompier" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/facom/c-1111?q=%7C%7C%7C%7CcategoryLevel1%7C%7C45&page=5", + "https://mydomain.com/fr/facom/c-1111?page=5" + ); + inputUrlToExpectedUrl.put( + "https://www.btshop.nl/nl/veiligheidsschoen-sl-80-blue-esd-s2/r-PR_G1021004878?q=||relevance||attribute891||43&sortAttribute=attribute891,attribute109,attribute5041,attribute157&sortOrder=asc", + "https://www.btshop.nl/nl/veiligheidsschoen-sl-80-blue-esd-s2/r-PR_G1021004878?sortAttribute=attribute891,attribute109,attribute5041,attribute157&sortOrder=asc" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/cart#", + "https://mydomain.com/fr/cart#" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/search/?text=smc+aq+240f-06-00", + "https://mydomain.com/fr/search/?text=smc+aq+240f-06-00" + ); + inputUrlToExpectedUrl.put( + "https://es.world.com/es/herramientas-de-mano/c-35-10?q=||relevance||manufacturerNameFacet||Roebuck||categoryLevel3%7C%7C35-10-20", + "https://es.world.com/es/herramientas-de-mano/c-35-10" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/search/?text=piquage%20&q=piquage%20||relevance||manufacturerNameFacet||Parker%20Legris||attribute1875%7C%7CM5%20%27%27", + "https://mydomain.com/search/?text=piquage%20" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/MyESC/modules/congress/Abstract/AbstractContent.aspx?abstractID=9GrIawodOyWmVAXM%2b9Bq3eJFWUiAKhB2Toh3Oct0zIH%2fCbISTIls4l4Ox45ROTAWHCUzXjOonos%3d", + "https://mydomain.com/MyESC/modules/congress/Abstract/AbstractContent.aspx?abstractID=9GrIawodOyWmVAXM%2b9Bq3eJFWUiAKhB2Toh3Oct0zIH%2fCbISTIls4l4Ox45ROTAWHCUzXjOonos%3d" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/Congress/ESC-CONGRESS-2019/Expert-Advice-Tips-and-tricks-in-imaging-your-patient-with-valvular-heart-d/189866-tips-and-tricks-for-imaging-in-aortic-stenosis#video", + "https://mydomain.com/Congress/ESC-CONGRESS-2019/Expert-Advice-Tips-and-tricks-in-imaging-your-patient-with-valvular-heart-d/189866-tips-and-tricks-for-imaging-in-aortic-stenosis#video" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/Councils/Council-on-Hypertension-(CHT)/News/position-statement-of-the-world-council-on-hypertension-on-ace-inhibitors-and-ang", + "https://mydomain.com/Councils/Council-on-Hypertension-(CHT)/News/position-statement-of-the-world-council-on-hypertension-on-ace-inhibitors-and-ang" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/Journals/E-Journal-of-Cardiology-Practice/Volume-14/Treatment-of-right-heart-failure-is-there-a-solution-to-the-problem", + "https://mydomain.com/Journals/E-Journal-of-Cardiology-Practice/Volume-14/Treatment-of-right-heart-failure-is-there-a-solution-to-the-problem" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/Congress/EuroCMR-2019/Special-Course-8-how-to-read-CMR-for-extra-cardiac-findings/187189-how-to-interpret-common-organ-specific-findings-in-the-lungs-skeletal-system-liver-kidneys-breast-case-based-interactive-discussion#slide", + "https://mydomain.com/Congress/EuroCMR-2019/Special-Course-8-how-to-read-CMR-for-extra-cardiac-findings/187189-how-to-interpret-common-organ-specific-findings-in-the-lungs-skeletal-system-liver-kidneys-breast-case-based-interactive-discussion#slide" + ); + inputUrlToExpectedUrl.put( + "https://my--domain.force.org/apex/ESCUserProfileInfo", + "https://my--domain.force.org/apex/ESCUserProfileInfo" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/Education/COVID-19-and-Cardiology/ESC-COVID-19-Guidance?hit=home&urlorig=/vgn-ext-templating/#tbl07", + "https://mydomain.com/Education/COVID-19-and-Cardiology/ESC-COVID-19-Guidance?hit=home&urlorig=/vgn-ext-templating/#tbl07" + ); + inputUrlToExpectedUrl.put( + "https://my--domain.force.org/ESCMyProfile?utm_medium=Email&utm_source=&utm_campaign=ESC+-+ESC+Congress+2020+-+registration+confirmation#", + "https://my--domain.force.org/ESCMyProfile?utm_medium=Email&utm_source=&utm_campaign=ESC+-+ESC+Congress+2020+-+registration+confirmation#" + ); + inputUrlToExpectedUrl.put( + "http://spo.hurence.org/default.aspx?eevtid=1482&showResults=False&_ga=2.267591435.481963044.1578999296-479375258.1578999295", + "http://spo.hurence.org/default.aspx?eevtid=1482&showResults=False&_ga=2.267591435.481963044.1578999296-479375258.1578999295" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/Congresses-&-Events/Frontiers-in-Cardiovascular-Biomedicine/Registration?utm_medium=Email&utm_source=Councils&utm_campaign=Councils+-+FCVB+2020+-+Early+registration+fee+-++Last+call", + "https://mydomain.com/Congresses-&-Events/Frontiers-in-Cardiovascular-Biomedicine/Registration?utm_medium=Email&utm_source=Councils&utm_campaign=Councils+-+FCVB+2020+-+Early+registration+fee+-++Last+call" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/MyESC/modules/congress/Abstract/AbstractAuthors.aspx?abstractID=9GrIawodOyXZLPpXgJHtvCxG5gTt5TznJt97rA1Jy%2bzH7V5eLZVqUnyoo903fiw9nf7mbxKuI14%3d", + "https://mydomain.com/MyESC/modules/congress/Abstract/AbstractAuthors.aspx?abstractID=9GrIawodOyXZLPpXgJHtvCxG5gTt5TznJt97rA1Jy%2bzH7V5eLZVqUnyoo903fiw9nf7mbxKuI14%3d" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/Congresses-&-Events/ESC-Congress/Scientific-sessions", + "https://mydomain.com/Congresses-&-Events/ESC-Congress/Scientific-sessions" + ); + inputUrlToExpectedUrl.put( + "https://idp.hurence.org/idp/login.jsp?loginFailed=true&actionUrl=%2Fidp%2FAuthn%2FESCUserPassword", + "https://idp.hurence.org/idp/login.jsp?loginFailed=true&actionUrl=%2Fidp%2FAuthn%2FESCUserPassword" + ); + inputUrlToExpectedUrl.put( + "https://aa.net/2016/formulaResult.aspx?model=europelow&exam=&patient=370532", + "https://aa.net/2016/formulaResult.aspx?model=europelow&exam=&patient=370532" + ); + inputUrlToExpectedUrl.put( + "https://aa.net/login.aspx?ReturnUrl=%2fpercutaneous-interventions%2fhomepage.aspx", + "https://aa.net/login.aspx?ReturnUrl=%2fpercutaneous-interventions%2fhomepage.aspx" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/Education/Practice-Tools/EACVI-toolboxes/3D-Echo/Atlas-of-Three%E2%80%93dimensional-Echocardiography/Volumes-and-Ejection-Fraction", + "https://mydomain.com/Education/Practice-Tools/EACVI-toolboxes/3D-Echo/Atlas-of-Three%E2%80%93dimensional-Echocardiography/Volumes-and-Ejection-Fraction" + ); + inputUrlToExpectedUrl.put( + "https://my--domain.force.org/ESCMyPublications", + "https://my--domain.force.org/ESCMyPublications" + ); + runTestWithRemoveQ(inputUrlToExpectedUrl); + } + + + @Test + public void bulkKeepQTest() { + Map inputUrlToExpectedUrl = new HashMap(); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/search/?text=loupe+las33300", + "https://mydomain.com/fr/search/" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/elingue-ronde-haute-resistance/r-PR_G1408003386?q=elingue%7C%7Crelevance%7C%7CmanufacturerNameFacet%7C%7CGISS&text=elingue&classif=", + "https://mydomain.com/fr/elingue-ronde-haute-resistance/r-PR_G1408003386?q=elingue%7C%7Crelevance%7C%7CmanufacturerNameFacet%7C%7CGISS" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/protection-usage-court/c-40-10-21?q=%7C%7Crelevance&page=6", + "https://mydomain.com/fr/protection-usage-court/c-40-10-21?q=%7C%7Crelevance" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/ensemble-ebavurage-chanfreinage-en-coffret/p-G1111003763", + "https://mydomain.com/fr/ensemble-ebavurage-chanfreinage-en-coffret/p-G1111003763" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/bac-a-bec/r-PR_G1408000200?q=||||attribute157||Gris||attribute228||225x150x125%20mm||&classif=45&sortAttribute=&sortOrder=", + "https://mydomain.com/fr/bac-a-bec/r-PR_G1408000200?q=||||attribute157||Gris||attribute228||225x150x125%20mm||" + ); +// decoded -> https://mydomain.com/fr/bac-a-bec/r-PR_G1408000200?q=||||attribute157||Gris||attribute228||225x150x125 mm||&classif=45&sortAttribute=&sortOrder= + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/search/?text=Chaine+9.25+inox", + "https://mydomain.com/fr/search/" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/moraillon-porte-cadenas/p-G1164000013?t=cadenas+pompier", + "https://mydomain.com/fr/moraillon-porte-cadenas/p-G1164000013" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/facom/c-1111?q=%7C%7C%7C%7CcategoryLevel1%7C%7C45&page=5", + "https://mydomain.com/fr/facom/c-1111?q=%7C%7C%7C%7CcategoryLevel1%7C%7C45" + ); + inputUrlToExpectedUrl.put( + "https://www.btshop.nl/nl/veiligheidsschoen-sl-80-blue-esd-s2/r-PR_G1021004878?q=||relevance||attribute891||43&sortAttribute=attribute891,attribute109,attribute5041,attribute157&sortOrder=asc", + "https://www.btshop.nl/nl/veiligheidsschoen-sl-80-blue-esd-s2/r-PR_G1021004878?q=||relevance||attribute891||43" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/cart#", + "https://mydomain.com/fr/cart#" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/fr/search/?text=smc+aq+240f-06-00", + "https://mydomain.com/fr/search/" + ); + inputUrlToExpectedUrl.put( + "https://es.world.com/es/herramientas-de-mano/c-35-10?q=||relevance||manufacturerNameFacet||Roebuck||categoryLevel3%7C%7C35-10-20", + "https://es.world.com/es/herramientas-de-mano/c-35-10?q=||relevance||manufacturerNameFacet||Roebuck||categoryLevel3%7C%7C35-10-20" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/search/?text=piquage%20&q=piquage%20||relevance||manufacturerNameFacet||Parker%20Legris||attribute1875%7C%7CM5%20%27%27", + "https://mydomain.com/search/?q=piquage%20||relevance||manufacturerNameFacet||Parker%20Legris||attribute1875%7C%7CM5%20%27%27" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/MyESC/modules/congress/Abstract/AbstractContent.aspx?abstractID=9GrIawodOyWmVAXM%2b9Bq3eJFWUiAKhB2Toh3Oct0zIH%2fCbISTIls4l4Ox45ROTAWHCUzXjOonos%3d", + "https://mydomain.com/MyESC/modules/congress/Abstract/AbstractContent.aspx" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/Congress/ESC-CONGRESS-2019/Expert-Advice-Tips-and-tricks-in-imaging-your-patient-with-valvular-heart-d/189866-tips-and-tricks-for-imaging-in-aortic-stenosis#video", + "https://mydomain.com/Congress/ESC-CONGRESS-2019/Expert-Advice-Tips-and-tricks-in-imaging-your-patient-with-valvular-heart-d/189866-tips-and-tricks-for-imaging-in-aortic-stenosis#video" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/Councils/Council-on-Hypertension-(CHT)/News/position-statement-of-the-world-council-on-hypertension-on-ace-inhibitors-and-ang", + "https://mydomain.com/Councils/Council-on-Hypertension-(CHT)/News/position-statement-of-the-world-council-on-hypertension-on-ace-inhibitors-and-ang" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/Journals/E-Journal-of-Cardiology-Practice/Volume-14/Treatment-of-right-heart-failure-is-there-a-solution-to-the-problem", + "https://mydomain.com/Journals/E-Journal-of-Cardiology-Practice/Volume-14/Treatment-of-right-heart-failure-is-there-a-solution-to-the-problem" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/Congress/EuroCMR-2019/Special-Course-8-how-to-read-CMR-for-extra-cardiac-findings/187189-how-to-interpret-common-organ-specific-findings-in-the-lungs-skeletal-system-liver-kidneys-breast-case-based-interactive-discussion#slide", + "https://mydomain.com/Congress/EuroCMR-2019/Special-Course-8-how-to-read-CMR-for-extra-cardiac-findings/187189-how-to-interpret-common-organ-specific-findings-in-the-lungs-skeletal-system-liver-kidneys-breast-case-based-interactive-discussion#slide" + ); + inputUrlToExpectedUrl.put( + "https://my--domain.force.org/apex/ESCUserProfileInfo", + "https://my--domain.force.org/apex/ESCUserProfileInfo" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/Education/COVID-19-and-Cardiology/ESC-COVID-19-Guidance?hit=home&urlorig=/vgn-ext-templating/#tbl07", + "https://mydomain.com/Education/COVID-19-and-Cardiology/ESC-COVID-19-Guidance#tbl07" + ); + inputUrlToExpectedUrl.put( + "https://my--domain.force.org/ESCMyProfile?utm_medium=Email&utm_source=&utm_campaign=ESC+-+ESC+Congress+2020+-+registration+confirmation#", + "https://my--domain.force.org/ESCMyProfile#" + ); + inputUrlToExpectedUrl.put( + "http://spo.hurence.org/default.aspx?eevtid=1482&showResults=False&_ga=2.267591435.481963044.1578999296-479375258.1578999295", + "http://spo.hurence.org/default.aspx" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/Congresses-&-Events/Frontiers-in-Cardiovascular-Biomedicine/Registration?utm_medium=Email&utm_source=Councils&utm_campaign=Councils+-+FCVB+2020+-+Early+registration+fee+-++Last+call", + "https://mydomain.com/Congresses-&-Events/Frontiers-in-Cardiovascular-Biomedicine/Registration" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/MyESC/modules/congress/Abstract/AbstractAuthors.aspx?abstractID=9GrIawodOyXZLPpXgJHtvCxG5gTt5TznJt97rA1Jy%2bzH7V5eLZVqUnyoo903fiw9nf7mbxKuI14%3d", + "https://mydomain.com/MyESC/modules/congress/Abstract/AbstractAuthors.aspx" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/Congresses-&-Events/ESC-Congress/Scientific-sessions", + "https://mydomain.com/Congresses-&-Events/ESC-Congress/Scientific-sessions" + ); + inputUrlToExpectedUrl.put( + "https://idp.hurence.org/idp/login.jsp?loginFailed=true&actionUrl=%2Fidp%2FAuthn%2FESCUserPassword", + "https://idp.hurence.org/idp/login.jsp" + ); + inputUrlToExpectedUrl.put( + "https://aa.net/2016/formulaResult.aspx?model=europelow&exam=&patient=370532", + "https://aa.net/2016/formulaResult.aspx" + ); + inputUrlToExpectedUrl.put( + "https://aa.net/login.aspx?ReturnUrl=%2fpercutaneous-interventions%2fhomepage.aspx", + "https://aa.net/login.aspx" + ); + inputUrlToExpectedUrl.put( + "https://mydomain.com/Education/Practice-Tools/EACVI-toolboxes/3D-Echo/Atlas-of-Three%E2%80%93dimensional-Echocardiography/Volumes-and-Ejection-Fraction", + "https://mydomain.com/Education/Practice-Tools/EACVI-toolboxes/3D-Echo/Atlas-of-Three%E2%80%93dimensional-Echocardiography/Volumes-and-Ejection-Fraction" + ); + inputUrlToExpectedUrl.put( + "https://my--domain.force.org/ESCMyPublications", + "https://my--domain.force.org/ESCMyPublications" + ); + runTestWithKeepQ(inputUrlToExpectedUrl); + } + private void runTestWithRemoveAll(Map inputUrlToExpectedUrl) { + Map conf = new HashMap<>(); + conf.put(URLCleaner.REMOVE_ALL_PARAMS, "true"); + runTestWithConfig(inputUrlToExpectedUrl, conf); + } + + private void runTestWithRemoveQ(Map inputUrlToExpectedUrl) { + Map conf = new HashMap<>(); + conf.put(URLCleaner.REMOVE_PARAMS, "q"); + runTestWithConfig(inputUrlToExpectedUrl, conf); + } + + private void runTestWithKeepQ(Map inputUrlToExpectedUrl) { + Map conf = new HashMap<>(); + conf.put(URLCleaner.KEEP_PARAMS, "q"); + runTestWithConfig(inputUrlToExpectedUrl, conf); + } + + private void runTestWithConfig(Map inputUrlToExpectedUrl, Map conf) { + List fieldsNames = IntStream.range(1, inputUrlToExpectedUrl.size() + 1) + .mapToObj(i -> "url" + i) + .collect(Collectors.toList()); + List inputValues = new ArrayList<>(inputUrlToExpectedUrl.keySet()); + Record record = buildRecordFromMap(fieldsNames, inputValues); + final Record myCopyOfInitialRecord = new StandardRecord(record); + + TestRunner testRunner = TestRunners.newTestRunner(new URLCleaner()); + testRunner.setProperty(URLCleaner.URL_FIELDS, String.join(",", fieldsNames)); + testRunner.setProperty(URLCleaner.CONFLICT_RESOLUTION_POLICY, URLCleaner.OVERWRITE_EXISTING); + conf.entrySet().forEach(kv -> { + testRunner.setProperty(kv.getKey(), kv.getValue()); + }); + testRunner.assertValid(); + testRunner.enqueue(record); + testRunner.run(); + testRunner.assertAllInputRecordsProcessed(); + testRunner.assertOutputRecordsCount(1); + + MockRecord out = testRunner.getOutputRecords().get(0); + out.assertRecordSizeEquals(record.size()); + + fieldsNames.forEach(fieldName -> { + String inputValue = myCopyOfInitialRecord.getField(fieldName).asString(); + String expectedValue = inputUrlToExpectedUrl.get(inputValue); + out.assertFieldEquals(fieldName, expectedValue); + }); + } + + private Record buildRecordFromMap(List fieldsNames, List values) { + if (fieldsNames.size() != values.size()) throw new IllegalArgumentException("list should be of same size"); + final Record record = new StandardRecord(); + IntStream + .range(0, fieldsNames.size()) + .forEach(i -> { + record.setStringField(fieldsNames.get(i), values.get(i)); + }); + return record; + } +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webAnalytics/URLDecoderTest.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/URLDecoderTest.java similarity index 91% rename from logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webAnalytics/URLDecoderTest.java rename to logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/URLDecoderTest.java index b611c5f91..510c16ec3 100644 --- a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webAnalytics/URLDecoderTest.java +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/URLDecoderTest.java @@ -13,8 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.hurence.logisland.processor.webAnalytics; +package com.hurence.logisland.processor.webanalytics; +import com.hurence.logisland.processor.Processor; import com.hurence.logisland.record.FieldType; import com.hurence.logisland.record.Record; import com.hurence.logisland.record.StandardRecord; @@ -22,12 +23,12 @@ import com.hurence.logisland.util.runner.TestRunner; import com.hurence.logisland.util.runner.TestRunners; import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class URLDecoderTest { - private static final Logger logger = LoggerFactory.getLogger(URLDecoderTest.class); + public Processor getDecoder() { + return new URLDecoder(); + } private static final String urlVal1 = "https://www.test.com/de/search/?text=toto"; private static final String expectedDecodedUrlVal1 = urlVal1; @@ -79,7 +80,7 @@ public void testNoURLValueField() { Record record1 = getRecord1(); - TestRunner testRunner = TestRunners.newTestRunner(new URLDecoder()); + TestRunner testRunner = TestRunners.newTestRunner(getDecoder()); testRunner.setProperty("decode.fields", "string1"); testRunner.assertValid(); testRunner.enqueue(record1); @@ -98,7 +99,7 @@ public void testBasicURLValueField() { Record record1 = getRecord1(); - TestRunner testRunner = TestRunners.newTestRunner(new URLDecoder()); + TestRunner testRunner = TestRunners.newTestRunner(getDecoder()); testRunner.setProperty("decode.fields", "string1, url1"); testRunner.assertValid(); testRunner.enqueue(record1); @@ -117,7 +118,7 @@ public void testEncodedURLValueField() { Record record1 = getRecord1(); - TestRunner testRunner = TestRunners.newTestRunner(new URLDecoder()); + TestRunner testRunner = TestRunners.newTestRunner(getDecoder()); testRunner.setProperty("decode.fields", "url2,string1, url1"); testRunner.assertValid(); testRunner.enqueue(record1); @@ -137,7 +138,7 @@ public void testComplexEncodedURLValueField() { Record record1 = getRecord1(); - TestRunner testRunner = TestRunners.newTestRunner(new URLDecoder()); + TestRunner testRunner = TestRunners.newTestRunner(getDecoder()); testRunner.setProperty("decode.fields", "url2,string1, url1, url3"); testRunner.assertValid(); testRunner.enqueue(record1); @@ -158,7 +159,7 @@ public void testComplexEncodedValueField() { Record record1 = getRecord1(); - TestRunner testRunner = TestRunners.newTestRunner(new URLDecoder()); + TestRunner testRunner = TestRunners.newTestRunner(getDecoder()); testRunner.setProperty("decode.fields", "url2,string1, url1, val4"); testRunner.assertValid(); testRunner.enqueue(record1); @@ -179,7 +180,7 @@ public void testNoMatchingField() { Record record1 = getRecord1(); - TestRunner testRunner = TestRunners.newTestRunner(new URLDecoder()); + TestRunner testRunner = TestRunners.newTestRunner(getDecoder()); testRunner.setProperty("decode.fields", "nonExistingField"); testRunner.assertValid(); testRunner.enqueue(record1); @@ -200,7 +201,7 @@ public void testPercentButNotHexaField() { Record record2 = getRecord2(); - TestRunner testRunner = TestRunners.newTestRunner(new URLDecoder()); + TestRunner testRunner = TestRunners.newTestRunner(getDecoder()); testRunner.setProperty("decode.fields", "val5,val6"); testRunner.assertValid(); testRunner.enqueue(record2); @@ -213,5 +214,4 @@ public void testPercentButNotHexaField() { out.assertFieldEquals("val5", expectedDecodedVal5); out.assertFieldEquals("val6", expectedDecodedVal6); } - } diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/modele/EventTest.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/modele/EventTest.java new file mode 100644 index 000000000..fb45b7d2c --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/modele/EventTest.java @@ -0,0 +1,41 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.modele; + +import com.hurence.logisland.processor.webanalytics.util.WebEvent; +import com.hurence.logisland.util.runner.MockRecord; +import org.junit.Assert; +import org.junit.Test; + +public class EventTest { + + /** + * This test ensure Events does not store twice events with the same id. + * Also it tests than it stores events with same timestamps but different ids. + */ + @Test + public void testClone() { + Event event0 = new Event( + new WebEvent("0", "session","user", 0L, "url"), + TestMappings.eventsInternalFields + ); + MockRecord cloneEvent = new MockRecord(event0.cloneRecord()); + MockRecord eventRecord = new MockRecord(event0.record); + Assert.assertEquals(eventRecord, cloneEvent); + eventRecord.setBooleanField("newField", true); + Assert.assertNotEquals(eventRecord, cloneEvent); + } +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/modele/EventsTest.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/modele/EventsTest.java new file mode 100644 index 000000000..7b11305e6 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/modele/EventsTest.java @@ -0,0 +1,118 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.modele; + +import com.hurence.logisland.processor.webanalytics.util.WebEvent; +import org.junit.Assert; +import org.junit.Test; + +import java.util.Collections; +import java.util.Iterator; + +public class EventsTest { + + private String SESSIONS_ID = "sessions"; + private String USER_ID = "user"; + private String URL = "url"; + + /** + * This test ensure Events does not store twice events with the same id. + * Also it tests than it stores events with same timestamps but different ids. + */ + @Test + public void testEventsAdd() { + Events events = new Events(Collections.emptyList()); + Event event0 = new Event( + new WebEvent("0", SESSIONS_ID,USER_ID, 0L, URL), + TestMappings.eventsInternalFields + ); + Event event1 = new Event( + new WebEvent("1", SESSIONS_ID,USER_ID, 1L, URL), + TestMappings.eventsInternalFields + ); + Event eventSameIdThan0 = new Event( + new WebEvent("0", SESSIONS_ID,USER_ID, 2L, URL), + TestMappings.eventsInternalFields + ); + events.add(event0); + Assert.assertEquals(1, events.size()); + events.add(event1); + Assert.assertEquals(2, events.size()); + events.add(eventSameIdThan0); + Assert.assertEquals(2, events.size()); + Assert.assertTrue(events.contains(event0)); + Assert.assertTrue(events.contains(event1)); + Assert.assertTrue(events.contains(eventSameIdThan0));//use id to compare ! + Event eventSameTimestampButDifferentIdThan0 = new Event( + new WebEvent("2", SESSIONS_ID,USER_ID, 0L, URL), + TestMappings.eventsInternalFields + ); + events.add(eventSameTimestampButDifferentIdThan0); + Assert.assertEquals(3, events.size()); + Assert.assertTrue(events.contains(event0)); + Assert.assertTrue(events.contains(event1)); + Assert.assertTrue(events.contains(eventSameTimestampButDifferentIdThan0)); + } + + @Test + public void testEventsWithSameTimestampStoredOnlyOnceIfSameId() { + Events events = new Events(Collections.emptyList()); + Event event0 = new Event( + new WebEvent("0", SESSIONS_ID,USER_ID, 0L, URL), + TestMappings.eventsInternalFields + ); + Event event1 = new Event( + new WebEvent("1", SESSIONS_ID,USER_ID, 0L, URL), + TestMappings.eventsInternalFields + ); + Event event2 = new Event( + new WebEvent("3", SESSIONS_ID,USER_ID, 0L, URL), + TestMappings.eventsInternalFields + ); + Event event3 = new Event( + new WebEvent("3", SESSIONS_ID,USER_ID, 3L, URL), + TestMappings.eventsInternalFields + ); + events.add(event0); + Assert.assertEquals(1, events.size()); + events.add(event1); + Assert.assertEquals(2, events.size()); + events.add(event2); + Assert.assertEquals(3, events.size()); + events.add(event3); + Assert.assertEquals(3, events.size()); + Assert.assertTrue(events.contains(event0)); + Assert.assertTrue(events.contains(event1)); + Assert.assertTrue(events.contains(event2)); + Assert.assertTrue(events.contains(event3));//same id + Iterator it = events.iterator(); + Assert.assertEquals(event0, it.next()); + Assert.assertEquals(event1, it.next()); + Event lastEvent = it.next(); + Assert.assertEquals(event2, lastEvent); + Assert.assertNotEquals(event3, lastEvent); + } + +// milli tmestamp d/M/yyyy à H:mm:ss + + + + + + + + +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/modele/TestMappings.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/modele/TestMappings.java new file mode 100644 index 000000000..5829dc0e0 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/modele/TestMappings.java @@ -0,0 +1,62 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.modele; + +import com.hurence.logisland.processor.webanalytics.IncrementalWebSession; + +import static com.hurence.logisland.processor.webanalytics.IncrementalWebSession.DEFAULT_SOURCE_OF_TRAFFIC_PREFIX; + +public class TestMappings { + + + public static Event.InternalFields eventsInternalFields = new Event.InternalFields() + .setSessionIdField("sessionId") + .setTimestampField("h2kTimestamp") + .setVisitedPageField("VISITED_PAGE") + .setSourceOffTrafficCampaignField(DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_CAMPAIGN) + .setSourceOffTrafficContentField(DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_CONTENT) + .setSourceOffTrafficKeyWordField(DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_KEYWORD) + .setSourceOffTrafficMediumField(DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_MEDIUM) + .setSourceOffTrafficSourceField(DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_SOURCE) + .setNewSessionReasonField("reasonForNewSession") + .setUserIdField("Userid") + .setOriginalSessionIdField("originalSessionId") + .setTransactionIdField("transactionId") + .setTransactionIdsField("transactionIds"); + + + public static WebSession.InternalFields sessionInternalFields = new WebSession.InternalFields() + .setSessionIdField("sessionId") + .setTimestampField("h2kTimestamp") + .setSourceOffTrafficCampaignField(DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_CAMPAIGN) + .setSourceOffTrafficContentField(DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_CONTENT) + .setSourceOffTrafficKeyWordField(DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_KEYWORD) + .setSourceOffTrafficMediumField(DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_MEDIUM) + .setSourceOffTrafficSourceField(DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_SOURCE) + .setIsSessionActiveField("is_sessionActive") + .setSessionDurationField("sessionDuration") + .setSessionInactivityDurationField("sessionInactivityDuration") + .setEventsCounterField("eventsCounter") + .setFirstEventDateTimeField("firstEventDateTime") + .setFirstEventEpochSecondsField("firstEventEpochSeconds") + .setFirstVisitedPageField("firstVisitedPage") + .setLastEventDateTimeField("lastEventDateTime") + .setLastEventEpochSecondsField("lastEventEpochSeconds") + .setLastVisitedPageField("lastVisitedPage") + .setTransactionIdsField("transactionIds") + .setUserIdField("Userid") + .setIsSinglePageVisit("isSinglePageVisit"); +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webAnalytics/setSourceOfTrafficTest.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/setSourceOfTrafficTest.java similarity index 98% rename from logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webAnalytics/setSourceOfTrafficTest.java rename to logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/setSourceOfTrafficTest.java index 5aa176deb..0311cb623 100644 --- a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webAnalytics/setSourceOfTrafficTest.java +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/setSourceOfTrafficTest.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.hurence.logisland.processor.webAnalytics; +package com.hurence.logisland.processor.webanalytics; import com.hurence.logisland.component.InitializationException; import com.hurence.logisland.record.Field; @@ -27,7 +27,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic.ES_INDEX_FIELD; +import static com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic.ES_INDEX_FIELD; public class setSourceOfTrafficTest { @@ -310,7 +310,7 @@ public void testAdwordsReferer() throws InitializationException { private TestRunner getTestRunner() throws InitializationException { - final TestRunner runner = TestRunners.newTestRunner("com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic"); + final TestRunner runner = TestRunners.newTestRunner(new SetSourceOfTraffic()); // create the controller service and link it to the test processor final MockElasticsearchClientService elasticsearchClient = new MockElasticsearchClientService(); diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/util/DateParsingTests.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/util/DateParsingTests.java new file mode 100644 index 000000000..80792e1c9 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/util/DateParsingTests.java @@ -0,0 +1,111 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.util; + +import org.junit.Assert; +import org.junit.jupiter.api.Test; + +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Locale; + +public class DateParsingTests { + + // 1575158400000 1/12/2019 à 0:00:00 + // 1577836799000 31/12/2019 à 23:59:59 + // 1577836800000 1/1/2020 à 0:00:00 + // 1577840399000 1/1/2020 à 0:59:59 + // 1580515199000 31/1/2020 à 23:59:59 + // 1580515200000 1/2/2020 à 0:00:00 + // 1583020799000 29/2/2020 à 23:59:59 + // @Test + public void testDateFormatters() { + DateTimeFormatter eventFormatter = DateTimeFormatter.ofPattern("d/M/yyyy à H:mm:ss Z", Locale.ENGLISH); + SimpleDateFormat sessionsFormatter = new SimpleDateFormat("d/M/yyyy à H:mm:ss Z"); + // 1575158400000 1/12/2019 à 0:00:00 + Assert.assertEquals("1/12/2019 à 1:00:00 +0100", + eventFormatter.format(ZonedDateTime.ofInstant(Instant.ofEpochMilli(1575158400000L), ZoneId.systemDefault()))); + Assert.assertEquals("1/12/2019 à 1:00:00 +0100", + sessionsFormatter.format(1575158400000L)); + // 1577836799000 31/12/2019 à 23:59:59 + Assert.assertEquals("1/1/2020 à 0:59:59 +0100", + eventFormatter.format(ZonedDateTime.ofInstant(Instant.ofEpochMilli(1577836799000L), ZoneId.systemDefault()))); + Assert.assertEquals("1/1/2020 à 0:59:59 +0100", + sessionsFormatter.format(1577836799000L)); +// 1577836800000 1/1/2020 à 0:00:00 + Assert.assertEquals("1/1/2020 à 1:00:00 +0100", + eventFormatter.format(ZonedDateTime.ofInstant(Instant.ofEpochMilli(1577836800000L), ZoneId.systemDefault()))); + Assert.assertEquals("1/1/2020 à 1:00:00 +0100", + sessionsFormatter.format(1577836800000L)); +// 1577840399000 1/1/2020 à 0:59:59 + Assert.assertEquals("1/1/2020 à 1:59:59 +0100", + eventFormatter.format(ZonedDateTime.ofInstant(Instant.ofEpochMilli(1577840399000L), ZoneId.systemDefault()))); + Assert.assertEquals("1/1/2020 à 1:59:59 +0100", + sessionsFormatter.format(1577840399000L)); +// 1580515199000 31/1/2020 à 23:59:59 + Assert.assertEquals("1/2/2020 à 0:59:59 +0100", + eventFormatter.format(ZonedDateTime.ofInstant(Instant.ofEpochMilli(1580515199000L), ZoneId.systemDefault()))); + Assert.assertEquals("1/2/2020 à 0:59:59 +0100", + sessionsFormatter.format(1580515199000L)); +// 1580515200000 1/2/2020 à 0:00:00 + Assert.assertEquals("1/2/2020 à 1:00:00 +0100", + eventFormatter.format(ZonedDateTime.ofInstant(Instant.ofEpochMilli(1580515200000L), ZoneId.systemDefault()))); + Assert.assertEquals("1/2/2020 à 1:00:00 +0100", + sessionsFormatter.format(1580515200000L)); + // 1583020799000 29/2/2020 à 23:59:59 + Assert.assertEquals("1/3/2020 à 0:59:59 +0100", + eventFormatter.format(ZonedDateTime.ofInstant(Instant.ofEpochMilli(1583020799000L), ZoneId.systemDefault()))); + Assert.assertEquals("1/3/2020 à 0:59:59 +0100", + sessionsFormatter.format(1583020799000L)); + } + +// @Test +// public void testDateFormatters2() { +// DateTimeFormatter eventFormatter = DateTimeFormatter.ofPattern("d/M/yyyy à H:mm:ss Z", Locale.ENGLISH); +// SimpleDateFormat sessionsFormatter = new SimpleDateFormat("d/M/yyyy à H:mm:ss Z"); +// +// Assert.assertEquals(Locale.FRANCE ,Locale.getDefault()); +// Locale.setDefault(Locale.ENGLISH); +// Assert.assertEquals(Locale.ENGLISH ,Locale.getDefault()); +// +// Assert.assertEquals(ZoneId.of("UTC") ,ZoneId.systemDefault()); +// +// Assert.assertEquals("1/2/2020 à 1:00:00 +0100", +// eventFormatter.format(ZonedDateTime.ofInstant(Instant.ofEpochMilli(1580515200000L), ZoneId.systemDefault()))); +// Assert.assertEquals("1/2/2020 à 1:00:00 +0100", +// sessionsFormatter.format(1580515200000L)); +// +// Locale.setDefault(Locale.CANADA); +// Assert.assertEquals(ZoneId.of("UTC") ,ZoneId.systemDefault()); +// +// Assert.assertEquals("1/2/2020 à 1:00:00 +0100", +// eventFormatter.format(ZonedDateTime.ofInstant(Instant.ofEpochMilli(1580515200000L), ZoneId.systemDefault()))); +// Assert.assertEquals("1/2/2020 à 1:00:00 +0100", +// sessionsFormatter.format(1580515200000L)); +// +// Locale.setDefault(Locale.JAPAN); +// Assert.assertEquals(ZoneId.of("UTC") ,ZoneId.systemDefault()); +// +// Assert.assertEquals("1/2/2020 à 1:00:00 +0100", +// eventFormatter.format(ZonedDateTime.ofInstant(Instant.ofEpochMilli(1580515200000L), ZoneId.systemDefault()))); +// Assert.assertEquals("1/2/2020 à 1:00:00 +0100", +// sessionsFormatter.format(1580515200000L)); +// } + +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/util/ElasticsearchServiceUtil.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/util/ElasticsearchServiceUtil.java new file mode 100644 index 000000000..8269827b5 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/util/ElasticsearchServiceUtil.java @@ -0,0 +1,162 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.util; + +import com.hurence.logisland.processor.webanalytics.modele.TestMappings; +import com.hurence.logisland.processor.webanalytics.modele.WebSession; +import com.hurence.logisland.record.FieldType; +import com.hurence.logisland.record.Record; +import com.hurence.logisland.record.StandardRecord; +import com.hurence.logisland.service.elasticsearch.ElasticsearchClientService; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.builder.SearchSourceBuilder; + +import java.io.IOException; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; + +public class ElasticsearchServiceUtil { + + public static final String SESSION_SUFFIX_FORMATTER_STRING = "yyyy.MM.dd"; + public static final String EVENT_SUFFIX_FORMATTER_STRING = "yyyy.MM.dd"; + public static final DateTimeFormatter SESSION_SUFFIX_FORMATTER = DateTimeFormatter.ofPattern( + SESSION_SUFFIX_FORMATTER_STRING, + Locale.ENGLISH + ); + public static final String SESSION_INDEX_PREFIX = "openanalytics_websessions-"; + public static final DateTimeFormatter EVENT_SUFFIX_FORMATTER = DateTimeFormatter.ofPattern( + EVENT_SUFFIX_FORMATTER_STRING, + Locale.ENGLISH + ); + public static final String EVENT_INDEX_PREFIX = "openanalytics_webevents."; + +// public static void injectSessionsThenRefresh(ElasticsearchClientService esClientService, +// List sessions) { +// injectSessionsWithoutRefreshing(esClientService, sessions); +// String[] indicesToWaitFor = sessions.stream() +// .map(session -> session.getField(defaultOutputFieldNameForEsIndex).asString()) +// .toArray(String[]::new); +// esClientService.waitUntilCollectionIsReadyAndRefreshIfAnyPendingTasks(indicesToWaitFor, 100000L); +// } +// +// public static void injectSessionsWithoutRefreshing(ElasticsearchClientService esClientService, +// List sessions) { +// final String sessionType = "sessions"; +// sessions.forEach(session -> { +// +// String sessionIndex = toSessionIndexName(session.getField(TestMappings.sessionInternalFields.getTimestampField()).asLong()); +// esClientService.bulkPut( sessionIndex + "," + sessionType, session); +// }); +// esClientService.bulkFlush(); +// } + + public static SearchResponse getAllSessionsRaw(ElasticsearchClientService esClientService, + RestHighLevelClient esclient) throws IOException { + esClientService.waitUntilCollectionIsReadyAndRefreshIfAnyPendingTasks(SESSION_INDEX_PREFIX + "*", 100000L); + SearchRequest searchRequest = new SearchRequest(SESSION_INDEX_PREFIX + "*"); + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + searchSourceBuilder.query(QueryBuilders.matchAllQuery()); + searchRequest.source(searchSourceBuilder); + return esclient.search(searchRequest, RequestOptions.DEFAULT); + } + + public static List getAllSessions(ElasticsearchClientService esClientService, + RestHighLevelClient esclient) throws IOException { + SearchResponse esRsp = getAllSessionsRaw(esClientService, esclient); + return Arrays.stream(esRsp.getHits().getHits()) + .map(hit -> { + Record record = new StandardRecord(); + hit.getSourceAsMap().forEach((name, value) -> { + record.setField(name, FieldType.STRING, value); + }); + return new WebSession(record, TestMappings.sessionInternalFields); + }) + .collect(Collectors.toList()); + } + + public static Record getSessionFromEs(ElasticsearchClientService esClientService, + RestHighLevelClient esclient, String sessionId, + WebSession.InternalFields fields) throws IOException { + esClientService.waitUntilCollectionIsReadyAndRefreshIfAnyPendingTasks(SESSION_INDEX_PREFIX + "*", 100000L); + SearchRequest searchRequest = new SearchRequest(SESSION_INDEX_PREFIX + "*"); + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + searchSourceBuilder.query(QueryBuilders.idsQuery().addIds(sessionId)); + searchRequest.source(searchSourceBuilder); + SearchResponse rsp = esclient.search(searchRequest, RequestOptions.DEFAULT); + assert (rsp.getHits().getTotalHits().value <= 1); + if (rsp.getHits().getTotalHits().value != 1) { + try { + Thread.sleep(2000L); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return getSessionFromEs(esClientService, esclient, sessionId, fields); + } + return WebSession.fromMap(rsp.getHits().getHits()[0].getSourceAsMap(), fields, "test").getRecord(); + } + + /** + * Returns the name of the event index corresponding to the specified date such as + * ${event-index-name}.${event-suffix}. + * Eg. openanalytics-webevents.2018.01.31 + * + * @param date the ZonedDateTime of the event to store in the index. + * @return the name of the event index corresponding to the specified date. + */ + public static String toEventIndexName(final ZonedDateTime date) { + return Utils.buildIndexName(EVENT_INDEX_PREFIX, EVENT_SUFFIX_FORMATTER, date, date.getZone()); + } + + /** + * Returns the name of the event index corresponding to the specified date such as + * ${session-index-name}${session-suffix}. + * Eg. openanalytics-webevents.2018.01.31 + * + * @param date the ZonedDateTime timestamp of the first event of the session. + * @return the name of the session index corresponding to the specified timestamp. + */ + public static String toSessionIndexName(final ZonedDateTime date) { + return Utils.buildIndexName(SESSION_INDEX_PREFIX, SESSION_SUFFIX_FORMATTER, date, date.getZone()); + } + + public static Map getEventFromEs(ElasticsearchClientService esClientService, + RestHighLevelClient esclient, + WebEvent event) throws IOException { + String indexName = toEventIndexName(event.getZonedDateTime()); + esClientService.waitUntilCollectionIsReadyAndRefreshIfAnyPendingTasks(indexName, 100000L); + SearchRequest searchRequest = new SearchRequest(indexName); + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + searchSourceBuilder.query(QueryBuilders.idsQuery().addIds(event.getId())); + searchRequest.source(searchSourceBuilder); + SearchResponse rsp = esclient.search(searchRequest, RequestOptions.DEFAULT); + assert (rsp.getHits().getTotalHits().value <= 1); + if (rsp.getHits().getTotalHits().value != 1) { + try { + Thread.sleep(2000L); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return getEventFromEs(esClientService, esclient, event); + } + return rsp.getHits().getHits()[0].getSourceAsMap(); + } +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/util/SessionCalculatorTest.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/util/SessionCalculatorTest.java new file mode 100644 index 000000000..d68decf5a --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/util/SessionCalculatorTest.java @@ -0,0 +1,190 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.util; + +import com.hurence.logisland.processor.webanalytics.modele.*; +import com.hurence.logisland.util.runner.MockRecord; + +import org.junit.jupiter.api.Test; + +import java.util.*; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class SessionCalculatorTest { + + private String SESSIONS_ID = "sessions"; + private String USER_ID = "user"; + private String URL = "url"; + + @Test + public void testDateFormatters() { + SessionsCalculator calculator = new SessionsCalculator( + Arrays.asList( + // Day overlap + (session, event) -> + { + return new InvalidSessionCheckResult("not valid"); + } + ), + 1800, + TestMappings.sessionInternalFields, + TestMappings.eventsInternalFields, + Collections.emptyList(), + SESSIONS_ID + ); + Events events = new Events(Collections.emptyList()); + Event event0 = new Event( + new WebEvent("0", SESSIONS_ID, USER_ID, 0L, URL), + TestMappings.eventsInternalFields + ); + Event event1 = new Event( + new WebEvent("1", SESSIONS_ID, USER_ID, 1L, URL), + TestMappings.eventsInternalFields + ); + Event event2 = new Event( + new WebEvent("2", SESSIONS_ID, USER_ID, 2L, URL), + TestMappings.eventsInternalFields + ); + events.add(event0); + events.add(event1); + events.add(event2); + calculator.processEvents(events, null); + List sessions = new ArrayList<>(calculator.getCalculatedSessions()); + assertEquals(3, sessions.size()); + new MockRecord(event0.getRecord()) + .assertFieldNotExists(TestMappings.eventsInternalFields.getOriginalSessionIdField()) + .assertFieldEquals(TestMappings.eventsInternalFields.getSessionIdField(), SESSIONS_ID); + new MockRecord(event1.getRecord()) + .assertFieldEquals(TestMappings.eventsInternalFields.getOriginalSessionIdField(), SESSIONS_ID) + .assertFieldEquals(TestMappings.eventsInternalFields.getSessionIdField(), SESSIONS_ID + "#2"); + new MockRecord(event2.getRecord()) + .assertFieldEquals(TestMappings.eventsInternalFields.getOriginalSessionIdField(), SESSIONS_ID) + .assertFieldEquals(TestMappings.eventsInternalFields.getSessionIdField(), SESSIONS_ID + "#3"); + + } + + + @Test + public void testWithBadSessionBinding() { + SessionsCalculator calculator = new SessionsCalculator( + Arrays.asList( + // Day overlap + (session, event) -> + { + return new InvalidSessionCheckResult("not valid"); + } + ), + 1800, + TestMappings.sessionInternalFields, + TestMappings.eventsInternalFields, + Collections.emptyList(), + SESSIONS_ID + ); + Events events = new Events(Collections.emptyList()); + Event event0 = new Event( + new WebEvent("0", SESSIONS_ID, USER_ID, 0L, URL), + TestMappings.eventsInternalFields + ); + Event event1 = new Event( + new WebEvent("1", SESSIONS_ID, USER_ID, 1L, URL), + TestMappings.eventsInternalFields + ); + Event event2 = new Event( + new WebEvent("2", SESSIONS_ID + "#2", USER_ID, 2L, URL), + TestMappings.eventsInternalFields + ); + events.add(event0); + events.add(event1); + events.add(event2); + calculator.processEvents(events, null); + List sessions = new ArrayList<>(calculator.getCalculatedSessions()); + assertEquals(3, sessions.size()); + new MockRecord(event0.getRecord()) + .assertFieldNotExists(TestMappings.eventsInternalFields.getOriginalSessionIdField()) + .assertFieldEquals(TestMappings.eventsInternalFields.getSessionIdField(), SESSIONS_ID); + new MockRecord(event1.getRecord()) + .assertFieldEquals(TestMappings.eventsInternalFields.getOriginalSessionIdField(), SESSIONS_ID) + .assertFieldEquals(TestMappings.eventsInternalFields.getSessionIdField(), SESSIONS_ID + "#2"); + new MockRecord(event2.getRecord()) + .assertFieldEquals(TestMappings.eventsInternalFields.getOriginalSessionIdField(), SESSIONS_ID) + .assertFieldEquals(TestMappings.eventsInternalFields.getSessionIdField(), SESSIONS_ID + "#3"); + + } + + @Test + public void testComputeIsSinglePageVisit() { + SessionsCalculator calculator = new SessionsCalculator(Collections.emptyList(), + 1800, + TestMappings.sessionInternalFields, + TestMappings.eventsInternalFields, + Collections.emptyList(), + SESSIONS_ID + ); + Events events = new Events(Collections.emptyList()); + Event event0 = new Event( + new WebEvent("0", SESSIONS_ID, USER_ID, 0L, URL), + TestMappings.eventsInternalFields + ); + events.add(event0); + calculator.processEventsKnowingLastSession(events, null); + List sessions = new ArrayList<>(calculator.getCalculatedSessions()); + assertEquals(1, sessions.size()); + new MockRecord(sessions.get(sessions.size() - 1).getRecord()) + .assertFieldExists(TestMappings.sessionInternalFields.getIsSinglePageVisit()) + .assertFieldEquals(TestMappings.sessionInternalFields.getIsSinglePageVisit(), "true"); + events.clear(); + + Event event1 = new Event( + new WebEvent("1", SESSIONS_ID, USER_ID, 1L, URL), + TestMappings.eventsInternalFields + ); + events.add(event1); + calculator.processEventsKnowingLastSession(events, sessions.get(sessions.size() - 1)); + sessions = new ArrayList<>(calculator.getCalculatedSessions()); + assertEquals(2, sessions.size()); + new MockRecord(sessions.get(sessions.size() - 1).getRecord()) + .assertFieldExists(TestMappings.sessionInternalFields.getIsSinglePageVisit()) + .assertFieldEquals(TestMappings.sessionInternalFields.getIsSinglePageVisit(), "true"); + events.clear(); + + Event event2 = new Event( + new WebEvent("2", SESSIONS_ID, USER_ID, 2L, URL + "/subpage"), + TestMappings.eventsInternalFields + ); + events.add(event2); + calculator.processEventsKnowingLastSession(events, sessions.get(sessions.size() - 1)); + sessions = new ArrayList<>(calculator.getCalculatedSessions()); + assertEquals(3, sessions.size()); + new MockRecord(sessions.get(sessions.size() - 1).getRecord()) + .assertFieldExists(TestMappings.sessionInternalFields.getIsSinglePageVisit()) + .assertFieldEquals(TestMappings.sessionInternalFields.getIsSinglePageVisit(), "false"); + events.clear(); + + Event event4 = new Event( + new WebEvent("4", SESSIONS_ID, USER_ID, 3L, URL), + TestMappings.eventsInternalFields + ); + events.add(event4); + calculator.processEventsKnowingLastSession(events, sessions.get(sessions.size() - 1)); + sessions = new ArrayList<>(calculator.getCalculatedSessions()); + assertEquals(4, sessions.size()); + new MockRecord(sessions.get(sessions.size() - 1).getRecord()) + .assertFieldExists(TestMappings.sessionInternalFields.getIsSinglePageVisit()) + .assertFieldEquals(TestMappings.sessionInternalFields.getIsSinglePageVisit(), "false"); + events.clear(); + } +} diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/util/UtilsTest.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/util/UtilsTest.java new file mode 100644 index 000000000..967519a75 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/util/UtilsTest.java @@ -0,0 +1,103 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.util; + + +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.fail; + +public class UtilsTest { + + public static void assertMapsAreEqualsIgnoringSomeKeys(Map expectedMap, Map actualMap, String... keysToIgnore) { + final Map wrongValuesMessages = getDiffInMaps(expectedMap, actualMap); + for (String key : keysToIgnore) { + wrongValuesMessages.remove(key); + } + assertMapEquals(expectedMap, actualMap, wrongValuesMessages); + } + + private static void assertMapEquals(Map expectedMap, Map actualMap, Map wrongValuesMessages) { + String error = ""; + if (expectedMap.size() != actualMap.size()) { + error = "expected map size to be " + expectedMap.size() + " but was " + actualMap.size(); + if (expectedMap.size() > actualMap.size()) { + for (String key : expectedMap.keySet()) { + if (!actualMap.containsKey(key)) { + error += "\n key " + key + " was expected"; + } + } + } + } + String mapAsString = wrongValuesMessages.keySet().stream() + .map(key -> key + " : " + wrongValuesMessages.get(key)) + .collect(Collectors.joining(",\n", "{", "}")); + if (!error.isEmpty() || !wrongValuesMessages.isEmpty()) { + String msg = error + "\n" + mapAsString; + fail(msg); + } + return; + } + + public static void assertMapsAreEquals(Map expectedMap, Map actualMap) { + final Map wrongValuesMessages = getDiffInMaps(expectedMap, actualMap); + assertMapEquals(expectedMap, actualMap, wrongValuesMessages); + } + + + private static Map getDiffInMaps(Map expectedMap, Map actualMap) { + final Map wrongValuesMessages = new HashMap<>(); + actualMap.forEach(handleEntry(expectedMap, wrongValuesMessages)); + return wrongValuesMessages; + } + + @NotNull + private static BiConsumer handleEntry(Map expectedMap, Map wrongValuesMessages) { + return (key, value) -> handleEntry(key, value, expectedMap, wrongValuesMessages); + } + + private static void handleEntry(String key, Object value, Map expectedMap, Map wrongValuesMessages) { + if (!expectedMap.containsKey(key)) { + wrongValuesMessages.put(key, "Did not expect this key to exist"); + return; + } + Object expectedValue = expectedMap.get(key); + if (expectedValue == null && value != null) { + wrongValuesMessages.put(key, "contain '" + value + "' but null was expected"); + return; + } + if (expectedValue == null) {//both null + return; + } + if (expectedValue.getClass().isArray()) { + if (!value.getClass().isArray()) { + wrongValuesMessages.put(key, "contain '" + value + "' which is not an array but was expected an array"); + return; + } + if (Arrays.equals((Object[]) expectedValue, (Object[]) value)) return; + wrongValuesMessages.put(key, "contain '" + value + "' but " + expectedValue + " was expected"); + } + if (expectedValue.equals(value)) return; + wrongValuesMessages.put(key, "contain '" + value + "' but " + expectedValue + " was expected"); + } + +} + diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/util/WebEvent.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/util/WebEvent.java new file mode 100644 index 000000000..b05b648fa --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/util/WebEvent.java @@ -0,0 +1,66 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.util; + +import com.hurence.logisland.processor.webanalytics.modele.TestMappings; +import com.hurence.logisland.record.FieldType; +import com.hurence.logisland.record.StandardRecord; + +import java.time.Instant; +import java.time.ZoneId; +import java.time.ZonedDateTime; + +/** + * The class represents a web event. + */ +public class WebEvent extends StandardRecord +{ + public static final String CURRENT_CART = "currentCart"; + /** + * Creates a new instance of this class with the provided parameter. + * + * @param id the event identifier. + * @param sessionId the session identifier. + * @param userId the user identifier. + * @param timestamp the h2kTimestamp. + * @param url the visited address. + */ + public WebEvent(final String id, final String sessionId, final String userId, final Long timestamp, + final String url) + { + this.setField(TestMappings.eventsInternalFields.getSessionIdField(), FieldType.STRING, sessionId) + .setField(TestMappings.eventsInternalFields.getUserIdField(), FieldType.STRING, userId) + .setField(TestMappings.eventsInternalFields.getTimestampField(), FieldType.STRING, timestamp) + .setField(TestMappings.eventsInternalFields.getVisitedPageField(), FieldType.STRING, url) + .setField(CURRENT_CART, FieldType.ARRAY, null) + .setField("record_id", FieldType.STRING, id); + } + + public WebEvent add(final String name, final String value) + { + this.setStringField(name, value); + return this; + } + + ZonedDateTime getZonedDateTime() { + long epochMilli = this.getField(TestMappings.eventsInternalFields.getTimestampField()).asLong(); + return ZonedDateTime.ofInstant(Instant.ofEpochMilli(epochMilli), ZoneId.systemDefault()); + } + + long getTimestamp() { + return this.getField(TestMappings.eventsInternalFields.getTimestampField()).asLong(); + } +} \ No newline at end of file diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/util/WebSessionChecker.java b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/util/WebSessionChecker.java new file mode 100644 index 000000000..c1ad2076d --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/java/com/hurence/logisland/processor/webanalytics/util/WebSessionChecker.java @@ -0,0 +1,83 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.processor.webanalytics.util; + +import com.hurence.logisland.processor.webanalytics.modele.WebSession; +import com.hurence.logisland.record.Field; +import com.hurence.logisland.record.Record; +import org.junit.Assert; + +import java.util.Date; + +import static com.hurence.logisland.processor.webanalytics.modele.TestMappings.sessionInternalFields; + +/** + * A class for testing web session. + */ +public class WebSessionChecker +{ + private static final String CURRENT_CART = "currentCart"; + private final Record record; + + /** + * Creates a new instance of this class with the provided parameter. + * + * @param record the fields to check. + */ + public WebSessionChecker(final Record record) + { + this.record = record; + } + + public WebSessionChecker(final WebSession session) { + this(session.getRecord()); + } + + public WebSessionChecker sessionId(final Object value) { return check(sessionInternalFields.getSessionIdField(), value); } + public WebSessionChecker Userid(final Object value) { return check(sessionInternalFields.getUserIdField(), value); } + public WebSessionChecker record_type(final Object value) { return check("record_type", value); } + public WebSessionChecker record_id(final Object value) { return check("record_id", value); } + public WebSessionChecker currentCart(final Object value) { return check(CURRENT_CART, value); } + public WebSessionChecker firstEventDateTime(final long value) { return check(sessionInternalFields.getFirstEventDateTimeField(), new Date(value).toString()); } + public WebSessionChecker firstEventEpochSeconds(final long value) { return check(sessionInternalFields.getFirstEventEpochSecondsField(), value); } + public WebSessionChecker h2kTimestamp(final long value) { return check(sessionInternalFields.getTimestampField(), value); } + public WebSessionChecker firstVisitedPage(final Object value) { return check(sessionInternalFields.getFirstVisitedPageField(), value); } + public WebSessionChecker eventsCounter(final long value) { return check(sessionInternalFields.getEventsCounterField(), value); } + public WebSessionChecker lastEventDateTime(final long value) { return check(sessionInternalFields.getLastEventDateTimeField(), new Date(value).toString()); } + public WebSessionChecker lastEventEpochSeconds(final long value) { return check(sessionInternalFields.getLastEventEpochSecondsField(), value); } + public WebSessionChecker lastVisitedPage(final Object value) { return check(sessionInternalFields.getLastVisitedPageField(), value); } + public WebSessionChecker sessionDuration(final Long value) { return check(sessionInternalFields.getSessionDurationField(), value); } + public WebSessionChecker is_sessionActive(final Object value) { return check(sessionInternalFields.getIsSessionActiveField(), value); } + public WebSessionChecker sessionInactivityDuration(final Object value) { return check(sessionInternalFields.getSessionInactivityDurationField(), value); } + public WebSessionChecker record_time(final Object value) { return check("record_time", value); } + + /** + * Checks the value associated to the specified name against the provided expected value. + * An exception is thrown if the check fails. + * + * @param name the name of the field to check. + * @param expectedValue the expected value. + * + * @return this object for convenience. + */ + public WebSessionChecker check(final String name, final Object expectedValue) + { + final Field field = this.record.getField(name); + Assert.assertEquals(expectedValue, + field!=null?field.getRawValue():null); + return this; + } +} \ No newline at end of file diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/resources/docker-compose-es-test.yml b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/resources/docker-compose-es-test.yml new file mode 100644 index 000000000..89addb5db --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/resources/docker-compose-es-test.yml @@ -0,0 +1,19 @@ +version: "2" + +services: + + elasticsearch: + image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0 + environment: + - node.name=elasticsearch + - discovery.type=single-node + - bootstrap.memory_lock=true + - "ES_JAVA_OPTS=-Xms512m -Xmx512m" + ports: + - "9200:9200" + - "9300:9300" + networks: + - es_net + +networks: + es_net: diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/resources/log4j.properties b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/resources/log4j.properties deleted file mode 100644 index 64b17240b..000000000 --- a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/resources/log4j.properties +++ /dev/null @@ -1,36 +0,0 @@ -# -# 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. -# - -# Set everything to be logged to the console -log4j.rootCategory=WARN, console -log4j.appender.console=org.apache.log4j.ConsoleAppender -log4j.appender.console.target=System.err -log4j.appender.console.layout=org.apache.log4j.PatternLayout -log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n - -#org.apache.zookeeper.server.ZooKeeperServer -log4j.logger.org.apache.spark=WARN -log4j.logger.org.apache.spark.scheduler=WARN -log4j.logger.org.apache.spark.history=WARN -log4j.logger.org.spark-project.jetty=WARN -log4j.logger.io.netty=WARN -log4j.logger.org.apache.zookeeper=WARN -log4j.logger.org.apache.hadoop.ipc.Client=WARN -log4j.logger.org.apache.hadoop=WARN -log4j.logger.org.apache.hadoop.ipc.ProtobufRpcEngine=WARN -log4j.logger.parquet.hadoop=WARN -log4j.logger.com.hurence=DEBUG \ No newline at end of file diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/resources/rawStringMappingFile.json b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/resources/rawStringMappingFile.json new file mode 100644 index 000000000..09b51c71b --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/resources/rawStringMappingFile.json @@ -0,0 +1,21 @@ +{ + "dynamic_templates": [ + { + "string_fields": { + "mapping": { + "index": "true", + "type": "text", + "fields": { + "raw": { + "ignore_above": 256, + "index": "true", + "type": "keyword", + "doc_values": true + } + } + }, + "match_mapping_type": "string" + } + } + ] +} \ No newline at end of file diff --git a/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/resources/simplelogger.properties b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/resources/simplelogger.properties new file mode 100644 index 000000000..95f327db5 --- /dev/null +++ b/logisland-components/logisland-processors/logisland-processor-web-analytics/src/test/resources/simplelogger.properties @@ -0,0 +1,8 @@ +org.slf4j.simpleLogger.console = System.out + +org.slf4j.appender.console=org.apache.log4j.ConsoleAppender +org.slf4j.appender.console.layout=org.apache.log4j.PatternLayout +org.slf4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n + +org.slf4j.simpleLogger.defaultLogLevel = WARN +org.slf4j.simpleLogger.log.com.hurence = trace \ No newline at end of file diff --git a/logisland-components/logisland-processors/logisland-processor-xml/pom.xml b/logisland-components/logisland-processors/logisland-processor-xml/pom.xml index b1a6a8c39..60fc58fc1 100644 --- a/logisland-components/logisland-processors/logisland-processor-xml/pom.xml +++ b/logisland-components/logisland-processors/logisland-processor-xml/pom.xml @@ -23,7 +23,7 @@ com.hurence.logisland logisland-processors - 1.3.0 + 1.4.0 logisland-processor-xml @@ -82,20 +82,10 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - diff --git a/logisland-components/logisland-processors/pom.xml b/logisland-components/logisland-processors/pom.xml index 1e20952e7..72108ce77 100644 --- a/logisland-components/logisland-processors/pom.xml +++ b/logisland-components/logisland-processors/pom.xml @@ -22,7 +22,7 @@ com.hurence.logisland logisland-components - 1.3.0 + 1.4.0 Logisland processors package @@ -32,7 +32,6 @@ logisland-processor-common logisland-processor-elasticsearch - logisland-processor-hbase logisland-processor-useragent logisland-processor-scripting logisland-processor-enrichment @@ -63,4 +62,32 @@ + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackaged + + package + + + + + com.hurence.logisland + logisland-maven-plugin + + + package + + + + + + diff --git a/logisland-components/logisland-services/logisland-service-cassandra/logisland-service-cassandra-api/pom.xml b/logisland-components/logisland-services/logisland-service-cassandra/logisland-service-cassandra-api/pom.xml index 08b58e806..2d758bbdb 100644 --- a/logisland-components/logisland-services/logisland-service-cassandra/logisland-service-cassandra-api/pom.xml +++ b/logisland-components/logisland-services/logisland-service-cassandra/logisland-service-cassandra-api/pom.xml @@ -7,7 +7,7 @@ com.hurence.logisland logisland-service-cassandra - 1.3.0 + 1.4.0 logisland-service-cassandra-api diff --git a/logisland-components/logisland-services/logisland-service-cassandra/logisland-service-cassandra-client/pom.xml b/logisland-components/logisland-services/logisland-service-cassandra/logisland-service-cassandra-client/pom.xml index b0eccc787..ea6400529 100644 --- a/logisland-components/logisland-services/logisland-service-cassandra/logisland-service-cassandra-client/pom.xml +++ b/logisland-components/logisland-services/logisland-service-cassandra/logisland-service-cassandra-client/pom.xml @@ -7,7 +7,7 @@ com.hurence.logisland logisland-service-cassandra - 1.3.0 + 1.4.0 logisland-service-cassandra-client @@ -81,20 +81,10 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - -
diff --git a/logisland-components/logisland-services/logisland-service-cassandra/logisland-service-cassandra-client/src/main/java/com/hurence/logisland/service/cassandra/CassandraControllerService.java b/logisland-components/logisland-services/logisland-service-cassandra/logisland-service-cassandra-client/src/main/java/com/hurence/logisland/service/cassandra/CassandraControllerService.java index 304f631ca..2c5f3364a 100644 --- a/logisland-components/logisland-services/logisland-service-cassandra/logisland-service-cassandra-client/src/main/java/com/hurence/logisland/service/cassandra/CassandraControllerService.java +++ b/logisland-components/logisland-services/logisland-service-cassandra/logisland-service-cassandra-client/src/main/java/com/hurence/logisland/service/cassandra/CassandraControllerService.java @@ -30,8 +30,8 @@ import com.hurence.logisland.processor.ProcessError; import com.hurence.logisland.record.Record; import com.hurence.logisland.service.datastore.DatastoreClientServiceException; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; +import com.hurence.logisland.service.datastore.model.MultiGetQueryRecord; +import com.hurence.logisland.service.datastore.model.MultiGetResponseRecord; import com.hurence.logisland.validator.StandardValidators; import org.apache.commons.lang3.NotImplementedException; @@ -273,6 +273,11 @@ private void stopUpdater() updater = null; } + @Override + public void waitUntilCollectionReady(String name, long timeoutMilli) throws DatastoreClientServiceException { + throw new NotImplementedException("Not yet supported for Cassandra"); + } + @Override public void createCollection(String name, int partitionsCount, int replicationFactor) throws DatastoreClientServiceException { throw new NotImplementedException("Not yet supported for Cassandra"); diff --git a/logisland-components/logisland-services/logisland-service-cassandra/pom.xml b/logisland-components/logisland-services/logisland-service-cassandra/pom.xml index ba5caebe7..c4c9dd532 100644 --- a/logisland-components/logisland-services/logisland-service-cassandra/pom.xml +++ b/logisland-components/logisland-services/logisland-service-cassandra/pom.xml @@ -20,7 +20,7 @@ com.hurence.logisland logisland-services - 1.3.0 + 1.4.0 logisland-service-cassandra diff --git a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch-api/pom.xml b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch-api/pom.xml index 8694c6c16..d27a7842a 100644 --- a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch-api/pom.xml +++ b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch-api/pom.xml @@ -21,7 +21,7 @@ com.hurence.logisland logisland-service-elasticsearch - 1.3.0 + 1.4.0 logisland-service-elasticsearch-api @@ -37,6 +37,4 @@ provided
- - diff --git a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch-api/src/main/java/com/hurence/logisland/service/elasticsearch/ElasticsearchClientService.java b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch-api/src/main/java/com/hurence/logisland/service/elasticsearch/ElasticsearchClientService.java index 9a52cc701..747d9dd65 100644 --- a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch-api/src/main/java/com/hurence/logisland/service/elasticsearch/ElasticsearchClientService.java +++ b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch-api/src/main/java/com/hurence/logisland/service/elasticsearch/ElasticsearchClientService.java @@ -15,22 +15,21 @@ */ package com.hurence.logisland.service.elasticsearch; - import com.hurence.logisland.annotation.documentation.CapabilityDescription; import com.hurence.logisland.annotation.documentation.Tags; import com.hurence.logisland.component.AllowableValue; import com.hurence.logisland.component.PropertyDescriptor; -import com.hurence.logisland.service.datastore.DatastoreClientService; +import com.hurence.logisland.service.datastore.*; import com.hurence.logisland.record.Record; +import com.hurence.logisland.service.datastore.model.MultiQueryRecord; +import com.hurence.logisland.service.datastore.model.MultiQueryResponseRecord; +import com.hurence.logisland.service.datastore.model.QueryRecord; +import com.hurence.logisland.service.datastore.model.QueryResponseRecord; import com.hurence.logisland.validator.StandardValidators; import com.hurence.logisland.validator.ValidationResult; import com.hurence.logisland.validator.Validator; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Optional; - +import java.util.*; @Tags({"elasticsearch", "client"}) @CapabilityDescription("A controller service for accessing an elasticsearch client.") @@ -154,6 +153,16 @@ public ValidationResult validate(final String subject, final String input) { .addValidator(StandardValidators.FILE_EXISTS_VALIDATOR) .build(); + PropertyDescriptor ENABLE_SSL = new PropertyDescriptor.Builder() + .name("enable.ssl") + .description("Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used" + + " with opendistro. Defaults to false. Note that the current implementation does try to validate" + + " the server certificate.") + .required(false) + .addValidator(StandardValidators.BOOLEAN_VALIDATOR) + .defaultValue("false") + .build(); + PropertyDescriptor USERNAME = new PropertyDescriptor.Builder() .name("username") .description("Username to access the Elasticsearch cluster") @@ -195,6 +204,12 @@ public ValidationResult validate(final String subject, final String input) { .addValidator(StandardValidators.CHARACTER_SET_VALIDATOR) .build(); + PropertyDescriptor GEOLOCATION_FIELD_LABEL = new PropertyDescriptor.Builder() + .name("geolocation.output.field.name") + .description("Label used to name the output record field for geolocation properties") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build(); /** * Put a given document in elasticsearch bulk processor. @@ -214,6 +229,39 @@ public ValidationResult validate(final String subject, final String input) { */ void bulkPut(String docIndex, String docType, Map document, Optional OptionalId); + /** + * Delete a given document in elasticsearch bulk processor. + * + * @param docIndex index name + * @param docType type name + * @param id document to delete + */ + void bulkDelete(String docIndex, String docType, String id); + + void deleteByQuery(QueryRecord queryRecord) throws DatastoreClientServiceException; + + /** + * Get a list of documents based on a query. + * + * @param queryRecord query to do + * @return the list of fetched documents + */ + QueryResponseRecord queryGet(QueryRecord queryRecord) throws DatastoreClientServiceException; + + MultiQueryResponseRecord multiQueryGet(MultiQueryRecord queryRecords) throws DatastoreClientServiceException; + + /** + * Wait until specified collection is ready to be used. Then if it is ready before timeout, + * wait until there is no pending task in the index. + */ + default void waitUntilCollectionIsReadyAndRefreshIfAnyPendingTasks(String index, long timeoutMilli) throws DatastoreClientServiceException { + waitUntilCollectionIsReadyAndRefreshIfAnyPendingTasks(new String[]{index}, timeoutMilli); + } + /** + * Wait until specified collection is ready to be used. Then if it is ready before timeout, + * wait until there is no pending task in the index. + */ + void waitUntilCollectionIsReadyAndRefreshIfAnyPendingTasks(String[] indices, long timeoutMilli) throws DatastoreClientServiceException; /** * Save the specified object to the index. @@ -231,4 +279,11 @@ public ValidationResult validate(final String subject, final String input) { */ String convertRecordToString(Record record); + /** + * Wait until the specified collection has integrated all previously-saved data. + */ + default void refreshCollection(String name) throws DatastoreClientServiceException { + refreshCollections(new String[]{name}); + } + } diff --git a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_2_4_0-client/pom.xml b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_2_4_0-client/pom.xml index 8a1ae9c7c..49cffa3fa 100644 --- a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_2_4_0-client/pom.xml +++ b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_2_4_0-client/pom.xml @@ -7,7 +7,7 @@ com.hurence.logisland logisland-service-elasticsearch - 1.3.0 + 1.4.0 logisland-service-elasticsearch_2_4_0-client @@ -82,20 +82,10 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - diff --git a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_2_4_0-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_2_4_0_ClientServiceIT.java b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_2_4_0-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_2_4_0_ClientServiceIT.java index 5591d8920..043c2212e 100644 --- a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_2_4_0-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_2_4_0_ClientServiceIT.java +++ b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_2_4_0-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_2_4_0_ClientServiceIT.java @@ -20,9 +20,9 @@ import com.hurence.logisland.component.PropertyDescriptor; import com.hurence.logisland.controller.ControllerServiceInitializationContext; import com.hurence.logisland.processor.ProcessException; -import com.hurence.logisland.service.datastore.InvalidMultiGetQueryRecordException; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; +import com.hurence.logisland.service.datastore.model.exception.InvalidMultiGetQueryRecordException; +import com.hurence.logisland.service.datastore.model.MultiGetQueryRecord; +import com.hurence.logisland.service.datastore.model.MultiGetResponseRecord; import com.hurence.logisland.util.runner.TestRunner; import com.hurence.logisland.util.runner.TestRunners; import org.elasticsearch.action.admin.cluster.health.ClusterHealthRequest; @@ -144,7 +144,6 @@ private ElasticsearchClientService configureElasticsearchClientService(final Tes runner.setProperty(TestProcessor.ELASTICSEARCH_CLIENT_SERVICE, "elasticsearchClient"); runner.assertValid(elasticsearchClientService); - // TODO : is this necessary ? final ElasticsearchClientService service = PluginProxy.unwrap(runner.getProcessContext().getPropertyValue(TestProcessor.ELASTICSEARCH_CLIENT_SERVICE).asControllerService()); return service; } diff --git a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_2_4_0-client/src/main/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_2_4_0_ClientService.java b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_2_4_0-client/src/main/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_2_4_0_ClientService.java index 39c301057..126f73850 100644 --- a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_2_4_0-client/src/main/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_2_4_0_ClientService.java +++ b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_2_4_0-client/src/main/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_2_4_0_ClientService.java @@ -26,13 +26,14 @@ import com.hurence.logisland.controller.AbstractControllerService; import com.hurence.logisland.controller.ControllerServiceInitializationContext; import com.hurence.logisland.processor.ProcessException; -import com.hurence.logisland.service.datastore.DatastoreClientServiceException; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; +import com.hurence.logisland.service.datastore.*; import com.hurence.logisland.record.Record; +import com.hurence.logisland.service.datastore.model.*; import org.apache.commons.lang3.NotImplementedException; import org.apache.commons.lang3.StringUtils; import org.elasticsearch.action.ActionRequestValidationException; +import org.elasticsearch.action.admin.cluster.health.ClusterHealthRequest; +import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequestBuilder; import org.elasticsearch.action.admin.indices.alias.IndicesAliasesResponse; import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder; @@ -41,7 +42,9 @@ import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequestBuilder; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingResponse; +import org.elasticsearch.action.admin.indices.refresh.RefreshResponse; import org.elasticsearch.action.bulk.*; +import org.elasticsearch.action.delete.DeleteRequestBuilder; import org.elasticsearch.action.get.*; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexRequestBuilder; @@ -49,6 +52,7 @@ import org.elasticsearch.action.search.SearchType; import org.elasticsearch.client.Client; import org.elasticsearch.client.transport.TransportClient; +import org.elasticsearch.common.Priority; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.common.unit.ByteSizeUnit; @@ -131,7 +135,7 @@ public void init(ControllerServiceInitializationContext context) throws Initiali */ protected void createElasticsearchClient(ControllerServiceInitializationContext context) throws ProcessException { if (esClient != null) { - return; + shutdown(); } try { @@ -369,6 +373,67 @@ public void bulkPut(String docIndex, String docType, Map document, Op bulkProcessor.add(result.request()); } + @Override + public void bulkDelete(String docIndex, String docType, String id) { + DeleteRequestBuilder builder = esClient + .prepareDelete(docIndex, docType, id); + bulkProcessor.add(builder.request()); + } + + @Override + public void deleteByQuery(QueryRecord queryRecord) throws DatastoreClientServiceException { + throw new NotImplementedException("Not yet supported for ElasticSearch 2.4.0"); + } + + @Override + public QueryResponseRecord queryGet(QueryRecord queryRecord) throws DatastoreClientServiceException { + throw new NotImplementedException("Not yet supported for ElasticSearch 2.4.0"); + } + + @Override + public MultiQueryResponseRecord multiQueryGet(MultiQueryRecord queryRecords) throws DatastoreClientServiceException { + throw new NotImplementedException("Not yet supported for ElasticSearch 2.4.0"); + } + + /** + * Wait until specified collection is ready to be used. + */ + @Override + public void waitUntilCollectionReady(String collection, long timeoutMilli) throws DatastoreClientServiceException { + getIndexHealth(new String[]{collection}, timeoutMilli); + } + + @Override + public void waitUntilCollectionIsReadyAndRefreshIfAnyPendingTasks(String[] indices, long timeoutMilli) throws DatastoreClientServiceException { + ClusterHealthResponse rsp = getIndexHealth(indices, timeoutMilli); + if (rsp.isTimedOut()) { + getLogger().error("indices {} is not ready !", new Object[]{indices}); + } else { + if (rsp.getNumberOfPendingTasks() != 0) { + this.refreshCollections(indices); + } + } + } + + @Override + public void refreshCollections(String[] indices) throws DatastoreClientServiceException { + try { + esClient.admin().indices().prepareRefresh(indices).execute().get(); + } catch (Exception e){ + throw new DatastoreClientServiceException(e); + } + } + + private ClusterHealthResponse getIndexHealth(String[] indices, long timeoutMilli) { + ClusterHealthRequest request = new ClusterHealthRequest(indices) + .timeout(TimeValue.timeValueMillis(timeoutMilli)) + .waitForGreenStatus() + .waitForEvents(Priority.LOW); + ClusterHealthResponse response = esClient.admin().cluster().health(request).actionGet(); + getLogger().trace("health response for index {} is {}", new Object[]{indices, response}); + return response; + } + @Override public List multiGet(List multiGetQueryRecords){ List multiGetResponseRecords = new ArrayList<>(); @@ -426,7 +491,9 @@ public List multiGet(List multiGetQ MultiGetResponse multiGetItemResponses = null; try { + multiGetRequestBuilder.setRefresh(true); multiGetItemResponses = multiGetRequestBuilder.get(); + getLogger().trace("multiget query is " + multiGetItemResponses); } catch (ActionRequestValidationException e) { getLogger().error("MultiGet query failed \n: message {}\n cause : {}", new Object[]{e.getMessage(), e.getCause()}); } @@ -458,7 +525,9 @@ public boolean existsCollection(String indexName) throws DatastoreClientServiceE @Override public void refreshCollection(String indexName) throws DatastoreClientServiceException { try { - esClient.admin().indices().prepareRefresh(indexName).execute().get(); + RefreshResponse rsp = esClient.admin().indices().prepareRefresh(indexName).execute().get(); + getLogger().trace("refresh response for index " + indexName + ", failed shards : " + rsp.getFailedShards() + + ", successfull shards : " + rsp.getSuccessfulShards()); } catch (Exception e){ throw new DatastoreClientServiceException(e); @@ -673,6 +742,7 @@ public void shutdown() { } else { getLogger().info("all requests have been submitted to es"); } + bulkProcessor = null; } catch (InterruptedException e) { getLogger().error(e.getMessage()); } diff --git a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_5_4_0-client/pom.xml b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_5_4_0-client/pom.xml index 03a52e186..2c8348498 100644 --- a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_5_4_0-client/pom.xml +++ b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_5_4_0-client/pom.xml @@ -7,7 +7,7 @@ com.hurence.logisland logisland-service-elasticsearch - 1.3.0 + 1.4.0 logisland-service-elasticsearch_5_4_0-client @@ -89,22 +89,13 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - + diff --git a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_5_4_0-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_5_4_0_ClientServiceIT.java b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_5_4_0-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_5_4_0_ClientServiceIT.java index 6ba5db962..178f4ffce 100644 --- a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_5_4_0-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_5_4_0_ClientServiceIT.java +++ b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_5_4_0-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_5_4_0_ClientServiceIT.java @@ -23,9 +23,9 @@ import com.hurence.logisland.record.FieldType; import com.hurence.logisland.record.Record; import com.hurence.logisland.record.StandardRecord; -import com.hurence.logisland.service.datastore.InvalidMultiGetQueryRecordException; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; +import com.hurence.logisland.service.datastore.model.exception.InvalidMultiGetQueryRecordException; +import com.hurence.logisland.service.datastore.model.MultiGetQueryRecord; +import com.hurence.logisland.service.datastore.model.MultiGetResponseRecord; import com.hurence.logisland.util.runner.TestRunner; import com.hurence.logisland.util.runner.TestRunners; import org.elasticsearch.action.admin.cluster.health.ClusterHealthRequest; diff --git a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_5_4_0-client/src/main/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_5_4_0_ClientService.java b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_5_4_0-client/src/main/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_5_4_0_ClientService.java index 5e9240353..e9a5f8636 100644 --- a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_5_4_0-client/src/main/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_5_4_0_ClientService.java +++ b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_5_4_0-client/src/main/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_5_4_0_ClientService.java @@ -27,12 +27,13 @@ import com.hurence.logisland.controller.ControllerServiceInitializationContext; import com.hurence.logisland.processor.ProcessException; import com.hurence.logisland.record.Record; -import com.hurence.logisland.service.datastore.DatastoreClientServiceException; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; +import com.hurence.logisland.service.datastore.*; +import com.hurence.logisland.service.datastore.model.*; import org.apache.commons.lang3.NotImplementedException; import org.apache.commons.lang3.StringUtils; import org.elasticsearch.action.ActionRequestValidationException; +import org.elasticsearch.action.admin.cluster.health.ClusterHealthRequest; +import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequestBuilder; import org.elasticsearch.action.admin.indices.alias.IndicesAliasesResponse; import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder; @@ -42,6 +43,7 @@ import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequestBuilder; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingResponse; import org.elasticsearch.action.bulk.*; +import org.elasticsearch.action.delete.DeleteRequestBuilder; import org.elasticsearch.action.get.*; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexRequestBuilder; @@ -49,6 +51,7 @@ import org.elasticsearch.action.search.SearchType; import org.elasticsearch.client.Client; import org.elasticsearch.client.transport.TransportClient; +import org.elasticsearch.common.Priority; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.common.unit.ByteSizeUnit; @@ -369,6 +372,67 @@ public void bulkPut(String docIndex, String docType, Map document, Op bulkProcessor.add(result.request()); } + @Override + public void bulkDelete(String docIndex, String docType, String id) { + DeleteRequestBuilder builder = esClient + .prepareDelete(docIndex, docType, id); + bulkProcessor.add(builder.request()); + } + + @Override + public void deleteByQuery(QueryRecord queryRecord) throws DatastoreClientServiceException { + throw new NotImplementedException("Not yet supported for ElasticSearch 5.4.0"); + } + + @Override + public QueryResponseRecord queryGet(QueryRecord queryRecord) throws DatastoreClientServiceException { + throw new NotImplementedException("Not yet supported for ElasticSearch 5.4.0"); + } + + @Override + public MultiQueryResponseRecord multiQueryGet(MultiQueryRecord queryRecords) throws DatastoreClientServiceException { + throw new NotImplementedException("Not yet supported for ElasticSearch 5.4.0"); + } + + /** + * Wait until specified collection is ready to be used. + */ + @Override + public void waitUntilCollectionReady(String collection, long timeoutMilli) throws DatastoreClientServiceException { + getIndexHealth(new String[]{collection}, timeoutMilli); + } + + @Override + public void waitUntilCollectionIsReadyAndRefreshIfAnyPendingTasks(String[] indices, long timeoutMilli) throws DatastoreClientServiceException { + ClusterHealthResponse rsp = getIndexHealth(indices, timeoutMilli); + if (rsp.isTimedOut()) { + getLogger().error("indices {} is not ready !", new Object[]{indices}); + } else { + if (rsp.getNumberOfPendingTasks() != 0) { + this.refreshCollections(indices); + } + } + } + + @Override + public void refreshCollections(String[] indices) throws DatastoreClientServiceException { + try { + esClient.admin().indices().prepareRefresh(indices).execute().get(); + } catch (Exception e){ + throw new DatastoreClientServiceException(e); + } + } + + private ClusterHealthResponse getIndexHealth(String[] indices, long timeoutMilli) { + ClusterHealthRequest request = new ClusterHealthRequest(indices) + .timeout(TimeValue.timeValueMillis(timeoutMilli)) + .waitForGreenStatus() + .waitForEvents(Priority.LOW); + ClusterHealthResponse response = esClient.admin().cluster().health(request).actionGet(); + getLogger().trace("health response for index {} is {}", new Object[]{indices, response}); + return response; + } + @Override public List multiGet(List multiGetQueryRecords) throws DatastoreClientServiceException { @@ -459,6 +523,9 @@ public long countCollection(String indexName) throws DatastoreClientServiceExcep return rsp.getHits().getTotalHits(); } + + + @Override public void createCollection(String indexName, int numShards, int numReplicas) throws DatastoreClientServiceException { // Define the index itself diff --git a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_6_6_2-client/pom.xml b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_6_6_2-client/pom.xml index 79a50428a..f80a5912b 100644 --- a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_6_6_2-client/pom.xml +++ b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_6_6_2-client/pom.xml @@ -7,7 +7,7 @@ com.hurence.logisland logisland-service-elasticsearch - 1.3.0 + 1.4.0 logisland-service-elasticsearch_6_6_2-client @@ -89,14 +89,14 @@ org.testcontainers testcontainers - 1.10.7 + 1.16.0 test org.testcontainers elasticsearch - 1.10.7 + 1.16.0 test @@ -126,20 +126,10 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - diff --git a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_6_6_2-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/ESRule.java b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_6_6_2-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/ESRule.java index 59b604daf..f8792bf22 100644 --- a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_6_6_2-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/ESRule.java +++ b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_6_6_2-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/ESRule.java @@ -36,6 +36,7 @@ public class ESRule implements TestRule { * The internal-transport client that talks to the local node. */ private RestHighLevelClient client; + private ElasticsearchContainer container; /** * Return a closure which starts an embedded ES docker container, executes the unit-test, then shuts down the @@ -46,7 +47,7 @@ public Statement apply(Statement base, Description description) { return new Statement() { @Override public void evaluate() throws Throwable { - ElasticsearchContainer container = new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch:6.6.2"); + container = new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch:6.6.2"); container.start(); client = new RestHighLevelClient(RestClient.builder(HttpHost.create(container.getHttpHostAddress()))); @@ -60,6 +61,10 @@ public void evaluate() throws Throwable { }; } + public String getHostPortString() { + return container.getHttpHostAddress(); + } + /** * Return the object through which operations can be performed on the ES cluster. */ diff --git a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_6_6_2-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_6_6_2_ClientServiceIT.java b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_6_6_2-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_6_6_2_ClientServiceIT.java index f2104d133..a060a2bce 100644 --- a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_6_6_2-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_6_6_2_ClientServiceIT.java +++ b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_6_6_2-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_6_6_2_ClientServiceIT.java @@ -17,38 +17,30 @@ import com.hurence.logisland.classloading.PluginProxy; import com.hurence.logisland.component.InitializationException; -import com.hurence.logisland.component.PropertyDescriptor; -import com.hurence.logisland.controller.ControllerServiceInitializationContext; -import com.hurence.logisland.processor.ProcessException; import com.hurence.logisland.record.FieldType; import com.hurence.logisland.record.Record; import com.hurence.logisland.record.StandardRecord; -import com.hurence.logisland.service.datastore.InvalidMultiGetQueryRecordException; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; +import com.hurence.logisland.service.datastore.model.MultiGetQueryRecord; +import com.hurence.logisland.service.datastore.model.MultiGetResponseRecord; +import com.hurence.logisland.service.datastore.model.exception.InvalidMultiGetQueryRecordException; import com.hurence.logisland.util.runner.TestRunner; import com.hurence.logisland.util.runner.TestRunners; -import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.admin.cluster.health.ClusterHealthRequest; import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; -import org.elasticsearch.action.admin.indices.get.GetIndexRequest; -import org.elasticsearch.action.bulk.BulkItemResponse; -import org.elasticsearch.action.bulk.BulkProcessor; -import org.elasticsearch.action.bulk.BulkRequest; -import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.client.RequestOptions; -import org.elasticsearch.cluster.metadata.IndexMetaData; -import org.elasticsearch.common.unit.ByteSizeUnit; -import org.elasticsearch.common.unit.ByteSizeValue; import org.elasticsearch.common.unit.TimeValue; -import org.junit.*; +import org.junit.Assert; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.*; -import java.util.function.BiConsumer; + +import static com.hurence.logisland.service.elasticsearch.ElasticsearchClientService.HOSTS; public class Elasticsearch_6_6_2_ClientServiceIT { @@ -74,84 +66,13 @@ public void clean() throws IOException { } } - private class MockElasticsearchClientService extends Elasticsearch_6_6_2_ClientService { - - @Override - protected void createElasticsearchClient(ControllerServiceInitializationContext context) throws ProcessException { - if (esClient != null) { - return; - } - esClient = esRule.getClient(); - } - - @Override - protected void createBulkProcessor(ControllerServiceInitializationContext context) { - - if (bulkProcessor != null) { - return; - } - - // create the bulk processor - - BulkProcessor.Listener listener = - new BulkProcessor.Listener() { - @Override - public void beforeBulk(long l, BulkRequest bulkRequest) { - getLogger().debug("Going to execute bulk [id:{}] composed of {} actions", new Object[]{l, bulkRequest.numberOfActions()}); - } - - @Override - public void afterBulk(long l, BulkRequest bulkRequest, BulkResponse bulkResponse) { - getLogger().debug("Executed bulk [id:{}] composed of {} actions", new Object[]{l, bulkRequest.numberOfActions()}); - if (bulkResponse.hasFailures()) { - getLogger().warn("There was failures while executing bulk [id:{}]," + - " done bulk request in {} ms with failure = {}", - new Object[]{l, bulkResponse.getTook().getMillis(), bulkResponse.buildFailureMessage()}); - for (BulkItemResponse item : bulkResponse.getItems()) { - if (item.isFailed()) { - errors.put(item.getId(), item.getFailureMessage()); - } - } - } - } - - @Override - public void afterBulk(long l, BulkRequest bulkRequest, Throwable throwable) { - getLogger().error("something went wrong while bulk loading events to es : {}", new Object[]{throwable.getMessage()}); - } - - }; - - BiConsumer> bulkConsumer = - (request, bulkListener) -> esClient.bulkAsync(request, RequestOptions.DEFAULT, bulkListener); - bulkProcessor = BulkProcessor.builder(bulkConsumer, listener) - .setBulkActions(1000) - .setBulkSize(new ByteSizeValue(10, ByteSizeUnit.MB)) - .setFlushInterval(TimeValue.timeValueSeconds(1)) - .setConcurrentRequests(2) - //.setBackoffPolicy(getBackOffPolicy(context)) - .build(); - - } - - @Override - public List getSupportedPropertyDescriptors() { - - List props = new ArrayList<>(); - - return Collections.unmodifiableList(props); - } - - } - private ElasticsearchClientService configureElasticsearchClientService(final TestRunner runner) throws InitializationException { - final MockElasticsearchClientService elasticsearchClientService = new MockElasticsearchClientService(); + final Elasticsearch_6_6_2_ClientService elasticsearchClientService = new Elasticsearch_6_6_2_ClientService(); runner.addControllerService("elasticsearchClient", elasticsearchClientService); - - runner.enableControllerService(elasticsearchClientService); runner.setProperty(TestProcessor.ELASTICSEARCH_CLIENT_SERVICE, "elasticsearchClient"); - runner.assertValid(elasticsearchClientService); + runner.setProperty(elasticsearchClientService, HOSTS, esRule.getHostPortString()); + runner.enableControllerService(elasticsearchClientService); // TODO : is this necessary ? final ElasticsearchClientService service = PluginProxy.unwrap(runner.getProcessContext().getPropertyValue(TestProcessor.ELASTICSEARCH_CLIENT_SERVICE).asControllerService()); diff --git a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_6_6_2-client/src/main/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_6_6_2_ClientService.java b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_6_6_2-client/src/main/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_6_6_2_ClientService.java index e602dfa60..8b2279388 100644 --- a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_6_6_2-client/src/main/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_6_6_2_ClientService.java +++ b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_6_6_2-client/src/main/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_6_6_2_ClientService.java @@ -28,9 +28,8 @@ import com.hurence.logisland.controller.ControllerServiceInitializationContext; import com.hurence.logisland.processor.ProcessException; import com.hurence.logisland.record.Record; -import com.hurence.logisland.service.datastore.DatastoreClientServiceException; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; +import com.hurence.logisland.service.datastore.*; +import com.hurence.logisland.service.datastore.model.*; import org.apache.commons.lang3.NotImplementedException; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpHost; @@ -40,6 +39,8 @@ import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; import org.elasticsearch.action.ActionListener; +import org.elasticsearch.action.admin.cluster.health.ClusterHealthRequest; +import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest; import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; import org.elasticsearch.action.admin.indices.create.CreateIndexResponse; @@ -48,6 +49,7 @@ import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; import org.elasticsearch.action.admin.indices.refresh.RefreshRequest; import org.elasticsearch.action.bulk.*; +import org.elasticsearch.action.delete.DeleteRequest; import org.elasticsearch.action.get.*; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.search.SearchRequest; @@ -58,12 +60,17 @@ import org.elasticsearch.client.*; import org.elasticsearch.client.core.CountRequest; import org.elasticsearch.client.core.CountResponse; +import org.elasticsearch.common.Priority; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.ByteSizeUnit; import org.elasticsearch.common.unit.ByteSizeValue; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.index.reindex.BulkByScrollResponse; +import org.elasticsearch.index.reindex.DeleteByQueryRequest; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.fetch.subphase.FetchSourceContext; @@ -299,6 +306,93 @@ public void bulkPut(String docIndex, String docType, Map document, Op bulkProcessor.add(request); } + @Override + public void bulkDelete(String docIndex, String docType, String id) { + DeleteRequest request = new DeleteRequest(docIndex, docType, id); + bulkProcessor.add(request); + } + + @Override + public void deleteByQuery(QueryRecord queryRecord) throws DatastoreClientServiceException { + throw new NotImplementedException("Not yet supported for ElasticSearch 6.6.2"); +//TODO String[] indices = new String[queryRecord.getCollections().size()]; +// DeleteByQueryRequest request = new DeleteByQueryRequest(queryRecord.getCollections().toArray(indices)); +// QueryBuilder builder = toQueryBuilder(queryRecord); +// request.setQuery(builder); +// request.setRefresh(queryRecord.getRefresh()); +// try { +// BulkByScrollResponse bulkResponse = +// esClient.deleteByQuery(request, RequestOptions.DEFAULT); +// getLogger().info("deleted {} documents, got {} failure(s).", new Object[]{bulkResponse.getDeleted(), bulkResponse.getBulkFailures().size()}); +// if (getLogger().isDebugEnabled()) { +// getLogger().debug("response was {}", new Object[]{bulkResponse}); +// } +// } catch (IOException e) { +// getLogger().error("error while deleteByQuery", e); +// throw new DatastoreClientServiceException(e); +// } + } + + @Override + public QueryResponseRecord queryGet(QueryRecord queryRecord) throws DatastoreClientServiceException { + throw new NotImplementedException("Not yet supported for ElasticSearch 6.6.2"); + } + + @Override + public MultiQueryResponseRecord multiQueryGet(MultiQueryRecord queryRecords) throws DatastoreClientServiceException { + throw new NotImplementedException("Not yet supported for ElasticSearch 2.4.0"); + } + + + /** + * Wait until specified collection is ready to be used. + */ + @Override + public void waitUntilCollectionReady(String collection, long timeoutMilli) throws DatastoreClientServiceException { + getIndexHealth(new String[]{collection}, timeoutMilli); + } + + @Override + public void waitUntilCollectionIsReadyAndRefreshIfAnyPendingTasks(String[] indices, long timeoutMilli) throws DatastoreClientServiceException { + ClusterHealthResponse rsp = getIndexHealth(indices, timeoutMilli); + if (rsp == null) { + getLogger().error("index {} seems to not be ready (query failed) !", new Object[]{indices}); + return; + } + if (rsp.isTimedOut()) { + getLogger().error("index {} is not ready !", new Object[]{indices}); + } else { + if (rsp.getNumberOfPendingTasks() != 0) { + this.refreshCollections(indices); + } + } + } + + @Override + public void refreshCollections(String[] indices) throws DatastoreClientServiceException { + try { + RefreshRequest request = new RefreshRequest(indices); + esClient.indices().refresh(request, RequestOptions.DEFAULT); + } catch (Exception e){ + throw new DatastoreClientServiceException(e); + } + } + + private ClusterHealthResponse getIndexHealth(String[] indices, long timeoutMilli) { + ClusterHealthRequest request = new ClusterHealthRequest(indices) + .timeout(TimeValue.timeValueMillis(timeoutMilli)) + .waitForGreenStatus() + .waitForEvents(Priority.LOW); + ClusterHealthResponse response = null; + try { + response = esClient.cluster().health(request, RequestOptions.DEFAULT); + getLogger().trace("health response for indices {} is {}", new Object[]{indices, response}); + } catch (Exception e) { + getLogger().error("health query failed : {}", new Object[]{e.getMessage()}); + } + return response; + } + @Override public List multiGet(List multiGetQueryRecords) throws DatastoreClientServiceException { diff --git a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/pom.xml b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/pom.xml index d9089b3a6..92c5439e5 100644 --- a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/pom.xml +++ b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/pom.xml @@ -7,7 +7,7 @@ com.hurence.logisland logisland-service-elasticsearch - 1.3.0 + 1.4.0 logisland-service-elasticsearch_7_x-client @@ -17,6 +17,7 @@ 7.1.1 + 1.16.0 @@ -70,14 +71,14 @@ org.testcontainers testcontainers - 1.10.7 + ${testcontainers.version} test org.testcontainers elasticsearch - 1.10.7 + ${testcontainers.version} test @@ -112,6 +113,13 @@ 2.11.1 + + + org.slf4j + slf4j-simple + test + + @@ -119,20 +127,10 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - diff --git a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/ESOpenDistroRule.java b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/ESOpenDistroRule.java new file mode 100644 index 000000000..d06c2cbe9 --- /dev/null +++ b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/ESOpenDistroRule.java @@ -0,0 +1,150 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.service.elasticsearch; + +import org.apache.http.HttpHost; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; +import org.elasticsearch.client.RestClient; +import org.elasticsearch.client.RestClientBuilder; +import org.elasticsearch.client.RestHighLevelClient; +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import java.security.cert.X509Certificate; + +/** +* A JUnit rule which starts an embedded opendsitro elasticsearch docker container to test security features +*/ +public class ESOpenDistroRule implements TestRule { + + /** + * The internal-transport client that talks to the local node. + */ + private RestHighLevelClient client; + private ElasticsearchOpenDistroContainer container; + private String opendistroUsername; + private String opendistroPassword; + + private static Logger logger = LoggerFactory.getLogger(ESOpenDistroRule.class); + + public ESOpenDistroRule(String opendistroUsername, String opendistroPassword) { + this.opendistroUsername = opendistroUsername; + this.opendistroPassword = opendistroPassword; + } + + /** + * Return a closure which starts an embedded ES OpenDistro docker container, executes the unit-test, then shuts down the + * ES instance. + */ + @Override + public Statement apply(Statement base, Description description) { + return new Statement() { + @Override + public void evaluate() throws Throwable { + container = new ElasticsearchOpenDistroContainer("amazon/opendistro-for-elasticsearch:1.4.0", + opendistroUsername, opendistroPassword); + container.start(); + + // TODO: if testcontainers support no SSL server validation one can use the wait strategy + // in ElasticsearchOpenDistroContainer instead. See inside ElasticsearchOpenDistroContainer. + long wait = 10000L; + logger.info("Waiting for ES open distro container to start for " + wait/1000 + " seconds"); + Thread.sleep(wait); + + /** + * Inspired from https://github.com/opendistro-for-elasticsearch/community/issues/64 + */ + + RestClientBuilder builder = RestClient.builder( + new HttpHost(container.getHostAddress(), container.getPort(), "https")) + .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() { + @Override + public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) { + + // Set user/password basic auth credentials + final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); + credentialsProvider.setCredentials(AuthScope.ANY, + new UsernamePasswordCredentials(opendistroUsername, opendistroPassword)); + httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); + + // Set SSL trust manager and context + // Create and use a trust manager accepting all server certificates + TrustManager[] acceptAllTrustManager = new TrustManager[] { new X509TrustManager() { + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return null; + } + public void checkClientTrusted(X509Certificate[] certs, String authType) { + } + + public void checkServerTrusted(X509Certificate[] certs, String authType) { + } + } }; + + SSLContext sslContext = null; + try { + sslContext = SSLContext.getInstance("SSL"); + sslContext.init(null, acceptAllTrustManager, new java.security.SecureRandom()); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + httpClientBuilder.setSSLContext(sslContext); + + return httpClientBuilder; + } + }); + client = new RestHighLevelClient(builder); + + try { + base.evaluate(); // execute the unit test + } finally { + client.close(); + container.stop(); + } + } + }; + } + + public String getHostPortString() { + return container.getHostPortString(); + } + + public String getHostAddress() { + return container.getHostAddress(); + } + + public int getPort() { + return container.getPort(); + } + + /** + * Return the object through which operations can be performed on the ES cluster. + */ + public RestHighLevelClient getClient() { + return client; + } + +} \ No newline at end of file diff --git a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/ESRule.java b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/ESRule.java index 28a023c2c..ae1de5241 100644 --- a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/ESRule.java +++ b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/ESRule.java @@ -36,6 +36,7 @@ public class ESRule implements TestRule { * The internal-transport client that talks to the local node. */ private RestHighLevelClient client; + private ElasticsearchContainer container; /** * Return a closure which starts an embedded ES docker container, executes the unit-test, then shuts down the @@ -46,7 +47,7 @@ public Statement apply(Statement base, Description description) { return new Statement() { @Override public void evaluate() throws Throwable { - ElasticsearchContainer container = new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch:7.1.1"); + container = new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch:7.1.1"); container.start(); client = new RestHighLevelClient(RestClient.builder(HttpHost.create(container.getHttpHostAddress()))); @@ -60,6 +61,10 @@ public void evaluate() throws Throwable { }; } + public String getHostPortString() { + return container.getHttpHostAddress(); + } + /** * Return the object through which operations can be performed on the ES cluster. */ diff --git a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/ElasticsearchOpenDistroContainer.java b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/ElasticsearchOpenDistroContainer.java new file mode 100644 index 000000000..ee69486e1 --- /dev/null +++ b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/ElasticsearchOpenDistroContainer.java @@ -0,0 +1,112 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.service.elasticsearch; + +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.HttpWaitStrategy; +import org.testcontainers.utility.Base58; + +import java.net.InetSocketAddress; +import java.time.Duration; + +import static java.net.HttpURLConnection.HTTP_OK; + +/** + * Represents an elasticsearch docker instance which exposes by default port 9200 and 9300 (transport.tcp.port) + * The docker image is by default fetched from docker.elastic.co/elasticsearch/elasticsearch + */ +public class ElasticsearchOpenDistroContainer extends GenericContainer { + + /** + * Elasticsearch Default HTTP port + */ + private static final int ELASTICSEARCH_OPENDISTRO_DEFAULT_PORT = 9200; + + /** + * Elasticsearch Default Transport port + */ + private static final int ELASTICSEARCH_OPENDISTRO_DEFAULT_TCP_PORT = 9300; + + /** + * Elasticsearch Docker base URL + */ + private static final String ELASTICSEARCH_OPENDISTRO_DEFAULT_IMAGE = "amazon/opendistro-for-elasticsearch"; + + /** + * Elasticsearch Default version + */ + protected static final String ELASTICSEARCH_OPENDISTRO_DEFAULT_VERSION = "1.4.0"; + + public ElasticsearchOpenDistroContainer() { + this(ELASTICSEARCH_OPENDISTRO_DEFAULT_IMAGE + ":" + ELASTICSEARCH_OPENDISTRO_DEFAULT_VERSION, null, null); + } + + /** + * Create an OpenDistro Elasticsearch Container by passing the full docker image name + * @param dockerImageName Full docker image name, like: docker.elastic.co/elasticsearch/elasticsearch:6.4.1 + */ + public ElasticsearchOpenDistroContainer(String dockerImageName, String user, String password) { + super(dockerImageName); + + logger().info("Starting an opendistro elasticsearch container using [{}]", dockerImageName); + withNetworkAliases("elasticsearch-opendistro-" + Base58.randomString(6)); + withEnv("discovery.type", "single-node"); + // With enforce_hostname_verification enabled, the Security plugin verifies that the hostname of the + // communication partner matches the hostname in the certificate +// withEnv("opendistro_security.ssl.transport.enforce_hostname_verification", "false"); + // Do the clients (typically the browser or the proxy) have to authenticate themselves to the http server, + // default is OPTIONAL. To enforce authentication use REQUIRE, to completely disable client certificates use + // NONE. + withEnv("opendistro_security.ssl.http.clientauth_mode", "NONE"); +// withEnv("opendistro_security.ssl.http.enabled", "false"); // Disable https +// withEnv("opendistro_security.disabled", "true"); // Completely disable security (https; authentication...) + addExposedPorts(ELASTICSEARCH_OPENDISTRO_DEFAULT_PORT, ELASTICSEARCH_OPENDISTRO_DEFAULT_TCP_PORT); + HttpWaitStrategy httpWaitStrategy = new HttpWaitStrategy() + .forPort(ELASTICSEARCH_OPENDISTRO_DEFAULT_PORT) + .forStatusCodeMatching(response -> response == HTTP_OK) + .usingTls(); + + // Ideally we would like to be able to setup the user with the passed one. For the moment we only support the + // out of the box admin/admin user + if ( (user != null) && (password != null) ) { + httpWaitStrategy.withBasicCredentials(user, password); + } + // TODO: if we use the wait strategy then this fails as it not only connects with SSL but it + // also tries to validate the server SSL certificate. We do not want that and there is currently no option to + // remove that offered by the testcontainers API. We could may be use system properties but this would impact + // the whole VM in which the IT test runs. We prefer for the moment just not use the wait strategy and replace + // it with a dummy sleep in the caller ESOpenDistroRule to let the docker container initialize. That is why it + // is commented here after. +// setWaitStrategy(httpWaitStrategy.withStartupTimeout(Duration.ofMinutes(2))); +// setWaitStrategy(httpWaitStrategy.withStartupTimeout(Duration.ofSeconds(10))); + } + + public String getHostPortString() { + return getContainerIpAddress() + ":" + getMappedPort(ELASTICSEARCH_OPENDISTRO_DEFAULT_PORT); + } + + public String getHostAddress() { + return getContainerIpAddress(); + } + + public int getPort() { + return getMappedPort(ELASTICSEARCH_OPENDISTRO_DEFAULT_PORT); + } + + public InetSocketAddress getTcpHost() { + return new InetSocketAddress(getContainerIpAddress(), getMappedPort(ELASTICSEARCH_OPENDISTRO_DEFAULT_TCP_PORT)); + } +} diff --git a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/ElasticsearchOpenDistro_7_x_ClientServiceIT.java b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/ElasticsearchOpenDistro_7_x_ClientServiceIT.java new file mode 100644 index 000000000..c28850948 --- /dev/null +++ b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/ElasticsearchOpenDistro_7_x_ClientServiceIT.java @@ -0,0 +1,523 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.service.elasticsearch; + +import com.hurence.logisland.classloading.PluginProxy; +import com.hurence.logisland.component.InitializationException; +import com.hurence.logisland.record.FieldType; +import com.hurence.logisland.record.Record; +import com.hurence.logisland.record.StandardRecord; +import com.hurence.logisland.service.datastore.model.exception.InvalidMultiGetQueryRecordException; +import com.hurence.logisland.service.datastore.model.MultiGetQueryRecord; +import com.hurence.logisland.service.datastore.model.MultiGetResponseRecord; +import com.hurence.logisland.util.runner.TestRunner; +import com.hurence.logisland.util.runner.TestRunners; +import org.elasticsearch.ElasticsearchStatusException; +import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.indices.GetIndexRequest; +import org.elasticsearch.client.indices.GetIndexResponse; +import org.elasticsearch.common.unit.TimeValue; +import org.junit.After; +import org.junit.Assert; +import org.junit.ClassRule; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.*; + +import static com.hurence.logisland.service.elasticsearch.ElasticsearchClientService.*; + +/** + * The current implementation uses HTTPS with no server certificate validation (like the ES service does) as well as + * user/password http basic auth, which is currently only admin/admin as it is by default configured in the opendistro + * ES docker image we currently use. + */ +public class ElasticsearchOpenDistro_7_x_ClientServiceIT { + + private static final String MAPPING1 = "{'properties':{'name':{'type': 'text'},'val':{'type':'integer'}}}"; + private static final String MAPPING2 = "{'properties':{'name':{'type': 'text'},'val':{'type': 'text'}}}"; + private static final String MAPPING3 = + "{'dynamic':'strict','properties':{'name':{'type': 'text'},'xyz':{'type': 'text'}}}"; + + private static Logger logger = LoggerFactory.getLogger(ElasticsearchOpenDistro_7_x_ClientServiceIT.class); + + // For the moment, the ES opendistro container does not support configuring and using another user/password than + // admin/admin. To be allowed to changed that, the ElasticsearchOpenDistroContainer constructor must find a way + // to configure a new user/password starting the opendistro container. + public static final String OPENDISTRO_USERNAME = "admin"; + public static final String OPENDISTRO_PASSWORD = "admin"; + + @ClassRule + public static final ESOpenDistroRule esOpenDistroRule = new ESOpenDistroRule(OPENDISTRO_USERNAME, OPENDISTRO_PASSWORD); + + @After + public void clean() throws IOException { +// ClusterHealthRequest is returning nothing... So we are using IndexRequest here + GetIndexRequest request = new GetIndexRequest("*"); + GetIndexResponse response; + try { + response = esOpenDistroRule.getClient().indices().get(request, RequestOptions.DEFAULT); + } catch (ElasticsearchStatusException ex) { + return;//should be index not found + } + String[] indices = response.getIndices(); + List indicesToClean = new ArrayList(); + // Do not remove .opendistro_security mandatory index + Arrays.stream(indices).forEach(index -> { + if (!index.equals(".opendistro_security")) { + indicesToClean.add(index); + } + }); + if (indicesToClean.size() > 0) { + logger.info("Cleaning indices:" + indicesToClean); + DeleteIndexRequest deleteRequest = new DeleteIndexRequest(indicesToClean.toArray(new String[0])); + Assert.assertTrue(esOpenDistroRule.getClient().indices().delete(deleteRequest, RequestOptions.DEFAULT).isAcknowledged()); + } else { + logger.info("No index to clean"); + } + } + + private ElasticsearchClientService configureElasticsearchOpenDistroClientService(final TestRunner runner) throws InitializationException { + final Elasticsearch_7_x_ClientService elasticsearchClientService = new Elasticsearch_7_x_ClientService(); + + runner.addControllerService("elasticsearchClient", elasticsearchClientService); + runner.setProperty(TestProcessor.ELASTICSEARCH_CLIENT_SERVICE, "elasticsearchClient"); + runner.setProperty(elasticsearchClientService, HOSTS, esOpenDistroRule.getHostPortString()); + runner.setProperty(elasticsearchClientService, USERNAME, OPENDISTRO_USERNAME); + runner.setProperty(elasticsearchClientService, PASSWORD, OPENDISTRO_PASSWORD); + runner.setProperty(elasticsearchClientService, ENABLE_SSL, "true"); + runner.enableControllerService(elasticsearchClientService); + + // TODO : is this necessary ? + final ElasticsearchClientService service = PluginProxy.unwrap(runner.getProcessContext().getPropertyValue(TestProcessor.ELASTICSEARCH_CLIENT_SERVICE).asControllerService()); + return service; + } + + @Test + public void testBasics() throws Exception { + + Map document1 = new HashMap<>(); + document1.put("name", "fred"); + document1.put("val", 33); + + boolean result; + + final TestRunner runner = TestRunners.newTestRunner(new TestProcessor()); + + final ElasticsearchClientService elasticsearchClientService = configureElasticsearchOpenDistroClientService(runner); + + + // Verify the index does not exist + Assert.assertEquals(false, elasticsearchClientService.existsCollection("foo")); + + // Define the index + elasticsearchClientService.createCollection("foo", 2, 1); + Assert.assertEquals(true, elasticsearchClientService.existsCollection("foo")); + + // Define another index + elasticsearchClientService.createCollection("bar", 2, 1); + Assert.assertEquals(true, elasticsearchClientService.existsCollection("foo")); + + // Add a mapping to foo + result = elasticsearchClientService.putMapping("foo", null, MAPPING1.replace('\'', '"')); + Assert.assertEquals(true, result); + + // Add the same mapping again + result = elasticsearchClientService.putMapping("foo", null, MAPPING1.replace('\'', '"')); + Assert.assertEquals(true, result); + + // create alias + elasticsearchClientService.createAlias("foo", "aliasFoo"); + Assert.assertEquals(true, elasticsearchClientService.existsCollection("aliasFoo")); + + // Insert a record into foo and count foo + Assert.assertEquals(0, elasticsearchClientService.countCollection("foo")); + elasticsearchClientService.saveSync("foo", null, document1); + Assert.assertEquals(1, elasticsearchClientService.countCollection("foo")); + + // copy index foo to bar - should work + Assert.assertEquals(0, elasticsearchClientService.countCollection("bar")); + elasticsearchClientService.copyCollection(TimeValue.timeValueMinutes(2).toString(), "foo", "bar"); + elasticsearchClientService.bulkFlush(); + Thread.sleep(2000); + elasticsearchClientService.refreshCollection("bar"); + Assert.assertEquals(1, elasticsearchClientService.countCollection("bar")); + + // Define incompatible mappings in two different indexes, then try to copy - should fail + // as a document registered in index foo cannot be written in index baz. + // + // Note: MAPPING2 cannot be added to index foo or bar at all, even under a different doctype, as ES (lucene) + // does not allow two types for the same field-name in different mappings of the same index. However if + // MAPPING2 is added to index baz, then the copyCollection succeeds - because by default ES automatically converts + // integers into strings when necessary. Interestingly, this means MAPPING1 and MAPPING2 are not compatible + // at the "put mapping" level, but are compatible at the "reindex" level.. + // + // The document (doc1) of type "type1" already in index "foo" cannot be inserted into index "baz" as type1 + // because that means applying its source to MAPPING3 - but MAPPING3 is strict and does not define property + // "val", so the insert fails. + elasticsearchClientService.createCollection("baz",2, 1); + elasticsearchClientService.putMapping("baz", null, MAPPING2.replace('\'', '"')); + +// try { +// elasticsearchClientService.copyCollection(TimeValue.timeValueMinutes(2).toString(), "foo", "baz"); +// Assert.fail("Exception not thrown when expected"); +// } catch(DatastoreClientServiceException e) { +// Assert.assertTrue(e.getMessage().contains("Reindex failed")); +// } + elasticsearchClientService.refreshCollection("baz"); + Assert.assertEquals(0, elasticsearchClientService.countCollection("baz")); + + // Drop index foo + elasticsearchClientService.dropCollection("foo"); + Assert.assertEquals(false, elasticsearchClientService.existsCollection("foo")); + Assert.assertEquals(false, elasticsearchClientService.existsCollection("aliasFoo")); // alias for foo disappears too + Assert.assertEquals(true, elasticsearchClientService.existsCollection("bar")); + } + + @Test + public void testBulkPut() throws InitializationException, IOException, InterruptedException { + final String index = "foo"; + final String docId = "id1"; + final String nameKey = "name"; + final String nameValue = "fred"; + final String ageKey = "age"; + final int ageValue = 33; + + Map document1 = new HashMap<>(); + document1.put(nameKey, nameValue); + document1.put(ageKey, ageValue); + + final TestRunner runner = TestRunners.newTestRunner(new TestProcessor()); + + // create the controller service and link it to the test processor : + final ElasticsearchClientService elasticsearchClientService = configureElasticsearchOpenDistroClientService(runner); + + // Verify the index does not exist + Assert.assertEquals(false, elasticsearchClientService.existsCollection(index)); + + // Create the index + elasticsearchClientService.createCollection(index,2, 1); + Assert.assertEquals(true, elasticsearchClientService.existsCollection(index)); + + // Put a document in the bulk processor : + elasticsearchClientService.bulkPut(index, null, document1, Optional.of(docId)); + // Flush the bulk processor : + elasticsearchClientService.bulkFlush(); + Thread.sleep(2000); + try { + // Refresh the index : + elasticsearchClientService.refreshCollection(index); + } catch (Exception e) { + logger.error("Error while refreshing the index : " + e.toString()); + } + + long documentsNumber = 0; + + try { + documentsNumber = elasticsearchClientService.countCollection(index); + } catch (Exception e) { + logger.error("Error while counting the number of documents in the index : " + e.toString()); + } + + Assert.assertEquals(1, documentsNumber); + + try { + elasticsearchClientService.saveSync(index, null, document1); + } catch (Exception e) { + logger.error("Error while saving the document in the index : " + e.toString()); + } + + try { + documentsNumber = elasticsearchClientService.countCollection(index); + } catch (Exception e) { + logger.error("Error while counting the number of documents in the index : " + e.toString()); + } + + Assert.assertEquals(2, documentsNumber); + + long numberOfHits = elasticsearchClientService.searchNumberOfHits(index, null, nameKey, nameValue); + + Assert.assertEquals(2, numberOfHits); + + } + + + @Test + public void testBulkPutGeopoint() throws InitializationException, InterruptedException { + final String index = "future_factory"; + final String docId = "modane_factory"; + Record record = new StandardRecord("factory") + .setId(docId) + .setStringField("address", "rue du Frejus") + .setField("latitude", FieldType.FLOAT, 45.4f) + .setField("longitude", FieldType.FLOAT, 45.4f); + + final TestRunner runner = TestRunners.newTestRunner(new TestProcessor()); + + // create the controller service and link it to the test processor : + final ElasticsearchClientService elasticsearchClientService = configureElasticsearchOpenDistroClientService(runner); + + // Verify the index does not exist + Assert.assertEquals(false, elasticsearchClientService.existsCollection(index)); + + // Create the index + elasticsearchClientService.createCollection(index, 2, 1); + Assert.assertEquals(true, elasticsearchClientService.existsCollection(index)); + + // Put a document in the bulk processor : + String document1 = ElasticsearchRecordConverter.convertToString(record); + elasticsearchClientService.bulkPut(index, null, document1, Optional.of(docId)); + // Flush the bulk processor : + elasticsearchClientService.bulkFlush(); + Thread.sleep(2000); + try { + // Refresh the index : + elasticsearchClientService.refreshCollection(index); + } catch (Exception e) { + logger.error("Error while refreshing the index : " + e.toString()); + } + + long documentsNumber = 0; + + try { + documentsNumber = elasticsearchClientService.countCollection(index); + } catch (Exception e) { + logger.error("Error while counting the number of documents in the index : " + e.toString()); + } + + Assert.assertEquals(1, documentsNumber); + + List multiGetQueryRecords = new ArrayList<>(); + ArrayList documentIds = new ArrayList<>(); + List multiGetResponseRecords = new ArrayList<>(); + + + // Make sure a dummy query returns no result : + documentIds.add(docId); + try { + multiGetQueryRecords.add(new MultiGetQueryRecord(index, null, new String[]{"location", "id"}, new String[]{}, documentIds)); + } catch (InvalidMultiGetQueryRecordException e) { + e.printStackTrace(); + } + multiGetResponseRecords = elasticsearchClientService.multiGet(multiGetQueryRecords); + Assert.assertEquals(1, multiGetResponseRecords.size()); // number of documents retrieved + + } + + + @Test + public void testMultiGet() throws InitializationException, InterruptedException, InvalidMultiGetQueryRecordException { + final String index1 = "index1"; + final String index2 = "index2"; + + Map document1 = new HashMap<>(); + final String docId1 = "id1"; + document1.put("field_beg_1", "field_beg_1_document1_value"); + document1.put("field_beg_2", "field_beg_2_document1_value"); + document1.put("field_beg_3", "field_beg_3_document1_value"); + document1.put("field_fin_1", "field_fin_1_document1_value"); + document1.put("field_fin_2", "field_fin_2_document1_value"); + + Map document2 = new HashMap<>(); + final String docId2 = "id2"; + document2.put("field_beg_1", "field_beg_1_document2_value"); + document2.put("field_beg_2", "field_beg_2_document2_value"); + document2.put("field_beg_3", "field_beg_3_document2_value"); + document2.put("field_fin_1", "field_fin_1_document2_value"); + document2.put("field_fin_2", "field_fin_2_document2_value"); + + Map document3 = new HashMap<>(); + final String docId3 = "id3"; + document3.put("field_beg_1", "field_beg_1_document3_value"); + document3.put("field_beg_2", "field_beg_2_document3_value"); + // this 3rd field is intentionally removed : + // document3.put("field_beg_3", "field_beg_3_document3_value"); + document3.put("field_fin_1", "field_fin_1_document3_value"); + document3.put("field_fin_2", "field_fin_2_document3_value"); + + final TestRunner runner = TestRunners.newTestRunner(new TestProcessor()); + + // create the controller service and link it to the test processor : + final ElasticsearchClientService elasticsearchClientService = configureElasticsearchOpenDistroClientService(runner); + + // Verify the indexes do not exist + Assert.assertEquals(false, elasticsearchClientService.existsCollection(index1)); + Assert.assertEquals(false, elasticsearchClientService.existsCollection(index2)); + + // Create the indexes + elasticsearchClientService.createCollection(index1, 2, 1); + elasticsearchClientService.createCollection(index2, 2, 1); + Assert.assertEquals(true, elasticsearchClientService.existsCollection(index1)); + Assert.assertEquals(true, elasticsearchClientService.existsCollection(index2)); + + // Put documents in the bulk processor : + elasticsearchClientService.bulkPut(index1, null, document1, Optional.of(docId1)); + elasticsearchClientService.bulkPut(index1, null, document2, Optional.of(docId2)); + elasticsearchClientService.bulkPut(index1, null, document3, Optional.of(docId3)); + elasticsearchClientService.bulkPut(index2, null, document1, Optional.of(docId1)); + elasticsearchClientService.bulkPut(index2, null, document2, Optional.of(docId2)); + elasticsearchClientService.bulkPut(index2, null, document3, Optional.of(docId3)); + // Flush the bulk processor : + elasticsearchClientService.bulkFlush(); + Thread.sleep(2000); + try { + // Refresh the indexes : + elasticsearchClientService.refreshCollection(index1); + elasticsearchClientService.refreshCollection(index2); + } catch (Exception e) { + logger.error("Error while refreshing the indexes : " + e.toString()); + } + + long countIndex1 = 0; + long countIndex2 = 0; + try { + countIndex1 = elasticsearchClientService.countCollection(index1); + countIndex2 = elasticsearchClientService.countCollection(index2); + } catch (Exception e) { + logger.error("Error while counting the number of documents in the index : " + e.toString()); + } + Assert.assertEquals(3, countIndex1); + Assert.assertEquals(3, countIndex2); + + List multiGetQueryRecords = new ArrayList<>(); + ArrayList documentIds = new ArrayList<>(); + ArrayList documentIds_2 = new ArrayList<>(); + List multiGetResponseRecords; + String[] fieldsToInclude = {"field_b*", "field*1"}; + String[] fieldsToExclude = {"field_*2"}; + + // Make sure a dummy query returns no result : + documentIds.add(docId1); + multiGetQueryRecords.add(new MultiGetQueryRecord("dummy", "", new String[]{"dummy"}, new String[]{}, documentIds)); + multiGetResponseRecords = elasticsearchClientService.multiGet(multiGetQueryRecords); + Assert.assertEquals(0, multiGetResponseRecords.size()); // number of documents retrieved + + multiGetQueryRecords.clear(); + documentIds.clear(); + multiGetResponseRecords.clear(); + + // Test : 1 MultiGetQueryRecord record, with 1 index, 1 type, 1 id, WITHOUT includes, WITHOUT excludes : + documentIds.add(docId1); + multiGetQueryRecords.add(new MultiGetQueryRecord(index1, null, documentIds)); + multiGetResponseRecords = elasticsearchClientService.multiGet(multiGetQueryRecords); + + Assert.assertEquals(1, multiGetResponseRecords.size()); // number of documents retrieved + Assert.assertEquals(index1, multiGetResponseRecords.get(0).getCollectionName()); + Assert.assertEquals("_doc", multiGetResponseRecords.get(0).getTypeName()); + Assert.assertEquals(docId1, multiGetResponseRecords.get(0).getDocumentId()); + Assert.assertEquals(5, multiGetResponseRecords.get(0).getRetrievedFields().size()); // number of fields retrieved for the document + multiGetResponseRecords.get(0).getRetrievedFields().forEach((k, v) -> document1.get(k).equals(v.toString())); + + multiGetQueryRecords.clear(); + documentIds.clear(); + multiGetResponseRecords.clear(); + + // Test : 1 MultiGetQueryRecord record, with 1 index, 0 type, 3 ids, WITH include, WITH exclude : + documentIds.add(docId1); + documentIds.add(docId2); + documentIds.add(docId3); + multiGetQueryRecords.add(new MultiGetQueryRecord(index1, null, fieldsToInclude, fieldsToExclude, documentIds)); + multiGetResponseRecords = elasticsearchClientService.multiGet(multiGetQueryRecords); + + Assert.assertEquals(3, multiGetResponseRecords.size()); // verify that 3 documents has been retrieved + multiGetResponseRecords.forEach(responseRecord -> Assert.assertEquals(index1, responseRecord.getCollectionName())); // verify that all retrieved are in index1 + multiGetResponseRecords.forEach(responseRecord -> Assert.assertEquals("_doc", responseRecord.getTypeName())); // verify that the type of all retrieved documents is type1 + multiGetResponseRecords.forEach(responseRecord -> { + if (responseRecord.getDocumentId() == docId1) { + Assert.assertEquals(3, responseRecord.getRetrievedFields().size()); // for document1, verify that 3 fields has been retrieved + // verify that the 3 retrieved fields are the correct ones : + Assert.assertEquals(true, responseRecord.getRetrievedFields().containsKey("field_beg_1")); + Assert.assertEquals(true, responseRecord.getRetrievedFields().containsKey("field_beg_3")); + Assert.assertEquals(true, responseRecord.getRetrievedFields().containsKey("field_fin_1")); + // verify that the values of the 3 retrieved fields are the correct ones : + Assert.assertEquals("field_beg_1_document1_value", responseRecord.getRetrievedFields().get("field_beg_1").toString()); + Assert.assertEquals("field_beg_3_document1_value", responseRecord.getRetrievedFields().get("field_beg_3").toString()); + Assert.assertEquals("field_fin_1_document1_value", responseRecord.getRetrievedFields().get("field_fin_1").toString()); + } + if (responseRecord.getDocumentId() == docId2) + Assert.assertEquals(3, responseRecord.getRetrievedFields().size()); // for document2, verify that 3 fields has been retrieved + if (responseRecord.getDocumentId() == docId3) + Assert.assertEquals(2, responseRecord.getRetrievedFields().size()); // for document3, verify that 2 fields has been retrieved + }); + + multiGetQueryRecords.clear(); + documentIds.clear(); + multiGetResponseRecords.clear(); + + // Test : 2 MultiGetQueryRecord records : + // - 1st : 1 index (index1), 1 type, 2 ids, WITH include, WITH exclude --> expecting : 2 docs retrieved (from index1), 3 fields each (except doc3 : 2 fields) + // - 2nd : 1 index (index2), 0 type, 3 ids, WITH include, WITHOUT exclude --> expecting : 3 docs retrieved (from index2), 4 fields each (except doc3 : 3 fields) + documentIds.add(docId1); + documentIds.add(docId2); + multiGetQueryRecords.add(new MultiGetQueryRecord(index1, null, fieldsToInclude, fieldsToExclude, documentIds)); + documentIds_2.add(docId1); + documentIds_2.add(docId1); + documentIds_2.add(docId1); + multiGetQueryRecords.add(new MultiGetQueryRecord(index2, null, fieldsToInclude, null, documentIds_2)); + multiGetResponseRecords = elasticsearchClientService.multiGet(multiGetQueryRecords); + + Assert.assertEquals(5, multiGetResponseRecords.size()); // verify that 5 documents has been retrieved + multiGetResponseRecords.forEach(responseRecord -> { + if (responseRecord.getCollectionName() == index1 && !responseRecord.getDocumentId().equals(docId3)) + Assert.assertEquals(3, responseRecord.getRetrievedFields().size()); // for documents from index1 (except doc3), verify that 3 fields has been retrieved + if (responseRecord.getCollectionName() == index1 && responseRecord.getDocumentId().equals(docId3)) + Assert.assertEquals(2, responseRecord.getRetrievedFields().size()); // for document3 from index1, verify that 2 fields has been retrieved + if (responseRecord.getDocumentId() == index2 && !responseRecord.getDocumentId().equals(docId3)) + Assert.assertEquals(4, responseRecord.getRetrievedFields().size()); // for documents from index2 (except doc3), verify that 4 fields has been retrieved + if (responseRecord.getDocumentId() == index2 && responseRecord.getDocumentId().equals(docId3)) + Assert.assertEquals(3, responseRecord.getRetrievedFields().size()); // for document3 from index2, verify that 3 fields has been retrieved + }); + + } + + @Test + public void testMultiGetInvalidRecords() { + + List multiGetQueryRecords = new ArrayList<>(); + + String errorMessage = ""; + + // Validate null index behaviour : + try { + multiGetQueryRecords.add(new MultiGetQueryRecord(null, null, null, null, null)); + } catch (InvalidMultiGetQueryRecordException e) { + errorMessage = e.getMessage(); + } + Assert.assertEquals(errorMessage, "The index name cannot be null"); + + // Validate empty index behaviour : + try { + multiGetQueryRecords.add(new MultiGetQueryRecord("", null, null, null, null)); + } catch (InvalidMultiGetQueryRecordException e) { + errorMessage = e.getMessage(); + } + Assert.assertEquals(errorMessage, "The index name cannot be empty"); + + // Validate null documentIds behaviour : + try { + multiGetQueryRecords.add(new MultiGetQueryRecord("dummy", null, null, null, null)); + } catch (InvalidMultiGetQueryRecordException e) { + errorMessage = e.getMessage(); + } + Assert.assertEquals(errorMessage, "The list of document ids cannot be null"); + + // Make sure no invalid MultiGetQueryRecord has been added to multiGetQueryRecords list : + Assert.assertEquals(0, multiGetQueryRecords.size()); + } +} diff --git a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_7_x_ClientServiceIT.java b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_7_x_ClientServiceIT.java index 5e5b86d05..0f5b3f1b2 100644 --- a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_7_x_ClientServiceIT.java +++ b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/integration-test/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_7_x_ClientServiceIT.java @@ -17,31 +17,19 @@ import com.hurence.logisland.classloading.PluginProxy; import com.hurence.logisland.component.InitializationException; -import com.hurence.logisland.component.PropertyDescriptor; -import com.hurence.logisland.controller.ControllerServiceInitializationContext; -import com.hurence.logisland.processor.ProcessException; import com.hurence.logisland.record.FieldType; import com.hurence.logisland.record.Record; import com.hurence.logisland.record.StandardRecord; -import com.hurence.logisland.service.datastore.InvalidMultiGetQueryRecordException; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; +import com.hurence.logisland.service.datastore.model.exception.InvalidMultiGetQueryRecordException; +import com.hurence.logisland.service.datastore.model.MultiGetQueryRecord; +import com.hurence.logisland.service.datastore.model.MultiGetResponseRecord; import com.hurence.logisland.util.runner.TestRunner; import com.hurence.logisland.util.runner.TestRunners; import org.elasticsearch.ElasticsearchStatusException; -import org.elasticsearch.action.ActionListener; -import org.elasticsearch.action.admin.cluster.health.ClusterHealthRequest; -import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; -import org.elasticsearch.action.bulk.BulkItemResponse; -import org.elasticsearch.action.bulk.BulkProcessor; -import org.elasticsearch.action.bulk.BulkRequest; -import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.indices.GetIndexRequest; import org.elasticsearch.client.indices.GetIndexResponse; -import org.elasticsearch.common.unit.ByteSizeUnit; -import org.elasticsearch.common.unit.ByteSizeValue; import org.elasticsearch.common.unit.TimeValue; import org.junit.After; import org.junit.Assert; @@ -52,7 +40,8 @@ import java.io.IOException; import java.util.*; -import java.util.function.BiConsumer; + +import static com.hurence.logisland.service.elasticsearch.ElasticsearchClientService.HOSTS; public class Elasticsearch_7_x_ClientServiceIT { @@ -60,6 +49,7 @@ public class Elasticsearch_7_x_ClientServiceIT { private static final String MAPPING2 = "{'properties':{'name':{'type': 'text'},'val':{'type': 'text'}}}"; private static final String MAPPING3 = "{'dynamic':'strict','properties':{'name':{'type': 'text'},'xyz':{'type': 'text'}}}"; + private static final String MAPPING4 = "{'properties':{'an_int_value':{'type': 'integer'}}}"; private static Logger logger = LoggerFactory.getLogger(Elasticsearch_7_x_ClientServiceIT.class); @@ -82,85 +72,13 @@ public void clean() throws IOException { Assert.assertTrue(esRule.getClient().indices().delete(deleteRequest, RequestOptions.DEFAULT).isAcknowledged()); } } - - private class MockElasticsearchClientService extends Elasticsearch_7_x_ClientService { - - @Override - protected void createElasticsearchClient(ControllerServiceInitializationContext context) throws ProcessException { - if (esClient != null) { - return; - } - esClient = esRule.getClient(); - } - - @Override - protected void createBulkProcessor(ControllerServiceInitializationContext context) { - - if (bulkProcessor != null) { - return; - } - - // create the bulk processor - - BulkProcessor.Listener listener = - new BulkProcessor.Listener() { - @Override - public void beforeBulk(long l, BulkRequest bulkRequest) { - getLogger().debug("Going to execute bulk [id:{}] composed of {} actions", new Object[]{l, bulkRequest.numberOfActions()}); - } - - @Override - public void afterBulk(long l, BulkRequest bulkRequest, BulkResponse bulkResponse) { - getLogger().debug("Executed bulk [id:{}] composed of {} actions", new Object[]{l, bulkRequest.numberOfActions()}); - if (bulkResponse.hasFailures()) { - getLogger().warn("There was failures while executing bulk [id:{}]," + - " done bulk request in {} ms with failure = {}", - new Object[]{l, bulkResponse.getTook().getMillis(), bulkResponse.buildFailureMessage()}); - for (BulkItemResponse item : bulkResponse.getItems()) { - if (item.isFailed()) { - errors.put(item.getId(), item.getFailureMessage()); - } - } - } - } - - @Override - public void afterBulk(long l, BulkRequest bulkRequest, Throwable throwable) { - getLogger().error("something went wrong while bulk loading events to es : {}", new Object[]{throwable.getMessage()}); - } - - }; - - BiConsumer> bulkConsumer = - (request, bulkListener) -> esClient.bulkAsync(request, RequestOptions.DEFAULT, bulkListener); - bulkProcessor = BulkProcessor.builder(bulkConsumer, listener) - .setBulkActions(1000) - .setBulkSize(new ByteSizeValue(10, ByteSizeUnit.MB)) - .setFlushInterval(TimeValue.timeValueSeconds(1)) - .setConcurrentRequests(2) - //.setBackoffPolicy(getBackOffPolicy(context)) - .build(); - - } - - @Override - public List getSupportedPropertyDescriptors() { - - List props = new ArrayList<>(); - - return Collections.unmodifiableList(props); - } - - } - private ElasticsearchClientService configureElasticsearchClientService(final TestRunner runner) throws InitializationException { - final MockElasticsearchClientService elasticsearchClientService = new MockElasticsearchClientService(); + final Elasticsearch_7_x_ClientService elasticsearchClientService = new Elasticsearch_7_x_ClientService(); runner.addControllerService("elasticsearchClient", elasticsearchClientService); - - runner.enableControllerService(elasticsearchClientService); runner.setProperty(TestProcessor.ELASTICSEARCH_CLIENT_SERVICE, "elasticsearchClient"); - runner.assertValid(elasticsearchClientService); + runner.setProperty(elasticsearchClientService, HOSTS, esRule.getHostPortString()); + runner.enableControllerService(elasticsearchClientService); // TODO : is this necessary ? final ElasticsearchClientService service = PluginProxy.unwrap(runner.getProcessContext().getPropertyValue(TestProcessor.ELASTICSEARCH_CLIENT_SERVICE).asControllerService()); @@ -248,6 +166,58 @@ public void testBasics() throws Exception { Assert.assertEquals(true, elasticsearchClientService.existsCollection("bar")); } + @Test + public void testBulkPutError() throws Exception { + + final String index = "error_test"; + final String docId1 = "id1"; + final String docId2 = "id2"; + Map document1 = new HashMap<>(); + document1.put("an_int_value", 1); + Map document2 = new HashMap<>(); + document2.put("an_int_value", "This string value should not be accepted as value should be an integer"); + + boolean result; + + final TestRunner runner = TestRunners.newTestRunner(new TestProcessor()); + + final ElasticsearchClientService elasticsearchClientService = configureElasticsearchClientService(runner); + + // Verify the index does not exist + Assert.assertEquals(false, elasticsearchClientService.existsCollection(index)); + + // Define the index + elasticsearchClientService.createCollection(index, 2, 1); + Assert.assertEquals(true, elasticsearchClientService.existsCollection(index)); + + // Add a mapping to error_test + result = elasticsearchClientService.putMapping(index, null, MAPPING4.replace('\'', '"')); + Assert.assertEquals(true, result); + + // Put both documents in the bulk processor : + elasticsearchClientService.bulkPut(index, null, document1, Optional.of(docId1)); + elasticsearchClientService.bulkPut(index, null, document2, Optional.of(docId2)); + // Flush the bulk processor : + elasticsearchClientService.bulkFlush(); + Thread.sleep(2000); + try { + // Refresh the index : + elasticsearchClientService.refreshCollection(index); + } catch (Exception e) { + logger.error("Error while refreshing the index : " + e.toString()); + } + + long documentsNumber = 0; + try { + documentsNumber = elasticsearchClientService.countCollection(index); + } catch (Exception e) { + logger.error("Error while counting the number of documents in the index : " + e.toString()); + } + + // First must have been added, second should have made error due to wrong value format + Assert.assertEquals(1, documentsNumber); + } + @Test public void testBulkPut() throws InitializationException, IOException, InterruptedException { final String index = "foo"; diff --git a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/main/java/com/hurence/logisland/service/elasticsearch/ElasticsearchRecordConverter.java b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/main/java/com/hurence/logisland/service/elasticsearch/ElasticsearchRecordConverter.java index eb72945ed..9ffbbdd00 100644 --- a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/main/java/com/hurence/logisland/service/elasticsearch/ElasticsearchRecordConverter.java +++ b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/main/java/com/hurence/logisland/service/elasticsearch/ElasticsearchRecordConverter.java @@ -17,6 +17,7 @@ import com.hurence.logisland.record.FieldDictionary; import com.hurence.logisland.record.Record; +import com.hurence.logisland.record.RecordUtils; import org.elasticsearch.common.Strings; import org.elasticsearch.common.xcontent.XContentBuilder; import org.joda.time.format.DateTimeFormatter; @@ -24,8 +25,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.text.SimpleDateFormat; -import java.util.TimeZone; +import java.lang.reflect.Array; +import java.util.*; import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; @@ -41,12 +42,22 @@ class ElasticsearchRecordConverter { * @return the json converted record */ static String convertToString(Record record) { - try { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); - sdf.setTimeZone(TimeZone.getTimeZone("UTC")); - XContentBuilder document = jsonBuilder().startObject(); - final float[] geolocation = new float[2]; + return convertToString(record, "location"); + } + + /** + * Converts an Event into an Elasticsearch document + * to be indexed later + *e + * @param record to convert + * @param geolocationFieldLabel is the label for the geolocation field + * @return the json converted record + */ + static String convertToString(Record record, String geolocationFieldLabel) { + logger.trace(record.toString()); + try { + final XContentBuilder document = jsonBuilder().startObject(); // convert event_time as ISO for ES if (record.hasField(FieldDictionary.RECORD_TIME)) { try { @@ -57,6 +68,7 @@ static String convertToString(Record record) { } } + final float[] geolocation = new float[2]; // add all other records record.getAllFieldsSorted().forEach(field -> { @@ -69,13 +81,10 @@ static String convertToString(Record record) { return; } + final String fieldName = field.getName().replaceAll("\\.", "_"); try { // cleanup invalid es fields characters like '.' - String fieldName = field.getName().replaceAll("\\.", "_"); - - switch (field.getType()) { - case STRING: document.field(fieldName, field.asString()); break; @@ -99,30 +108,59 @@ static String convertToString(Record record) { geolocation[0] = field.asFloat(); if( fieldName.equals("long") || fieldName.equals("longitude")) geolocation[1] = field.asFloat(); - break; case BOOLEAN: document.field(fieldName, field.asBoolean().booleanValue()); break; + case RECORD: + Map map = RecordUtils.toMap(field.asRecord(), true); + document.field(fieldName, map); + break; + case ARRAY: + Collection collection; + Object value = field.getRawValue(); + if (value == null) { + break; + } else if (value.getClass().isArray()) { + collection = new ArrayList<>(); + for (int i = 0; i < Array.getLength(value); i++) { + collection.add(Array.get(value, i)); + } + } else if (value instanceof Collection) { + collection = (Collection) value; + } else { + logger.error("unable to process field '{}' in record : {}, {}", fieldName, record, "the value of field is not an array or collection"); + break; + } + + final List list = new ArrayList(collection.size()); + for (final Object item : collection) { + if (item instanceof Record) { + list.add(RecordUtils.toMap((Record) item, true)); + } else { + list.add(item); + } + } + document.field(fieldName, list); + break; default: document.field(fieldName, field.getRawValue()); break; } - } catch (Throwable ex) { - logger.error("unable to process a field in record : {}, {}", record, ex.toString()); + logger.error("unable to process field '{}' in record : {}, {}", fieldName, record, ex.toString()); } }); - if((geolocation[0] != 0) && (geolocation[1] != 0)){ - GeoPoint point = new GeoPoint(geolocation[0], geolocation[1]); - document.latlon("location", geolocation[0], geolocation[1]); + if((geolocation[0] != 0) && (geolocation[1] != 0)) { + document.latlon(geolocationFieldLabel, geolocation[0], geolocation[1]); } String result = Strings.toString(document.endObject()); document.flush(); + logger.trace(result); return result; } catch (Throwable ex) { logger.error("unable to convert record : {}, {}", record, ex.toString()); @@ -130,4 +168,14 @@ static String convertToString(Record record) { return null; } + /** + * Returns the conversion of a record to a map where all {@code null} values were removed. + * + * @param record the record to convert. + * + * @return the conversion of a record to a map where all {@code null} values were removed. + */ + private static Map toMap(final Record record) { + return RecordUtils.toMap(record, false); + } } diff --git a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/main/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_7_x_ClientService.java b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/main/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_7_x_ClientService.java index 1a93e0220..30f5771ec 100644 --- a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/main/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_7_x_ClientService.java +++ b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/main/java/com/hurence/logisland/service/elasticsearch/Elasticsearch_7_x_ClientService.java @@ -25,9 +25,9 @@ import com.hurence.logisland.controller.ControllerServiceInitializationContext; import com.hurence.logisland.processor.ProcessException; import com.hurence.logisland.record.Record; -import com.hurence.logisland.service.datastore.DatastoreClientServiceException; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; +import com.hurence.logisland.service.datastore.*; +import com.hurence.logisland.service.datastore.model.*; +import com.hurence.logisland.service.datastore.model.bool.*; import org.apache.commons.lang3.NotImplementedException; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpHost; @@ -36,38 +36,65 @@ import org.apache.http.client.CredentialsProvider; import org.apache.http.impl.client.BasicCredentialsProvider; import org.elasticsearch.action.ActionListener; +import org.elasticsearch.action.DocWriteRequest; +import org.elasticsearch.action.admin.cluster.health.ClusterHealthRequest; +import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest; import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; import org.elasticsearch.action.admin.indices.refresh.RefreshRequest; +import org.elasticsearch.action.admin.indices.refresh.RefreshResponse; import org.elasticsearch.action.bulk.*; -import org.elasticsearch.action.get.*; +import org.elasticsearch.action.delete.DeleteRequest; +import org.elasticsearch.action.get.GetResponse; +import org.elasticsearch.action.get.MultiGetItemResponse; +import org.elasticsearch.action.get.MultiGetRequest; +import org.elasticsearch.action.get.MultiGetResponse; import org.elasticsearch.action.index.IndexRequest; +import org.elasticsearch.action.search.MultiSearchRequest; +import org.elasticsearch.action.search.MultiSearchResponse; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.support.master.AcknowledgedResponse; -import org.elasticsearch.client.*; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestClient; +import org.elasticsearch.client.RestClientBuilder; +import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.core.CountRequest; import org.elasticsearch.client.core.CountResponse; import org.elasticsearch.client.indices.CreateIndexRequest; import org.elasticsearch.client.indices.CreateIndexResponse; import org.elasticsearch.client.indices.GetIndexRequest; import org.elasticsearch.client.indices.PutMappingRequest; +import org.elasticsearch.common.Priority; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.ByteSizeUnit; import org.elasticsearch.common.unit.ByteSizeValue; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.index.reindex.BulkByScrollResponse; +import org.elasticsearch.index.reindex.DeleteByQueryRequest; import org.elasticsearch.index.reindex.ReindexRequest; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.fetch.subphase.FetchSourceContext; - +import org.elasticsearch.search.sort.FieldSortBuilder; +import org.elasticsearch.search.sort.SortBuilder; +import org.elasticsearch.search.sort.SortBuilders; +import org.elasticsearch.search.sort.SortOrder; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import java.beans.Transient; import java.io.IOException; +import java.security.cert.X509Certificate; import java.util.*; import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.BiConsumer; +import java.util.stream.Collectors; @Tags({ "elasticsearch", "client"}) @CapabilityDescription("Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although " + @@ -77,11 +104,11 @@ public class Elasticsearch_7_x_ClientService extends AbstractControllerService implements ElasticsearchClientService { - protected volatile RestHighLevelClient esClient; + protected volatile transient RestHighLevelClient esClient; private volatile HttpHost[] esHosts; private volatile String authToken; - protected volatile BulkProcessor bulkProcessor; - protected volatile Map errors = new HashMap<>(); + protected volatile transient BulkProcessor bulkProcessor; + private String geolocationFieldLabel; @Override public List getSupportedPropertyDescriptors() { @@ -98,10 +125,12 @@ public List getSupportedPropertyDescriptors() { props.add(SAMPLER_INTERVAL); props.add(USERNAME); props.add(PASSWORD); + props.add(ENABLE_SSL); props.add(PROP_SHIELD_LOCATION); props.add(HOSTS); props.add(PROP_SSL_CONTEXT_SERVICE); props.add(CHARSET); + props.add(GEOLOCATION_FIELD_LABEL); return Collections.unmodifiableList(props); } @@ -112,6 +141,7 @@ public void init(ControllerServiceInitializationContext context) throws Initiali super.init(context); synchronized(this) { try { + shutdown(); createElasticsearchClient(context); createBulkProcessor(context); } catch (Exception e){ @@ -129,28 +159,71 @@ public void init(ControllerServiceInitializationContext context) throws Initiali * @throws ProcessException if an error occurs while creating an Elasticsearch client */ protected void createElasticsearchClient(ControllerServiceInitializationContext context) throws ProcessException { - if (esClient != null) { - return; - } - try { final String username = context.getPropertyValue(USERNAME).asString(); final String password = context.getPropertyValue(PASSWORD).asString(); final String hosts = context.getPropertyValue(HOSTS).asString(); + final boolean enableSsl = context.getPropertyValue(ENABLE_SSL).asBoolean(); + geolocationFieldLabel = context.getPropertyValue(GEOLOCATION_FIELD_LABEL).asString(); - esHosts = getEsHosts(hosts); + esHosts = getEsHosts(hosts, enableSsl); if (esHosts != null) { RestClientBuilder builder = RestClient.builder(esHosts); - if (!StringUtils.isEmpty(username) && !StringUtils.isEmpty(password)) { - final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); - credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password)); + /** + * Inspired from: + * https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/_encrypted_communication.html + * https://github.com/opendistro-for-elasticsearch/community/issues/64 + */ + + if ((!StringUtils.isEmpty(username) && !StringUtils.isEmpty(password)) || enableSsl) { builder.setHttpClientConfigCallback(httpClientBuilder -> { - return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); - }); + + if (!StringUtils.isEmpty(username) && !StringUtils.isEmpty(password)) { + // Support user/password basic auth + final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); + credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password)); + httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); + } + if (enableSsl) { + // Support SSL (ES Shield or OpenDistro) + + /** + * TODO: This current implementation does not verify the server certificate. One could + * improve this and provide support for a local truststore to check the server certificate. + * The same way, authentication to the server through local certificate is not supported + * yet. + */ + + // Create and use a trust manager accepting all server certificates + TrustManager[] acceptAllTrustManager = new TrustManager[] { new X509TrustManager() { + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return null; + } + public void checkClientTrusted(X509Certificate[] certs, String authType) { + } + + public void checkServerTrusted(X509Certificate[] certs, String authType) { + } + } }; + + SSLContext sslContext = null; + try { + sslContext = SSLContext.getInstance("SSL"); + sslContext.init(null, acceptAllTrustManager, new java.security.SecureRandom()); + } catch (Exception e) { + getLogger().error("Failed to create Elasticsearch client SSLContext due to {}", + new Object[]{e}, e); + throw new RuntimeException(e); + } + + httpClientBuilder.setSSLContext(sslContext); + } + return httpClientBuilder; + }); } esClient = new RestHighLevelClient(builder); @@ -166,9 +239,10 @@ protected void createElasticsearchClient(ControllerServiceInitializationContext * Get the ElasticSearch hosts. * * @param hosts A comma-separated list of ElasticSearch hosts (host:port,host2:port2, etc.) + * @param enableSsl Enable ssl or not * @return List of HttpHost for the ES hosts */ - private HttpHost[] getEsHosts(String hosts) { + private HttpHost[] getEsHosts(String hosts, boolean enableSsl) { if (hosts == null) { return null; @@ -182,7 +256,7 @@ private HttpHost[] getEsHosts(String hosts) { final String hostName = addresses[0].trim(); final int port = Integer.parseInt(addresses[1].trim()); - esHosts[indHost] = new HttpHost(hostName, port); + esHosts[indHost] = new HttpHost(hostName, port, enableSsl ? "https" : "http"); indHost++; } return esHosts; @@ -191,12 +265,6 @@ private HttpHost[] getEsHosts(String hosts) { protected void createBulkProcessor(ControllerServiceInitializationContext context) { - if (bulkProcessor != null) { - return; - } - - // create the bulk processor - BulkProcessor.Listener listener = new BulkProcessor.Listener() { @Override public void beforeBulk(long l, BulkRequest bulkRequest) { @@ -207,12 +275,24 @@ public void beforeBulk(long l, BulkRequest bulkRequest) { public void afterBulk(long l, BulkRequest bulkRequest, BulkResponse bulkResponse) { getLogger().debug("Executed bulk [id:{}] composed of {} actions", new Object[]{l, bulkRequest.numberOfActions()}); if (bulkResponse.hasFailures()) { - getLogger().warn("There was failures while executing bulk [id:{}]," + + getLogger().error("There was failures while executing bulk [id:{}]," + " done bulk request in {} ms with failure = {}", new Object[]{l, bulkResponse.getTook().getMillis(), bulkResponse.buildFailureMessage()}); + // For each failed doc retrieve the doc we tried to send and display original content + // with error returned by the bulkResponse + List> requests = bulkRequest.requests(); for (BulkItemResponse item : bulkResponse.getItems()) { if (item.isFailed()) { - errors.put(item.getId(), item.getFailureMessage()); + String itemId = item.getId(); + String failureMessage = item.getFailureMessage(); + for (DocWriteRequest dwr : requests) { + if (dwr.id().equals(itemId)) { + getLogger().error("\nBULK ID: " + l + + "\nDOCUMENT ID: " + itemId + + "\nERROR: " + failureMessage + + "\nORIGINAL DOCUMENT:" + dwr.toString() + "\n"); + } + } } } } @@ -285,23 +365,216 @@ public void bulkPut(String docIndex, String docType, String document, Optional document, Optional OptionalId) { - // Note: we do not support type anymore but keep it in API (method signature) for backward compatibility // purpose. So the type is ignored, even if filled. - // add it to the bulk IndexRequest request = new IndexRequest(docIndex) .source(document) .opType(IndexRequest.OpType.INDEX); - if(OptionalId.isPresent()){ + if (OptionalId.isPresent()) { request.id(OptionalId.get()); } bulkProcessor.add(request); } + @Override + public void bulkDelete(String docIndex, String docType, String id) { + DeleteRequest request = new DeleteRequest(docIndex, id); + bulkProcessor.add(request); + } + + + @Override + public void deleteByQuery(QueryRecord queryRecord) throws DatastoreClientServiceException { + String[] indices = new String[queryRecord.getCollections().size()]; + DeleteByQueryRequest request = new DeleteByQueryRequest(queryRecord.getCollections().toArray(indices)); + QueryBuilder builder = toQueryBuilder(queryRecord); + request.setQuery(builder); + if (queryRecord.getSize() >= 0) { + request.setSize(queryRecord.getSize()); + } + //TODO supporting sort, usefull only when using size. Well not needed at the moment + request.setRefresh(queryRecord.getRefresh()); + try { + BulkByScrollResponse bulkResponse = + esClient.deleteByQuery(request, RequestOptions.DEFAULT); + getLogger().info("deleted {} documents, got {} failure(s).", new Object[]{bulkResponse.getDeleted(), bulkResponse.getBulkFailures().size()}); + if (getLogger().isDebugEnabled()) { + getLogger().debug("response was {}", new Object[]{bulkResponse}); + } + } catch (IOException e) { + getLogger().error("error while deleteByQuery", e); + throw new DatastoreClientServiceException(e); + } + } + + @Override + public QueryResponseRecord queryGet(QueryRecord queryRecord) throws DatastoreClientServiceException { + final SearchRequest searchRequest = buildSearchRequest(queryRecord); + try { + SearchResponse searchRsp = esClient.search(searchRequest, RequestOptions.DEFAULT); + return buildQueryResponseRecord(searchRsp); + } catch (IOException e) { + getLogger().error("error while queryGet", e); + throw new DatastoreClientServiceException(e); + } + } + + public QueryResponseRecord buildQueryResponseRecord(SearchResponse searchRsp) { + Objects.requireNonNull(searchRsp); + if (getLogger().isTraceEnabled()) { + getLogger().trace("response was {}", new Object[]{searchRsp}); + } + if (searchRsp.getHits() != null && + searchRsp.getHits().getHits() != null && + searchRsp.getHits().getTotalHits() != null) { + long totalMatched = searchRsp.getHits().getTotalHits().value; + long totalReturned = searchRsp.getHits().getHits().length; + getLogger().info("Number of documents returned is {}, Total number of documents that matched is {}.", + new Object[]{ + totalReturned, + totalMatched + }); + List docs = new ArrayList<>(); + for (SearchHit hit : searchRsp.getHits().getHits()) { + Map responseMap = hit.getSourceAsMap(); + docs.add(new ResponseRecord(hit.getIndex(), hit.getType(), hit.getId(), responseMap)); + } + return new QueryResponseRecord(totalMatched, docs); + } + return new QueryResponseRecord(-1, Collections.emptyList()); + } + + public SearchRequest buildSearchRequest(QueryRecord queryRecord) { + //build SearchSourceBuilder + final SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + final QueryBuilder queryBuilder = toQueryBuilder(queryRecord); + searchSourceBuilder.query(queryBuilder); + if (queryRecord.getSize() >= 0) { + searchSourceBuilder.size(queryRecord.getSize()); + } + List> sortBuilders = toSortBuilders(queryRecord); + sortBuilders.forEach(searchSourceBuilder::sort); + //build SearchRequest + String[] indices = new String[queryRecord.getCollections().size()]; + return new SearchRequest(queryRecord.getCollections().toArray(indices), searchSourceBuilder); + } + + private List> toSortBuilders(QueryRecord queryRecord) { + List> sortBuilders = new ArrayList<>(); + for (SortQueryRecord sortQuery : queryRecord.getSortQueries()) { + FieldSortBuilder sortBuilder = SortBuilders.fieldSort(sortQuery.getFieldName()); + switch (sortQuery.getSortingOrder()) { + case ASC: + sortBuilder = sortBuilder.order(SortOrder.ASC); + break; + case DESC: + sortBuilder = sortBuilder.order(SortOrder.DESC); + break; + } + sortBuilders.add(sortBuilder); + } + return sortBuilders; + } + + private QueryBuilder toQueryBuilder(BoolQueryRecord boolQueryRecord) { + if (boolQueryRecord instanceof BoolQueryRecordRoot) { + return toQueryBuilder((BoolQueryRecordRoot) boolQueryRecord); + } else if (boolQueryRecord instanceof RangeQueryRecord) { + RangeQueryRecord rangeQuery = (RangeQueryRecord) boolQueryRecord; + return QueryBuilders + .rangeQuery(rangeQuery.getFieldName()) + .from(rangeQuery.getFrom(), rangeQuery.isIncludeLower()) + .to(rangeQuery.getTo(), rangeQuery.isIncludeUpper()); + } else if (boolQueryRecord instanceof TermQueryRecord) { + TermQueryRecord termQuery = (TermQueryRecord) boolQueryRecord; + return QueryBuilders.termQuery(termQuery.getFieldName(), termQuery.getFieldValue()); + } else if (boolQueryRecord instanceof WildCardQueryRecord) { + WildCardQueryRecord wildCardQuery = (WildCardQueryRecord) boolQueryRecord; + return QueryBuilders.wildcardQuery(wildCardQuery.getFieldName(), wildCardQuery.getFieldValue()); + } else { + getLogger().error("BoolQueryRecord of class " + boolQueryRecord.getClass() + " is not yet supported"); + throw new IllegalArgumentException("BoolQueryRecord of class " + boolQueryRecord.getClass() + " is not yet supported"); + } + } + + private QueryBuilder toQueryBuilder(BoolQueryRecordRoot boolQueryRoot) { + final BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); + boolQueryRoot.getChildren().forEach(node -> { + QueryBuilder query = toQueryBuilder(node.getData()); + switch (node.getBoolCondition()) { + case MUSTNOT: + boolQuery.mustNot(query); + break; + case MUST: + boolQuery.must(query); + break; + case SHOULD: + boolQuery.should(query); + break; + } + }); + return boolQuery; + } + + private QueryBuilder toQueryBuilder(QueryRecord queryRecord) { + return toQueryBuilder(queryRecord.getBoolQuery()); + } + + + /** + * Wait until specified collection is ready to be used. + */ + @Override + public void waitUntilCollectionReady(String collection, long timeoutMilli) throws DatastoreClientServiceException { + getIndexHealth(new String[]{collection}, timeoutMilli); + } + + @Override + public void waitUntilCollectionIsReadyAndRefreshIfAnyPendingTasks(String[] indices, long timeoutMilli) throws DatastoreClientServiceException { + ClusterHealthResponse rsp = getIndexHealth(indices, timeoutMilli); + if (rsp == null) { + getLogger().error("index {} seems to not be ready (query failed) !", new Object[]{indices}); + return; + } + if (rsp.isTimedOut()) { + getLogger().error("index {} is not ready !", new Object[]{indices}); + } else { + if (rsp.getNumberOfPendingTasks() != 0) { + this.refreshCollections(indices); + } + } + } + + @Override + public void refreshCollections(String[] indices) throws DatastoreClientServiceException { + try { + RefreshRequest request = new RefreshRequest(indices); + RefreshResponse rsp = esClient.indices().refresh(request, RequestOptions.DEFAULT); + getLogger().info("refresh response for indices {} is {}", new Object[]{indices, rsp.getStatus()}); + } catch (Exception e){ + throw new DatastoreClientServiceException(e); + } + } + + private ClusterHealthResponse getIndexHealth(String[] indices, long timeoutMilli) { + ClusterHealthRequest request = new ClusterHealthRequest(indices) + .timeout(TimeValue.timeValueMillis(timeoutMilli)) + .waitForGreenStatus() + .waitForEvents(Priority.LOW); + ClusterHealthResponse response = null; + try { + response = esClient.cluster().health(request, RequestOptions.DEFAULT); + getLogger().trace("health response for indices {} is {}", new Object[]{indices, response}); + } catch (Exception e) { + getLogger().error("health query failed : {}", new Object[]{e.getMessage()}); + } + return response; + } + @Override public List multiGet(List multiGetQueryRecords) throws DatastoreClientServiceException { @@ -351,29 +624,59 @@ public List multiGet(List multiGetQ } @Override - public boolean existsCollection(String indexName) throws DatastoreClientServiceException { - boolean exists; + public MultiQueryResponseRecord multiQueryGet(MultiQueryRecord queryRecords) throws DatastoreClientServiceException{ + final MultiSearchRequest multiSearchRequest = new MultiSearchRequest(); + List searchRequests = buildSearchRequests(queryRecords); + searchRequests.forEach(multiSearchRequest::add); try { - GetIndexRequest request = new GetIndexRequest(indexName); - exists = esClient.indices().exists(request, RequestOptions.DEFAULT); - } - catch (Exception e){ + MultiSearchResponse multiSearchResponse = esClient.msearch(multiSearchRequest, RequestOptions.DEFAULT); + if (getLogger().isTraceEnabled()) { + getLogger().trace("response was {}", new Object[]{multiSearchResponse}); + } + List searchResponses = new ArrayList<>(); + + if (multiSearchResponse.getResponses() != null) { + MultiSearchResponse.Item[] items = multiSearchResponse.getResponses(); + for (MultiSearchResponse.Item item : items) { + SearchResponse searchResponse = item.getResponse(); + if (searchResponse != null) { + searchResponses.add(buildQueryResponseRecord(searchResponse)); + } else { + if (item.isFailure()) { + getLogger().error("a search request failed because :\n'{}'", new Object[]{item.getFailureMessage()}); + } + } + } + } + + return new MultiQueryResponseRecord(searchResponses); + } catch (IOException e) { + getLogger().error("error while queryGet", e); throw new DatastoreClientServiceException(e); } - return exists; + } + + private List buildSearchRequests(MultiQueryRecord queryRecords) { + return queryRecords.getQueries().stream() + .map(this::buildSearchRequest) + .collect(Collectors.toList()); } @Override - public void refreshCollection(String indexName) throws DatastoreClientServiceException { + public boolean existsCollection(String indexName) throws DatastoreClientServiceException { + boolean exists; try { - RefreshRequest request = new RefreshRequest(indexName); - esClient.indices().refresh(request, RequestOptions.DEFAULT); + GetIndexRequest request = new GetIndexRequest(indexName); + exists = esClient.indices().exists(request, RequestOptions.DEFAULT); } catch (Exception e){ throw new DatastoreClientServiceException(e); } + return exists; } + + @Override public void saveSync(String indexName, String doctype, Map doc) throws Exception { IndexRequest indexRequest = new IndexRequest(indexName).source(doc); @@ -511,7 +814,7 @@ public void bulkPut(String indexName, Record record) throws DatastoreClientServi } - bulkPut(indexName, null, ElasticsearchRecordConverter.convertToString(record), Optional.of(record.getId())); + bulkPut(indexName, null, convertRecordToString(record), Optional.of(record.getId())); } @Override @@ -541,6 +844,9 @@ public long queryCount(String query) { @Override public String convertRecordToString(Record record) { + if (geolocationFieldLabel != null) { + return ElasticsearchRecordConverter.convertToString(record, geolocationFieldLabel); + } return ElasticsearchRecordConverter.convertToString(record); } diff --git a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/test/java/com/hurence/logisland/service/elasticsearch/ElasticsearchRecordConverterTest.java b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/test/java/com/hurence/logisland/service/elasticsearch/ElasticsearchRecordConverterTest.java index 1bec3c378..98b7ddeaf 100644 --- a/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/test/java/com/hurence/logisland/service/elasticsearch/ElasticsearchRecordConverterTest.java +++ b/logisland-components/logisland-services/logisland-service-elasticsearch/logisland-service-elasticsearch_7_x-client/src/test/java/com/hurence/logisland/service/elasticsearch/ElasticsearchRecordConverterTest.java @@ -18,14 +18,20 @@ import com.hurence.logisland.record.FieldType; import com.hurence.logisland.record.Record; import com.hurence.logisland.record.StandardRecord; +import org.apache.commons.collections.map.HashedMap; import org.junit.Assert; import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Map; public class ElasticsearchRecordConverterTest { + private static Logger logger = LoggerFactory.getLogger(ElasticsearchRecordConverterTest.class); + @Test public void testBasics() throws Exception { - Record record = new StandardRecord("factory") .setId("Modane") .setStringField("address", "rue du Frejus") @@ -34,9 +40,157 @@ public void testBasics() throws Exception { String convertedRecord = ElasticsearchRecordConverter.convertToString(record); - System.out.println(convertedRecord); + logger.info("record is '{}'", record); + logger.info("convertedRecord is '{}'", convertedRecord); // Verify the index does not exist Assert.assertEquals(true, convertedRecord.contains("location")); } + + @Test + public void testArraySimple() throws Exception { + Record record = new StandardRecord("test") + .setId("simple array") + .setStringField("address", "rue du Frejus") + .setField("stringArray", FieldType.ARRAY, new String[]{"hi", "han"}) + .setField("intArray", FieldType.ARRAY, new int[]{1, 2}) + .setField("longArray", FieldType.ARRAY, new long[]{1, 2}) + .setField("doubleArray", FieldType.ARRAY, new double[]{1.12, 2.12}) + .setField("floatArray", FieldType.ARRAY, new float[]{1.12f, 2.12f}) + .setField("byteArray", FieldType.ARRAY, new byte[]{45, 35}); + + String convertedRecord = ElasticsearchRecordConverter.convertToString(record); + logger.info("record is '{}'", record); + logger.info("convertedRecord is '{}'", convertedRecord); + } + + + @Test + public void testMap() throws Exception { + Map map = new HashedMap(); + map.put("key1", "value1"); + map.put("key2", "value2"); + Map nestedMap = new HashedMap(); + nestedMap.put("key1", "value1"); + nestedMap.put("key2", map); + + Record record = new StandardRecord("test") + .setId("simple array") + .setStringField("address", "rue du Frejus") + .setField("simpleMap", FieldType.MAP, map) + .setField("nestedMap", FieldType.MAP, nestedMap); + + String convertedRecord = ElasticsearchRecordConverter.convertToString(record); + logger.info("record is '{}'", record); + logger.info("convertedRecord is '{}'", convertedRecord); + } + + @Test + public void testObject() throws Exception { + //TODO currently not working but not really necessary is it ? + Object object = new ElasticsearchRecordConverter(); + + Record record = new StandardRecord("test") + .setId("simple array") + .setStringField("address", "rue du Frejus") + .setField("Object", FieldType.OBJECT, object); + + String convertedRecord = ElasticsearchRecordConverter.convertToString(record); + logger.info("record is '{}'", record); + logger.info("convertedRecord is '{}'", convertedRecord); + } + + @Test + public void testRecord() throws Exception { + Record nestedRecord = new StandardRecord("factory") + .setId("Modane") + .setStringField("address", "rue du Frejus") + .setField("latitude", FieldType.FLOAT, 45.4f) + .setField("longitude", FieldType.FLOAT, 41.4f); + + Record nestedNestedRecord = new StandardRecord("factory") + .setId("Modane") + .setField("latitude", FieldType.FLOAT, 45.4f) + .setField("longitude", FieldType.RECORD, nestedRecord); + + Record record = new StandardRecord("test") + .setId("simple array") + .setStringField("address", "rue du Frejus") + .setField("Record", FieldType.RECORD, nestedRecord) + .setField("RecordNested", FieldType.RECORD, nestedNestedRecord); + + String convertedRecord = ElasticsearchRecordConverter.convertToString(record); + logger.info("record is '{}'", record); + logger.info("convertedRecord is '{}'", convertedRecord); + } + + @Test + public void testMapArray() throws Exception { + Map map = new HashedMap(); + map.put("key1", "value1"); + map.put("key2", "value2"); + Map nestedMap = new HashedMap(); + nestedMap.put("key1", "value1"); + nestedMap.put("key2", map); + Map nestedMap2 = new HashedMap(); + nestedMap.put("key12", "value2"); + nestedMap.put("key2", map); + Record record = new StandardRecord("test") + .setId("simple array") + .setStringField("address", "rue du Frejus") + .setField("MapArray", FieldType.ARRAY, new Map[]{nestedMap, nestedMap2}); + + String convertedRecord = ElasticsearchRecordConverter.convertToString(record); + logger.info("record is '{}'", record); + logger.info("convertedRecord is '{}'", convertedRecord); + } + + @Test + public void testRecordArray() throws Exception { + Record nestedRecord = new StandardRecord("factory") + .setId("Modane") + .setStringField("address", "rue du Frejus") + .setField("latitude", FieldType.FLOAT, 45.4f) + .setField("longitude", FieldType.FLOAT, 41.4f); + + Record nestedNestedRecord = new StandardRecord("factory") + .setId("Modane") + .setField("latitude", FieldType.FLOAT, 45.4f) + .setField("nestedRecord", FieldType.RECORD, nestedRecord); + + Record nestedNestedRecord2 = new StandardRecord("factory") + .setId("Modane") + .setField("latitude2", FieldType.FLOAT, 45.4f) + .setField("nestedRecord2", FieldType.RECORD, nestedRecord); + + Record record = new StandardRecord("test") + .setId("simple array") + .setStringField("address", "rue du Frejus") + .setField("latitude", FieldType.FLOAT, 45.4f) + .setField("longitude", FieldType.FLOAT, 41.4f) + .setField("RecordArray", FieldType.ARRAY, new Record[]{nestedNestedRecord, nestedNestedRecord2}); + + String convertedRecord = ElasticsearchRecordConverter.convertToString(record); + logger.info("record is '{}'", record); + logger.info("convertedRecord is '{}'", convertedRecord); + } + +// @Test +// public void aaa() throws IOException { +// Record record = new StandardRecord("test") +// .setId("simple array") +// .setStringField("address", "rue du Frejus") +// .setField("MapArray", FieldType.ARRAY, new String[]{"hi", "han"}) +// .setField("RecordArray", FieldType.ARRAY, new String[]{"hi", "han"}); +// +// final XContentBuilder document = jsonBuilder(); +// document.startObject(); +// document.field("hi", "han"); +// document.field("record", record); +// document.endObject(); +// String result = Strings.toString(document); +// document.flush(); +// logger.info("convertedRecord is '{}'", result); +// } } + diff --git a/logisland-components/logisland-services/logisland-service-elasticsearch/pom.xml b/logisland-components/logisland-services/logisland-service-elasticsearch/pom.xml index dca2b5e89..6454406f0 100644 --- a/logisland-components/logisland-services/logisland-service-elasticsearch/pom.xml +++ b/logisland-components/logisland-services/logisland-service-elasticsearch/pom.xml @@ -22,7 +22,7 @@ com.hurence.logisland logisland-services - 1.3.0 + 1.4.0 logisland-service-elasticsearch diff --git a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase-api/pom.xml b/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase-api/pom.xml deleted file mode 100644 index 6626c6503..000000000 --- a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase-api/pom.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - 4.0.0 - - - com.hurence.logisland - logisland-service-hbase - 1.3.0 - - - logisland-service-hbase-api - Logisland Hbase Service API - Hbase service api for logisland - jar - - - - - com.hurence.logisland - logisland-api - ${project.version} - provided - - - com.hurence.logisland - logisland-utils - ${project.version} - provided - - - - diff --git a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase-api/src/main/java/com/hurence/logisland/service/hbase/HBaseClientService.java b/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase-api/src/main/java/com/hurence/logisland/service/hbase/HBaseClientService.java deleted file mode 100644 index 3bd1a8992..000000000 --- a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase-api/src/main/java/com/hurence/logisland/service/hbase/HBaseClientService.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.service.hbase; - - -import com.hurence.logisland.annotation.documentation.CapabilityDescription; -import com.hurence.logisland.annotation.documentation.Tags; -import com.hurence.logisland.component.PropertyDescriptor; -import com.hurence.logisland.controller.ControllerService; -import com.hurence.logisland.service.hbase.put.PutColumn; -import com.hurence.logisland.service.hbase.put.PutRecord; -import com.hurence.logisland.service.hbase.scan.Column; -import com.hurence.logisland.service.hbase.scan.ResultHandler; -import com.hurence.logisland.service.hbase.validate.ConfigFilesValidator; -import com.hurence.logisland.validator.StandardValidators; - -import java.io.IOException; -import java.util.Collection; - -@Tags({"hbase", "client"}) -@CapabilityDescription("A controller service for accessing an HBase client.") -public interface HBaseClientService extends ControllerService { - - PropertyDescriptor HADOOP_CONF_FILES = new PropertyDescriptor.Builder() - .name("hadoop.configuration.files") - .description("Comma-separated list of Hadoop Configuration files," + - " such as hbase-site.xml and core-site.xml for kerberos, " + - "including full paths to the files.") - .addValidator(new ConfigFilesValidator()) - .build(); - - PropertyDescriptor ZOOKEEPER_QUORUM = new PropertyDescriptor.Builder() - .name("zookeeper.quorum") - .description("Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.") - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .build(); - - PropertyDescriptor ZOOKEEPER_CLIENT_PORT = new PropertyDescriptor.Builder() - .name("zookeeper.client.port") - .description("The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.") - .addValidator(StandardValidators.PORT_VALIDATOR) - .build(); - - PropertyDescriptor ZOOKEEPER_ZNODE_PARENT = new PropertyDescriptor.Builder() - .name("zookeeper.znode.parent") - .description("The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.") - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .build(); - - PropertyDescriptor HBASE_CLIENT_RETRIES = new PropertyDescriptor.Builder() - .name("hbase.client.retries") - .description("The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.") - .addValidator(StandardValidators.POSITIVE_INTEGER_VALIDATOR) - .defaultValue("3") - .build(); - - PropertyDescriptor PHOENIX_CLIENT_JAR_LOCATION = new PropertyDescriptor.Builder() - .name("phoenix.client.jar.location") - .description("The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.") - .addValidator(StandardValidators.FILE_EXISTS_VALIDATOR) - .expressionLanguageSupported(true) - // .dynamicallyModifiesClasspath(true) - .build(); - - /** - * Puts a batch of mutations to the given table. - * - * @param tableName the name of an HBase table - * @param puts a list of put mutations for the given table - * @throws IOException thrown when there are communication errors with HBase - */ - void put(String tableName, Collection puts) throws IOException; - - /** - * Puts the given row to HBase with the provided columns. - * - * @param tableName the name of an HBase table - * @param rowId the id of the row to put - * @param columns the columns of the row to put - * @throws IOException thrown when there are communication errors with HBase - */ - void put(String tableName, byte[] rowId, Collection columns) throws IOException; - - /** - * Scans the given table using the optional filter criteria and passing each result to the provided handler. - * - * @param tableName the name of an HBase table to scan - * @param columns optional columns to return, if not specified all columns are returned - * @param filterExpression optional filter expression, if not specified no filtering is performed - * @param minTime the minimum timestamp of cells to return, passed to the HBase scanner timeRange - * @param handler a handler to process rows of the result set - * @throws IOException thrown when there are communication errors with HBase - */ - void scan(String tableName, Collection columns, String filterExpression, long minTime, ResultHandler handler) throws IOException; - - /** - * Scans the given table for the given rowId and passes the result to the handler. - * - * @param tableName the name of an HBase table to scan - * @param startRow the row identifier to start scanning at - * @param endRow the row identifier to end scanning at - * @param columns optional columns to return, if not specified all columns are returned - * @param handler a handler to process rows of the result - * @throws IOException thrown when there are communication errors with HBase - */ - void scan(String tableName, byte[] startRow, byte[] endRow, Collection columns, ResultHandler handler) throws IOException; - - /** - * Converts the given boolean to it's byte representation. - * - * @param b a boolean - * @return the boolean represented as bytes - */ - byte[] toBytes(boolean b); - - /** - * Converts the given long to it's byte representation. - * - * @param l a long - * @return the long represented as bytes - */ - byte[] toBytes(long l); - - /** - * Converts the given double to it's byte representation. - * - * @param d a double - * @return the double represented as bytes - */ - byte[] toBytes(double d); - - /** - * Converts the given string to it's byte representation. - * - * @param s a string - * @return the string represented as bytes - */ - byte[] toBytes(String s); - - /** - * Converts the given binary formatted string to a byte representation - * @param s a binary encoded string - * @return the string represented as bytes - */ - byte[] toBytesBinary(String s); - -} diff --git a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase-api/src/main/java/com/hurence/logisland/service/hbase/put/PutColumn.java b/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase-api/src/main/java/com/hurence/logisland/service/hbase/put/PutColumn.java deleted file mode 100644 index 4862511be..000000000 --- a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase-api/src/main/java/com/hurence/logisland/service/hbase/put/PutColumn.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.service.hbase.put; - -/** - * Encapsulates the information for one column of a put operation. - */ -public class PutColumn { - - private final byte[] columnFamily; - private final byte[] columnQualifier; - private final byte[] buffer; - - - public PutColumn(final byte[] columnFamily, final byte[] columnQualifier, final byte[] buffer) { - this.columnFamily = columnFamily; - this.columnQualifier = columnQualifier; - this.buffer = buffer; - } - - public byte[] getColumnFamily() { - return columnFamily; - } - - public byte[] getColumnQualifier() { - return columnQualifier; - } - - public byte[] getBuffer() { - return buffer; - } - -} diff --git a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase-api/src/main/java/com/hurence/logisland/service/hbase/put/PutRecord.java b/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase-api/src/main/java/com/hurence/logisland/service/hbase/put/PutRecord.java deleted file mode 100644 index 647e175ed..000000000 --- a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase-api/src/main/java/com/hurence/logisland/service/hbase/put/PutRecord.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.service.hbase.put; - - -import com.hurence.logisland.record.Record; - -import java.util.Collection; - -/** - * Wrapper to encapsulate all of the information for the Put along with the Record. - */ -public class PutRecord { - - private final String tableName; - private final byte[] row; - private final Collection columns; - private final Record record; - - public PutRecord(String tableName, byte[] row, Collection columns, Record record) { - this.tableName = tableName; - this.row = row; - this.columns = columns; - this.record = record; - } - - public String getTableName() { - return tableName; - } - - public byte[] getRow() { - return row; - } - - public Collection getColumns() { - return columns; - } - - public Record getRecord() { - return record; - } - - public boolean isValid() { - if (tableName == null || tableName.trim().isEmpty() || null == row || record == null || columns == null || columns.isEmpty()) { - return false; - } - - for (PutColumn column : columns) { - if (null == column.getColumnQualifier() || null == column.getColumnFamily() || column.getBuffer() == null) { - return false; - } - } - - return true; - } - -} diff --git a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase-api/src/main/java/com/hurence/logisland/service/hbase/scan/Column.java b/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase-api/src/main/java/com/hurence/logisland/service/hbase/scan/Column.java deleted file mode 100644 index 36d2c28ba..000000000 --- a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase-api/src/main/java/com/hurence/logisland/service/hbase/scan/Column.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.service.hbase.scan; - -import java.util.Arrays; - -/** - * Wrapper to encapsulate a column family and qualifier. - */ -public class Column { - - private final byte[] family; - private final byte[] qualifier; - - public Column(byte[] family, byte[] qualifier) { - this.family = family; - this.qualifier = qualifier; - } - - public byte[] getFamily() { - return family; - } - - public byte[] getQualifier() { - return qualifier; - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof Column)) { - return false; - } - - final Column other = (Column) obj; - return ((this.family == null && other.family == null) - || (this.family != null && other.family != null && Arrays.equals(this.family, other.family))) - && ((this.qualifier == null && other.qualifier == null) - || (this.qualifier != null && other.qualifier != null && Arrays.equals(this.qualifier, other.qualifier))); - } - - @Override - public int hashCode() { - int result = 37; - if (family != null) { - for (byte b : family) { - result += (int)b; - } - } - if (qualifier != null) { - for (byte b : qualifier) { - result += (int)b; - } - } - return result; - } - -} diff --git a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase-api/src/main/java/com/hurence/logisland/service/hbase/scan/ResultCell.java b/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase-api/src/main/java/com/hurence/logisland/service/hbase/scan/ResultCell.java deleted file mode 100644 index 3847358f6..000000000 --- a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase-api/src/main/java/com/hurence/logisland/service/hbase/scan/ResultCell.java +++ /dev/null @@ -1,187 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.service.hbase.scan; - -public class ResultCell { - - byte[] rowArray; - int rowOffset; - short rowLength; - - byte[] familyArray; - int familyOffset; - byte familyLength; - - byte[] qualifierArray; - int qualifierOffset; - int qualifierLength; - - long timestamp; - byte typeByte; - long sequenceId; - - byte[] valueArray; - int valueOffset; - int valueLength; - - byte[] tagsArray; - int tagsOffset; - int tagsLength; - - public byte[] getRowArray() { - return rowArray; - } - - public void setRowArray(byte[] rowArray) { - this.rowArray = rowArray; - } - - public int getRowOffset() { - return rowOffset; - } - - public void setRowOffset(int rowOffset) { - this.rowOffset = rowOffset; - } - - public short getRowLength() { - return rowLength; - } - - public void setRowLength(short rowLength) { - this.rowLength = rowLength; - } - - public byte[] getFamilyArray() { - return familyArray; - } - - public void setFamilyArray(byte[] familyArray) { - this.familyArray = familyArray; - } - - public int getFamilyOffset() { - return familyOffset; - } - - public void setFamilyOffset(int familyOffset) { - this.familyOffset = familyOffset; - } - - public byte getFamilyLength() { - return familyLength; - } - - public void setFamilyLength(byte familyLength) { - this.familyLength = familyLength; - } - - public byte[] getQualifierArray() { - return qualifierArray; - } - - public void setQualifierArray(byte[] qualifierArray) { - this.qualifierArray = qualifierArray; - } - - public int getQualifierOffset() { - return qualifierOffset; - } - - public void setQualifierOffset(int qualifierOffset) { - this.qualifierOffset = qualifierOffset; - } - - public int getQualifierLength() { - return qualifierLength; - } - - public void setQualifierLength(int qualifierLength) { - this.qualifierLength = qualifierLength; - } - - public long getTimestamp() { - return timestamp; - } - - public void setTimestamp(long timestamp) { - this.timestamp = timestamp; - } - - public byte getTypeByte() { - return typeByte; - } - - public void setTypeByte(byte typeByte) { - this.typeByte = typeByte; - } - - public long getSequenceId() { - return sequenceId; - } - - public void setSequenceId(long sequenceId) { - this.sequenceId = sequenceId; - } - - public byte[] getValueArray() { - return valueArray; - } - - public void setValueArray(byte[] valueArray) { - this.valueArray = valueArray; - } - - public int getValueOffset() { - return valueOffset; - } - - public void setValueOffset(int valueOffset) { - this.valueOffset = valueOffset; - } - - public int getValueLength() { - return valueLength; - } - - public void setValueLength(int valueLength) { - this.valueLength = valueLength; - } - - public byte[] getTagsArray() { - return tagsArray; - } - - public void setTagsArray(byte[] tagsArray) { - this.tagsArray = tagsArray; - } - - public int getTagsOffset() { - return tagsOffset; - } - - public void setTagsOffset(int tagsOffset) { - this.tagsOffset = tagsOffset; - } - - public int getTagsLength() { - return tagsLength; - } - - public void setTagsLength(int tagsLength) { - this.tagsLength = tagsLength; - } -} diff --git a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase-api/src/main/java/com/hurence/logisland/service/hbase/validate/ConfigFilesValidator.java b/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase-api/src/main/java/com/hurence/logisland/service/hbase/validate/ConfigFilesValidator.java deleted file mode 100644 index 3f13824f4..000000000 --- a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase-api/src/main/java/com/hurence/logisland/service/hbase/validate/ConfigFilesValidator.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.service.hbase.validate; - - -import com.hurence.logisland.validator.StandardValidators; -import com.hurence.logisland.validator.ValidationResult; -import com.hurence.logisland.validator.Validator; - -public class ConfigFilesValidator implements Validator { - - @Override - public ValidationResult validate(final String subject, final String value) { - final String[] filenames = value.split(","); - for (final String filename : filenames) { - final ValidationResult result = StandardValidators.FILE_EXISTS_VALIDATOR.validate(subject, filename.trim()); - if (!result.isValid()) { - return result; - } - } - - return new ValidationResult.Builder().subject(subject).input(value).valid(true).build(); - } -} diff --git a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/pom.xml b/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/pom.xml deleted file mode 100644 index a81dbcd71..000000000 --- a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/pom.xml +++ /dev/null @@ -1,160 +0,0 @@ - - - - 4.0.0 - - - com.hurence.logisland - logisland-service-hbase - 1.3.0 - - - logisland-service-hbase_1_1_2-client - HBase 1.1.2 Plugin - Implement some manipulations on an hbase database. - jar - - - - - org.apache.hbase - hbase-client - 1.1.2.2.4.0.0-169 - - - - jdk.tools - jdk.tools - - - com.google.guava - guava - - - - - com.github.stephenc.findbugs - findbugs-annotations - 1.3.9-1 - - - org.apache.commons - commons-lang3 - 3.4 - - - xml-apis - xml-apis - 1.4.01 - - - com.hurence.logisland - logisland-api - ${project.version} - - - com.hurence.logisland - logisland-service-hbase-api - ${project.version} - - - - - org.slf4j - slf4j-simple - 1.7.5 - test - - - junit - junit - 4.13.1 - test - - - org.mockito - mockito-core - 2.15.0 - test - - - com.hurence.logisland - logisland-utils - ${project.version} - test - - - - org.apache.hbase - hbase-client - 1.1.2.2.4.0.0-169 - - - - jdk.tools - jdk.tools - - - test - - - com.hurence.logisland - logisland-hadoop-utils - 1.1.2 - - - org.apache.hbase - hbase-common - 1.1.2.2.4.0.0-169 - compile - - - org.apache.hbase - hbase-client - 1.1.2.2.4.0.0-169 - compile - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - package - - - - - com.hurence.logisland - logisland-maven-plugin - - - package - - - - - org.apache.hadoop.* - - - - - - diff --git a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/main/java/com/hurence/logisland/service/hbase/HBase_1_1_2_ClientService.java b/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/main/java/com/hurence/logisland/service/hbase/HBase_1_1_2_ClientService.java deleted file mode 100644 index 00edf0e77..000000000 --- a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/main/java/com/hurence/logisland/service/hbase/HBase_1_1_2_ClientService.java +++ /dev/null @@ -1,490 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.service.hbase; - -import com.hurence.logisland.annotation.behavior.DynamicProperty; -import com.hurence.logisland.annotation.documentation.CapabilityDescription; -import com.hurence.logisland.annotation.documentation.Category; -import com.hurence.logisland.annotation.documentation.ComponentCategory; -import com.hurence.logisland.annotation.documentation.Tags; -import com.hurence.logisland.annotation.lifecycle.OnDisabled; -import com.hurence.logisland.annotation.lifecycle.OnEnabled; -import com.hurence.logisland.component.InitializationException; -import com.hurence.logisland.component.PropertyDescriptor; -import com.hurence.logisland.controller.AbstractControllerService; -import com.hurence.logisland.controller.ControllerServiceInitializationContext; -import com.hurence.logisland.service.hbase.put.PutColumn; -import com.hurence.logisland.service.hbase.put.PutRecord; -import com.hurence.logisland.service.hbase.scan.Column; -import com.hurence.logisland.service.hbase.scan.ResultCell; -import com.hurence.logisland.service.hbase.scan.ResultHandler; -import com.hurence.logisland.service.hbase.security.KerberosProperties; -import com.hurence.logisland.service.hbase.security.KerberosTicketRenewer; -import com.hurence.logisland.service.hbase.security.SecurityUtil; -import com.hurence.logisland.validator.StandardValidators; -import com.hurence.logisland.validator.ValidationContext; -import com.hurence.logisland.validator.ValidationResult; -import org.apache.commons.lang3.StringUtils; -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.fs.Path; -import org.apache.hadoop.hbase.Cell; -import org.apache.hadoop.hbase.HBaseConfiguration; -import org.apache.hadoop.hbase.TableName; -import org.apache.hadoop.hbase.client.Admin; -import org.apache.hadoop.hbase.client.Connection; -import org.apache.hadoop.hbase.client.ConnectionFactory; -import org.apache.hadoop.hbase.client.Put; -import org.apache.hadoop.hbase.client.Result; -import org.apache.hadoop.hbase.client.ResultScanner; -import org.apache.hadoop.hbase.client.Scan; -import org.apache.hadoop.hbase.client.Table; -import org.apache.hadoop.hbase.filter.Filter; -import org.apache.hadoop.hbase.filter.ParseFilter; -import org.apache.hadoop.hbase.util.Bytes; -import org.apache.hadoop.security.UserGroupInformation; - - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.security.PrivilegedExceptionAction; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicReference; - -@Category(ComponentCategory.DATASTORE) -@Tags({ "hbase", "client"}) -@CapabilityDescription("Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing " + - "a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files " + - "are provided, they will be loaded first, and the values of the additional properties will override the values from " + - "the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase " + - "configuration.") -@DynamicProperty(name="The name of an HBase configuration property.", value="The value of the given HBase configuration property.", - description="These properties will be set on the HBase configuration after loading any provided configuration files.") -public class HBase_1_1_2_ClientService extends AbstractControllerService implements HBaseClientService { - - static final String HBASE_CONF_ZK_QUORUM = "hbase.zookeeper.quorum"; - static final String HBASE_CONF_ZK_PORT = "hbase.zookeeper.property.clientPort"; - static final String HBASE_CONF_ZNODE_PARENT = "zookeeper.znode.parent"; - static final String HBASE_CONF_CLIENT_RETRIES = "hbase.client.retries.number"; - - static final long TICKET_RENEWAL_PERIOD = 60000; - - private volatile Connection connection; - private volatile UserGroupInformation ugi; - private volatile KerberosTicketRenewer renewer; - - private KerberosProperties kerberosProperties; - private volatile File kerberosConfigFile = null; - - // Holder of cached Configuration information so validation does not reload the same config over and over - private final AtomicReference validationResourceHolder = new AtomicReference<>(); - - @Override - @OnEnabled - public void init(ControllerServiceInitializationContext context) throws InitializationException { - super.init(context); - try { - kerberosConfigFile = context.getKerberosConfigurationFile(); - kerberosProperties = getKerberosProperties(kerberosConfigFile); - - this.connection = createConnection(context); - - // connection check - if (this.connection != null) { - final Admin admin = this.connection.getAdmin(); - if (admin != null) { - admin.listTableNames(); - } - - // if we got here then we have a successful connection, so if we have a ugi then start a renewer - if (ugi != null) { - final String id = getClass().getSimpleName(); - renewer = SecurityUtil.startTicketRenewalThread(id, ugi, TICKET_RENEWAL_PERIOD, getLogger()); - } - } - }catch (Exception e){ - throw new InitializationException(e); - } - } - - protected KerberosProperties getKerberosProperties(File kerberosConfigFile) { - return new KerberosProperties(kerberosConfigFile); - } - - @Override - public List getSupportedPropertyDescriptors() { - - List props = new ArrayList<>(); - props.add(HADOOP_CONF_FILES); - props.add(ZOOKEEPER_QUORUM); - props.add(ZOOKEEPER_CLIENT_PORT); - props.add(ZOOKEEPER_ZNODE_PARENT); - props.add(HBASE_CLIENT_RETRIES); - props.add(PHOENIX_CLIENT_JAR_LOCATION); - return Collections.unmodifiableList(props); - } - - @Override - protected PropertyDescriptor getSupportedDynamicPropertyDescriptor(String propertyDescriptorName) { - return new PropertyDescriptor.Builder() - .description("Specifies the value for '" + propertyDescriptorName + "' in the HBase configuration.") - .name(propertyDescriptorName) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .dynamic(true) - .build(); - } - - @Override - protected Collection customValidate(ValidationContext validationContext) { - boolean confFileProvided = validationContext.getPropertyValue(HADOOP_CONF_FILES).isSet(); - boolean zkQuorumProvided = validationContext.getPropertyValue(ZOOKEEPER_QUORUM).isSet(); - boolean zkPortProvided = validationContext.getPropertyValue(ZOOKEEPER_CLIENT_PORT).isSet(); - boolean znodeParentProvided = validationContext.getPropertyValue(ZOOKEEPER_ZNODE_PARENT).isSet(); - boolean retriesProvided = validationContext.getPropertyValue(HBASE_CLIENT_RETRIES).isSet(); - - final List problems = new ArrayList<>(); - - if (!confFileProvided && (!zkQuorumProvided || !zkPortProvided || !znodeParentProvided || !retriesProvided)) { - problems.add(new ValidationResult.Builder() - .valid(false) - .subject(this.getClass().getSimpleName()) - .explanation("ZooKeeper Quorum, ZooKeeper Client Port, ZooKeeper ZNode Parent, and HBase Client Retries are required " + - "when Hadoop Configuration Files are not provided.") - .build()); - } - - if (confFileProvided) { - final String configFiles = validationContext.getPropertyValue(HADOOP_CONF_FILES).asString(); - ValidationResources resources = validationResourceHolder.get(); - - // if no resources in the holder, or if the holder has different resources loaded, - // then load the Configuration and set the new resources in the holder - if (resources == null || !configFiles.equals(resources.getConfigResources())) { - getLogger().debug("Reloading validation resources"); - resources = new ValidationResources(configFiles, getConfigurationFromFiles(configFiles)); - validationResourceHolder.set(resources); - } - - final Configuration hbaseConfig = resources.getConfiguration(); - final String principal = validationContext.getPropertyValue(kerberosProperties.getKerberosPrincipal()).asString(); - final String keytab = validationContext.getPropertyValue(kerberosProperties.getKerberosKeytab()).asString(); - - problems.addAll(KerberosProperties.validatePrincipalAndKeytab( - this.getClass().getSimpleName(), hbaseConfig, principal, keytab, getLogger())); - } - - return problems; - } - - - protected Connection createConnection(final ControllerServiceInitializationContext context) throws IOException, InterruptedException { - final String configFiles = context.getPropertyValue(HADOOP_CONF_FILES).asString(); - final Configuration hbaseConfig = getConfigurationFromFiles(configFiles); - - // override with any properties that are provided - if (context.getPropertyValue(ZOOKEEPER_QUORUM).isSet()) { - hbaseConfig.set(HBASE_CONF_ZK_QUORUM, context.getPropertyValue(ZOOKEEPER_QUORUM).asString()); - } - if (context.getPropertyValue(ZOOKEEPER_CLIENT_PORT).isSet()) { - hbaseConfig.set(HBASE_CONF_ZK_PORT, context.getPropertyValue(ZOOKEEPER_CLIENT_PORT).asString()); - } - if (context.getPropertyValue(ZOOKEEPER_ZNODE_PARENT).isSet()) { - hbaseConfig.set(HBASE_CONF_ZNODE_PARENT, context.getPropertyValue(ZOOKEEPER_ZNODE_PARENT).asString()); - } - if (context.getPropertyValue(HBASE_CLIENT_RETRIES).isSet()) { - hbaseConfig.setInt(HBASE_CONF_CLIENT_RETRIES, context.getPropertyValue(HBASE_CLIENT_RETRIES).asInteger()); - } - - // add any dynamic properties to the HBase configuration - for (final Map.Entry entry : context.getProperties().entrySet()) { - final PropertyDescriptor descriptor = entry.getKey(); - if (descriptor.isDynamic()) { - hbaseConfig.set(descriptor.getName(), entry.getValue()); - } - } - - if (SecurityUtil.isSecurityEnabled(hbaseConfig)) { - final String principal = context.getPropertyValue(kerberosProperties.getKerberosPrincipal()).asString(); - final String keyTab = context.getPropertyValue(kerberosProperties.getKerberosKeytab()).asString(); - - getLogger().info("HBase Security Enabled, logging in as principal {} with keytab {}", new Object[] {principal, keyTab}); - ugi = SecurityUtil.loginKerberos(hbaseConfig, principal, keyTab); - getLogger().info("Successfully logged in as principal {} with keytab {}", new Object[] {principal, keyTab}); - - return ugi.doAs(new PrivilegedExceptionAction() { - @Override - public Connection run() throws Exception { - return ConnectionFactory.createConnection(hbaseConfig); - } - }); - - } else { - getLogger().info("Simple Authentication"); - return ConnectionFactory.createConnection(hbaseConfig); - } - - } - - protected Configuration getConfigurationFromFiles(final String configFiles) { - final Configuration hbaseConfig = HBaseConfiguration.create(); - if (StringUtils.isNotBlank(configFiles)) { - for (final String configFile : configFiles.split(",")) { - hbaseConfig.addResource(new Path(configFile.trim())); - } - } - return hbaseConfig; - } - - @OnDisabled - public void shutdown() { - if (renewer != null) { - renewer.stop(); - } - - if (connection != null) { - try { - connection.close(); - } catch (final IOException ioe) { - getLogger().warn("Failed to close connection to HBase due to {}", new Object[]{ioe}); - } - } - } - - @Override - public void put(final String tableName, final Collection puts) throws IOException { - try (final Table table = connection.getTable(TableName.valueOf(tableName))) { - // Create one Put per row.... - final Map rowPuts = new HashMap<>(); - for (final PutRecord putFlowFile : puts) { - //this is used for the map key as a byte[] does not work as a key. - final String rowKeyString = new String(putFlowFile.getRow(), StandardCharsets.UTF_8); - Put put = rowPuts.get(rowKeyString); - if (put == null) { - put = new Put(putFlowFile.getRow()); - rowPuts.put(rowKeyString, put); - } - - for (final PutColumn column : putFlowFile.getColumns()) { - put.addColumn( - column.getColumnFamily(), - column.getColumnQualifier(), - column.getBuffer()); - } - } - - table.put(new ArrayList<>(rowPuts.values())); - } - } - - @Override - public void put(final String tableName, final byte[] rowId, final Collection columns) throws IOException { - try (final Table table = connection.getTable(TableName.valueOf(tableName))) { - Put put = new Put(rowId); - for (final PutColumn column : columns) { - put.addColumn( - column.getColumnFamily(), - column.getColumnQualifier(), - column.getBuffer()); - } - table.put(put); - } - } - - @Override - public void scan(final String tableName, final Collection columns, final String filterExpression, final long minTime, final ResultHandler handler) - throws IOException { - - Filter filter = null; - if (!StringUtils.isBlank(filterExpression)) { - ParseFilter parseFilter = new ParseFilter(); - filter = parseFilter.parseFilterString(filterExpression); - } - - try (final Table table = connection.getTable(TableName.valueOf(tableName)); - final ResultScanner scanner = getResults(table, columns, filter, minTime)) { - - for (final Result result : scanner) { - final byte[] rowKey = result.getRow(); - final Cell[] cells = result.rawCells(); - - if (cells == null) { - continue; - } - - // convert HBase cells to NiFi cells - final ResultCell[] resultCells = new ResultCell[cells.length]; - for (int i=0; i < cells.length; i++) { - final Cell cell = cells[i]; - final ResultCell resultCell = getResultCell(cell); - resultCells[i] = resultCell; - } - - // delegate to the handler - handler.handle(rowKey, resultCells); - } - } - } - - @Override - public void scan(final String tableName, final byte[] startRow, final byte[] endRow, final Collection columns, final ResultHandler handler) - throws IOException { - - try (final Table table = connection.getTable(TableName.valueOf(tableName)); - final ResultScanner scanner = getResults(table, startRow, endRow, columns)) { - - for (final Result result : scanner) { - final byte[] rowKey = result.getRow(); - final Cell[] cells = result.rawCells(); - - if (cells == null) { - continue; - } - - // convert HBase cells to NiFi cells - final ResultCell[] resultCells = new ResultCell[cells.length]; - for (int i=0; i < cells.length; i++) { - final Cell cell = cells[i]; - final ResultCell resultCell = getResultCell(cell); - resultCells[i] = resultCell; - } - - // delegate to the handler - handler.handle(rowKey, resultCells); - } - } - } - - // protected and extracted into separate method for testing - protected ResultScanner getResults(final Table table, final byte[] startRow, final byte[] endRow, final Collection columns) throws IOException { - final Scan scan = new Scan(); - scan.setStartRow(startRow); - scan.setStopRow(endRow); - - if (columns != null) { - for (Column col : columns) { - if (col.getQualifier() == null) { - scan.addFamily(col.getFamily()); - } else { - scan.addColumn(col.getFamily(), col.getQualifier()); - } - } - } - - return table.getScanner(scan); - } - - // protected and extracted into separate method for testing - protected ResultScanner getResults(final Table table, final Collection columns, final Filter filter, final long minTime) throws IOException { - // Create a new scan. We will set the min timerange as the latest timestamp that - // we have seen so far. The minimum timestamp is inclusive, so we will get duplicates. - // We will record any cells that have the latest timestamp, so that when we scan again, - // we know to throw away those duplicates. - final Scan scan = new Scan(); - scan.setTimeRange(minTime, Long.MAX_VALUE); - - if (filter != null) { - scan.setFilter(filter); - } - - if (columns != null) { - for (Column col : columns) { - if (col.getQualifier() == null) { - scan.addFamily(col.getFamily()); - } else { - scan.addColumn(col.getFamily(), col.getQualifier()); - } - } - } - - return table.getScanner(scan); - } - - private ResultCell getResultCell(Cell cell) { - final ResultCell resultCell = new ResultCell(); - resultCell.setRowArray(cell.getRowArray()); - resultCell.setRowOffset(cell.getRowOffset()); - resultCell.setRowLength(cell.getRowLength()); - - resultCell.setFamilyArray(cell.getFamilyArray()); - resultCell.setFamilyOffset(cell.getFamilyOffset()); - resultCell.setFamilyLength(cell.getFamilyLength()); - - resultCell.setQualifierArray(cell.getQualifierArray()); - resultCell.setQualifierOffset(cell.getQualifierOffset()); - resultCell.setQualifierLength(cell.getQualifierLength()); - - resultCell.setTimestamp(cell.getTimestamp()); - resultCell.setTypeByte(cell.getTypeByte()); - resultCell.setSequenceId(cell.getSequenceId()); - - resultCell.setValueArray(cell.getValueArray()); - resultCell.setValueOffset(cell.getValueOffset()); - resultCell.setValueLength(cell.getValueLength()); - - resultCell.setTagsArray(cell.getTagsArray()); - resultCell.setTagsOffset(cell.getTagsOffset()); - resultCell.setTagsLength(cell.getTagsLength()); - return resultCell; - } - - static protected class ValidationResources { - private final String configResources; - private final Configuration configuration; - - public ValidationResources(String configResources, Configuration configuration) { - this.configResources = configResources; - this.configuration = configuration; - } - - public String getConfigResources() { - return configResources; - } - - public Configuration getConfiguration() { - return configuration; - } - } - - @Override - public byte[] toBytes(boolean b) { - return Bytes.toBytes(b); - } - - @Override - public byte[] toBytes(long l) { - return Bytes.toBytes(l); - } - - @Override - public byte[] toBytes(double d) { - return Bytes.toBytes(d); - } - - @Override - public byte[] toBytes(String s) { - return Bytes.toBytes(s); - } - - @Override - public byte[] toBytesBinary(String s) { - return Bytes.toBytesBinary(s); - } -} diff --git a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/main/java/com/hurence/logisland/service/hbase/security/KerberosProperties.java b/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/main/java/com/hurence/logisland/service/hbase/security/KerberosProperties.java deleted file mode 100644 index 444723622..000000000 --- a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/main/java/com/hurence/logisland/service/hbase/security/KerberosProperties.java +++ /dev/null @@ -1,143 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.service.hbase.security; - -import com.hurence.logisland.component.PropertyDescriptor; -import com.hurence.logisland.logging.ComponentLog; -import com.hurence.logisland.validator.StandardValidators; -import com.hurence.logisland.validator.ValidationResult; -import com.hurence.logisland.validator.Validator; -import org.apache.hadoop.conf.Configuration; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -/** - * All processors and controller services that need properties for Kerberos - * Principal and Keytab should obtain them through this class by calling: - * - * KerberosProperties props = - * KerberosProperties.create(NiFiProperties.getInstance()) - * - * The properties can be accessed from the resulting KerberosProperties - * instance. - */ -public class KerberosProperties { - - private final File kerberosConfigFile; - private final Validator kerberosConfigValidator; - private final PropertyDescriptor kerberosPrincipal; - private final PropertyDescriptor kerberosKeytab; - - /** - * Instantiate a KerberosProperties object but keep in mind it is - * effectively a singleton because the krb5.conf file needs to be set as a - * system property which this constructor will take care of. - * - * @param kerberosConfigFile file of krb5.conf - */ - public KerberosProperties(final File kerberosConfigFile) { - this.kerberosConfigFile = kerberosConfigFile; - - this.kerberosConfigValidator = new Validator() { - @Override - public ValidationResult validate(String subject, String input) { - // Check that the Kerberos configuration is set - if (kerberosConfigFile == null) { - return new ValidationResult.Builder() - .subject(subject).input(input).valid(false) - .explanation("you are missing the logisland.kerberos.krb5.file property which " - + "must be set in order to use Kerberos") - .build(); - } - - // Check that the Kerberos configuration is readable - if (!kerberosConfigFile.canRead()) { - return new ValidationResult.Builder().subject(subject).input(input).valid(false) - .explanation(String.format("unable to read Kerberos config [%s], please make sure the path is valid " - + "and logisland has adequate permissions", kerberosConfigFile.getAbsoluteFile())) - .build(); - } - - return new ValidationResult.Builder().subject(subject).input(input).valid(true).build(); - } - }; - - this.kerberosPrincipal = new PropertyDescriptor.Builder() - .name("kerberos.principal") - .required(false) - .description("Kerberos principal to authenticate as. Requires logisland.kerberos.krb5.file to be set in your logisland.properties") - .addValidator(kerberosConfigValidator) - .build(); - - this.kerberosKeytab = new PropertyDescriptor.Builder() - .name("kerberos.keytab") - .required(false) - .description("Kerberos keytab associated with the principal. Requires logisland.kerberos.krb5.file to be set in your logisland.properties") - .addValidator(StandardValidators.FILE_EXISTS_VALIDATOR) - .addValidator(kerberosConfigValidator) - .build(); - } - - public File getKerberosConfigFile() { - return kerberosConfigFile; - } - - public Validator getKerberosConfigValidator() { - return kerberosConfigValidator; - } - - public PropertyDescriptor getKerberosPrincipal() { - return kerberosPrincipal; - } - - public PropertyDescriptor getKerberosKeytab() { - return kerberosKeytab; - } - - public static List validatePrincipalAndKeytab(final String subject, final Configuration config, final String principal, final String keytab, final ComponentLog logger) { - final List results = new ArrayList<>(); - - // if security is enabled then the keytab and principal are required - final boolean isSecurityEnabled = SecurityUtil.isSecurityEnabled(config); - - final boolean blankPrincipal = (principal == null || principal.isEmpty()); - if (isSecurityEnabled && blankPrincipal) { - results.add(new ValidationResult.Builder() - .valid(false) - .subject(subject) - .explanation("Kerberos Principal must be provided when using a secure configuration") - .build()); - } - - final boolean blankKeytab = (keytab == null || keytab.isEmpty()); - if (isSecurityEnabled && blankKeytab) { - results.add(new ValidationResult.Builder() - .valid(false) - .subject(subject) - .explanation("Kerberos Keytab must be provided when using a secure configuration") - .build()); - } - - if (!isSecurityEnabled && (!blankPrincipal || !blankKeytab)) { - logger.warn("Configuration does not have security enabled, Keytab and Principal will be ignored"); - } - - return results; - } - -} diff --git a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/main/java/com/hurence/logisland/service/hbase/security/KerberosTicketRenewer.java b/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/main/java/com/hurence/logisland/service/hbase/security/KerberosTicketRenewer.java deleted file mode 100644 index a62ba776b..000000000 --- a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/main/java/com/hurence/logisland/service/hbase/security/KerberosTicketRenewer.java +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.service.hbase.security; - -import com.hurence.logisland.logging.ComponentLog; -import org.apache.hadoop.security.UserGroupInformation; - -import java.io.IOException; -import java.security.PrivilegedExceptionAction; - -/** - * Periodically attempts to renew the Kerberos user's ticket for the given UGI. - * - * This class will attempt to call ugi.checkTGTAndReloginFromKeytab() which - * will re-login the user if the ticket expired or is close to expiry. Between - * relogin attempts this thread will sleep for the provided amount of time. - * - */ -public class KerberosTicketRenewer implements Runnable { - - private final UserGroupInformation ugi; - private final long renewalPeriod; - private final ComponentLog logger; - - private volatile boolean stopped = false; - - /** - * @param ugi - * the user to renew the ticket for - * @param renewalPeriod - * the amount of time in milliseconds to wait between renewal attempts - * @param logger - * the logger from the component that started the renewer - */ - public KerberosTicketRenewer(final UserGroupInformation ugi, final long renewalPeriod, final ComponentLog logger) { - this.ugi = ugi; - this.renewalPeriod = renewalPeriod; - this.logger = logger; - } - - @Override - public void run() { - stopped = false; - while (!stopped) { - try { - logger.debug("Invoking renewal attempt for Kerberos ticket"); - // While we run this "frequently", the Hadoop implementation will only perform the login at 80% of ticket lifetime. - ugi.doAs((PrivilegedExceptionAction) () -> { - ugi.checkTGTAndReloginFromKeytab(); - return null; - }); - } catch (IOException e) { - logger.error("Failed to renew Kerberos ticket", e); - } catch (InterruptedException e) { - logger.error("Interrupted while attempting to renew Kerberos ticket", e); - Thread.currentThread().interrupt(); - return; - } - - logger.debug("current UGI {}", new Object[]{ugi}); - - // Wait for a bit before checking again. - try { - Thread.sleep(renewalPeriod); - } catch (InterruptedException e) { - logger.error("Renewal thread interrupted", e); - Thread.currentThread().interrupt(); - return; - } - } - } - - public void stop() { - stopped = true; - } - -} diff --git a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/main/java/com/hurence/logisland/service/hbase/security/SecurityUtil.java b/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/main/java/com/hurence/logisland/service/hbase/security/SecurityUtil.java deleted file mode 100644 index 5ec8b53c6..000000000 --- a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/main/java/com/hurence/logisland/service/hbase/security/SecurityUtil.java +++ /dev/null @@ -1,115 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.service.hbase.security; - -import com.hurence.logisland.logging.ComponentLog; -import org.apache.commons.lang3.Validate; -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.security.UserGroupInformation; - -import java.io.IOException; - -/** - * Provides synchronized access to UserGroupInformation to avoid multiple processors/services from - * interfering with each other. - */ -public class SecurityUtil { - public static final String HADOOP_SECURITY_AUTHENTICATION = "hadoop.security.authentication"; - public static final String KERBEROS = "kerberos"; - - /** - * Initializes UserGroupInformation with the given Configuration and performs the login for the given principal - * and keytab. All logins should happen through this class to ensure other threads are not concurrently modifying - * UserGroupInformation. - * - * @param config the configuration instance - * @param principal the principal to authenticate as - * @param keyTab the keytab to authenticate with - * - * @return the UGI for the given principal - * - * @throws IOException if login failed - */ - public static synchronized UserGroupInformation loginKerberos(final Configuration config, final String principal, final String keyTab) - throws IOException { - Validate.notNull(config); - Validate.notNull(principal); - Validate.notNull(keyTab); - - UserGroupInformation.setConfiguration(config); - return UserGroupInformation.loginUserFromKeytabAndReturnUGI(principal.trim(), keyTab.trim()); - } - - /** - * Initializes UserGroupInformation with the given Configuration and returns UserGroupInformation.getLoginUser(). - * All logins should happen through this class to ensure other threads are not concurrently modifying - * UserGroupInformation. - * - * @param config the configuration instance - * - * @return the UGI for the given principal - * - * @throws IOException if login failed - */ - public static synchronized UserGroupInformation loginSimple(final Configuration config) throws IOException { - Validate.notNull(config); - UserGroupInformation.setConfiguration(config); - return UserGroupInformation.getLoginUser(); - } - - /** - * Initializes UserGroupInformation with the given Configuration and returns UserGroupInformation.isSecurityEnabled(). - * - * All checks for isSecurityEnabled() should happen through this method. - * - * @param config the given configuration - * - * @return true if kerberos is enabled on the given configuration, false otherwise - * - */ - public static boolean isSecurityEnabled(final Configuration config) { - Validate.notNull(config); - return KERBEROS.equalsIgnoreCase(config.get(HADOOP_SECURITY_AUTHENTICATION)); - } - - /** - * Start a thread that periodically attempts to renew the current Kerberos user's ticket. - * - * Callers of this method should store the reference to the KerberosTicketRenewer and call stop() to stop the thread. - * - * @param id - * The unique identifier to use for the thread, can be the class name that started the thread - * (i.e. PutHDFS, etc) - * @param ugi - * The current Kerberos user. - * @param renewalPeriod - * The amount of time between attempting renewals. - * @param logger - * The logger to use with in the renewer - * - * @return the KerberosTicketRenewer Runnable - */ - public static KerberosTicketRenewer startTicketRenewalThread(final String id, final UserGroupInformation ugi, final long renewalPeriod, final ComponentLog logger) { - final KerberosTicketRenewer renewer = new KerberosTicketRenewer(ugi, renewalPeriod, logger); - - final Thread t = new Thread(renewer); - t.setName("Kerberos Ticket Renewal [" + id + "]"); - t.start(); - - return renewer; - } - -} diff --git a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/java/com/hurence/logisland/service/hbase/TestHBase_1_1_2_ClientService.java b/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/java/com/hurence/logisland/service/hbase/TestHBase_1_1_2_ClientService.java deleted file mode 100644 index 406dd7dc3..000000000 --- a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/java/com/hurence/logisland/service/hbase/TestHBase_1_1_2_ClientService.java +++ /dev/null @@ -1,488 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.service.hbase; - -import com.hurence.logisland.classloading.PluginProxy; -import com.hurence.logisland.component.InitializationException; -import com.hurence.logisland.controller.ControllerServiceInitializationContext; -import com.hurence.logisland.service.hbase.put.PutColumn; -import com.hurence.logisland.service.hbase.put.PutRecord; -import com.hurence.logisland.service.hbase.scan.Column; -import com.hurence.logisland.service.hbase.scan.ResultCell; -import com.hurence.logisland.service.hbase.scan.ResultHandler; -import com.hurence.logisland.service.hbase.security.KerberosProperties; -import com.hurence.logisland.util.runner.TestRunner; -import com.hurence.logisland.util.runner.TestRunners; -import org.apache.hadoop.hbase.Cell; -import org.apache.hadoop.hbase.TableName; -import org.apache.hadoop.hbase.client.*; -import org.apache.hadoop.hbase.filter.Filter; -import org.junit.Before; -import org.junit.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Mockito; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.*; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.mockito.Mockito.*; - -public class TestHBase_1_1_2_ClientService { - - private KerberosProperties kerberosPropsWithFile; - private KerberosProperties kerberosPropsWithoutFile; - - @Before - public void setup() { - // needed for calls to UserGroupInformation.setConfiguration() to work when passing in - // config with Kerberos authentication enabled - System.setProperty("java.security.krb5.realm", "logisland.com"); - System.setProperty("java.security.krb5.kdc", "logisland.kdc"); - - kerberosPropsWithFile = new KerberosProperties(new File("src/test/resources/krb5.conf")); - kerberosPropsWithoutFile = new KerberosProperties(null); - } - - @Test - public void testCustomValidate() throws InitializationException, IOException { - final TestRunner runner = TestRunners.newTestRunner(new TestProcessor()); - - final String tableName = "logisland"; - final Table table = Mockito.mock(Table.class); - when(table.getName()).thenReturn(TableName.valueOf(tableName)); - - // no conf file or zk properties so should be invalid - final MockHBaseClientService service = new MockHBaseClientService(table); - runner.addControllerService("hbaseClientService", service); - runner.assertNotValid(service); - - // conf file with no zk properties should be valid - runner.setProperty(service, HBase_1_1_2_ClientService.HADOOP_CONF_FILES, "src/test/resources/hbase-site.xml"); - runner.enableControllerService(service); - - runner.assertValid(service); - runner.disableControllerService(service); - - // only quorum and no conf file should be invalid - runner.addControllerService("hbaseClientService", service); - runner.setProperty(service, HBase_1_1_2_ClientService.ZOOKEEPER_QUORUM, "localhost"); - - runner.assertNotValid(service); - - // quorum and port, no znode, no conf file, should be invalid - runner.addControllerService("hbaseClientService", service); - runner.setProperty(service, HBase_1_1_2_ClientService.ZOOKEEPER_QUORUM, "localhost"); - runner.setProperty(service, HBase_1_1_2_ClientService.ZOOKEEPER_CLIENT_PORT, "2181"); - - runner.assertNotValid(service); - - // quorum, port, and znode, no conf file, should be valid - runner.addControllerService("hbaseClientService", service); - runner.setProperty(service, HBase_1_1_2_ClientService.ZOOKEEPER_QUORUM, "localhost"); - runner.setProperty(service, HBase_1_1_2_ClientService.ZOOKEEPER_CLIENT_PORT, "2181"); - runner.setProperty(service, HBase_1_1_2_ClientService.ZOOKEEPER_ZNODE_PARENT, "/hbase"); - runner.enableControllerService(service); - - runner.assertValid(service); - runner.disableControllerService(service); - - // quorum and port with conf file should be valid - runner.addControllerService("hbaseClientService", service); - runner.setProperty(service, HBase_1_1_2_ClientService.HADOOP_CONF_FILES, "src/test/resources/hbase-site.xml"); - runner.setProperty(service, HBase_1_1_2_ClientService.ZOOKEEPER_QUORUM, "localhost"); - runner.setProperty(service, HBase_1_1_2_ClientService.ZOOKEEPER_CLIENT_PORT, "2181"); - runner.enableControllerService(service); - - runner.assertValid(service); - runner.disableControllerService(service); - - // Kerberos - principal with non-set keytab and only hbase-site-security - valid because we need core-site-security to turn on security - runner.addControllerService("hbaseClientService", service); - runner.setProperty(service, HBase_1_1_2_ClientService.HADOOP_CONF_FILES, "src/test/resources/hbase-site-security.xml"); - runner.setProperty(service, kerberosPropsWithFile.getKerberosPrincipal(), "test@REALM"); - runner.setProperty(service, "logisland.kerberos.krb5.file", "src/test/resources/krb5.conf"); - runner.enableControllerService(service); - runner.assertValid(service); - - // Kerberos - principal with non-set keytab and both config files - runner.disableControllerService(service); - runner.setProperty(service, HBase_1_1_2_ClientService.HADOOP_CONF_FILES, - "src/test/resources/hbase-site-security.xml, src/test/resources/core-site-security.xml"); - runner.assertNotValid(service); - - // Kerberos - add valid options - runner.setProperty(service, kerberosPropsWithFile.getKerberosKeytab(), "src/test/resources/fake.keytab"); - runner.setProperty(service, kerberosPropsWithFile.getKerberosPrincipal(), "test@REALM"); - runner.enableControllerService(service); - runner.assertValid(service); - - // Kerberos - add invalid non-existent keytab file - runner.disableControllerService(service); - runner.setProperty(service, kerberosPropsWithFile.getKerberosKeytab(), "src/test/resources/missing.keytab"); - runner.assertNotValid(service); - - // Kerberos - add invalid principal - runner.setProperty(service, kerberosPropsWithFile.getKerberosKeytab(), "src/test/resources/fake.keytab"); - runner.setProperty(service, kerberosPropsWithFile.getKerberosPrincipal(), ""); - runner.assertNotValid(service); - - // Kerberos - valid props but the KerberosProperties has a null Kerberos config file so be invalid - runner.addControllerService("hbaseClientService", service); - runner.setProperty(service, HBase_1_1_2_ClientService.HADOOP_CONF_FILES, - "src/test/resources/hbase-site-security.xml, src/test/resources/core-site-security.xml"); - runner.setProperty(service, kerberosPropsWithoutFile.getKerberosKeytab(), "src/test/resources/fake.keytab"); - runner.setProperty(service, kerberosPropsWithoutFile.getKerberosPrincipal(), "test@REALM"); - runner.assertNotValid(service); - } - - @Test - public void testSinglePut() throws InitializationException, IOException { - final String tableName = "logisland"; - final String row = "row1"; - final String columnFamily = "family1"; - final String columnQualifier = "qualifier1"; - final String content = "content1"; - - final Collection columns = Collections.singletonList(new PutColumn(columnFamily.getBytes(StandardCharsets.UTF_8), columnQualifier.getBytes(StandardCharsets.UTF_8), - content.getBytes(StandardCharsets.UTF_8))); - final PutRecord putFlowFile = new PutRecord(tableName, row.getBytes(StandardCharsets.UTF_8), columns, null); - - final TestRunner runner = TestRunners.newTestRunner(new TestProcessor()); - - // Mock an HBase Table so we can verify the put operations later - final Table table = Mockito.mock(Table.class); - when(table.getName()).thenReturn(TableName.valueOf(tableName)); - - // create the controller service and link it to the test processor - final HBaseClientService service = configureHBaseClientService(runner, table); - runner.assertValid(service); - - // try to put a single cell - final HBaseClientService hBaseClientService = PluginProxy.unwrap(runner.getProcessContext().getPropertyValue(TestProcessor.HBASE_CLIENT_SERVICE) - .asControllerService()); - - hBaseClientService.put(tableName, Arrays.asList(putFlowFile)); - - // verify only one call to put was made - ArgumentCaptor capture = ArgumentCaptor.forClass(List.class); - verify(table, times(1)).put(capture.capture()); - - // verify only one put was in the list of puts - final List puts = capture.getValue(); - assertEquals(1, puts.size()); - verifyPut(row, columnFamily, columnQualifier, content, puts.get(0)); - } - - @Test - public void testMultiplePutsSameRow() throws IOException, InitializationException { - final String tableName = "logisland"; - final String row = "row1"; - final String columnFamily = "family1"; - final String columnQualifier = "qualifier1"; - final String content1 = "content1"; - final String content2 = "content2"; - - final Collection columns1 = Collections.singletonList(new PutColumn(columnFamily.getBytes(StandardCharsets.UTF_8), - columnQualifier.getBytes(StandardCharsets.UTF_8), - content1.getBytes(StandardCharsets.UTF_8))); - final PutRecord putFlowFile1 = new PutRecord(tableName, row.getBytes(StandardCharsets.UTF_8), columns1, null); - - final Collection columns2 = Collections.singletonList(new PutColumn(columnFamily.getBytes(StandardCharsets.UTF_8), - columnQualifier.getBytes(StandardCharsets.UTF_8), - content2.getBytes(StandardCharsets.UTF_8))); - final PutRecord putFlowFile2 = new PutRecord(tableName, row.getBytes(StandardCharsets.UTF_8), columns2, null); - - final TestRunner runner = TestRunners.newTestRunner(new TestProcessor()); - - // Mock an HBase Table so we can verify the put operations later - final Table table = Mockito.mock(Table.class); - when(table.getName()).thenReturn(TableName.valueOf(tableName)); - - // create the controller service and link it to the test processor - final HBaseClientService service = configureHBaseClientService(runner, table); - runner.assertValid(service); - - // try to put a multiple cells for the same row - final HBaseClientService hBaseClientService = PluginProxy.unwrap( - runner.getProcessContext().getPropertyValue(TestProcessor.HBASE_CLIENT_SERVICE) - .asControllerService()); - - hBaseClientService.put(tableName, Arrays.asList(putFlowFile1, putFlowFile2)); - - // verify put was only called once - ArgumentCaptor capture = ArgumentCaptor.forClass(List.class); - verify(table, times(1)).put(capture.capture()); - - // verify there was only one put in the list of puts - final List puts = capture.getValue(); - assertEquals(1, puts.size()); - - // verify two cells were added to this one put operation - final NavigableMap> familyCells = puts.get(0).getFamilyCellMap(); - Map.Entry> entry = familyCells.firstEntry(); - assertEquals(2, entry.getValue().size()); - } - - @Test - public void testMultiplePutsDifferentRow() throws IOException, InitializationException { - final String tableName = "logisland"; - final String row1 = "row1"; - final String row2 = "row2"; - final String columnFamily = "family1"; - final String columnQualifier = "qualifier1"; - final String content1 = "content1"; - final String content2 = "content2"; - - final Collection columns1 = Collections.singletonList(new PutColumn(columnFamily.getBytes(StandardCharsets.UTF_8), - columnQualifier.getBytes(StandardCharsets.UTF_8), - content1.getBytes(StandardCharsets.UTF_8))); - final PutRecord putFlowFile1 = new PutRecord(tableName, row1.getBytes(StandardCharsets.UTF_8), columns1, null); - - final Collection columns2 = Collections.singletonList(new PutColumn(columnFamily.getBytes(StandardCharsets.UTF_8), - columnQualifier.getBytes(StandardCharsets.UTF_8), - content2.getBytes(StandardCharsets.UTF_8))); - final PutRecord putFlowFile2 = new PutRecord(tableName, row2.getBytes(StandardCharsets.UTF_8), columns2, null); - - final TestRunner runner = TestRunners.newTestRunner(new TestProcessor()); - - // Mock an HBase Table so we can verify the put operations later - final Table table = Mockito.mock(Table.class); - when(table.getName()).thenReturn(TableName.valueOf(tableName)); - - // create the controller service and link it to the test processor - final HBaseClientService service = configureHBaseClientService(runner, table); - runner.assertValid(service); - - // try to put a multiple cells with different rows - final HBaseClientService hBaseClientService = PluginProxy.unwrap(runner.getProcessContext().getPropertyValue(TestProcessor.HBASE_CLIENT_SERVICE) - .asControllerService()); - - hBaseClientService.put(tableName, Arrays.asList(putFlowFile1, putFlowFile2)); - - // verify put was only called once - ArgumentCaptor capture = ArgumentCaptor.forClass(List.class); - verify(table, times(1)).put(capture.capture()); - - // verify there were two puts in the list - final List puts = capture.getValue(); - assertEquals(2, puts.size()); - } - - @Test - public void testScan() throws InitializationException, IOException { - final String tableName = "logisland"; - final TestRunner runner = TestRunners.newTestRunner(new TestProcessor()); - - // Mock an HBase Table so we can verify the put operations later - final Table table = Mockito.mock(Table.class); - when(table.getName()).thenReturn(TableName.valueOf(tableName)); - - // create the controller service and link it to the test processor - final MockHBaseClientService service = configureHBaseClientService(runner, table); - runner.assertValid(service); - - // stage some results in the mock service... - final long now = System.currentTimeMillis(); - - final Map cells = new HashMap<>(); - cells.put("greeting", "hello"); - cells.put("name", "logisland"); - - service.addResult("row0", cells, now - 2); - service.addResult("row1", cells, now - 1); - service.addResult("row2", cells, now - 1); - service.addResult("row3", cells, now); - - // perform a scan and verify the four rows were returned - final CollectingResultHandler handler = new CollectingResultHandler(); - final HBaseClientService hBaseClientService = PluginProxy.unwrap(runner.getProcessContext().getPropertyValue(TestProcessor.HBASE_CLIENT_SERVICE) - .asControllerService()); - - hBaseClientService.scan(tableName, new ArrayList(), null, now, handler); - assertEquals(4, handler.results.size()); - - // get row0 using the row id and verify it has 2 cells - final ResultCell[] results = handler.results.get("row0"); - assertNotNull(results); - assertEquals(2, results.length); - - verifyResultCell(results[0], "logisland", "greeting", "hello"); - verifyResultCell(results[1], "logisland", "name", "logisland"); - } - - @Test - public void testScanWithValidFilter() throws InitializationException, IOException { - final String tableName = "logisland"; - final TestRunner runner = TestRunners.newTestRunner(new TestProcessor()); - - // Mock an HBase Table so we can verify the put operations later - final Table table = Mockito.mock(Table.class); - when(table.getName()).thenReturn(TableName.valueOf(tableName)); - - // create the controller service and link it to the test processor - final MockHBaseClientService service = configureHBaseClientService(runner, table); - runner.assertValid(service); - - // perform a scan and verify the four rows were returned - final CollectingResultHandler handler = new CollectingResultHandler(); - final HBaseClientService hBaseClientService = PluginProxy.unwrap(runner.getProcessContext().getPropertyValue(TestProcessor.HBASE_CLIENT_SERVICE) - .asControllerService()); - - // make sure we parse the filter expression without throwing an exception - final String filter = "PrefixFilter ('Row') AND PageFilter (1) AND FirstKeyOnlyFilter ()"; - hBaseClientService.scan(tableName, new ArrayList(), filter, System.currentTimeMillis(), handler); - } - - @Test(expected = IllegalArgumentException.class) - public void testScanWithInvalidFilter() throws InitializationException, IOException { - final String tableName = "logisland"; - final TestRunner runner = TestRunners.newTestRunner(new TestProcessor()); - - // Mock an HBase Table so we can verify the put operations later - final Table table = Mockito.mock(Table.class); - when(table.getName()).thenReturn(TableName.valueOf(tableName)); - - // create the controller service and link it to the test processor - final MockHBaseClientService service = configureHBaseClientService(runner, table); - runner.assertValid(service); - - // perform a scan and verify the four rows were returned - final CollectingResultHandler handler = new CollectingResultHandler(); - final HBaseClientService hBaseClientService = PluginProxy.unwrap( - runner.getProcessContext().getPropertyValue(TestProcessor.HBASE_CLIENT_SERVICE) - .asControllerService()); - - // this should throw IllegalArgumentException - final String filter = "this is not a filter"; - hBaseClientService.scan(tableName, new ArrayList(), filter, System.currentTimeMillis(), handler); - } - - private MockHBaseClientService configureHBaseClientService(final TestRunner runner, final Table table) throws InitializationException { - final MockHBaseClientService service = new MockHBaseClientService(table); - runner.addControllerService("hbaseClient", service); - runner.setProperty(service, HBase_1_1_2_ClientService.HADOOP_CONF_FILES, "src/test/resources/hbase-site.xml"); - runner.enableControllerService(service); - runner.setProperty(TestProcessor.HBASE_CLIENT_SERVICE, "hbaseClient"); - return service; - } - - private void verifyResultCell(final ResultCell result, final String cf, final String cq, final String val) { - final String colFamily = new String(result.getFamilyArray(), result.getFamilyOffset(), result.getFamilyLength()); - assertEquals(cf, colFamily); - - final String colQualifier = new String(result.getQualifierArray(), result.getQualifierOffset(), result.getQualifierLength()); - assertEquals(cq, colQualifier); - - final String value = new String(result.getValueArray(), result.getValueOffset(), result.getValueLength()); - assertEquals(val, value); - } - - private void verifyPut(String row, String columnFamily, String columnQualifier, String content, Put put) { - assertEquals(row, new String(put.getRow())); - - NavigableMap> familyCells = put.getFamilyCellMap(); - assertEquals(1, familyCells.size()); - - Map.Entry> entry = familyCells.firstEntry(); - assertEquals(columnFamily, new String(entry.getKey())); - assertEquals(1, entry.getValue().size()); - - Cell cell = entry.getValue().get(0); - assertEquals(columnQualifier, new String(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength())); - assertEquals(content, new String(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength())); - } - - // Override methods to create a mock service that can return staged data - private class MockHBaseClientService extends HBase_1_1_2_ClientService { - - private Table table; - private List results = new ArrayList<>(); - - public MockHBaseClientService(final Table table) { - this.table = table; - } - - public void addResult(final String rowKey, final Map cells, final long timestamp) { - final byte[] rowArray = rowKey.getBytes(StandardCharsets.UTF_8); - - final Cell[] cellArray = new Cell[cells.size()]; - int i = 0; - for (final Map.Entry cellEntry : cells.entrySet()) { - final Cell cell = Mockito.mock(Cell.class); - when(cell.getRowArray()).thenReturn(rowArray); - when(cell.getRowOffset()).thenReturn(0); - when(cell.getRowLength()).thenReturn((short) rowArray.length); - - final String cellValue = cellEntry.getValue(); - final byte[] valueArray = cellValue.getBytes(StandardCharsets.UTF_8); - when(cell.getValueArray()).thenReturn(valueArray); - when(cell.getValueOffset()).thenReturn(0); - when(cell.getValueLength()).thenReturn(valueArray.length); - - final byte[] familyArray = "logisland".getBytes(StandardCharsets.UTF_8); - when(cell.getFamilyArray()).thenReturn(familyArray); - when(cell.getFamilyOffset()).thenReturn(0); - when(cell.getFamilyLength()).thenReturn((byte) familyArray.length); - - final String qualifier = cellEntry.getKey(); - final byte[] qualifierArray = qualifier.getBytes(StandardCharsets.UTF_8); - when(cell.getQualifierArray()).thenReturn(qualifierArray); - when(cell.getQualifierOffset()).thenReturn(0); - when(cell.getQualifierLength()).thenReturn(qualifierArray.length); - - when(cell.getTimestamp()).thenReturn(timestamp); - - cellArray[i++] = cell; - } - - final Result result = Mockito.mock(Result.class); - when(result.getRow()).thenReturn(rowArray); - when(result.rawCells()).thenReturn(cellArray); - results.add(result); - } - - @Override - protected ResultScanner getResults(Table table, Collection columns, Filter filter, long minTime) throws IOException { - final ResultScanner scanner = Mockito.mock(ResultScanner.class); - Mockito.when(scanner.iterator()).thenReturn(results.iterator()); - return scanner; - } - - @Override - protected Connection createConnection(ControllerServiceInitializationContext context) throws IOException { - Connection connection = Mockito.mock(Connection.class); - Mockito.when(connection.getTable(table.getName())).thenReturn(table); - return connection; - } - } - - // handler that saves results for verification - private static final class CollectingResultHandler implements ResultHandler { - - Map results = new LinkedHashMap<>(); - - @Override - public void handle(byte[] row, ResultCell[] resultCells) { - final String rowStr = new String(row, StandardCharsets.UTF_8); - results.put(rowStr, resultCells); - } - } - -} diff --git a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/java/com/hurence/logisland/service/hbase/TestProcessor.java b/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/java/com/hurence/logisland/service/hbase/TestProcessor.java deleted file mode 100644 index 7e708600d..000000000 --- a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/java/com/hurence/logisland/service/hbase/TestProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.hurence.logisland.service.hbase; - -import com.hurence.logisland.component.PropertyDescriptor; -import com.hurence.logisland.processor.AbstractProcessor; -import com.hurence.logisland.processor.ProcessContext; -import com.hurence.logisland.record.Record; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - - - -public class TestProcessor extends AbstractProcessor { - - static final PropertyDescriptor HBASE_CLIENT_SERVICE = new PropertyDescriptor.Builder() - .name("hbase.client.service") - .description("HBaseClientService") - .identifiesControllerService(HBaseClientService.class) - .required(true) - .build(); - - - @Override - public List getSupportedPropertyDescriptors() { - List propDescs = new ArrayList<>(); - propDescs.add(HBASE_CLIENT_SERVICE); - return propDescs; - } - - @Override - public Collection process(ProcessContext context, Collection records) { - return Collections.emptyList(); - } - - -} diff --git a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/java/com/hurence/logisland/service/hbase/security/TestKerberosProperties.java b/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/java/com/hurence/logisland/service/hbase/security/TestKerberosProperties.java deleted file mode 100644 index 91d5937b6..000000000 --- a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/java/com/hurence/logisland/service/hbase/security/TestKerberosProperties.java +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.hurence.logisland.service.hbase.security; - -import com.hurence.logisland.logging.ComponentLog; -import com.hurence.logisland.validator.ValidationResult; -import org.apache.hadoop.conf.Configuration; -import org.junit.Assert; -import org.junit.Test; -import org.mockito.Mockito; - -import java.io.File; -import java.util.List; - -public class TestKerberosProperties { - - @Test - public void testWithKerberosConfigFile() { - final File file = new File("src/test/resources/krb5.conf"); - - final KerberosProperties kerberosProperties = new KerberosProperties(file); - Assert.assertNotNull(kerberosProperties); - - Assert.assertNotNull(kerberosProperties.getKerberosConfigFile()); - Assert.assertNotNull(kerberosProperties.getKerberosConfigValidator()); - Assert.assertNotNull(kerberosProperties.getKerberosPrincipal()); - Assert.assertNotNull(kerberosProperties.getKerberosKeytab()); - - final ValidationResult result = kerberosProperties.getKerberosConfigValidator().validate("test", "principal"); - Assert.assertTrue(result.isValid()); - } - - @Test - public void testWithoutKerberosConfigFile() { - final File file = new File("src/test/resources/krb5.conf"); - - final KerberosProperties kerberosProperties = new KerberosProperties(null); - Assert.assertNotNull(kerberosProperties); - - Assert.assertNull(kerberosProperties.getKerberosConfigFile()); - Assert.assertNotNull(kerberosProperties.getKerberosConfigValidator()); - Assert.assertNotNull(kerberosProperties.getKerberosPrincipal()); - Assert.assertNotNull(kerberosProperties.getKerberosKeytab()); - - final ValidationResult result = kerberosProperties.getKerberosConfigValidator().validate("test", "principal"); - Assert.assertFalse(result.isValid()); - } - - @Test - public void testValidatePrincipalAndKeytab() { - final ComponentLog log = Mockito.mock(ComponentLog.class); - final Configuration config = new Configuration(); - - // no security enabled in config so doesn't matter what principal and keytab are - List results = KerberosProperties.validatePrincipalAndKeytab( - "test", config, null, null, log); - Assert.assertEquals(0, results.size()); - - results = KerberosProperties.validatePrincipalAndKeytab( - "test", config, "principal", null, log); - Assert.assertEquals(0, results.size()); - - results = KerberosProperties.validatePrincipalAndKeytab( - "test", config, "principal", "keytab", log); - Assert.assertEquals(0, results.size()); - - // change the config to have kerberos turned on - config.set("hadoop.security.authentication", "kerberos"); - config.set("hadoop.security.authorization", "true"); - - results = KerberosProperties.validatePrincipalAndKeytab( - "test", config, null, null, log); - Assert.assertEquals(2, results.size()); - } - -} diff --git a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/resources/core-site-security.xml b/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/resources/core-site-security.xml deleted file mode 100644 index 2aca105f9..000000000 --- a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/resources/core-site-security.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - fs.default.name - hdfs://hbase - - - hadoop.security.authentication - kerberos - - - hadoop.security.authorization - true - - \ No newline at end of file diff --git a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/resources/core-site.xml b/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/resources/core-site.xml deleted file mode 100644 index c044ee30d..000000000 --- a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/resources/core-site.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - fs.default.name - hdfs://hbase - - \ No newline at end of file diff --git a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/resources/fake.keytab b/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/resources/fake.keytab deleted file mode 100644 index e69de29bb..000000000 diff --git a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/resources/hbase-site-security.xml b/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/resources/hbase-site-security.xml deleted file mode 100644 index 0875ea8d9..000000000 --- a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/resources/hbase-site-security.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - fs.default.name - hdfs://hbase - - - hbase.security.authentication - kerberos - - - hbase.security.authorization - true - - \ No newline at end of file diff --git a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/resources/hbase-site.xml b/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/resources/hbase-site.xml deleted file mode 100644 index d022099f6..000000000 --- a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/resources/hbase-site.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - fs.default.name - hdfs://hbase - - \ No newline at end of file diff --git a/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/resources/krb5.conf b/logisland-components/logisland-services/logisland-service-hbase/logisland-service-hbase_1_1_2-client/src/test/resources/krb5.conf deleted file mode 100644 index e69de29bb..000000000 diff --git a/logisland-components/logisland-services/logisland-service-hbase/pom.xml b/logisland-components/logisland-services/logisland-service-hbase/pom.xml deleted file mode 100644 index a6dd7efe2..000000000 --- a/logisland-components/logisland-services/logisland-service-hbase/pom.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - 4.0.0 - - - com.hurence.logisland - logisland-services - 1.3.0 - - - logisland-service-hbase - Logisland HBase Service Packages - Module containing all logisland hbase services - pom - - - logisland-service-hbase_1_1_2-client - logisland-service-hbase-api - - - - diff --git a/logisland-components/logisland-services/logisland-service-influxdb/logisland-service-influxdb-api/pom.xml b/logisland-components/logisland-services/logisland-service-influxdb/logisland-service-influxdb-api/pom.xml index 11cf915a4..9f0ca0409 100644 --- a/logisland-components/logisland-services/logisland-service-influxdb/logisland-service-influxdb-api/pom.xml +++ b/logisland-components/logisland-services/logisland-service-influxdb/logisland-service-influxdb-api/pom.xml @@ -7,7 +7,7 @@ com.hurence.logisland logisland-service-influxdb - 1.3.0 + 1.4.0 logisland-service-influxdb-api diff --git a/logisland-components/logisland-services/logisland-service-influxdb/logisland-service-influxdb-client/pom.xml b/logisland-components/logisland-services/logisland-service-influxdb/logisland-service-influxdb-client/pom.xml index b5d051692..062b470b2 100644 --- a/logisland-components/logisland-services/logisland-service-influxdb/logisland-service-influxdb-client/pom.xml +++ b/logisland-components/logisland-services/logisland-service-influxdb/logisland-service-influxdb-client/pom.xml @@ -7,7 +7,7 @@ com.hurence.logisland logisland-service-influxdb - 1.3.0 + 1.4.0 logisland-service-influxdb-client @@ -59,21 +59,10 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - - diff --git a/logisland-components/logisland-services/logisland-service-influxdb/logisland-service-influxdb-client/src/integration-test/java/com/hurence/logisland/service/influxdb/InfluxDBServiceIT.java b/logisland-components/logisland-services/logisland-service-influxdb/logisland-service-influxdb-client/src/integration-test/java/com/hurence/logisland/service/influxdb/InfluxDBServiceIT.java index 20ad98315..f17250b57 100644 --- a/logisland-components/logisland-services/logisland-service-influxdb/logisland-service-influxdb-client/src/integration-test/java/com/hurence/logisland/service/influxdb/InfluxDBServiceIT.java +++ b/logisland-components/logisland-services/logisland-service-influxdb/logisland-service-influxdb-client/src/integration-test/java/com/hurence/logisland/service/influxdb/InfluxDBServiceIT.java @@ -56,7 +56,7 @@ public class InfluxDBServiceIT { private static Logger logger = LoggerFactory.getLogger(InfluxDBServiceIT.class); - private final static String INFLUXDB_HOST = "172.17.0.2"; + private final static String INFLUXDB_HOST = "localhost"; private final static String INFLUXDB_PORT = "8086"; private final static String INFLUXDB_URL = "http://" + INFLUXDB_HOST + ":" + INFLUXDB_PORT; diff --git a/logisland-components/logisland-services/logisland-service-influxdb/logisland-service-influxdb-client/src/main/java/com/hurence/logisland/service/influxdb/InfluxDBControllerService.java b/logisland-components/logisland-services/logisland-service-influxdb/logisland-service-influxdb-client/src/main/java/com/hurence/logisland/service/influxdb/InfluxDBControllerService.java index cbed28d2d..401c5352f 100644 --- a/logisland-components/logisland-services/logisland-service-influxdb/logisland-service-influxdb-client/src/main/java/com/hurence/logisland/service/influxdb/InfluxDBControllerService.java +++ b/logisland-components/logisland-services/logisland-service-influxdb/logisland-service-influxdb-client/src/main/java/com/hurence/logisland/service/influxdb/InfluxDBControllerService.java @@ -1,5 +1,5 @@ /** - * Copyright (C) 2019 Hurence (support@hurence.com) + * Copyright (C) 2016 Hurence (support@hurence.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,10 +29,10 @@ import com.hurence.logisland.record.FieldDictionary; import com.hurence.logisland.record.Record; import com.hurence.logisland.service.datastore.DatastoreClientServiceException; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; +import com.hurence.logisland.service.datastore.model.MultiGetQueryRecord; +import com.hurence.logisland.service.datastore.model.MultiGetResponseRecord; +import com.hurence.logisland.validator.Configuration; import com.hurence.logisland.validator.StandardValidators; -import com.hurence.logisland.validator.ValidationContext; import com.hurence.logisland.validator.ValidationResult; import org.apache.commons.lang3.NotImplementedException; import org.influxdb.InfluxDB; @@ -403,7 +403,7 @@ public void init(ControllerServiceInitializationContext context) throws Initiali } @Override - protected Collection customValidate(ValidationContext context) { + protected Collection customValidate(Configuration context) { final List problems = new ArrayList<>(); @@ -806,6 +806,11 @@ private void stopUpdater() updater = null; } + @Override + public void waitUntilCollectionReady(String name, long timeoutMilli) throws DatastoreClientServiceException { + throw new NotImplementedException("Not yet supported for InfluxDB"); + } + @Override public void createCollection(String name, int partitionsCount, int replicationFactor) throws DatastoreClientServiceException { throw new NotImplementedException("Not yet supported for InfluxDB"); diff --git a/logisland-components/logisland-services/logisland-service-influxdb/pom.xml b/logisland-components/logisland-services/logisland-service-influxdb/pom.xml index 4acde3b81..c46ad7a99 100644 --- a/logisland-components/logisland-services/logisland-service-influxdb/pom.xml +++ b/logisland-components/logisland-services/logisland-service-influxdb/pom.xml @@ -20,7 +20,7 @@ com.hurence.logisland logisland-services - 1.3.0 + 1.4.0 logisland-service-influxdb diff --git a/logisland-components/logisland-services/logisland-service-inmemory-cache/pom.xml b/logisland-components/logisland-services/logisland-service-inmemory-cache/pom.xml index 7e04e7c62..c0d3d5f04 100644 --- a/logisland-components/logisland-services/logisland-service-inmemory-cache/pom.xml +++ b/logisland-components/logisland-services/logisland-service-inmemory-cache/pom.xml @@ -7,7 +7,7 @@ logisland-services com.hurence.logisland - 1.3.0 + 1.4.0 logisland-service-inmemory-cache @@ -75,20 +75,10 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - diff --git a/logisland-components/logisland-services/logisland-service-inmemory-cache/src/main/java/com/hurence/logisland/service/cache/CSVKeyValueCacheService.java b/logisland-components/logisland-services/logisland-service-inmemory-cache/src/main/java/com/hurence/logisland/service/cache/CSVKeyValueCacheService.java index 206f7ee43..bcccf00be 100644 --- a/logisland-components/logisland-services/logisland-service-inmemory-cache/src/main/java/com/hurence/logisland/service/cache/CSVKeyValueCacheService.java +++ b/logisland-components/logisland-services/logisland-service-inmemory-cache/src/main/java/com/hurence/logisland/service/cache/CSVKeyValueCacheService.java @@ -29,8 +29,8 @@ import com.hurence.logisland.record.StandardRecord; import com.hurence.logisland.service.datastore.DatastoreClientService; import com.hurence.logisland.service.datastore.DatastoreClientServiceException; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; +import com.hurence.logisland.service.datastore.model.MultiGetQueryRecord; +import com.hurence.logisland.service.datastore.model.MultiGetResponseRecord; import com.hurence.logisland.validator.StandardValidators; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVParser; @@ -284,6 +284,11 @@ private InputStream initFromUri(String dbUri) { } + @Override + public void waitUntilCollectionReady(String name, long timeoutMilli) throws DatastoreClientServiceException { + throw new UnsupportedOperationException(); + } + @Override public void createCollection(String name, int partitionsCount, int replicationFactor) throws DatastoreClientServiceException { throw new UnsupportedOperationException(); diff --git a/logisland-components/logisland-services/logisland-service-inmemory-cache/src/main/java/com/hurence/logisland/service/cache/LRUKeyValueCacheService.java b/logisland-components/logisland-services/logisland-service-inmemory-cache/src/main/java/com/hurence/logisland/service/cache/LRUKeyValueCacheService.java index a4858a717..904e1f3de 100644 --- a/logisland-components/logisland-services/logisland-service-inmemory-cache/src/main/java/com/hurence/logisland/service/cache/LRUKeyValueCacheService.java +++ b/logisland-components/logisland-services/logisland-service-inmemory-cache/src/main/java/com/hurence/logisland/service/cache/LRUKeyValueCacheService.java @@ -53,7 +53,7 @@ @CapabilityDescription("A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap") public class LRUKeyValueCacheService extends AbstractControllerService implements CacheService { - protected volatile Cache cache; + protected volatile transient Cache cache; @Override public V get(K k) { diff --git a/logisland-components/logisland-services/logisland-service-inmemory-cache/src/test/java/com/hurence/logisland/service/cache/LRUKeyValueCacheServiceTest.java b/logisland-components/logisland-services/logisland-service-inmemory-cache/src/test/java/com/hurence/logisland/service/cache/LRUKeyValueCacheServiceTest.java index de964e835..da4bdb0cd 100644 --- a/logisland-components/logisland-services/logisland-service-inmemory-cache/src/test/java/com/hurence/logisland/service/cache/LRUKeyValueCacheServiceTest.java +++ b/logisland-components/logisland-services/logisland-service-inmemory-cache/src/test/java/com/hurence/logisland/service/cache/LRUKeyValueCacheServiceTest.java @@ -79,6 +79,18 @@ public void testCache() throws InitializationException, IOException { assertEquals("5", cacheService.get("5")); assertEquals("3", cacheService.get("3")); assertEquals("6", cacheService.get("6")); + + cacheService.get("3"); + cacheService.get("5"); + cacheService.set("7", "7"); + + assertEquals(null, cacheService.get("1")); + assertEquals(null, cacheService.get("2")); + assertEquals(null, cacheService.get("4")); + assertEquals("5", cacheService.get("5")); + assertEquals("3", cacheService.get("3")); + assertEquals(null, cacheService.get("6")); + assertEquals("7", cacheService.get("7")); } private class MockCacheService extends LRUKeyValueCacheService { diff --git a/logisland-components/logisland-services/logisland-service-ip-to-geo/logisland-service-ip-to-geo-api/pom.xml b/logisland-components/logisland-services/logisland-service-ip-to-geo/logisland-service-ip-to-geo-api/pom.xml index c07606815..a89e54c65 100644 --- a/logisland-components/logisland-services/logisland-service-ip-to-geo/logisland-service-ip-to-geo-api/pom.xml +++ b/logisland-components/logisland-services/logisland-service-ip-to-geo/logisland-service-ip-to-geo-api/pom.xml @@ -5,7 +5,7 @@ com.hurence.logisland logisland-service-ip-to-geo - 1.3.0 + 1.4.0 4.0.0 diff --git a/logisland-components/logisland-services/logisland-service-ip-to-geo/logisland-service-ip-to-geo-maxmind/pom.xml b/logisland-components/logisland-services/logisland-service-ip-to-geo/logisland-service-ip-to-geo-maxmind/pom.xml index 6f8c30c72..326301f5a 100644 --- a/logisland-components/logisland-services/logisland-service-ip-to-geo/logisland-service-ip-to-geo-maxmind/pom.xml +++ b/logisland-components/logisland-services/logisland-service-ip-to-geo/logisland-service-ip-to-geo-maxmind/pom.xml @@ -5,7 +5,7 @@ com.hurence.logisland logisland-service-ip-to-geo - 1.3.0 + 1.4.0 @@ -41,28 +41,28 @@ 3.7 true - - - com.fasterxml.jackson.core jackson-databind - 2.9.3 + ${jackson.version} + true + + + com.fasterxml.jackson.core + jackson-core + 2.10.3 true com.maxmind.geoip2 geoip2 - 2.11.0 + 2.13.1 true org.apache.hadoop hadoop-client - 2.2.0 + 3.2.1 provided true @@ -97,20 +97,10 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - diff --git a/logisland-components/logisland-services/logisland-service-ip-to-geo/logisland-service-ip-to-geo-maxmind/src/main/java/com/hurence/logisland/service/iptogeo/maxmind/MaxmindIpToGeoService.java b/logisland-components/logisland-services/logisland-service-ip-to-geo/logisland-service-ip-to-geo-maxmind/src/main/java/com/hurence/logisland/service/iptogeo/maxmind/MaxmindIpToGeoService.java index 86722f917..2f7a57385 100644 --- a/logisland-components/logisland-services/logisland-service-ip-to-geo/logisland-service-ip-to-geo-maxmind/src/main/java/com/hurence/logisland/service/iptogeo/maxmind/MaxmindIpToGeoService.java +++ b/logisland-components/logisland-services/logisland-service-ip-to-geo/logisland-service-ip-to-geo-maxmind/src/main/java/com/hurence/logisland/service/iptogeo/maxmind/MaxmindIpToGeoService.java @@ -30,7 +30,6 @@ import com.maxmind.geoip2.exception.GeoIp2Exception; import com.maxmind.geoip2.model.CityResponse; import com.maxmind.geoip2.record.*; -import com.hurence.logisland.component.PropertyValue; import java.io.File; import java.io.IOException; @@ -146,7 +145,7 @@ private void initFromUri(String dbUri) throws Exception Configuration conf = new Configuration(); String hdfsUri = conf.get("fs.defaultFS"); - getLogger().info("Default HDFS URI: " + hdfsUri); + getLogger().info("Base default FS: " + hdfsUri); // Set HADOOP user to same as current suer String hadoopUser = System.getProperty("user.name"); @@ -158,7 +157,7 @@ private void initFromUri(String dbUri) throws Exception // Create a path to config file and init input stream Path hdfsReadpath = new Path(dbUri); - getLogger().info("Reading Maxmind DB file from HDFS at: " + dbUri); + getLogger().info("Reading Maxmind DB file from URI at: " + dbUri); FSDataInputStream inputStream = fs.open(hdfsReadpath); long start = System.currentTimeMillis(); @@ -166,6 +165,8 @@ private void initFromUri(String dbUri) throws Exception long stop = System.currentTimeMillis(); getLogger().info("Completed loading of Maxmind Geo Database in {} milliseconds.", new Object[]{stop - start}); databaseReaderRef.set(databaseReader); + + inputStream.close(); } /** diff --git a/logisland-components/logisland-services/logisland-service-ip-to-geo/pom.xml b/logisland-components/logisland-services/logisland-service-ip-to-geo/pom.xml index 7a42194eb..853544ab0 100644 --- a/logisland-components/logisland-services/logisland-service-ip-to-geo/pom.xml +++ b/logisland-components/logisland-services/logisland-service-ip-to-geo/pom.xml @@ -23,7 +23,7 @@ com.hurence.logisland logisland-services - 1.3.0 + 1.4.0 logisland-service-ip-to-geo diff --git a/logisland-components/logisland-services/logisland-service-mongodb/logisland-service-mongodb-api/pom.xml b/logisland-components/logisland-services/logisland-service-mongodb/logisland-service-mongodb-api/pom.xml index 5ec6c8fd2..95f11e2e8 100644 --- a/logisland-components/logisland-services/logisland-service-mongodb/logisland-service-mongodb-api/pom.xml +++ b/logisland-components/logisland-services/logisland-service-mongodb/logisland-service-mongodb-api/pom.xml @@ -7,7 +7,7 @@ com.hurence.logisland logisland-service-mongodb - 1.3.0 + 1.4.0 logisland-service-mongodb-api diff --git a/logisland-components/logisland-services/logisland-service-mongodb/logisland-service-mongodb-client/pom.xml b/logisland-components/logisland-services/logisland-service-mongodb/logisland-service-mongodb-client/pom.xml index 9dd8dba35..f8264176d 100644 --- a/logisland-components/logisland-services/logisland-service-mongodb/logisland-service-mongodb-client/pom.xml +++ b/logisland-components/logisland-services/logisland-service-mongodb/logisland-service-mongodb-client/pom.xml @@ -7,7 +7,7 @@ com.hurence.logisland logisland-service-mongodb - 1.3.0 + 1.4.0 logisland-service-mongodb-client @@ -45,22 +45,11 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - - diff --git a/logisland-components/logisland-services/logisland-service-mongodb/logisland-service-mongodb-client/src/main/java/com/hurence/logisland/service/mongodb/MongoDBControllerService.java b/logisland-components/logisland-services/logisland-service-mongodb/logisland-service-mongodb-client/src/main/java/com/hurence/logisland/service/mongodb/MongoDBControllerService.java index 9246e6cf0..fe66ed9ad 100644 --- a/logisland-components/logisland-services/logisland-service-mongodb/logisland-service-mongodb-client/src/main/java/com/hurence/logisland/service/mongodb/MongoDBControllerService.java +++ b/logisland-components/logisland-services/logisland-service-mongodb/logisland-service-mongodb-client/src/main/java/com/hurence/logisland/service/mongodb/MongoDBControllerService.java @@ -27,16 +27,14 @@ import com.hurence.logisland.controller.ControllerServiceInitializationContext; import com.hurence.logisland.record.Record; import com.hurence.logisland.service.datastore.DatastoreClientServiceException; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; +import com.hurence.logisland.service.datastore.model.MultiGetQueryRecord; +import com.hurence.logisland.service.datastore.model.MultiGetResponseRecord; import com.hurence.logisland.util.Tuple; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoCursor; import com.mongodb.client.MongoDatabase; -import com.mongodb.client.model.Filters; import com.mongodb.client.model.UpdateOptions; -import org.bson.BSON; import org.bson.BsonDocument; import org.bson.Document; import org.bson.conversions.Bson; @@ -226,6 +224,11 @@ public MongoDatabase getDatabase(String name) { return mongoClient.getDatabase(name); } + @Override + public void waitUntilCollectionReady(String name, long timeoutMilli) throws DatastoreClientServiceException { + getLogger().warn("not implemented for Mongo"); + } + @Override public void createCollection(String name, int partitionsCount, int replicationFactor) throws DatastoreClientServiceException { diff --git a/logisland-components/logisland-services/logisland-service-mongodb/logisland-service-mongodb-client/src/main/java/com/hurence/logisland/service/mongodb/Validation.java b/logisland-components/logisland-services/logisland-service-mongodb/logisland-service-mongodb-client/src/main/java/com/hurence/logisland/service/mongodb/Validation.java index 509ac1b45..8ec197e66 100644 --- a/logisland-components/logisland-services/logisland-service-mongodb/logisland-service-mongodb-client/src/main/java/com/hurence/logisland/service/mongodb/Validation.java +++ b/logisland-components/logisland-services/logisland-service-mongodb/logisland-service-mongodb-client/src/main/java/com/hurence/logisland/service/mongodb/Validation.java @@ -15,7 +15,6 @@ */ package com.hurence.logisland.service.mongodb; -import com.hurence.logisland.validator.ValidationContext; import com.hurence.logisland.validator.ValidationResult; import com.hurence.logisland.validator.Validator; import com.mongodb.MongoClientURI; diff --git a/logisland-components/logisland-services/logisland-service-mongodb/pom.xml b/logisland-components/logisland-services/logisland-service-mongodb/pom.xml index b0c2c9162..bf3275ee9 100644 --- a/logisland-components/logisland-services/logisland-service-mongodb/pom.xml +++ b/logisland-components/logisland-services/logisland-service-mongodb/pom.xml @@ -6,7 +6,7 @@ com.hurence.logisland logisland-services - 1.3.0 + 1.4.0 logisland-service-mongodb diff --git a/logisland-components/logisland-services/logisland-service-proxy/pom.xml b/logisland-components/logisland-services/logisland-service-proxy/pom.xml index 466a527cd..5ea126496 100644 --- a/logisland-components/logisland-services/logisland-service-proxy/pom.xml +++ b/logisland-components/logisland-services/logisland-service-proxy/pom.xml @@ -5,7 +5,7 @@ logisland-services com.hurence.logisland - 1.3.0 + 1.4.0 4.0.0 @@ -44,22 +44,11 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - - diff --git a/logisland-components/logisland-services/logisland-service-proxy/src/main/java/com/hurence/logisland/rest/service/proxy/StandardProxyConfigurationService.java b/logisland-components/logisland-services/logisland-service-proxy/src/main/java/com/hurence/logisland/rest/service/proxy/StandardProxyConfigurationService.java index 9598ae3b8..3edecb9bd 100644 --- a/logisland-components/logisland-services/logisland-service-proxy/src/main/java/com/hurence/logisland/rest/service/proxy/StandardProxyConfigurationService.java +++ b/logisland-components/logisland-services/logisland-service-proxy/src/main/java/com/hurence/logisland/rest/service/proxy/StandardProxyConfigurationService.java @@ -1,12 +1,12 @@ /** - * Copyright (C) 2019 Hurence (support@hurence.com) - *

+ * Copyright (C) 2016 Hurence (support@hurence.com) + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

+ * + * 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. @@ -26,8 +26,8 @@ import com.hurence.logisland.controller.ControllerServiceInitializationContext; import com.hurence.logisland.service.proxy.ProxyConfiguration; import com.hurence.logisland.service.proxy.ProxyConfigurationService; +import com.hurence.logisland.validator.Configuration; import com.hurence.logisland.validator.StandardValidators; -import com.hurence.logisland.validator.ValidationContext; import com.hurence.logisland.validator.ValidationResult; import java.net.Proxy; @@ -129,18 +129,18 @@ public void init(ControllerServiceInitializationContext context) throws Initiali } @Override - protected Collection customValidate(ValidationContext validationContext) { - final Proxy.Type proxyType = Proxy.Type.valueOf(validationContext.getPropertyValue(PROXY_TYPE).asString()); + protected Collection customValidate(Configuration configuration) { + final Proxy.Type proxyType = Proxy.Type.valueOf(configuration.getPropertyValue(PROXY_TYPE).asString()); if (Proxy.Type.DIRECT.equals(proxyType)) { return Collections.emptyList(); } final List results = new ArrayList<>(); - if (!validationContext.getPropertyValue(PROXY_SERVER_HOST).isSet()) { + if (!configuration.getPropertyValue(PROXY_SERVER_HOST).isSet()) { results.add(new ValidationResult.Builder().subject(PROXY_SERVER_HOST.getDisplayName()) .explanation("required").valid(false).build()); } - if (!validationContext.getPropertyValue(PROXY_SERVER_PORT).isSet()) { + if (!configuration.getPropertyValue(PROXY_SERVER_PORT).isSet()) { results.add(new ValidationResult.Builder().subject(PROXY_SERVER_PORT.getDisplayName()) .explanation("required").valid(false).build()); } diff --git a/logisland-components/logisland-services/logisland-service-redis/pom.xml b/logisland-components/logisland-services/logisland-service-redis/pom.xml index bffc789ed..cc73776ee 100644 --- a/logisland-components/logisland-services/logisland-service-redis/pom.xml +++ b/logisland-components/logisland-services/logisland-service-redis/pom.xml @@ -7,7 +7,7 @@ com.hurence.logisland logisland-services - 1.3.0 + 1.4.0 logisland-service-redis @@ -67,28 +67,18 @@ + org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - - diff --git a/logisland-components/logisland-services/logisland-service-redis/src/main/java/com/hurence/logisland/redis/service/RedisKeyValueCacheService.java b/logisland-components/logisland-services/logisland-service-redis/src/main/java/com/hurence/logisland/redis/service/RedisKeyValueCacheService.java index 7cfc038a1..cf7345b9d 100644 --- a/logisland-components/logisland-services/logisland-service-redis/src/main/java/com/hurence/logisland/redis/service/RedisKeyValueCacheService.java +++ b/logisland-components/logisland-services/logisland-service-redis/src/main/java/com/hurence/logisland/redis/service/RedisKeyValueCacheService.java @@ -32,11 +32,11 @@ import com.hurence.logisland.service.cache.CacheService; import com.hurence.logisland.service.datastore.DatastoreClientService; import com.hurence.logisland.service.datastore.DatastoreClientServiceException; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; +import com.hurence.logisland.service.datastore.model.MultiGetQueryRecord; +import com.hurence.logisland.service.datastore.model.MultiGetResponseRecord; import com.hurence.logisland.util.Tuple; import com.hurence.logisland.validator.StandardValidators; -import com.hurence.logisland.validator.ValidationContext; +import com.hurence.logisland.validator.Configuration; import com.hurence.logisland.validator.ValidationResult; import org.apache.commons.io.IOUtils; import org.springframework.data.redis.connection.RedisConnection; @@ -125,8 +125,8 @@ public List getSupportedPropertyDescriptors() { } @Override - protected Collection customValidate(ValidationContext validationContext) { - return RedisUtils.validate(validationContext); + protected Collection customValidate(Configuration configuration) { + return RedisUtils.validate(configuration); } @Override @@ -190,9 +190,7 @@ public Record getAndPutIfAbsent(final String key, final Record + firstResult.getClass().getName() + " with value " + firstResult.toString()); } } - } while (isEnabled()); - - return null; + } while (true); }); } @@ -349,6 +347,11 @@ private RecordSerializer getSerializer(String inSerializerClass, String schemaCo } + @Override + public void waitUntilCollectionReady(String name, long timeoutMilli) throws DatastoreClientServiceException { + + } + @Override public void createCollection(String name, int partitionsCount, int replicationFactor) throws DatastoreClientServiceException { diff --git a/logisland-components/logisland-services/logisland-service-redis/src/main/java/com/hurence/logisland/redis/util/RedisUtils.java b/logisland-components/logisland-services/logisland-service-redis/src/main/java/com/hurence/logisland/redis/util/RedisUtils.java index a54c29a1d..9acaa71e0 100644 --- a/logisland-components/logisland-services/logisland-service-redis/src/main/java/com/hurence/logisland/redis/util/RedisUtils.java +++ b/logisland-components/logisland-services/logisland-service-redis/src/main/java/com/hurence/logisland/redis/util/RedisUtils.java @@ -22,7 +22,7 @@ import com.hurence.logisland.redis.RedisType; import com.hurence.logisland.util.string.StringUtils; import com.hurence.logisland.validator.StandardValidators; -import com.hurence.logisland.validator.ValidationContext; +import com.hurence.logisland.validator.Configuration; import com.hurence.logisland.validator.ValidationResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -376,12 +376,12 @@ private static JedisPoolConfig createJedisPoolConfig(final ControllerServiceInit return poolConfig; } - public static List validate(ValidationContext validationContext) { + public static List validate(Configuration configuration) { final List results = new ArrayList<>(); - final String redisMode = validationContext.getPropertyValue(RedisUtils.REDIS_MODE).asString(); - final String connectionString = validationContext.getPropertyValue(RedisUtils.CONNECTION_STRING).asString(); - final Integer dbIndex = validationContext.getPropertyValue(RedisUtils.DATABASE).asInteger(); + final String redisMode = configuration.getPropertyValue(RedisUtils.REDIS_MODE).asString(); + final String connectionString = configuration.getPropertyValue(RedisUtils.CONNECTION_STRING).asString(); + final Integer dbIndex = configuration.getPropertyValue(RedisUtils.DATABASE).asInteger(); if (StringUtils.isBlank(connectionString)) { results.add(new ValidationResult.Builder() @@ -422,7 +422,7 @@ public static List validate(ValidationContext validationContex } if (RedisUtils.REDIS_MODE_SENTINEL.getValue().equals(redisMode)) { - final String sentinelMaster = validationContext.getPropertyValue(RedisUtils.SENTINEL_MASTER).asString(); + final String sentinelMaster = configuration.getPropertyValue(RedisUtils.SENTINEL_MASTER).asString(); if (StringUtils.isEmpty(sentinelMaster)) { results.add(new ValidationResult.Builder() .subject(RedisUtils.SENTINEL_MASTER.getDisplayName()) diff --git a/logisland-components/logisland-services/logisland-service-rest/pom.xml b/logisland-components/logisland-services/logisland-service-rest/pom.xml index 126f81759..1c96d3d1b 100644 --- a/logisland-components/logisland-services/logisland-service-rest/pom.xml +++ b/logisland-components/logisland-services/logisland-service-rest/pom.xml @@ -5,7 +5,7 @@ logisland-services com.hurence.logisland - 1.3.0 + 1.4.0 4.0.0 @@ -63,38 +63,28 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/logisland-components/logisland-services/logisland-service-rest/src/main/java/com/hurence/logisland/rest/service/lookup/RestLookupService.java b/logisland-components/logisland-services/logisland-service-rest/src/main/java/com/hurence/logisland/rest/service/lookup/RestLookupService.java index 5ba0c6799..878055f5f 100644 --- a/logisland-components/logisland-services/logisland-service-rest/src/main/java/com/hurence/logisland/rest/service/lookup/RestLookupService.java +++ b/logisland-components/logisland-services/logisland-service-rest/src/main/java/com/hurence/logisland/rest/service/lookup/RestLookupService.java @@ -1,12 +1,12 @@ /** - * Copyright (C) 2019 Hurence (support@hurence.com) - *

+ * Copyright (C) 2016 Hurence (support@hurence.com) + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

+ * + * 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. @@ -180,7 +180,7 @@ public List getSupportedPropertyDescriptors() { private volatile ProxyConfigurationService proxyConfigurationService; private volatile RecordSerializer deserializer; - private volatile OkHttpClient client; + private volatile transient OkHttpClient client; private volatile Map headers; private volatile String urlTemplate; private volatile String basicUser; @@ -234,9 +234,21 @@ public void init(ControllerServiceInitializationContext context) throws Initiali } } + + @Override + public void start() { + super.start(); + } + + @Override + public void stop() { + super.stop(); +// this.urlTemplate = null; + } + @OnDisabled public void onDisable() { - this.urlTemplate = null; + stop(); } private void buildHeaders(ControllerServiceInitializationContext context) { @@ -260,9 +272,13 @@ private void setProxy(OkHttpClient.Builder builder) { if (config.hasCredential()){ builder.proxyAuthenticator((route, response) -> { final String credential= Credentials.basic(config.getProxyUserName(), config.getProxyUserPassword()); - return response.request().newBuilder() - .header("Proxy-Authorization", credential) - .build(); + try {//bug memory leak 28/08/2020 + return response.request().newBuilder() + .header("Proxy-Authorization", credential) + .build(); + } finally { + response.close(); + } }); } } @@ -295,11 +311,15 @@ public Optional lookup(Record coordinates) throws LookupFailureException Request request = buildRequest(mimeType, method, body, endpoint); try { Response response = executeRequest(request); - if (getLogger().isDebugEnabled()) { - getLogger().debug("Response code {} was returned for coordinate {}", - new Object[]{response.code(), coordinates}); + try {//bug memory leak 28/08/2020 + if (getLogger().isDebugEnabled()) { + getLogger().debug("Response code {} was returned for coordinate {}", + new Object[]{response.code(), coordinates}); + } + return handleResponse(response); + } finally { + response.close(); } - return handleResponse(response); } catch (Exception e) { getLogger().error(String.format("Could not execute lookup at endpoint '%s'.", endpoint), e); throw new LookupFailureException(e); @@ -482,4 +502,5 @@ public String getResponseMsgCodeKey() { public String getResponseBodyKey() { return RESPONSE_BODY_FIELD; } + } \ No newline at end of file diff --git a/logisland-components/logisland-services/logisland-service-rest/src/test/java/com/hurence/logisland/rest/service/lookup/MockRestLookUpService.java b/logisland-components/logisland-services/logisland-service-rest/src/test/java/com/hurence/logisland/rest/service/lookup/MockRestLookUpService.java index e05c96a48..13b8cd740 100644 --- a/logisland-components/logisland-services/logisland-service-rest/src/test/java/com/hurence/logisland/rest/service/lookup/MockRestLookUpService.java +++ b/logisland-components/logisland-services/logisland-service-rest/src/test/java/com/hurence/logisland/rest/service/lookup/MockRestLookUpService.java @@ -1,3 +1,18 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.hurence.logisland.rest.service.lookup; import okhttp3.Protocol; diff --git a/logisland-components/logisland-services/logisland-service-rest/src/test/java/com/hurence/logisland/rest/service/lookup/TestRestLookupService.java b/logisland-components/logisland-services/logisland-service-rest/src/test/java/com/hurence/logisland/rest/service/lookup/TestRestLookupService.java index 0a515e7d7..beaf7387d 100644 --- a/logisland-components/logisland-services/logisland-service-rest/src/test/java/com/hurence/logisland/rest/service/lookup/TestRestLookupService.java +++ b/logisland-components/logisland-services/logisland-service-rest/src/test/java/com/hurence/logisland/rest/service/lookup/TestRestLookupService.java @@ -186,6 +186,33 @@ public void testResponseSerialization() throws InitializationException, IOExcept outputRecord1.assertRecordSizeEquals(3); } + + @Test + public void testResponseWithStringEmpty() throws InitializationException, IOException, LookupFailureException { + final TestRunner runner = TestRunners.newTestRunner(new TestProcessor()); + MockRestLookUpService service = new MockRestLookUpService(); + //build mock urls + service.addServerResponse("http://192.168.99.100:31112/function/id1", + "".getBytes(StandardCharsets.UTF_8)); + //enable service + runner.addControllerService("restLookupService", service); + runner.setProperty(service, MockRestLookUpService.URL, "http://192.168.99.100:31112/function/${function_name}"); + runner.enableControllerService(service); + runner.assertValid(service); + + runner.setProperty(TestProcessor.LOOKUP_SERVICE, "restLookupService"); + + runner.enqueue(RecordUtils.getRecordOfString("function_name", "id1")); + runner.run(); + + runner.assertAllInputRecordsProcessed(); + + final MockRecord outputRecord1 = runner.getOutputRecords().get(0); + outputRecord1.assertFieldEquals(service.getResponseCodeKey(), 200); + outputRecord1.assertFieldEquals(service.getResponseMsgCodeKey(), "ok"); + outputRecord1.assertFieldEquals(service.getResponseBodyKey(), ""); + outputRecord1.assertRecordSizeEquals(3); + } //TODO test with a proxy //TODO test with SSL //TODO testConcurrency diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr-api/pom.xml b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr-api/pom.xml index 5e7275200..f3ce5c161 100644 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr-api/pom.xml +++ b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr-api/pom.xml @@ -7,7 +7,7 @@ com.hurence.logisland logisland-service-solr - 1.3.0 + 1.4.0 logisland-service-solr-api diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr-api/src/main/java/com/hurence/logisland/service/solr/api/SolrClientService.java b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr-api/src/main/java/com/hurence/logisland/service/solr/api/SolrClientService.java index cad3360c4..0ec4cb8be 100644 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr-api/src/main/java/com/hurence/logisland/service/solr/api/SolrClientService.java +++ b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr-api/src/main/java/com/hurence/logisland/service/solr/api/SolrClientService.java @@ -26,8 +26,8 @@ import com.hurence.logisland.record.Record; import com.hurence.logisland.service.datastore.DatastoreClientService; import com.hurence.logisland.service.datastore.DatastoreClientServiceException; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; +import com.hurence.logisland.service.datastore.model.MultiGetQueryRecord; +import com.hurence.logisland.service.datastore.model.MultiGetResponseRecord; import com.hurence.logisland.validator.StandardValidators; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrQuery; @@ -523,6 +523,13 @@ public void put(String collectionName, Record record, boolean asynchronous, bool } } + + + @Override + public void waitUntilCollectionReady(String name, long timeoutMilli) throws DatastoreClientServiceException { + throw new UnsupportedOperationException("not yet supported for SolrClientService"); + } + @Override public List multiGet(List multiGetQueryRecords) throws DatastoreClientServiceException { try { diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr-test/pom.xml b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr-test/pom.xml index 7c2cabe38..7605b7f34 100644 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr-test/pom.xml +++ b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr-test/pom.xml @@ -7,7 +7,7 @@ com.hurence.logisland logisland-service-solr - 1.3.0 + 1.4.0 logisland-service-solr-test diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr-test/src/main/java/com/hurence/logisland/service/solr/TestSolrClientService.java b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr-test/src/main/java/com/hurence/logisland/service/solr/TestSolrClientService.java index 94d413141..b4cd24a43 100644 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr-test/src/main/java/com/hurence/logisland/service/solr/TestSolrClientService.java +++ b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr-test/src/main/java/com/hurence/logisland/service/solr/TestSolrClientService.java @@ -20,9 +20,9 @@ import com.hurence.logisland.record.FieldType; import com.hurence.logisland.record.Record; import com.hurence.logisland.record.StandardRecord; -import com.hurence.logisland.service.datastore.InvalidMultiGetQueryRecordException; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; +import com.hurence.logisland.service.datastore.model.exception.InvalidMultiGetQueryRecordException; +import com.hurence.logisland.service.datastore.model.MultiGetQueryRecord; +import com.hurence.logisland.service.datastore.model.MultiGetResponseRecord; import com.hurence.logisland.service.solr.api.SolrClientService; import com.hurence.logisland.util.runner.TestRunner; import com.hurence.logisland.util.runner.TestRunners; diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_5_5_5-client/pom.xml b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_5_5_5-client/pom.xml index aecc57415..2da3ffef0 100644 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_5_5_5-client/pom.xml +++ b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_5_5_5-client/pom.xml @@ -7,7 +7,7 @@ com.hurence.logisland logisland-service-solr - 1.3.0 + 1.4.0 logisland-service-solr_5_5_5-client @@ -67,20 +67,10 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_6_6_2-client/pom.xml b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_6_6_2-client/pom.xml index 8424943d6..35d9c89c0 100644 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_6_6_2-client/pom.xml +++ b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_6_6_2-client/pom.xml @@ -7,7 +7,7 @@ com.hurence.logisland logisland-service-solr - 1.3.0 + 1.4.0 @@ -76,20 +76,10 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_6_6_2-client/src/integration-test/java/com/hurence/logisland/service/solr/TestSolr_6_6_2_ClientService.java b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_6_6_2-client/src/integration-test/java/com/hurence/logisland/service/solr/TestSolr_6_6_2_ClientService.java index acc590b6b..4ef38eeae 100644 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_6_6_2-client/src/integration-test/java/com/hurence/logisland/service/solr/TestSolr_6_6_2_ClientService.java +++ b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_6_6_2-client/src/integration-test/java/com/hurence/logisland/service/solr/TestSolr_6_6_2_ClientService.java @@ -19,10 +19,9 @@ import com.hurence.logisland.component.PropertyDescriptor; import com.hurence.logisland.controller.ControllerServiceInitializationContext; import com.hurence.logisland.processor.ProcessException; -import com.hurence.logisland.service.datastore.InvalidMultiGetQueryRecordException; +import com.hurence.logisland.service.datastore.model.exception.InvalidMultiGetQueryRecordException; import com.hurence.logisland.service.solr.api.SolrClientService; import org.apache.solr.client.solrj.SolrClient; -import org.apache.solr.client.solrj.impl.HttpSolrClient; import org.junit.Test; import java.io.IOException; diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_8-client/pom.xml b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_8-client/pom.xml index 721ecf8d4..1edd8eee7 100644 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_8-client/pom.xml +++ b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_8-client/pom.xml @@ -7,7 +7,7 @@ com.hurence.logisland logisland-service-solr - 1.3.0 + 1.4.0 logisland-service-solr_8-client @@ -77,20 +77,10 @@ org.springframework.boot spring-boot-maven-plugin - - - package - - com.hurence.logisland logisland-maven-plugin - - - package - - diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_8-client/src/integration-test/java/com/hurence/logisland/service/solr/TestSolr8ClientService.java b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_8-client/src/integration-test/java/com/hurence/logisland/service/solr/TestSolr8ClientService.java index 1ea5ac84c..8bdddcc04 100644 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_8-client/src/integration-test/java/com/hurence/logisland/service/solr/TestSolr8ClientService.java +++ b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_8-client/src/integration-test/java/com/hurence/logisland/service/solr/TestSolr8ClientService.java @@ -19,10 +19,9 @@ import com.hurence.logisland.component.PropertyDescriptor; import com.hurence.logisland.controller.ControllerServiceInitializationContext; import com.hurence.logisland.processor.ProcessException; -import com.hurence.logisland.service.datastore.InvalidMultiGetQueryRecordException; +import com.hurence.logisland.service.datastore.model.exception.InvalidMultiGetQueryRecordException; import com.hurence.logisland.service.solr.api.SolrClientService; import org.apache.solr.client.solrj.SolrClient; -import org.apache.solr.client.solrj.impl.HttpSolrClient; import org.junit.Test; import java.io.IOException; diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_8-client/src/main/java/com/hurence/logisland/service/solr/Solr8ClientService.java b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_8-client/src/main/java/com/hurence/logisland/service/solr/Solr8ClientService.java index 335b0514e..e72efd7a0 100644 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_8-client/src/main/java/com/hurence/logisland/service/solr/Solr8ClientService.java +++ b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_8-client/src/main/java/com/hurence/logisland/service/solr/Solr8ClientService.java @@ -89,4 +89,5 @@ protected SolrClient createCloudClient(String connectionString, String collectio protected SolrClient createHttpClient(String connectionString, String collection) { return new HttpSolrClient.Builder(connectionString + "/" + collection).build(); } + } diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/pom.xml b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/pom.xml deleted file mode 100644 index 5938d7bc1..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/pom.xml +++ /dev/null @@ -1,157 +0,0 @@ - - - 4.0.0 - - - com.hurence.logisland - logisland-service-solr - 1.3.0 - - - logisland-service-solr_chronix_6_4_2-client - jar - - Chronix-Solr 6.4.2 Service Plugin - An Implementation of the datastore logisland api for Chronix - - - - bintray - bintray repo - http://dl.bintray.com/chronix/maven - - - - - - org.slf4j - slf4j-api - 1.7.5 - provided - true - - - org.apache.commons - commons-lang3 - 3.7 - true - - - com.hurence.logisland - logisland-service-solr-api - ${project.version} - true - - - - com.hurence.logisland - logisland-api - ${project.version} - true - provided - - - - com.hurence.logisland - logisland-service-solr-test - ${project.version} - test - - - - - org.apache.solr - solr-solrj - 6.4.2 - true - - - de.qaware.chronix - chronix-api - 0.2-beta - true - - - de.qaware.chronix - chronix-server-client - 0.5-beta - true - - - de.qaware.chronix - chronix-timeseries - 0.3.2-beta - true - - - de.qaware.chronix - chronix-timeseries-converter - 0.3.2-beta - true - - - de.qaware.chronix - chronix-timeseries-common - 0.3.2-beta - true - - - org.apache.solr - solr-core - 6.4.2 - true - - - org.apache.lucene - lucene-queries - 6.5.0 - true - - - - org.slf4j - slf4j-simple - 1.7.5 - test - - - - junit - junit - 4.13.1 - test - - - - - - - - maven-surefire-plugin - - never - - - - org.springframework.boot - spring-boot-maven-plugin - - - package - - - - - com.hurence.logisland - logisland-maven-plugin - - - package - - - - - - diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/java/com/hurence/logisland/service/solr/ChronixClientServiceIT.java b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/java/com/hurence/logisland/service/solr/ChronixClientServiceIT.java deleted file mode 100644 index 1bc271c70..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/java/com/hurence/logisland/service/solr/ChronixClientServiceIT.java +++ /dev/null @@ -1,144 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.service.solr; - -import com.hurence.logisland.component.InitializationException; -import com.hurence.logisland.controller.ControllerServiceInitializationContext; -import com.hurence.logisland.processor.ProcessException; -import com.hurence.logisland.record.*; -import com.hurence.logisland.service.datastore.DatastoreClientService; -import com.hurence.logisland.util.runner.TestRunner; -import com.hurence.logisland.util.runner.TestRunners; -import de.qaware.chronix.timeseries.MetricTimeSeries; -import org.junit.Rule; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.*; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; - -import static junit.framework.TestCase.assertFalse; -import static junit.framework.TestCase.assertTrue; - -public class ChronixClientServiceIT { - - - private static final String CHRONIX_COLLECTION = "chronix"; - - private static Logger logger = LoggerFactory.getLogger(ChronixClientServiceIT.class); - - @Rule - public final SolrRule solrRule = new SolrRule(); - - - - private class MockSolrClientService extends Solr_6_4_2_ChronixClientService { - - @Override - protected void createSolrClient(ControllerServiceInitializationContext context) throws ProcessException { - if (solr != null) { - return; - } - solr = solrRule.getClient(); - } - - } - - private DatastoreClientService configureClientService(final TestRunner runner) throws InitializationException { - runner.setProperty(TestProcessor.SOLR_CLIENT_SERVICE, "service"); - - final Solr_6_4_2_ChronixClientService service = new MockSolrClientService(); - runner.addControllerService("service", service); - runner.setProperty(service, Solr_6_4_2_ChronixClientService.SOLR_COLLECTION, "chronix" ); - - runner.enableControllerService(service); - runner.assertValid(service); - - return service; - } - - - private Collection getRandomMetrics(int size) throws InterruptedException { - - List records = new ArrayList<>(); - Random rnd = new Random(); - long now = System.currentTimeMillis(); - - String[] metricsType = {"disk.io", "cpu.wait", "io.wait"}; - String[] hosts = {"host1", "host2", "host3"}; - for (int i = 0; i < size; i++) { - records.add(new StandardRecord(RecordDictionary.METRIC) - .setStringField(FieldDictionary.RECORD_NAME, metricsType[rnd.nextInt(3)]) - .setStringField("host", hosts[rnd.nextInt(3)]) - .setField(FieldDictionary.RECORD_TIME, FieldType.LONG, new Date().getTime()) - .setField(FieldDictionary.RECORD_VALUE, FieldType.FLOAT, 100.0 * Math.random()) - .setTime(now) - ); - now+=rnd.nextInt(500); - } - - return records; - } - - - @Test - public void testConversion() throws InterruptedException { - - final Date now = new Date(); - final Record record = new StandardRecord(RecordDictionary.METRIC) - .setStringField(FieldDictionary.RECORD_NAME, "cpu.wait") - .setTime(now) - .setField(FieldDictionary.RECORD_VALUE, FieldType.FLOAT, 12.345); - - final BlockingQueue queue = new ArrayBlockingQueue<>(1000000); - - final ChronixUpdater service = new ChronixUpdater(solrRule.getClient(), queue, Collections.emptyList(), 10, 1000); - MetricTimeSeries metric = service.convertToMetric(Collections.singletonList(record)); - System.out.println(metric); - assertTrue(metric.getName().equals("cpu.wait")); - assertTrue(metric.getType().equals("metric")); - assertTrue(metric.getTime(0) == now.getTime()); - assertTrue(metric.getValue(0) == 12.345); - } - - - @Test - public void testBasics() { - try { - - Collection records = null; - - records = getRandomMetrics(1000); - - boolean result; - - final TestRunner runner = TestRunners.newTestRunner(new TestProcessor()); - final DatastoreClientService service = configureClientService(runner); - - records.forEach(record -> service.put(CHRONIX_COLLECTION, record, false)); - - // Verify the index does not exist - assertFalse(service.existsCollection("foo")); - // Assert.assertEquals(true, service.existsCollection("chronix")); - } catch (InterruptedException | InitializationException e) { - e.printStackTrace(); - } - - } - -} diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/java/com/hurence/logisland/service/solr/SolrRule.java b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/java/com/hurence/logisland/service/solr/SolrRule.java deleted file mode 100644 index 405f0ceab..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/java/com/hurence/logisland/service/solr/SolrRule.java +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.service.solr; - -// Author: Simon Kitching -// This code is in the public domain - - -import org.apache.commons.io.FileUtils; -import org.apache.solr.client.solrj.SolrClient; -import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer; -import org.apache.solr.core.CoreContainer; -import org.junit.rules.ExternalResource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.io.IOException; - -/** - * A JUnit rule which starts an embedded solr instance. - *

- * Tests which use this rule will run relatively slowly, and should only be used when more conventional unit tests are - * not sufficient - eg when testing DAO-specific code. - *

- */ -public class SolrRule extends ExternalResource { - - private Logger logger = LoggerFactory.getLogger(SolrRule.class); - private EmbeddedSolrServer server; - private CoreContainer container; - - @Override - protected void before() throws Throwable { - - FileUtils.deleteDirectory(new File("src/integration-test/resources/solr/chronix/data")); - container = new CoreContainer("src/integration-test/resources/solr/"); - container.load(); - - server = new EmbeddedSolrServer(container, "chronix" ); - - getClient().deleteByQuery("*:*"); - getClient().commit(); - }; - - @Override - protected void after() { - try { - server.close(); - } catch (IOException e) { - logger.error("error while closing server", e); - } - }; - - /** - * Return the object through which operations can be performed on the ES cluster. - */ - public SolrClient getClient() { - return server; - } - - -} \ No newline at end of file diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/java/com/hurence/logisland/service/solr/SolrTokenizationIT.java b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/java/com/hurence/logisland/service/solr/SolrTokenizationIT.java deleted file mode 100644 index 6937dd6bd..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/java/com/hurence/logisland/service/solr/SolrTokenizationIT.java +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.service.solr; - -import org.apache.solr.client.solrj.SolrClient; -import org.apache.solr.client.solrj.SolrServerException; -import org.apache.solr.client.solrj.response.QueryResponse; -import org.apache.solr.common.SolrDocument; -import org.apache.solr.common.SolrDocumentList; -import org.apache.solr.common.SolrInputDocument; -import org.apache.solr.common.params.ModifiableSolrParams; -import org.junit.Rule; -import org.junit.Test; - -import java.io.IOException; -import java.util.Date; - -import static junit.framework.TestCase.assertTrue; - -public class SolrTokenizationIT { - - @Rule - public SolrRule rule = new SolrRule(); - - @Test - public void testTokenizerInSolr() throws SolrServerException, IOException { - SolrClient server = rule.getClient(); - ModifiableSolrParams params = new ModifiableSolrParams(); - - // ** Let's index a document into our embedded server - - SolrInputDocument newDoc = new SolrInputDocument(); - newDoc.addField("host", "Test Document 1"); - newDoc.addField("name", "doc-1"); - newDoc.addField("type", "Hello world!"); - newDoc.addField("start", new Date().getTime()); - newDoc.addField("end", new Date().getTime() +1000); - server.add(newDoc); - server.commit(); - - // ** And now let's query for it - - params.set("q", "name:doc-1"); - QueryResponse qResp = server.query(params); - - SolrDocumentList docList = qResp.getResults(); - assertTrue( docList.getNumFound() == 1); - SolrDocument doc = docList.get(0); - assertTrue( doc.getFirstValue("host").equals("Test Document 1")) ; - } -} \ No newline at end of file diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/java/com/hurence/logisland/service/solr/TestProcessor.java b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/java/com/hurence/logisland/service/solr/TestProcessor.java deleted file mode 100644 index f536c5412..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/java/com/hurence/logisland/service/solr/TestProcessor.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.hurence.logisland.service.solr; - -import com.hurence.logisland.component.PropertyDescriptor; -import com.hurence.logisland.processor.AbstractProcessor; -import com.hurence.logisland.processor.ProcessContext; -import com.hurence.logisland.record.Record; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - - - -public class TestProcessor extends AbstractProcessor { - - public static final PropertyDescriptor SOLR_CLIENT_SERVICE = new PropertyDescriptor.Builder() - .name("solr.chronix.client.service") - .description("The instance of the Controller Service to use for accessing Solr.") - .required(true) - .identifiesControllerService(Solr_6_4_2_ChronixClientService.class) - .build(); - - - @Override - public List getSupportedPropertyDescriptors() { - List propDescs = new ArrayList<>(); - propDescs.add(SOLR_CLIENT_SERVICE); - return propDescs; - } - - @Override - public Collection process(ProcessContext context, Collection records) { - return Collections.emptyList(); - } - - -} diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/README.txt b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/README.txt deleted file mode 100644 index 28268b19e..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/README.txt +++ /dev/null @@ -1,77 +0,0 @@ -# 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. - - -Default Solr Home Directory -============================= - -This directory is the default Solr home directory which holds -configuration files and Solr indexes (called cores). - - -Basic Directory Structure -------------------------- - -The Solr Home directory typically contains the following... - -* solr.xml * - -This is the primary configuration file Solr looks for when starting; -it specifies high-level configuration options that apply to all -of your Solr cores, such as cluster-wide SolrCloud settings like -the ZooKeeper client timeout. - -In addition, you can also declare Solr cores in this file, however -it is recommended to just use automatic core discovery instead of -listing cores in solr.xml. - -If no solr.xml file is found, then Solr assumes that there should be -a single SolrCore named "collection1" and that the "Instance Directory" -for collection1 should be the same as the Solr Home Directory. - -For more information about solr.xml, please see: -https://cwiki.apache.org/confluence/display/solr/Solr+Cores+and+solr.xml - -* Individual SolrCore Instance Directories * - -Although solr.xml can be configured to look for SolrCore Instance Directories -in any path, simple sub-directories of the Solr Home Dir using relative paths -are common for many installations. - -* Core Discovery * - -During startup, Solr will scan sub-directories of Solr home looking for -a specific file named core.properties. If core.properties is found in a -sub-directory (at any depth), Solr will initialize a core using the properties -defined in core.properties. For an example of core.properties, please see: - -example/solr/collection1/core.properties - -For more information about core discovery, please see: -https://cwiki.apache.org/confluence/display/solr/Moving+to+the+New+solr.xml+Format - -* A Shared 'lib' Directory * - -Although solr.xml can be configured with an optional "sharedLib" attribute -that can point to any path, it is common to use a "./lib" sub-directory of the -Solr Home Directory. - -* ZooKeeper Files * - -When using SolrCloud using the embedded ZooKeeper option for Solr, it is -common to have a "zoo.cfg" file and "zoo_data" directories in the Solr Home -Directory. Please see the SolrCloud wiki page for more details... - -https://wiki.apache.org/solr/SolrCloud diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/conf/protwords.txt b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/conf/protwords.txt deleted file mode 100644 index 1dfc0abec..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/conf/protwords.txt +++ /dev/null @@ -1,21 +0,0 @@ -# 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. - -#----------------------------------------------------------------------- -# Use a protected word file to protect against the stemmer reducing two -# unrelated words to the same base word. - -# Some non-words that normally won't be encountered, -# just to test that they won't be stemmed. -dontstems -zwhacky - diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/conf/schema.xml b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/conf/schema.xml deleted file mode 100644 index d57125554..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/conf/schema.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _text_ - - - - - - - - - - - - - - - - - - id - - - - - - - - - - - - - - - - - - diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/conf/solrconfig.xml b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/conf/solrconfig.xml deleted file mode 100644 index 83cee8e8a..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/conf/solrconfig.xml +++ /dev/null @@ -1,649 +0,0 @@ - - - - - - - - - 6.2.1 - - - ${solr.data.dir:} - - - - - - - - - - - - - - - - - ${solr.lock.type:native} - - - false - - - - - - - - - - - - - - - - - - ${solr.ulog.dir:} - ${solr.ulog.numVersionBuckets:65536} - - - - - ${solr.autoCommit.maxTime:15000} - false - - - - - ${solr.autoSoftCommit.maxTime:-1} - - - - - - - - 1024 - - - - - - - - - - - - - - - - - - true - - - 20 - - - 200 - - - false - - - 2 - - - - - - - - - - - - - - - - - - - - {!xport} - xsort - false - - - - query - - - - - - - text - - - - - - - - - - - - - - - explicit - true - - - - - - - - - - - - - true - false - - - terms - - - - - - - - - - explicit - 10 - metric - - - - - - - explicit - json - true - metric - - - - - - - - - - - - - - - update-processor-chain - - - - - - id - - - - - - - - - - - end - 40DAY - 12 - http://localhost:8983/solr/chronix/retention - false - false - - - - - - - *:* - - - diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/conf/stopwords.txt b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/conf/stopwords.txt deleted file mode 100644 index ae1e83eeb..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/conf/stopwords.txt +++ /dev/null @@ -1,14 +0,0 @@ -# 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. diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/conf/synonyms.txt b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/conf/synonyms.txt deleted file mode 100644 index 7f7212830..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/conf/synonyms.txt +++ /dev/null @@ -1,29 +0,0 @@ -# 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. - -#----------------------------------------------------------------------- -#some test synonym mappings unlikely to appear in real input text -aaafoo => aaabar -bbbfoo => bbbfoo bbbbar -cccfoo => cccbar cccbaz -fooaaa,baraaa,bazaaa - -# Some synonym groups specific to this example -GB,gib,gigabyte,gigabytes -MB,mib,megabyte,megabytes -Television, Televisions, TV, TVs -#notice we use "gib" instead of "GiB" so any WordDelimiterFilter coming -#after us won't split it into two words. - -# Synonym mappings can be used for spelling correction too -pixima => pixma - diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/core.properties b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/core.properties deleted file mode 100644 index fe27796b6..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/core.properties +++ /dev/null @@ -1,3 +0,0 @@ -#Written by CorePropertiesLocator -#Tue Sep 22 08:35:05 UTC 2015 -name=chronix diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/data/index/write.lock b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/data/index/write.lock deleted file mode 100644 index e69de29bb..000000000 diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/aopalliance-1.0.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/aopalliance-1.0.jar deleted file mode 100644 index 578b1a0c3..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/aopalliance-1.0.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-api-0.2-beta.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-api-0.2-beta.jar deleted file mode 100644 index 41d1cedbb..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-api-0.2-beta.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-server-compaction-handler-0.5-beta.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-server-compaction-handler-0.5-beta.jar deleted file mode 100644 index e8f6126a4..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-server-compaction-handler-0.5-beta.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-server-function-metric-0.5-beta.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-server-function-metric-0.5-beta.jar deleted file mode 100644 index a67de5864..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-server-function-metric-0.5-beta.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-server-ingestion-handler-0.5-beta.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-server-ingestion-handler-0.5-beta.jar deleted file mode 100644 index cb9f5cdb1..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-server-ingestion-handler-0.5-beta.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-server-plugin-management-0.5-beta.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-server-plugin-management-0.5-beta.jar deleted file mode 100644 index 3dda93396..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-server-plugin-management-0.5-beta.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-server-query-handler-0.5-beta.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-server-query-handler-0.5-beta.jar deleted file mode 100644 index 6475ce655..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-server-query-handler-0.5-beta.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-server-retention-0.5-beta.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-server-retention-0.5-beta.jar deleted file mode 100644 index 9bd899d1a..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-server-retention-0.5-beta.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-server-type-metric-0.5-beta.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-server-type-metric-0.5-beta.jar deleted file mode 100644 index 083c09b3c..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-server-type-metric-0.5-beta.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-timeseries-0.3.2-beta.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-timeseries-0.3.2-beta.jar deleted file mode 100644 index a4744a2a9..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-timeseries-0.3.2-beta.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-timeseries-common-0.3.2-beta.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-timeseries-common-0.3.2-beta.jar deleted file mode 100644 index f96bb2592..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-timeseries-common-0.3.2-beta.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-timeseries-converter-0.3.2-beta.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-timeseries-converter-0.3.2-beta.jar deleted file mode 100644 index f80004a7c..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix-timeseries-converter-0.3.2-beta.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix.fastdtw-0.3.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix.fastdtw-0.3.jar deleted file mode 100644 index f9bd78af1..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/chronix.fastdtw-0.3.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/commons-lang3-3.4.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/commons-lang3-3.4.jar deleted file mode 100644 index 8ec91d454..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/commons-lang3-3.4.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/commons-math3-3.6.1.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/commons-math3-3.6.1.jar deleted file mode 100644 index 0ff582cfc..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/commons-math3-3.6.1.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/gson-2.7.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/gson-2.7.jar deleted file mode 100644 index be5b59b76..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/gson-2.7.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/guice-4.1.0.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/guice-4.1.0.jar deleted file mode 100644 index 92cad689d..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/guice-4.1.0.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/guice-multibindings-4.1.0.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/guice-multibindings-4.1.0.jar deleted file mode 100644 index af2471892..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/guice-multibindings-4.1.0.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/javax.inject-1.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/javax.inject-1.jar deleted file mode 100644 index b2a9d0bf7..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/javax.inject-1.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/protobuf-java-2.6.1.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/protobuf-java-2.6.1.jar deleted file mode 100644 index 0fcd8089e..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/protobuf-java-2.6.1.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/quartz-2.2.2.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/quartz-2.2.2.jar deleted file mode 100644 index bfff89777..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/chronix/lib/quartz-2.2.2.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/solr.xml b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/solr.xml deleted file mode 100644 index 4bbd200cf..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/solr.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - ${host:} - ${jetty.port:8983} - ${hostContext:solr} - - ${genericCoreNodeNames:true} - - ${zkClientTimeout:30000} - ${distribUpdateSoTimeout:600000} - ${distribUpdateConnTimeout:60000} - - - - - ${socketTimeout:600000} - ${connTimeout:60000} - - - diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/zoo.cfg b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/zoo.cfg deleted file mode 100644 index aea451885..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/integration-test/resources/solr/zoo.cfg +++ /dev/null @@ -1,17 +0,0 @@ -# The number of milliseconds of each tick -tickTime=2000 -# The number of ticks that the initial -# synchronization phase can take -initLimit=10 -# The number of ticks that can pass between -# sending a request and getting an acknowledgement -syncLimit=5 - -# the directory where the snapshot is stored. -# dataDir=/opt/zookeeper/data -# NOTE: Solr defaults the dataDir to /zoo_data - -# the port at which the clients will connect -# clientPort=2181 -# NOTE: Solr sets this based on zkRun / zkHost params - diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/main/java/com/hurence/logisland/service/solr/ChronixUpdater.java b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/main/java/com/hurence/logisland/service/solr/ChronixUpdater.java deleted file mode 100644 index 712910e4c..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/main/java/com/hurence/logisland/service/solr/ChronixUpdater.java +++ /dev/null @@ -1,201 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.service.solr; - -import com.hurence.logisland.record.FieldDictionary; -import com.hurence.logisland.record.Record; -import com.hurence.logisland.record.RecordDictionary; -import com.hurence.logisland.service.datastore.DatastoreClientServiceException; -import de.qaware.chronix.converter.MetricTimeSeriesConverter; -import de.qaware.chronix.solr.client.ChronixSolrStorage; -import de.qaware.chronix.timeseries.MetricTimeSeries; -import de.qaware.chronix.timeseries.dts.Pair; -import org.apache.solr.client.solrj.SolrClient; -import org.apache.solr.client.solrj.SolrServerException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.util.*; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.TimeUnit; -import java.util.function.BinaryOperator; -import java.util.function.Function; -import java.util.stream.Collectors; - -public class ChronixUpdater implements Runnable { - - private final SolrClient solr; - private final BlockingQueue records; - private final int batchSize; - private final long flushInterval; - private volatile int batchedUpdates = 0; - private volatile long lastTS = 0; - private final Collection groupByFields = new LinkedHashSet<>(); - private final List batchBuffer = new ArrayList<>(); - - - private static volatile int threadCount = 0; - protected static Function storageGroupBy = MetricTimeSeries::getName; - protected static BinaryOperator reduce = (binaryTimeSeries, binaryTimeSeries2) -> binaryTimeSeries; - - private Logger logger = LoggerFactory.getLogger(ChronixUpdater.class.getName() + threadCount); - - private MetricTimeSeriesConverter converter = null; - private ChronixSolrStorage storage = null; - - public ChronixUpdater(SolrClient solr, BlockingQueue records, List groupByFields, - int batchSize, long flushInterval) { - this.solr = solr; - this.records = records; - this.batchSize = batchSize; - this.flushInterval = flushInterval; - this.lastTS = System.nanoTime(); // far in the future ... - converter = new MetricTimeSeriesConverter(); - storage = new ChronixSolrStorage<>(batchSize, storageGroupBy, reduce); - if (groupByFields != null) { - this.groupByFields.addAll(groupByFields); - } - threadCount++; - } - - @Override - public void run() { - - while (true) { - - // process record if one - try { - Record record = records.poll(flushInterval, TimeUnit.MILLISECONDS); - if (record != null) { - batchBuffer.add(record); - batchedUpdates++; - } - } catch (InterruptedException e) { - //here we should exit the loop - logger.warn("Interrupted while waiting", e); - try { - sendData(System.nanoTime()); - } catch (Exception e1) { - logger.warn("Unable to flush data before quitting.", e1); - } - break; - } - - // - try { - long currentTS = System.nanoTime(); - if ((currentTS - lastTS) >= flushInterval * 1000000 || batchedUpdates >= batchSize) { - sendData(currentTS); - } - - - // Thread.sleep(10); - } catch (IOException | SolrServerException e) { - logger.error("Unexpected I/O exception", e); - } - } - } - - private synchronized void sendData(long currentTS) throws SolrServerException, IOException { - logger.debug("committing {} records to Chronix after {} ns", batchedUpdates, (currentTS - lastTS)); - Map> groups = batchBuffer.stream().collect(Collectors.groupingBy(r -> - groupByFields.stream().map(f -> r.hasField(f) ? r.getField(f).asString() : null).collect(Collectors.joining("|")))); - if (!groups.isEmpty()) { - storage.add(converter, - groups.values().stream().filter(l -> !l.isEmpty()).map(recs -> { - Collections.sort(recs, Comparator.comparing(Record::getTime)); - return recs; - }).map(this::convertToMetric).collect(Collectors.toList()), solr); - solr.commit(); - } - lastTS = currentTS; - batchBuffer.clear(); - batchedUpdates = 0; - } - - MetricTimeSeries convertToMetric(List records) throws DatastoreClientServiceException { - - - Record first = records.get(0); - String batchUID = UUID.randomUUID().toString(); - final long firstTS = records.get(0).getTime().getTime(); - long tmp = records.get(records.size() - 1).getTime().getTime(); - final long lastTS = tmp == firstTS ? firstTS + 1 : tmp; - - - //extract meta - String metricType = records.stream().filter(record -> record.hasField(FieldDictionary.RECORD_TYPE) && - record.getField(FieldDictionary.RECORD_TYPE).getRawValue() != null) - .map(record -> record.getField(FieldDictionary.RECORD_TYPE).asString()) - .findFirst().orElse(RecordDictionary.METRIC); - - String metricName = records.stream().filter(record -> record.hasField(FieldDictionary.RECORD_NAME) && - record.getField(FieldDictionary.RECORD_NAME).getRawValue() != null) - .map(record -> record.getField(FieldDictionary.RECORD_NAME).asString()) - .findFirst().orElse("unknown"); - - Map attributes = first.getAllFieldsSorted().stream() - .filter(field -> !field.getName().equals(FieldDictionary.RECORD_TIME) && - !field.getName().equals(FieldDictionary.RECORD_NAME) && - !field.getName().equals(FieldDictionary.RECORD_VALUE) && - !field.getName().equals(FieldDictionary.RECORD_ID) && - !field.getName().equals(FieldDictionary.RECORD_TYPE) - ) - .collect(Collectors.toMap(field -> field.getName().replaceAll("\\.", "_"), - field -> { - try { - switch (field.getType()) { - case STRING: - return field.asString(); - case INT: - return field.asInteger(); - case LONG: - return field.asLong(); - case FLOAT: - return field.asFloat(); - case DOUBLE: - return field.asDouble(); - case BOOLEAN: - return field.asBoolean(); - default: - return field.getRawValue(); - } - } catch (Exception e) { - logger.error("Unable to process field " + field, e); - return null; - } - } - )); - - MetricTimeSeries.Builder ret = new MetricTimeSeries.Builder(metricName, metricType) - .attributes(attributes) - .attribute("id", batchUID) - .start(firstTS) - .end(lastTS); - - records.stream() - .filter(record -> record.getField(FieldDictionary.RECORD_VALUE) != null && record.getField(FieldDictionary.RECORD_VALUE).getRawValue() != null) - .map(record -> new Pair<>(record.getTime().getTime(), record.getField(FieldDictionary.RECORD_VALUE).asDouble())) - .filter(longDoublePair -> longDoublePair.getSecond() != null && Double.isFinite(longDoublePair.getSecond())) - .forEach(pair -> ret.point(pair.getFirst(), pair.getSecond())); - - - return ret.build(); - - } - -} diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/main/java/com/hurence/logisland/service/solr/Solr_6_4_2_ChronixClientService.java b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/main/java/com/hurence/logisland/service/solr/Solr_6_4_2_ChronixClientService.java deleted file mode 100644 index 44da5175c..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_6_4_2-client/src/main/java/com/hurence/logisland/service/solr/Solr_6_4_2_ChronixClientService.java +++ /dev/null @@ -1,308 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.service.solr; - -import com.hurence.logisland.annotation.documentation.CapabilityDescription; -import com.hurence.logisland.annotation.documentation.Category; -import com.hurence.logisland.annotation.documentation.ComponentCategory; -import com.hurence.logisland.annotation.documentation.Tags; -import com.hurence.logisland.annotation.lifecycle.OnEnabled; -import com.hurence.logisland.component.InitializationException; -import com.hurence.logisland.component.PropertyDescriptor; -import com.hurence.logisland.controller.AbstractControllerService; -import com.hurence.logisland.controller.ControllerServiceInitializationContext; -import com.hurence.logisland.processor.ProcessException; -import com.hurence.logisland.record.Record; -import com.hurence.logisland.service.datastore.DatastoreClientService; -import com.hurence.logisland.service.datastore.DatastoreClientServiceException; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; -import com.hurence.logisland.validator.StandardValidators; -import org.apache.commons.lang3.StringUtils; -import org.apache.solr.client.solrj.SolrClient; -import org.apache.solr.client.solrj.SolrQuery; -import org.apache.solr.client.solrj.SolrServerException; -import org.apache.solr.client.solrj.impl.CloudSolrClient; -import org.apache.solr.client.solrj.impl.HttpSolrClient; -import org.apache.solr.client.solrj.response.QueryResponse; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.util.*; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.stream.Collectors; - -@Category(ComponentCategory.DATASTORE) -@Tags({"solr", "client"}) -@CapabilityDescription("Implementation of ChronixClientService for Solr 6 4 2") -public class Solr_6_4_2_ChronixClientService extends AbstractControllerService implements DatastoreClientService { - - private static Logger logger = LoggerFactory.getLogger(Solr_6_4_2_ChronixClientService.class); - protected volatile SolrClient solr; - private ExecutorService executorService = Executors.newSingleThreadExecutor(); - private ChronixUpdater updater; - final BlockingQueue queue = new ArrayBlockingQueue<>(1000000); - - public static final PropertyDescriptor SOLR_CLOUD = new PropertyDescriptor.Builder() - .name("solr.cloud") - .description("is slor cloud enabled") - .required(true) - .addValidator(StandardValidators.BOOLEAN_VALIDATOR) - .defaultValue("false") - .build(); - - public static final PropertyDescriptor SOLR_CONNECTION_STRING = new PropertyDescriptor.Builder() - .name("solr.connection.string") - .description("zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ") - .required(true) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .defaultValue("localhost:8983/solr") - .build(); - - public static final PropertyDescriptor SOLR_COLLECTION = new PropertyDescriptor.Builder() - .name("solr.collection") - .description("name of the collection to use") - .required(true) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .build(); - - - public static final PropertyDescriptor GROUP_BY = new PropertyDescriptor.Builder() - .name("group.by") - .description("The field the chunk should be grouped by") - .required(false) - .addValidator(StandardValidators.COMMA_SEPARATED_LIST_VALIDATOR) - .defaultValue("") - .build(); - - - @Override - public List getSupportedPropertyDescriptors() { - List props = new ArrayList<>(); - props.add(BATCH_SIZE); - props.add(SOLR_CLOUD); - props.add(SOLR_COLLECTION); - props.add(SOLR_CONNECTION_STRING); - props.add(FLUSH_INTERVAL); - props.add(GROUP_BY); - return Collections.unmodifiableList(props); - } - - @Override - @OnEnabled - public void init(ControllerServiceInitializationContext context) throws InitializationException { - super.init(context); - synchronized (this) { - try { - createSolrClient(context); - createChronixStorage(context); - } catch (Exception e) { - throw new InitializationException("Error while instantiating ChronixClientService. " + - "Please check your configuration!", e); - } - } - } - - /** - * Instantiate Chronix Client. This should be called by subclasses' @OnScheduled method to create a client - * if one does not yet exist. If called when scheduled, closeClient() should be called by the subclasses' @OnStopped - * method so the client will be destroyed when the processor is stopped. - * - * @param context The context for this processor - * @throws ProcessException if an error occurs while creating an Chronix client - */ - protected void createSolrClient(ControllerServiceInitializationContext context) throws ProcessException { - if (solr != null) { - return; - } - - - // create a solr client - final boolean isCloud = context.getPropertyValue(SOLR_CLOUD).asBoolean(); - final String connectionString = context.getPropertyValue(SOLR_CONNECTION_STRING).asString(); - final String collection = context.getPropertyValue(SOLR_COLLECTION).asString(); - - - if (isCloud) { - //logInfo("creating solrCloudClient on $solrUrl for collection $collection"); - CloudSolrClient cloudSolrClient = new CloudSolrClient.Builder().withZkHost(connectionString).build(); - cloudSolrClient.setDefaultCollection(collection); - cloudSolrClient.setZkClientTimeout(30000); - cloudSolrClient.setZkConnectTimeout(30000); - solr = cloudSolrClient; - } else { - // logInfo(s"creating HttpSolrClient on $solrUrl for collection $collection") - solr = new HttpSolrClient.Builder(connectionString + "/" + collection).build(); - } - - - } - - - protected void createChronixStorage(ControllerServiceInitializationContext context) throws ProcessException { - if (updater != null) { - return; - } - - // setup a thread pool of solr updaters - int batchSize = context.getPropertyValue(BATCH_SIZE).asInteger(); - long flushInterval = context.getPropertyValue(FLUSH_INTERVAL).asLong(); - String[] groupBy = context.getPropertyValue(GROUP_BY).asString().split(","); - updater = new ChronixUpdater(solr, queue, Arrays.stream(groupBy).filter(StringUtils::isNotBlank).collect(Collectors.toList()), - batchSize, flushInterval); - executorService.execute(updater); - - } - - @Override - public void createCollection(String name, int partitionsCount, int replicationFactor) throws DatastoreClientServiceException { - throw new DatastoreClientServiceException("not implemented yet"); - } - - @Override - public void dropCollection(String name) throws DatastoreClientServiceException { - throw new DatastoreClientServiceException("not implemented yet"); - } - - @Override - public long countCollection(String name) throws DatastoreClientServiceException { - throw new DatastoreClientServiceException("not implemented yet"); - } - - @Override - public boolean existsCollection(String name) throws DatastoreClientServiceException { - return false; - } - - @Override - public void refreshCollection(String name) throws DatastoreClientServiceException { - throw new DatastoreClientServiceException("not implemented yet"); - } - - @Override - public void copyCollection(String reindexScrollTimeout, String src, String dst) throws DatastoreClientServiceException { - throw new DatastoreClientServiceException("not implemented yet"); - } - - @Override - public void createAlias(String collection, String alias) throws DatastoreClientServiceException { - throw new DatastoreClientServiceException("not implemented yet"); - } - - @Override - public boolean putMapping(String indexName, String doctype, String mappingAsJsonString) throws DatastoreClientServiceException { - throw new DatastoreClientServiceException("not implemented yet"); - } - - @Override - public void bulkFlush() throws DatastoreClientServiceException { - } - - @Override - public void bulkPut(String collectionName, Record record) throws DatastoreClientServiceException { - - if (record != null) - queue.add(record); - else - logger.debug("trying to add null record in the queue"); - /* try { - MetricTimeSeries metric = convertToMetric(record); - - List timeSeries = new ArrayList<>(); - timeSeries.add(metric); - storage.add(converter, timeSeries, solr); - - solr.commit(); - - - } catch (DatastoreClientServiceException ex) { - logger.error(ex.toString() + " for record " + record.toString()); - } catch (SolrServerException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - }*/ - - } - - - @Override - public void put(String collectionName, Record record, boolean asynchronous) throws DatastoreClientServiceException { - - bulkPut(collectionName, record); - - - } - - @Override - public void remove(String collectionName, Record record, boolean asynchronous) throws DatastoreClientServiceException { - try { - solr.deleteById(collectionName, record.getId()); - - } catch (SolrServerException | IOException e) { - logger.error(e.toString()); - throw new DatastoreClientServiceException(e); - } - } - - @Override - public List multiGet(List multiGetQueryRecords) throws DatastoreClientServiceException { - return null; - } - - @Override - public Record get(String collectionName, Record record) throws DatastoreClientServiceException { - return null; - } - - @Override - public Collection query(String queryString) { - try { - SolrQuery query = new SolrQuery(); - query.setQuery(queryString); - - QueryResponse response = solr.query(query); - - //response.getResults().forEach(doc -> doc.); - - } catch (SolrServerException | IOException e) { - logger.error(e.toString()); - throw new DatastoreClientServiceException(e); - } - - return null; - } - - @Override - public long queryCount(String queryString) { - try { - SolrQuery query = new SolrQuery(); - query.setQuery(queryString); - - QueryResponse response = solr.query(query); - - return response.getResults().getNumFound(); - - } catch (SolrServerException | IOException e) { - logger.error(e.toString()); - throw new DatastoreClientServiceException(e); - } - } -} diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/pom.xml b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/pom.xml deleted file mode 100644 index c4bb8ed1f..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/pom.xml +++ /dev/null @@ -1,157 +0,0 @@ - - - 4.0.0 - - - com.hurence.logisland - logisland-service-solr - 1.3.0 - - - logisland-service-solr_chronix_8-client - jar - - Chronix-Solr 8.x Service Plugin - An Implementation of the datastore logisland api for Chronix - - - - bintray - bintray repo - http://dl.bintray.com/chronix/maven - - - - - - org.slf4j - slf4j-api - 1.7.5 - provided - true - - - org.apache.commons - commons-lang3 - 3.7 - true - - - com.hurence.logisland - logisland-service-solr-api - ${project.version} - true - - - - com.hurence.logisland - logisland-api - ${project.version} - true - provided - - - - com.hurence.logisland - logisland-service-solr-test - ${project.version} - test - - - - - org.apache.solr - solr-solrj - 8.0.0 - true - - - de.qaware.chronix - chronix-api - 0.2-beta - true - - - de.qaware.chronix - chronix-server-client - 0.5-beta - true - - - de.qaware.chronix - chronix-timeseries - 0.3.2-beta - true - - - de.qaware.chronix - chronix-timeseries-converter - 0.3.2-beta - true - - - de.qaware.chronix - chronix-timeseries-common - 0.3.2-beta - true - - - org.apache.solr - solr-core - 8.0.0 - true - - - org.apache.lucene - lucene-queries - 6.5.0 - true - - - - org.slf4j - slf4j-simple - 1.7.5 - test - - - - junit - junit - 4.13.1 - test - - - - - - - - maven-surefire-plugin - - never - - - - org.springframework.boot - spring-boot-maven-plugin - - - package - - - - - com.hurence.logisland - logisland-maven-plugin - - - package - - - - - - diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/java/com/hurence/logisland/service/solr/ChronixClientServiceIT.java b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/java/com/hurence/logisland/service/solr/ChronixClientServiceIT.java deleted file mode 100644 index 7049d6615..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/java/com/hurence/logisland/service/solr/ChronixClientServiceIT.java +++ /dev/null @@ -1,144 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.service.solr; - -import com.hurence.logisland.component.InitializationException; -import com.hurence.logisland.controller.ControllerServiceInitializationContext; -import com.hurence.logisland.processor.ProcessException; -import com.hurence.logisland.record.*; -import com.hurence.logisland.service.datastore.DatastoreClientService; -import com.hurence.logisland.util.runner.TestRunner; -import com.hurence.logisland.util.runner.TestRunners; -import de.qaware.chronix.timeseries.MetricTimeSeries; -import org.junit.Rule; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.*; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; - -import static junit.framework.TestCase.assertFalse; -import static junit.framework.TestCase.assertTrue; - -public class ChronixClientServiceIT { - - - private static final String CHRONIX_COLLECTION = "chronix"; - - private static Logger logger = LoggerFactory.getLogger(ChronixClientServiceIT.class); - - @Rule - public final SolrRule solrRule = new SolrRule(); - - - - private class MockSolrClientService extends Solr_8_ChronixClientService { - - @Override - protected void createSolrClient(ControllerServiceInitializationContext context) throws ProcessException { - if (solr != null) { - return; - } - solr = solrRule.getClient(); - } - - } - - private DatastoreClientService configureClientService(final TestRunner runner) throws InitializationException { - runner.setProperty(TestProcessor.SOLR_CLIENT_SERVICE, "service"); - - final Solr_8_ChronixClientService service = new MockSolrClientService(); - runner.addControllerService("service", service); - runner.setProperty(service, Solr_8_ChronixClientService.SOLR_COLLECTION, "chronix" ); - - runner.enableControllerService(service); - runner.assertValid(service); - - return service; - } - - - private Collection getRandomMetrics(int size) throws InterruptedException { - - List records = new ArrayList<>(); - Random rnd = new Random(); - long now = System.currentTimeMillis(); - - String[] metricsType = {"disk.io", "cpu.wait", "io.wait"}; - String[] hosts = {"host1", "host2", "host3"}; - for (int i = 0; i < size; i++) { - records.add(new StandardRecord(RecordDictionary.METRIC) - .setStringField(FieldDictionary.RECORD_NAME, metricsType[rnd.nextInt(3)]) - .setStringField("host", hosts[rnd.nextInt(3)]) - .setField(FieldDictionary.RECORD_TIME, FieldType.LONG, new Date().getTime()) - .setField(FieldDictionary.RECORD_VALUE, FieldType.FLOAT, 100.0 * Math.random()) - .setTime(now) - ); - now+=rnd.nextInt(500); - } - - return records; - } - - - @Test - public void testConversion() throws InterruptedException { - - final Date now = new Date(); - final Record record = new StandardRecord(RecordDictionary.METRIC) - .setStringField(FieldDictionary.RECORD_NAME, "cpu.wait") - .setTime(now) - .setField(FieldDictionary.RECORD_VALUE, FieldType.FLOAT, 12.345); - - final BlockingQueue queue = new ArrayBlockingQueue<>(1000000); - - final ChronixUpdater service = new ChronixUpdater(solrRule.getClient(), queue, Collections.emptyList(), 10, 1000); - MetricTimeSeries metric = service.convertToMetric(Collections.singletonList(record)); - System.out.println(metric); - assertTrue(metric.getName().equals("cpu.wait")); - assertTrue(metric.getType().equals("metric")); - assertTrue(metric.getTime(0) == now.getTime()); - assertTrue(metric.getValue(0) == 12.345); - } - - - @Test - public void testBasics() { - try { - - Collection records = null; - - records = getRandomMetrics(1000); - - boolean result; - - final TestRunner runner = TestRunners.newTestRunner(new TestProcessor()); - final DatastoreClientService service = configureClientService(runner); - - records.forEach(record -> service.put(CHRONIX_COLLECTION, record, false)); - - // Verify the index does not exist - assertFalse(service.existsCollection("foo")); - // Assert.assertEquals(true, service.existsCollection("chronix")); - } catch (InterruptedException | InitializationException e) { - e.printStackTrace(); - } - - } - -} diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/java/com/hurence/logisland/service/solr/SolrRule.java b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/java/com/hurence/logisland/service/solr/SolrRule.java deleted file mode 100644 index 405f0ceab..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/java/com/hurence/logisland/service/solr/SolrRule.java +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.service.solr; - -// Author: Simon Kitching -// This code is in the public domain - - -import org.apache.commons.io.FileUtils; -import org.apache.solr.client.solrj.SolrClient; -import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer; -import org.apache.solr.core.CoreContainer; -import org.junit.rules.ExternalResource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.io.IOException; - -/** - * A JUnit rule which starts an embedded solr instance. - *

- * Tests which use this rule will run relatively slowly, and should only be used when more conventional unit tests are - * not sufficient - eg when testing DAO-specific code. - *

- */ -public class SolrRule extends ExternalResource { - - private Logger logger = LoggerFactory.getLogger(SolrRule.class); - private EmbeddedSolrServer server; - private CoreContainer container; - - @Override - protected void before() throws Throwable { - - FileUtils.deleteDirectory(new File("src/integration-test/resources/solr/chronix/data")); - container = new CoreContainer("src/integration-test/resources/solr/"); - container.load(); - - server = new EmbeddedSolrServer(container, "chronix" ); - - getClient().deleteByQuery("*:*"); - getClient().commit(); - }; - - @Override - protected void after() { - try { - server.close(); - } catch (IOException e) { - logger.error("error while closing server", e); - } - }; - - /** - * Return the object through which operations can be performed on the ES cluster. - */ - public SolrClient getClient() { - return server; - } - - -} \ No newline at end of file diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/java/com/hurence/logisland/service/solr/SolrTokenizationIT.java b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/java/com/hurence/logisland/service/solr/SolrTokenizationIT.java deleted file mode 100644 index 6937dd6bd..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/java/com/hurence/logisland/service/solr/SolrTokenizationIT.java +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.service.solr; - -import org.apache.solr.client.solrj.SolrClient; -import org.apache.solr.client.solrj.SolrServerException; -import org.apache.solr.client.solrj.response.QueryResponse; -import org.apache.solr.common.SolrDocument; -import org.apache.solr.common.SolrDocumentList; -import org.apache.solr.common.SolrInputDocument; -import org.apache.solr.common.params.ModifiableSolrParams; -import org.junit.Rule; -import org.junit.Test; - -import java.io.IOException; -import java.util.Date; - -import static junit.framework.TestCase.assertTrue; - -public class SolrTokenizationIT { - - @Rule - public SolrRule rule = new SolrRule(); - - @Test - public void testTokenizerInSolr() throws SolrServerException, IOException { - SolrClient server = rule.getClient(); - ModifiableSolrParams params = new ModifiableSolrParams(); - - // ** Let's index a document into our embedded server - - SolrInputDocument newDoc = new SolrInputDocument(); - newDoc.addField("host", "Test Document 1"); - newDoc.addField("name", "doc-1"); - newDoc.addField("type", "Hello world!"); - newDoc.addField("start", new Date().getTime()); - newDoc.addField("end", new Date().getTime() +1000); - server.add(newDoc); - server.commit(); - - // ** And now let's query for it - - params.set("q", "name:doc-1"); - QueryResponse qResp = server.query(params); - - SolrDocumentList docList = qResp.getResults(); - assertTrue( docList.getNumFound() == 1); - SolrDocument doc = docList.get(0); - assertTrue( doc.getFirstValue("host").equals("Test Document 1")) ; - } -} \ No newline at end of file diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/README.txt b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/README.txt deleted file mode 100644 index 28268b19e..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/README.txt +++ /dev/null @@ -1,77 +0,0 @@ -# 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. - - -Default Solr Home Directory -============================= - -This directory is the default Solr home directory which holds -configuration files and Solr indexes (called cores). - - -Basic Directory Structure -------------------------- - -The Solr Home directory typically contains the following... - -* solr.xml * - -This is the primary configuration file Solr looks for when starting; -it specifies high-level configuration options that apply to all -of your Solr cores, such as cluster-wide SolrCloud settings like -the ZooKeeper client timeout. - -In addition, you can also declare Solr cores in this file, however -it is recommended to just use automatic core discovery instead of -listing cores in solr.xml. - -If no solr.xml file is found, then Solr assumes that there should be -a single SolrCore named "collection1" and that the "Instance Directory" -for collection1 should be the same as the Solr Home Directory. - -For more information about solr.xml, please see: -https://cwiki.apache.org/confluence/display/solr/Solr+Cores+and+solr.xml - -* Individual SolrCore Instance Directories * - -Although solr.xml can be configured to look for SolrCore Instance Directories -in any path, simple sub-directories of the Solr Home Dir using relative paths -are common for many installations. - -* Core Discovery * - -During startup, Solr will scan sub-directories of Solr home looking for -a specific file named core.properties. If core.properties is found in a -sub-directory (at any depth), Solr will initialize a core using the properties -defined in core.properties. For an example of core.properties, please see: - -example/solr/collection1/core.properties - -For more information about core discovery, please see: -https://cwiki.apache.org/confluence/display/solr/Moving+to+the+New+solr.xml+Format - -* A Shared 'lib' Directory * - -Although solr.xml can be configured with an optional "sharedLib" attribute -that can point to any path, it is common to use a "./lib" sub-directory of the -Solr Home Directory. - -* ZooKeeper Files * - -When using SolrCloud using the embedded ZooKeeper option for Solr, it is -common to have a "zoo.cfg" file and "zoo_data" directories in the Solr Home -Directory. Please see the SolrCloud wiki page for more details... - -https://wiki.apache.org/solr/SolrCloud diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/conf/protwords.txt b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/conf/protwords.txt deleted file mode 100644 index 1dfc0abec..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/conf/protwords.txt +++ /dev/null @@ -1,21 +0,0 @@ -# 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. - -#----------------------------------------------------------------------- -# Use a protected word file to protect against the stemmer reducing two -# unrelated words to the same base word. - -# Some non-words that normally won't be encountered, -# just to test that they won't be stemmed. -dontstems -zwhacky - diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/conf/schema.xml b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/conf/schema.xml deleted file mode 100644 index 882d7cd7b..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/conf/schema.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _text_ - - - - - - - - - - - - - - - - - - id - - - - - - - - - - - - - - - - - - diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/conf/solrconfig.xml b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/conf/solrconfig.xml deleted file mode 100644 index 83cee8e8a..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/conf/solrconfig.xml +++ /dev/null @@ -1,649 +0,0 @@ - - - - - - - - - 6.2.1 - - - ${solr.data.dir:} - - - - - - - - - - - - - - - - - ${solr.lock.type:native} - - - false - - - - - - - - - - - - - - - - - - ${solr.ulog.dir:} - ${solr.ulog.numVersionBuckets:65536} - - - - - ${solr.autoCommit.maxTime:15000} - false - - - - - ${solr.autoSoftCommit.maxTime:-1} - - - - - - - - 1024 - - - - - - - - - - - - - - - - - - true - - - 20 - - - 200 - - - false - - - 2 - - - - - - - - - - - - - - - - - - - - {!xport} - xsort - false - - - - query - - - - - - - text - - - - - - - - - - - - - - - explicit - true - - - - - - - - - - - - - true - false - - - terms - - - - - - - - - - explicit - 10 - metric - - - - - - - explicit - json - true - metric - - - - - - - - - - - - - - - update-processor-chain - - - - - - id - - - - - - - - - - - end - 40DAY - 12 - http://localhost:8983/solr/chronix/retention - false - false - - - - - - - *:* - - - diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/conf/stopwords.txt b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/conf/stopwords.txt deleted file mode 100644 index ae1e83eeb..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/conf/stopwords.txt +++ /dev/null @@ -1,14 +0,0 @@ -# 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. diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/conf/synonyms.txt b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/conf/synonyms.txt deleted file mode 100644 index 7f7212830..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/conf/synonyms.txt +++ /dev/null @@ -1,29 +0,0 @@ -# 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. - -#----------------------------------------------------------------------- -#some test synonym mappings unlikely to appear in real input text -aaafoo => aaabar -bbbfoo => bbbfoo bbbbar -cccfoo => cccbar cccbaz -fooaaa,baraaa,bazaaa - -# Some synonym groups specific to this example -GB,gib,gigabyte,gigabytes -MB,mib,megabyte,megabytes -Television, Televisions, TV, TVs -#notice we use "gib" instead of "GiB" so any WordDelimiterFilter coming -#after us won't split it into two words. - -# Synonym mappings can be used for spelling correction too -pixima => pixma - diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/core.properties b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/core.properties deleted file mode 100644 index fe27796b6..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/core.properties +++ /dev/null @@ -1,3 +0,0 @@ -#Written by CorePropertiesLocator -#Tue Sep 22 08:35:05 UTC 2015 -name=chronix diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/aopalliance-1.0.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/aopalliance-1.0.jar deleted file mode 100644 index 578b1a0c3..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/aopalliance-1.0.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-api-0.2-beta.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-api-0.2-beta.jar deleted file mode 100644 index 41d1cedbb..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-api-0.2-beta.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-server-compaction-handler-0.5-beta.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-server-compaction-handler-0.5-beta.jar deleted file mode 100644 index e8f6126a4..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-server-compaction-handler-0.5-beta.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-server-function-metric-0.5-beta.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-server-function-metric-0.5-beta.jar deleted file mode 100644 index a67de5864..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-server-function-metric-0.5-beta.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-server-ingestion-handler-0.5-beta.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-server-ingestion-handler-0.5-beta.jar deleted file mode 100644 index cb9f5cdb1..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-server-ingestion-handler-0.5-beta.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-server-plugin-management-0.5-beta.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-server-plugin-management-0.5-beta.jar deleted file mode 100644 index 3dda93396..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-server-plugin-management-0.5-beta.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-server-query-handler-0.5-beta.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-server-query-handler-0.5-beta.jar deleted file mode 100644 index 6475ce655..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-server-query-handler-0.5-beta.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-server-retention-0.5-beta.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-server-retention-0.5-beta.jar deleted file mode 100644 index 9bd899d1a..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-server-retention-0.5-beta.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-server-type-metric-0.5-beta.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-server-type-metric-0.5-beta.jar deleted file mode 100644 index 083c09b3c..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-server-type-metric-0.5-beta.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-timeseries-0.3.2-beta.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-timeseries-0.3.2-beta.jar deleted file mode 100644 index a4744a2a9..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-timeseries-0.3.2-beta.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-timeseries-common-0.3.2-beta.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-timeseries-common-0.3.2-beta.jar deleted file mode 100644 index f96bb2592..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-timeseries-common-0.3.2-beta.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-timeseries-converter-0.3.2-beta.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-timeseries-converter-0.3.2-beta.jar deleted file mode 100644 index f80004a7c..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix-timeseries-converter-0.3.2-beta.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix.fastdtw-0.3.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix.fastdtw-0.3.jar deleted file mode 100644 index f9bd78af1..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/chronix.fastdtw-0.3.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/commons-lang3-3.4.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/commons-lang3-3.4.jar deleted file mode 100644 index 8ec91d454..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/commons-lang3-3.4.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/commons-math3-3.6.1.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/commons-math3-3.6.1.jar deleted file mode 100644 index 0ff582cfc..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/commons-math3-3.6.1.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/gson-2.7.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/gson-2.7.jar deleted file mode 100644 index be5b59b76..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/gson-2.7.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/guice-4.1.0.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/guice-4.1.0.jar deleted file mode 100644 index 92cad689d..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/guice-4.1.0.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/guice-multibindings-4.1.0.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/guice-multibindings-4.1.0.jar deleted file mode 100644 index af2471892..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/guice-multibindings-4.1.0.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/javax.inject-1.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/javax.inject-1.jar deleted file mode 100644 index b2a9d0bf7..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/javax.inject-1.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/protobuf-java-2.6.1.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/protobuf-java-2.6.1.jar deleted file mode 100644 index 0fcd8089e..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/protobuf-java-2.6.1.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/quartz-2.2.2.jar b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/quartz-2.2.2.jar deleted file mode 100644 index bfff89777..000000000 Binary files a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/chronix/lib/quartz-2.2.2.jar and /dev/null differ diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/solr.xml b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/solr.xml deleted file mode 100644 index 4bbd200cf..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/solr.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - ${host:} - ${jetty.port:8983} - ${hostContext:solr} - - ${genericCoreNodeNames:true} - - ${zkClientTimeout:30000} - ${distribUpdateSoTimeout:600000} - ${distribUpdateConnTimeout:60000} - - - - - ${socketTimeout:600000} - ${connTimeout:60000} - - - diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/zoo.cfg b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/zoo.cfg deleted file mode 100644 index aea451885..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/integration-test/resources/solr/zoo.cfg +++ /dev/null @@ -1,17 +0,0 @@ -# The number of milliseconds of each tick -tickTime=2000 -# The number of ticks that the initial -# synchronization phase can take -initLimit=10 -# The number of ticks that can pass between -# sending a request and getting an acknowledgement -syncLimit=5 - -# the directory where the snapshot is stored. -# dataDir=/opt/zookeeper/data -# NOTE: Solr defaults the dataDir to /zoo_data - -# the port at which the clients will connect -# clientPort=2181 -# NOTE: Solr sets this based on zkRun / zkHost params - diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/main/java/com/hurence/logisland/service/solr/ChronixUpdater.java b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/main/java/com/hurence/logisland/service/solr/ChronixUpdater.java deleted file mode 100644 index 712910e4c..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/main/java/com/hurence/logisland/service/solr/ChronixUpdater.java +++ /dev/null @@ -1,201 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.service.solr; - -import com.hurence.logisland.record.FieldDictionary; -import com.hurence.logisland.record.Record; -import com.hurence.logisland.record.RecordDictionary; -import com.hurence.logisland.service.datastore.DatastoreClientServiceException; -import de.qaware.chronix.converter.MetricTimeSeriesConverter; -import de.qaware.chronix.solr.client.ChronixSolrStorage; -import de.qaware.chronix.timeseries.MetricTimeSeries; -import de.qaware.chronix.timeseries.dts.Pair; -import org.apache.solr.client.solrj.SolrClient; -import org.apache.solr.client.solrj.SolrServerException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.util.*; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.TimeUnit; -import java.util.function.BinaryOperator; -import java.util.function.Function; -import java.util.stream.Collectors; - -public class ChronixUpdater implements Runnable { - - private final SolrClient solr; - private final BlockingQueue records; - private final int batchSize; - private final long flushInterval; - private volatile int batchedUpdates = 0; - private volatile long lastTS = 0; - private final Collection groupByFields = new LinkedHashSet<>(); - private final List batchBuffer = new ArrayList<>(); - - - private static volatile int threadCount = 0; - protected static Function storageGroupBy = MetricTimeSeries::getName; - protected static BinaryOperator reduce = (binaryTimeSeries, binaryTimeSeries2) -> binaryTimeSeries; - - private Logger logger = LoggerFactory.getLogger(ChronixUpdater.class.getName() + threadCount); - - private MetricTimeSeriesConverter converter = null; - private ChronixSolrStorage storage = null; - - public ChronixUpdater(SolrClient solr, BlockingQueue records, List groupByFields, - int batchSize, long flushInterval) { - this.solr = solr; - this.records = records; - this.batchSize = batchSize; - this.flushInterval = flushInterval; - this.lastTS = System.nanoTime(); // far in the future ... - converter = new MetricTimeSeriesConverter(); - storage = new ChronixSolrStorage<>(batchSize, storageGroupBy, reduce); - if (groupByFields != null) { - this.groupByFields.addAll(groupByFields); - } - threadCount++; - } - - @Override - public void run() { - - while (true) { - - // process record if one - try { - Record record = records.poll(flushInterval, TimeUnit.MILLISECONDS); - if (record != null) { - batchBuffer.add(record); - batchedUpdates++; - } - } catch (InterruptedException e) { - //here we should exit the loop - logger.warn("Interrupted while waiting", e); - try { - sendData(System.nanoTime()); - } catch (Exception e1) { - logger.warn("Unable to flush data before quitting.", e1); - } - break; - } - - // - try { - long currentTS = System.nanoTime(); - if ((currentTS - lastTS) >= flushInterval * 1000000 || batchedUpdates >= batchSize) { - sendData(currentTS); - } - - - // Thread.sleep(10); - } catch (IOException | SolrServerException e) { - logger.error("Unexpected I/O exception", e); - } - } - } - - private synchronized void sendData(long currentTS) throws SolrServerException, IOException { - logger.debug("committing {} records to Chronix after {} ns", batchedUpdates, (currentTS - lastTS)); - Map> groups = batchBuffer.stream().collect(Collectors.groupingBy(r -> - groupByFields.stream().map(f -> r.hasField(f) ? r.getField(f).asString() : null).collect(Collectors.joining("|")))); - if (!groups.isEmpty()) { - storage.add(converter, - groups.values().stream().filter(l -> !l.isEmpty()).map(recs -> { - Collections.sort(recs, Comparator.comparing(Record::getTime)); - return recs; - }).map(this::convertToMetric).collect(Collectors.toList()), solr); - solr.commit(); - } - lastTS = currentTS; - batchBuffer.clear(); - batchedUpdates = 0; - } - - MetricTimeSeries convertToMetric(List records) throws DatastoreClientServiceException { - - - Record first = records.get(0); - String batchUID = UUID.randomUUID().toString(); - final long firstTS = records.get(0).getTime().getTime(); - long tmp = records.get(records.size() - 1).getTime().getTime(); - final long lastTS = tmp == firstTS ? firstTS + 1 : tmp; - - - //extract meta - String metricType = records.stream().filter(record -> record.hasField(FieldDictionary.RECORD_TYPE) && - record.getField(FieldDictionary.RECORD_TYPE).getRawValue() != null) - .map(record -> record.getField(FieldDictionary.RECORD_TYPE).asString()) - .findFirst().orElse(RecordDictionary.METRIC); - - String metricName = records.stream().filter(record -> record.hasField(FieldDictionary.RECORD_NAME) && - record.getField(FieldDictionary.RECORD_NAME).getRawValue() != null) - .map(record -> record.getField(FieldDictionary.RECORD_NAME).asString()) - .findFirst().orElse("unknown"); - - Map attributes = first.getAllFieldsSorted().stream() - .filter(field -> !field.getName().equals(FieldDictionary.RECORD_TIME) && - !field.getName().equals(FieldDictionary.RECORD_NAME) && - !field.getName().equals(FieldDictionary.RECORD_VALUE) && - !field.getName().equals(FieldDictionary.RECORD_ID) && - !field.getName().equals(FieldDictionary.RECORD_TYPE) - ) - .collect(Collectors.toMap(field -> field.getName().replaceAll("\\.", "_"), - field -> { - try { - switch (field.getType()) { - case STRING: - return field.asString(); - case INT: - return field.asInteger(); - case LONG: - return field.asLong(); - case FLOAT: - return field.asFloat(); - case DOUBLE: - return field.asDouble(); - case BOOLEAN: - return field.asBoolean(); - default: - return field.getRawValue(); - } - } catch (Exception e) { - logger.error("Unable to process field " + field, e); - return null; - } - } - )); - - MetricTimeSeries.Builder ret = new MetricTimeSeries.Builder(metricName, metricType) - .attributes(attributes) - .attribute("id", batchUID) - .start(firstTS) - .end(lastTS); - - records.stream() - .filter(record -> record.getField(FieldDictionary.RECORD_VALUE) != null && record.getField(FieldDictionary.RECORD_VALUE).getRawValue() != null) - .map(record -> new Pair<>(record.getTime().getTime(), record.getField(FieldDictionary.RECORD_VALUE).asDouble())) - .filter(longDoublePair -> longDoublePair.getSecond() != null && Double.isFinite(longDoublePair.getSecond())) - .forEach(pair -> ret.point(pair.getFirst(), pair.getSecond())); - - - return ret.build(); - - } - -} diff --git a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/main/java/com/hurence/logisland/service/solr/Solr_8_ChronixClientService.java b/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/main/java/com/hurence/logisland/service/solr/Solr_8_ChronixClientService.java deleted file mode 100644 index a13a6ec79..000000000 --- a/logisland-components/logisland-services/logisland-service-solr/logisland-service-solr_chronix_8-client/src/main/java/com/hurence/logisland/service/solr/Solr_8_ChronixClientService.java +++ /dev/null @@ -1,305 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.service.solr; - -import com.hurence.logisland.annotation.documentation.CapabilityDescription; -import com.hurence.logisland.annotation.documentation.Tags; -import com.hurence.logisland.annotation.lifecycle.OnEnabled; -import com.hurence.logisland.component.InitializationException; -import com.hurence.logisland.component.PropertyDescriptor; -import com.hurence.logisland.controller.AbstractControllerService; -import com.hurence.logisland.controller.ControllerServiceInitializationContext; -import com.hurence.logisland.processor.ProcessException; -import com.hurence.logisland.record.Record; -import com.hurence.logisland.service.datastore.DatastoreClientService; -import com.hurence.logisland.service.datastore.DatastoreClientServiceException; -import com.hurence.logisland.service.datastore.MultiGetQueryRecord; -import com.hurence.logisland.service.datastore.MultiGetResponseRecord; -import com.hurence.logisland.validator.StandardValidators; -import org.apache.commons.lang3.StringUtils; -import org.apache.solr.client.solrj.SolrClient; -import org.apache.solr.client.solrj.SolrQuery; -import org.apache.solr.client.solrj.SolrServerException; -import org.apache.solr.client.solrj.impl.CloudSolrClient; -import org.apache.solr.client.solrj.impl.HttpSolrClient; -import org.apache.solr.client.solrj.response.QueryResponse; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.util.*; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.stream.Collectors; - -@Tags({"solr", "client"}) -@CapabilityDescription("Implementation of ChronixClientService for Solr 8") -public class Solr_8_ChronixClientService extends AbstractControllerService implements DatastoreClientService { - - private static Logger logger = LoggerFactory.getLogger(Solr_8_ChronixClientService.class); - protected volatile SolrClient solr; - private ExecutorService executorService = Executors.newSingleThreadExecutor(); - private ChronixUpdater updater; - final BlockingQueue queue = new ArrayBlockingQueue<>(1000000); - - public static final PropertyDescriptor SOLR_CLOUD = new PropertyDescriptor.Builder() - .name("solr.cloud") - .description("is slor cloud enabled") - .required(true) - .addValidator(StandardValidators.BOOLEAN_VALIDATOR) - .defaultValue("false") - .build(); - - public static final PropertyDescriptor SOLR_CONNECTION_STRING = new PropertyDescriptor.Builder() - .name("solr.connection.string") - .description("zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ") - .required(true) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .defaultValue("localhost:8983/solr") - .build(); - - public static final PropertyDescriptor SOLR_COLLECTION = new PropertyDescriptor.Builder() - .name("solr.collection") - .description("name of the collection to use") - .required(true) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .build(); - - - public static final PropertyDescriptor GROUP_BY = new PropertyDescriptor.Builder() - .name("group.by") - .description("The field the chunk should be grouped by") - .required(false) - .addValidator(StandardValidators.COMMA_SEPARATED_LIST_VALIDATOR) - .defaultValue("") - .build(); - - - @Override - public List getSupportedPropertyDescriptors() { - List props = new ArrayList<>(); - props.add(BATCH_SIZE); - props.add(SOLR_CLOUD); - props.add(SOLR_COLLECTION); - props.add(SOLR_CONNECTION_STRING); - props.add(FLUSH_INTERVAL); - props.add(GROUP_BY); - return Collections.unmodifiableList(props); - } - - @Override - @OnEnabled - public void init(ControllerServiceInitializationContext context) throws InitializationException { - super.init(context); - synchronized (this) { - try { - createSolrClient(context); - createChronixStorage(context); - } catch (Exception e) { - throw new InitializationException("Error while instantiating ChronixClientService. " + - "Please check your configuration!", e); - } - } - } - - /** - * Instantiate Chronix Client. This should be called by subclasses' @OnScheduled method to create a client - * if one does not yet exist. If called when scheduled, closeClient() should be called by the subclasses' @OnStopped - * method so the client will be destroyed when the processor is stopped. - * - * @param context The context for this processor - * @throws ProcessException if an error occurs while creating an Chronix client - */ - protected void createSolrClient(ControllerServiceInitializationContext context) throws ProcessException { - if (solr != null) { - return; - } - - - // create a solr client - final boolean isCloud = context.getPropertyValue(SOLR_CLOUD).asBoolean(); - final String connectionString = context.getPropertyValue(SOLR_CONNECTION_STRING).asString(); - final String collection = context.getPropertyValue(SOLR_COLLECTION).asString(); - - - if (isCloud) { - //logInfo("creating solrCloudClient on $solrUrl for collection $collection"); - CloudSolrClient cloudSolrClient = new CloudSolrClient.Builder(Collections.singletonList(connectionString), Optional.empty()).build(); - cloudSolrClient.setDefaultCollection(collection); - cloudSolrClient.setZkClientTimeout(30000); - cloudSolrClient.setZkConnectTimeout(30000); - solr = cloudSolrClient; - } else { - // logInfo(s"creating HttpSolrClient on $solrUrl for collection $collection") - solr = new HttpSolrClient.Builder(connectionString + "/" + collection).build(); - } - - - } - - - protected void createChronixStorage(ControllerServiceInitializationContext context) throws ProcessException { - if (updater != null) { - return; - } - - // setup a thread pool of solr updaters - int batchSize = context.getPropertyValue(BATCH_SIZE).asInteger(); - long flushInterval = context.getPropertyValue(FLUSH_INTERVAL).asLong(); - String[] groupBy = context.getPropertyValue(GROUP_BY).asString().split(","); - updater = new ChronixUpdater(solr, queue, Arrays.stream(groupBy).filter(StringUtils::isNotBlank).collect(Collectors.toList()), - batchSize, flushInterval); - executorService.execute(updater); - - } - - @Override - public void createCollection(String name, int partitionsCount, int replicationFactor) throws DatastoreClientServiceException { - throw new DatastoreClientServiceException("not implemented yet"); - } - - @Override - public void dropCollection(String name) throws DatastoreClientServiceException { - throw new DatastoreClientServiceException("not implemented yet"); - } - - @Override - public long countCollection(String name) throws DatastoreClientServiceException { - throw new DatastoreClientServiceException("not implemented yet"); - } - - @Override - public boolean existsCollection(String name) throws DatastoreClientServiceException { - return false; - } - - @Override - public void refreshCollection(String name) throws DatastoreClientServiceException { - throw new DatastoreClientServiceException("not implemented yet"); - } - - @Override - public void copyCollection(String reindexScrollTimeout, String src, String dst) throws DatastoreClientServiceException { - throw new DatastoreClientServiceException("not implemented yet"); - } - - @Override - public void createAlias(String collection, String alias) throws DatastoreClientServiceException { - throw new DatastoreClientServiceException("not implemented yet"); - } - - @Override - public boolean putMapping(String indexName, String doctype, String mappingAsJsonString) throws DatastoreClientServiceException { - throw new DatastoreClientServiceException("not implemented yet"); - } - - @Override - public void bulkFlush() throws DatastoreClientServiceException { - } - - @Override - public void bulkPut(String collectionName, Record record) throws DatastoreClientServiceException { - - if (record != null) - queue.add(record); - else - logger.debug("trying to add null record in the queue"); - /* try { - MetricTimeSeries metric = convertToMetric(record); - - List timeSeries = new ArrayList<>(); - timeSeries.add(metric); - storage.add(converter, timeSeries, solr); - - solr.commit(); - - - } catch (DatastoreClientServiceException ex) { - logger.error(ex.toString() + " for record " + record.toString()); - } catch (SolrServerException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - }*/ - - } - - - @Override - public void put(String collectionName, Record record, boolean asynchronous) throws DatastoreClientServiceException { - - bulkPut(collectionName, record); - - - } - - @Override - public void remove(String collectionName, Record record, boolean asynchronous) throws DatastoreClientServiceException { - try { - solr.deleteById(collectionName, record.getId()); - - } catch (SolrServerException | IOException e) { - logger.error(e.toString()); - throw new DatastoreClientServiceException(e); - } - } - - @Override - public List multiGet(List multiGetQueryRecords) throws DatastoreClientServiceException { - return null; - } - - @Override - public Record get(String collectionName, Record record) throws DatastoreClientServiceException { - return null; - } - - @Override - public Collection query(String queryString) { - try { - SolrQuery query = new SolrQuery(); - query.setQuery(queryString); - - QueryResponse response = solr.query(query); - - //response.getResults().forEach(doc -> doc.); - - } catch (SolrServerException | IOException e) { - logger.error(e.toString()); - throw new DatastoreClientServiceException(e); - } - - return null; - } - - @Override - public long queryCount(String queryString) { - try { - SolrQuery query = new SolrQuery(); - query.setQuery(queryString); - - QueryResponse response = solr.query(query); - - return response.getResults().getNumFound(); - - } catch (SolrServerException | IOException e) { - logger.error(e.toString()); - throw new DatastoreClientServiceException(e); - } - } -} diff --git a/logisland-components/logisland-services/logisland-service-solr/pom.xml b/logisland-components/logisland-services/logisland-service-solr/pom.xml index 6cc3a2fb9..35e4513db 100644 --- a/logisland-components/logisland-services/logisland-service-solr/pom.xml +++ b/logisland-components/logisland-services/logisland-service-solr/pom.xml @@ -7,7 +7,7 @@ com.hurence.logisland logisland-services - 1.3.0 + 1.4.0 logisland-service-solr @@ -29,7 +29,5 @@ logisland-service-solr-test logisland-service-solr_8-client logisland-service-solr_6_6_2-client - logisland-service-solr_chronix_6_4_2-client - logisland-service-solr_chronix_8-client diff --git a/logisland-components/logisland-services/pom.xml b/logisland-components/logisland-services/pom.xml index b90da5f96..0e408df2f 100644 --- a/logisland-components/logisland-services/pom.xml +++ b/logisland-components/logisland-services/pom.xml @@ -7,7 +7,7 @@ com.hurence.logisland logisland-components - 1.3.0 + 1.4.0 pom @@ -21,12 +21,38 @@ logisland-service-inmemory-cache logisland-service-ip-to-geo logisland-service-redis - logisland-service-hbase logisland-service-solr logisland-service-elasticsearch logisland-service-rest logisland-service-proxy + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackaged + + package + + + + + com.hurence.logisland + logisland-maven-plugin + + + package + + + + + + diff --git a/logisland-components/pom.xml b/logisland-components/pom.xml index a44717178..b3c1baa16 100644 --- a/logisland-components/pom.xml +++ b/logisland-components/pom.xml @@ -8,7 +8,7 @@ com.hurence.logisland logisland - 1.3.0 + 1.4.0 pom diff --git a/logisland-core/logisland-agent/src/main/java/com/hurence/logisland/agent/api/DataflowApi.java b/logisland-core/logisland-agent/src/main/java/com/hurence/logisland/agent/api/DataflowApi.java index d35e6e999..987eb4965 100644 --- a/logisland-core/logisland-agent/src/main/java/com/hurence/logisland/agent/api/DataflowApi.java +++ b/logisland-core/logisland-agent/src/main/java/com/hurence/logisland/agent/api/DataflowApi.java @@ -1,3 +1,18 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.hurence.logisland.agent.api; import com.hurence.logisland.agent.api.model.DataFlow; diff --git a/logisland-core/logisland-agent/src/main/java/com/hurence/logisland/agent/api/DataflowApiVerticle.java b/logisland-core/logisland-agent/src/main/java/com/hurence/logisland/agent/api/DataflowApiVerticle.java index 6f89bdfe7..927898e29 100644 --- a/logisland-core/logisland-agent/src/main/java/com/hurence/logisland/agent/api/DataflowApiVerticle.java +++ b/logisland-core/logisland-agent/src/main/java/com/hurence/logisland/agent/api/DataflowApiVerticle.java @@ -1,3 +1,18 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.hurence.logisland.agent.api; import io.vertx.core.AbstractVerticle; diff --git a/logisland-core/logisland-agent/src/main/java/io/swagger/server/api/MainApiVerticle.java b/logisland-core/logisland-agent/src/main/java/io/swagger/server/api/MainApiVerticle.java index 873ad4e34..ae89355b4 100644 --- a/logisland-core/logisland-agent/src/main/java/io/swagger/server/api/MainApiVerticle.java +++ b/logisland-core/logisland-agent/src/main/java/io/swagger/server/api/MainApiVerticle.java @@ -1,3 +1,18 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package io.swagger.server.api; import java.nio.charset.Charset; diff --git a/logisland-core/logisland-api/pom.xml b/logisland-core/logisland-api/pom.xml index bb933b193..ee0114eb0 100644 --- a/logisland-core/logisland-api/pom.xml +++ b/logisland-core/logisland-api/pom.xml @@ -22,7 +22,7 @@ com.hurence.logisland logisland-core - 1.3.0 + 1.4.0 logisland-api jar diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/annotation/documentation/ComponentCategory.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/annotation/documentation/ComponentCategory.java index dca71251b..0c1335fc1 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/annotation/documentation/ComponentCategory.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/annotation/documentation/ComponentCategory.java @@ -1,3 +1,18 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.hurence.logisland.annotation.documentation; public class ComponentCategory { diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/AbstractConfigurableComponent.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/AbstractConfigurableComponent.java index 146848abb..d31140891 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/AbstractConfigurableComponent.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/AbstractConfigurableComponent.java @@ -17,8 +17,8 @@ import com.hurence.logisland.logging.ComponentLog; import com.hurence.logisland.logging.StandardComponentLogger; -import com.hurence.logisland.processor.AbstractProcessor; -import com.hurence.logisland.validator.ValidationContext; +import com.hurence.logisland.processor.ProcessContext; +import com.hurence.logisland.validator.Configuration; import com.hurence.logisland.validator.ValidationResult; import com.hurence.logisland.validator.Validator; import org.slf4j.Logger; @@ -30,15 +30,13 @@ public abstract class AbstractConfigurableComponent implements ConfigurableCompo protected String identifier = ""; protected ComponentLog componentLogger; - private static Logger logger = LoggerFactory.getLogger(AbstractConfigurableComponent.class); +// private static Logger logger = LoggerFactory.getLogger(AbstractConfigurableComponent.class); @Override public String getIdentifier() { return identifier; } - - @Deprecated public void setIdentifier(String identifier) { this.identifier = identifier; } @@ -56,14 +54,15 @@ public void setIdentifier(String identifier) { * @return Collection of ValidationResult objects that will be added to any * other validation findings - may be null */ - protected Collection customValidate(ValidationContext context){ + protected Collection customValidate(Configuration context){ return Collections.emptySet(); } - + //ValidationContext même a la confusion finalement ce n'est qu'un wrapper de Map + //==> interface Properties à la place ? ou juste Map ? @Override - public final Collection validate(final ValidationContext context) { + public final Collection validate(final Configuration context) { // goes through supported properties final Collection results = new ArrayList<>(); final List supportedDescriptors = getSupportedPropertyDescriptors(); @@ -116,8 +115,9 @@ public final Collection validate(final ValidationContext conte // log issues if (!results.isEmpty()) { for (ValidationResult result:results) { - logger.warn(result.toString()); - } + getLogger().error(result.toString()); +// logger.warn(); + } } return results; @@ -214,9 +214,10 @@ protected PropertyDescriptor getSupportedDynamicPropertyDescriptor(final String */ public void init(final ComponentContext context) throws InitializationException { identifier = context.getIdentifier(); - componentLogger = context.getLogger(); +// componentLogger = context.getLogger(); } + /** * @return the logger that has been provided to the component by the * framework in its init method diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/AbstractConfiguredComponent.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/AbstractConfiguredComponent.java index 959ff11bd..71cf2ade7 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/AbstractConfiguredComponent.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/AbstractConfiguredComponent.java @@ -17,16 +17,13 @@ import com.hurence.logisland.logging.ComponentLog; import com.hurence.logisland.logging.StandardComponentLogger; -import com.hurence.logisland.processor.StandardValidationContext; -import com.hurence.logisland.validator.ValidationContext; +import com.hurence.logisland.processor.StandardConfiguration; +import com.hurence.logisland.validator.Configuration; import com.hurence.logisland.validator.ValidationResult; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @@ -60,10 +57,7 @@ public ValidationResult setProperty(final String name, final String value) { lock.lock(); ValidationResult result =null; try { - - verifyModifiable(); - - final PropertyDescriptor descriptor = component.getPropertyDescriptor(name); + final PropertyDescriptor descriptor = getPropertyDescriptor(name); result = descriptor.validate(value); if (!result.isValid()) { //throw new IllegalArgumentException(result.toString()); @@ -72,10 +66,8 @@ public ValidationResult setProperty(final String name, final String value) { final String oldValue = properties.put(descriptor, value); if (!value.equals(oldValue)) { - - try { - component.onPropertyModified(descriptor, oldValue, value); + onPropertyModified(descriptor, oldValue, value); } catch (final Exception e) { // nothing really to do here... } @@ -106,15 +98,13 @@ public boolean removeProperty(final String name) { lock.lock(); try { - verifyModifiable(); - - final PropertyDescriptor descriptor = component.getPropertyDescriptor(name); + final PropertyDescriptor descriptor = getPropertyDescriptor(name); String value = null; if (!descriptor.isRequired() && (value = properties.remove(descriptor)) != null) { try { - component.onPropertyModified(descriptor, value, null); + onPropertyModified(descriptor, value, null); } catch (final Exception e) { // nothing really to do here... } @@ -133,7 +123,7 @@ public boolean removeProperty(final String name) { @Override public Map getProperties() { - final List supported = component.getPropertyDescriptors(); + final List supported = getPropertyDescriptors(); if (supported == null || supported.isEmpty()) { return Collections.unmodifiableMap(properties); } else { @@ -178,7 +168,7 @@ public boolean equals(final Object obj) { @Override public String toString() { - return getClass().getSimpleName() + "[id=" + getIdentifier() + "]"; + return getClass().getSimpleName() + "[id=" + getIdentifier() + ", component=" + component.getClass().getSimpleName() + "]"; } @@ -199,27 +189,40 @@ public List getPropertyDescriptors() { @Override public boolean isValid() { + return isValid(false); + } + + @Override + public boolean isValid(boolean strictCheck) { final Collection validationResults = getValidationErrors(); + boolean isValid = true; for (final ValidationResult result : validationResults) { + //TODO tolerate unsupported properties or no depending on strictCheck if (!result.isValid()) { - getLogger().warn("invalid property {}", new Object[]{result.getExplanation()}); - return false; + getLogger().error("invalid property {}", new Object[]{result.getExplanation()}); + isValid = false; } } - - return true; + if (!isValid) { + if (component instanceof AbstractConfigurableComponent) { + AbstractConfigurableComponent abstractComp = (AbstractConfigurableComponent) component; + List descriptors = abstractComp.getSupportedPropertyDescriptors(); + getLogger().info("Here the supported properties for this component:"); + descriptors.forEach(desc -> { + getLogger().info("{}", new Object[]{desc}); + }); + } + } + return isValid; } @Override public Collection getValidationErrors() { - return validate(new StandardValidationContext(getProperties())); + return validate(new StandardConfiguration(getProperties())); } - public abstract void verifyModifiable() throws IllegalStateException; - @Override - public Collection validate(final ValidationContext context) { - + public Collection validate(final Configuration context) { return component.validate(context); } diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/AbstractPropertyValue.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/AbstractPropertyValue.java index d2f7f8c0c..d38d0fae1 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/AbstractPropertyValue.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/AbstractPropertyValue.java @@ -1,12 +1,12 @@ /** * Copyright (C) 2016 Hurence (support@hurence.com) - *

+ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

+ * + * 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. @@ -172,6 +172,21 @@ public char[] asChars() { } } + @Override + public char asChar() { + if (getRawValue() == null) { + throw new IllegalArgumentException("null is not a char"); + } else if (getRawValue() instanceof Character) { + return ((char) getRawValue()); + } else { + try { + return asString().charAt(0); + } catch (Exception ex) { + logger.error(" : unable to convert " + rawValue.toString() + " as a char", ex); + throw ex; + } + } + } @Override public boolean isSet() { diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/ConfigurableComponent.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/ConfigurableComponent.java index 3c4da2b15..8f17b15fe 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/ConfigurableComponent.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/ConfigurableComponent.java @@ -16,7 +16,7 @@ package com.hurence.logisland.component; -import com.hurence.logisland.validator.ValidationContext; +import com.hurence.logisland.validator.Configuration; import com.hurence.logisland.validator.ValidationResult; import java.io.Serializable; @@ -36,7 +36,7 @@ public interface ConfigurableComponent extends Serializable{ * only. If the collection is empty then the component is valid. Guaranteed * non-null */ - Collection validate(ValidationContext context); + Collection validate(Configuration context); /** * @param name to lookup the descriptor diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/ConfiguredComponent.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/ConfiguredComponent.java index 6e3b35360..03f9bf376 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/ConfiguredComponent.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/ConfiguredComponent.java @@ -68,6 +68,13 @@ public interface ConfiguredComponent extends Serializable { */ boolean isValid(); + /** + * + * @param strictCheck + * @return if configuration is valid and if configuration does not contain unsupported properties + */ + boolean isValid(boolean strictCheck); + /** * @return the any validation errors for this connectable */ diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/PropertyDescriptor.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/PropertyDescriptor.java index 2127f8e15..5f70a3775 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/PropertyDescriptor.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/PropertyDescriptor.java @@ -452,7 +452,17 @@ public int hashCode() { @Override public String toString() { - return getClass().getSimpleName() + "[" + displayName + "]"; + String toReturn = "{\n" + + "\tname : " + displayName + ",\n" + + "\tdescription : " + description + ",\n" + + "\tdefault : " + defaultValue + ",\n" + + "\trequired : " + required; + if (getAllowableValues() != null && !getAllowableValues().isEmpty()) { + toReturn = toReturn + ",\n\tallowable values : " + getAllowableValues() + "\n}"; + } else { + toReturn = toReturn + "\n}"; + } + return toReturn; } private static final class ConstrainedSetValidator implements Validator { diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/PropertyValue.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/PropertyValue.java index b528bb460..1c3574664 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/PropertyValue.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/component/PropertyValue.java @@ -62,20 +62,24 @@ default Optional asStringOpt() { /** - * @return a byte[] representation of the property value, of - * null if not set + * @return a byte[] representation of the property value * @throws IllegalArgumentException if not able to parse */ byte[] asBytes(); /** - * @return a char[] representation of the property value, of - * null if not set + * @return a char[] representation of the property value * @throws IllegalArgumentException if not able to parse */ char[] asChars(); + /** + * @return a char representation of the property value + * @throws IllegalArgumentException if not able to parse + */ + char asChar(); + /** * @return a Record representation of the property value, or * null if not set diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/config/StreamConfiguration.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/config/StreamConfiguration.java index 0402df474..471943392 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/config/StreamConfiguration.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/config/StreamConfiguration.java @@ -16,6 +16,7 @@ package com.hurence.logisland.config; import java.util.ArrayList; +import java.util.Collections; import java.util.List; @@ -37,7 +38,7 @@ public void setStream(String stream) { } public List getProcessorConfigurations() { - return processorConfigurations; + return processorConfigurations == null ? Collections.emptyList() : processorConfigurations; } public void addProcessorConfiguration(ProcessorConfiguration processorConfiguration) { diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/controller/AbstractControllerService.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/controller/AbstractControllerService.java index 48175187a..011d03cd5 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/controller/AbstractControllerService.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/controller/AbstractControllerService.java @@ -17,33 +17,16 @@ package com.hurence.logisland.controller; -import com.hurence.logisland.annotation.lifecycle.OnDisabled; -import com.hurence.logisland.annotation.lifecycle.OnEnabled; import com.hurence.logisland.component.AbstractConfigurableComponent; import com.hurence.logisland.component.InitializationException; -import com.hurence.logisland.logging.ComponentLog; - -import java.io.IOException; public abstract class AbstractControllerService extends AbstractConfigurableComponent implements ControllerService { - private ControllerServiceLookup serviceLookup; - private volatile boolean enabled = true; - @Override public void initialize(final ControllerServiceInitializationContext context) throws InitializationException { - serviceLookup = context.getControllerServiceLookup(); init(context); } - /** - * @return the {@link ControllerServiceLookup} that was passed to the - * {@link #init(ControllerServiceInitializationContext)} method - */ - protected ControllerServiceLookup getControllerServiceLookup() { - return serviceLookup; - } - /** * Provides a mechanism by which subclasses can perform initialization of * the Controller Service before it is scheduled to be run @@ -55,17 +38,4 @@ protected void init(final ControllerServiceInitializationContext context) throws super.init(context); } - @OnEnabled - public void enabled() { - this.enabled = true; - } - - @OnDisabled - public void disabled() { - this.enabled = false; - } - - public boolean isEnabled() { - return this.enabled; - } } diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/controller/ControllerService.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/controller/ControllerService.java index 3647e8410..061710aba 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/controller/ControllerService.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/controller/ControllerService.java @@ -163,6 +163,20 @@ */ public interface ControllerService extends ConfigurableComponent { + /** + * Initialize heavy object or start them (ie connections). Make service + * enabled + * Calling stop() then start() on a service should make the service ok. + */ + default void start() {} + + /** + * Stop heavy object or stop them (ie connections). To free resources as + * the services is not necessary anymore. + * Calling stop() then start() on a service should make the service ok + */ + default void stop() {} + /** * Provides the Controller Service with access to objects that may be of use * throughout the life of the service. This method will be called before any diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/controller/ControllerServiceInitializationContext.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/controller/ControllerServiceInitializationContext.java index a387ca487..09ff19a3c 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/controller/ControllerServiceInitializationContext.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/controller/ControllerServiceInitializationContext.java @@ -18,14 +18,11 @@ import com.hurence.logisland.component.ComponentContext; -import com.hurence.logisland.kerberos.KerberosContext; -import com.hurence.logisland.logging.ComponentLog; -public interface ControllerServiceInitializationContext extends KerberosContext, ComponentContext { +public interface ControllerServiceInitializationContext extends ComponentContext { /** - * @return the {@link ControllerServiceLookup} which can be used to obtain - * Controller Services + * @return the Stream */ - ControllerServiceLookup getControllerServiceLookup(); + ControllerService getService(); } diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/controller/StandardControllerServiceContext.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/controller/StandardControllerServiceContext.java index ae0b287d0..710c20f08 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/controller/StandardControllerServiceContext.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/controller/StandardControllerServiceContext.java @@ -17,6 +17,7 @@ import com.hurence.logisland.component.*; +import com.hurence.logisland.processor.Processor; import java.io.File; @@ -26,8 +27,6 @@ public StandardControllerServiceContext(final ControllerService controllerServic super(controllerService, identifier); } - - @Override public PropertyValue getPropertyValue(final PropertyDescriptor descriptor) { return getPropertyValue(descriptor.getName()); @@ -43,7 +42,7 @@ public PropertyValue getPropertyValue(final String propertyName) { final String setPropertyValue = getProperty(descriptor); final String propValue = (setPropertyValue == null) ? descriptor.getDefaultValue() : setPropertyValue; - return PropertyValueFactory.getInstance(descriptor, propValue, getControllerServiceLookup()); + return PropertyValueFactory.getInstance(descriptor, propValue, null); } @Override @@ -52,28 +51,7 @@ public PropertyValue newPropertyValue(final String rawValue) { } @Override - public void verifyModifiable() throws IllegalStateException { - - } - - @Override - public ControllerServiceLookup getControllerServiceLookup() { - return null; - } - - - @Override - public String getKerberosServicePrincipal() { - return null; - } - - @Override - public File getKerberosServiceKeytab() { - return null; - } - - @Override - public File getKerberosConfigurationFile() { - return null; + public ControllerService getService() { + return (ControllerService) component; } } diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/engine/AbstractProcessingEngine.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/engine/AbstractProcessingEngine.java index c86fc4630..66caf2b25 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/engine/AbstractProcessingEngine.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/engine/AbstractProcessingEngine.java @@ -16,18 +16,30 @@ package com.hurence.logisland.engine; import com.hurence.logisland.component.AbstractConfigurableComponent; -import com.hurence.logisland.validator.ValidationContext; +import com.hurence.logisland.component.InitializationException; +import com.hurence.logisland.component.PropertyDescriptor; +import com.hurence.logisland.validator.Configuration; import com.hurence.logisland.validator.ValidationResult; import java.util.Collection; import java.util.Collections; +import java.util.List; public abstract class AbstractProcessingEngine extends AbstractConfigurableComponent implements ProcessingEngine { @Override - protected Collection customValidate(ValidationContext context){ + protected Collection customValidate(Configuration context){ + return Collections.emptySet(); + } + @Override + public List getSupportedPropertyDescriptors() { + return super.getPropertyDescriptors(); + } - return Collections.emptySet(); + @Override + public void init(EngineContext engineContext) throws InitializationException { + super.init(engineContext); } + } diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/engine/EngineContext.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/engine/EngineContext.java index 0ec4d6efb..2be36d16b 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/engine/EngineContext.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/engine/EngineContext.java @@ -18,6 +18,7 @@ import com.hurence.logisland.component.ComponentContext; import com.hurence.logisland.config.ControllerServiceConfiguration; +import com.hurence.logisland.controller.ControllerServiceInitializationContext; import com.hurence.logisland.stream.StreamContext; import java.util.Collection; @@ -36,24 +37,32 @@ public interface EngineContext extends ComponentContext { */ void addStreamContext(StreamContext streamContext); - /** * @return the engine */ ProcessingEngine getEngine(); + Collection getControllerServiceConfigurations(); + + /** + * add a ControllerServiceConfiguration + * + * @param config to add + */ + void addControllerServiceConfiguration(ControllerServiceConfiguration config); + /** * @return the init context for controllers */ - Collection getControllerServiceConfigurations(); + Collection getControllerServiceContexts(); /** * add a ControllerServiceConfiguration * * @param config to add */ - void addControllerServiceConfiguration(ControllerServiceConfiguration config); + void addControllerServiceContext(ControllerServiceInitializationContext config); } diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/engine/MockProcessingEngine.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/engine/MockProcessingEngine.java index 96f615828..550e2aed4 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/engine/MockProcessingEngine.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/engine/MockProcessingEngine.java @@ -44,25 +44,32 @@ public List getSupportedPropertyDescriptors() { return Collections.unmodifiableList(descriptors); } + @Override + public void init(EngineContext engineContext) { + + } + @Override public void start(EngineContext engineContext) { logger.info("engine start"); } @Override - public void shutdown(EngineContext engineContext) { + public void stop(EngineContext engineContext) { + logger.info("engine reset"); + engineContext.getStreamContexts().clear(); + engineContext.getControllerServiceContexts().clear(); logger.info("engine shutdown"); } @Override - public void awaitTermination(EngineContext engineContext) { - logger.info("engine awaitTermination"); + public void softStop(EngineContext engineContext) { + stop(engineContext); } @Override - public void reset(EngineContext engineContext) { - logger.info("engine reset"); - engineContext.getStreamContexts().clear(); - engineContext.getControllerServiceConfigurations().clear(); + public void awaitTermination(EngineContext engineContext) { + logger.info("engine awaitTermination"); } + } diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/engine/ProcessingEngine.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/engine/ProcessingEngine.java index 5180a0c62..744e68a6c 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/engine/ProcessingEngine.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/engine/ProcessingEngine.java @@ -16,12 +16,20 @@ package com.hurence.logisland.engine; import com.hurence.logisland.component.ConfigurableComponent; +import com.hurence.logisland.component.InitializationException; /** * Carry the whole workload of processing */ public interface ProcessingEngine extends ConfigurableComponent { + /** + * Init the engine with a context + * + * @param engineContext + */ + void init(EngineContext engineContext) throws InitializationException; + /** * start the engine with a context * @@ -34,18 +42,22 @@ public interface ProcessingEngine extends ConfigurableComponent { * * @param engineContext */ - void shutdown(EngineContext engineContext); + void stop(EngineContext engineContext); + /** - * Await for termination. + * Stop the engine (and all streams in it) but keep reusable + * ressources without closing them so that it can be used in + * a next run + * * @param engineContext */ - void awaitTermination(EngineContext engineContext); + void softStop(EngineContext engineContext); /** - * Reset the engine by stopping the streaming context. + * Await for termination. * @param engineContext */ - void reset(EngineContext engineContext); + void awaitTermination(EngineContext engineContext); } diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/engine/StandardEngineContext.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/engine/StandardEngineContext.java index d54099485..f636e290e 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/engine/StandardEngineContext.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/engine/StandardEngineContext.java @@ -21,8 +21,8 @@ import com.hurence.logisland.component.PropertyValue; import com.hurence.logisland.component.StandardPropertyValue; import com.hurence.logisland.config.ControllerServiceConfiguration; +import com.hurence.logisland.controller.ControllerServiceInitializationContext; import com.hurence.logisland.stream.StreamContext; -import com.hurence.logisland.validator.ValidationResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,7 +35,7 @@ public class StandardEngineContext extends AbstractConfiguredComponent implement private final List streamContexts = new ArrayList<>(); private final List controllerServiceConfigurations = new ArrayList<>(); - private static Logger logger = LoggerFactory.getLogger(StandardEngineContext.class); + private final List controllerServiceContext = new ArrayList<>(); public StandardEngineContext(final ProcessingEngine engine, final String id) { super(engine, id); @@ -57,6 +57,16 @@ public ProcessingEngine getEngine() { return (ProcessingEngine) component; } + @Override + public Collection getControllerServiceConfigurations() { + return controllerServiceConfigurations; + } + + @Override + public void addControllerServiceConfiguration(ControllerServiceConfiguration config) { + controllerServiceConfigurations.add(config); + } + @Override public PropertyValue getPropertyValue(final PropertyDescriptor descriptor) { return getPropertyValue(descriptor.getName()); @@ -81,31 +91,34 @@ public PropertyValue newPropertyValue(final String rawValue) { } @Override - public void verifyModifiable() throws IllegalStateException { - - } - - @Override - public boolean isValid() { - boolean engineValid = super.isValid(); + public boolean isValid(boolean strictCheck) { + boolean engineValid = super.isValid(strictCheck); + if (!engineValid) { + getLogger().error("Conf of engine is not valid !"); + } boolean streamsValid = true; for (final StreamContext streamContext : streamContexts) { - if (!streamContext.isValid()) { - logger.info("invalid stream {}", streamContext.getIdentifier()); + if (!streamContext.isValid(strictCheck)) { streamsValid = false; } } - return engineValid && streamsValid; + boolean servicesValid = true; + for (final ControllerServiceInitializationContext serviceContext : controllerServiceContext) { + if (!serviceContext.isValid(strictCheck)) { + servicesValid = false; + } + } + return engineValid && streamsValid && servicesValid; } @Override - public Collection getControllerServiceConfigurations() { - return controllerServiceConfigurations; + public Collection getControllerServiceContexts() { + return controllerServiceContext; } @Override - public void addControllerServiceConfiguration(ControllerServiceConfiguration config) { - controllerServiceConfigurations.add(config); + public void addControllerServiceContext(ControllerServiceInitializationContext config) { + controllerServiceContext.add(config); } } diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/processor/AbstractProcessor.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/processor/AbstractProcessor.java index 515bff87d..4dcaad270 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/processor/AbstractProcessor.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/processor/AbstractProcessor.java @@ -28,9 +28,14 @@ public boolean isInitialized() { return isInitialized; } + protected void setIsInitialized(boolean isInitialized) { + this.isInitialized = isInitialized; + } + @Override - public void init(ProcessContext context) throws InitializationException { + public void init(final ProcessContext context) throws InitializationException { super.init(context); + isInitialized = true; } @Override diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/processor/Processor.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/processor/Processor.java index 231e6f191..d00c1f791 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/processor/Processor.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/processor/Processor.java @@ -26,6 +26,20 @@ public interface Processor extends ConfigurableComponent { boolean isInitialized(); + /** + * Initialize heavy object or start them (ie connections). Make service + * enabled + * Calling stop() then start() on a service should make the service ok. + */ + default void start() {} + + /** + * Stop heavy object or stop them (ie connections). To free resources as + * the services is not necessary anymore. + * Calling stop() then start() on a service should make the service ok + */ + default void stop() {} + /** * Setup statefull parameters * diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/processor/StandardValidationContext.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/processor/StandardConfiguration.java similarity index 56% rename from logisland-core/logisland-api/src/main/java/com/hurence/logisland/processor/StandardValidationContext.java rename to logisland-core/logisland-api/src/main/java/com/hurence/logisland/processor/StandardConfiguration.java index 78f7b24c5..0c85683be 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/processor/StandardValidationContext.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/processor/StandardConfiguration.java @@ -19,22 +19,18 @@ import com.hurence.logisland.component.PropertyDescriptor; import com.hurence.logisland.component.PropertyValue; import com.hurence.logisland.component.StandardPropertyValue; -import com.hurence.logisland.controller.ControllerService; -import com.hurence.logisland.controller.ControllerServiceLookup; -import com.hurence.logisland.validator.ValidationContext; -import org.apache.commons.lang3.NotImplementedException; +import com.hurence.logisland.validator.Configuration; import java.util.Collections; import java.util.HashMap; import java.util.Map; -public class StandardValidationContext implements ValidationContext { +public class StandardConfiguration implements Configuration { private final Map properties; private final Map expressionLanguageSupported; - - public StandardValidationContext(final Map properties) { + public StandardConfiguration(final Map properties) { this.properties = new HashMap<>(properties); expressionLanguageSupported = new HashMap<>(properties.size()); for (final PropertyDescriptor descriptor : properties.keySet()) { @@ -42,22 +38,6 @@ public StandardValidationContext(final Map propertie } } - @Override - public PropertyValue newPropertyValue(final String rawValue) { - return new StandardPropertyValue(rawValue); - } - - - @Override - public ControllerServiceLookup getControllerServiceLookup() { - throw new NotImplementedException("todo"); - } - - @Override - public ValidationContext getControllerServiceValidationContext(ControllerService controllerService) { - throw new NotImplementedException("todo"); - } - @Override public PropertyValue getPropertyValue(final PropertyDescriptor property) { final String configuredValue = properties.get(property); @@ -68,23 +48,4 @@ public PropertyValue getPropertyValue(final PropertyDescriptor property) { public Map getProperties() { return Collections.unmodifiableMap(properties); } - - - @Override - public boolean isExpressionLanguagePresent(final String value) { - /* if (value == null) { - return false; - } - - final List elRanges = Query.extractExpressionRanges(value); - return (elRanges != null && !elRanges.isEmpty());*/ - return false; - } - - @Override - public boolean isExpressionLanguageSupported(final String propertyName) { - final Boolean supported = expressionLanguageSupported.get(propertyName); - return Boolean.TRUE.equals(supported); - } - } diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/processor/StandardProcessContext.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/processor/StandardProcessContext.java index ea46e8d25..08fa664c3 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/processor/StandardProcessContext.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/processor/StandardProcessContext.java @@ -62,9 +62,4 @@ public PropertyValue newPropertyValue(final String rawValue) { return new StandardPropertyValue(rawValue); } - @Override - public void verifyModifiable() throws IllegalStateException { - - } - } diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/record/Field.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/record/Field.java index 50a366732..284b776f4 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/record/Field.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/record/Field.java @@ -24,11 +24,9 @@ import org.slf4j.LoggerFactory; import java.io.Serializable; -import java.util.Collection; -import java.util.Date; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; /** * Primitive Types @@ -124,19 +122,66 @@ public Boolean isReserved() { @Override public String toString() { + return toString(0); + } + + public String toString(int deepness) { + if (deepness < 0) throw new IllegalArgumentException("deepness must be grater than 0 ! [" + deepness + "]"); - if (rawValue != null) - return "Field{" + - "name='" + name + '\'' + - ", type=" + type + - ", rawValue=" + rawValue + - '}'; - else - return "Field{" + - "name='" + name + '\'' + - ", type=" + type + - ", rawValue=null" + - '}'; + String valueAsString = "null"; + if (rawValue != null) { + switch(type) { + case BYTES: + case ARRAY: + try { + if (rawValue.getClass().isArray()) { + if (rawValue instanceof int[]) { + valueAsString = Arrays.toString((int[]) rawValue); + } else if (rawValue instanceof double[]) { + valueAsString = Arrays.toString((double[]) rawValue); + } else if (rawValue instanceof float[]) { + valueAsString = Arrays.toString((float[]) rawValue); + } else if (rawValue instanceof long[]) { + valueAsString = Arrays.toString((long[]) rawValue); + } else if (rawValue instanceof byte[]) { + valueAsString = Arrays.toString((byte[]) rawValue); + } else if (rawValue instanceof short[]) { + valueAsString = Arrays.toString((short[]) rawValue); + } else if (rawValue instanceof char[]) { + valueAsString = Arrays.toString((char[]) rawValue); + } else if (rawValue instanceof boolean[]) { + valueAsString = Arrays.toString((boolean[]) rawValue); + } else if (rawValue instanceof Object[]) { + valueAsString = Arrays.toString((Object[]) rawValue); + } else { + valueAsString = rawValue.toString(); + } + } else { + valueAsString = rawValue.toString(); + } + } catch (Exception ex) { + logger.warn("failed to cast record type as record !"); + valueAsString = rawValue.toString(); + } + break; + case RECORD: + try { + valueAsString = asRecord().toString(deepness); + } catch (Exception ex) { + logger.warn("failed to cast record type as record !"); + valueAsString = rawValue.toString(); + } + break; + default: + valueAsString = rawValue.toString(); + break; + } + } + return "Field{" + + "name='" + name + "'" + + ", type=" + type + + ", rawValue=" + valueAsString + + '}'; } @Override diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/record/Position.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/record/Position.java index 0979a9eaf..6c2cb0a8c 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/record/Position.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/record/Position.java @@ -32,6 +32,7 @@ *******************************************************************************/ +import java.io.Serializable; import java.util.Date; /** @@ -40,7 +41,7 @@ * Everyware Cloud. Refer to the description of each of the fields for more * information on the model of EdcPosition. */ -public class Position extends StandardRecord{ +public class Position implements Serializable { /** * Longitude of this position in degrees. This is a mandatory field. */ @@ -97,7 +98,6 @@ private Position( final Integer status, final Double speed, final Date timestamp) { - this.altitude = altitude; this.heading = heading; this.latitude = latitude; @@ -107,7 +107,6 @@ private Position( this.speed = speed; this.timestamp = timestamp; this.status = status; - } private static final Position EMPTY = new Position(null, null, null, null, null, null, null, null, null); diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/record/Record.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/record/Record.java index c4998aa19..939a2fed8 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/record/Record.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/record/Record.java @@ -18,10 +18,8 @@ import com.hurence.logisland.logging.ComponentLog; import java.io.Serializable; -import java.util.Collection; -import java.util.Date; -import java.util.Map; -import java.util.Set; +import java.util.*; +import java.util.stream.Collectors; public interface Record extends Serializable { @@ -51,6 +49,8 @@ public interface Record extends Serializable { boolean hasField(String fieldName); + boolean checkFieldIsSet(String fieldName); + boolean isInternField(String fieldName); boolean isInternField(Field field); @@ -148,4 +148,10 @@ public interface Record extends Serializable { Collection getErrors(); + + default String toString(int deepness) { + return toString(); + } + + default String toString(int deepness, String indentationString) { return toString(); } } diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/record/RecordUtils.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/record/RecordUtils.java index 68dae36ac..5d360a210 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/record/RecordUtils.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/record/RecordUtils.java @@ -15,10 +15,11 @@ */ package com.hurence.logisland.record; +import java.lang.reflect.Array; +import java.util.*; public final class RecordUtils { - public static Record getKeyValueRecord(String key, String value) { final Record record = new StandardRecord("kv_record"); record.setStringField(FieldDictionary.RECORD_KEY, key); @@ -41,4 +42,62 @@ public static Record getRecordOfString(String... kvs) { } return record; } + + /** + * Returns the conversion of a record to a map where all {@code null} values were removed. + * + * @param record the record to convert. + * @param filterInnerRecord if {@code true} special dictionnary fields are ignored; included otherwise. + * + * @return the conversion of a record to a map where all {@code null} values were removed. + */ + public static Map toMap(final Record record, + final boolean filterInnerRecord) { + try { + final Map result = new HashMap<>(); + + record.getFieldsEntrySet() + .stream() + .forEach(entry -> + { + if (!filterInnerRecord || (filterInnerRecord && !FieldDictionary.contains(entry.getKey()))) { + Object value = entry.getValue().getRawValue(); + if (value != null) { + switch (entry.getValue().getType()) { + case RECORD: + value = toMap((Record) value, true); + break; + case ARRAY: + Collection collection; + if (value.getClass().isArray()) { + collection = new ArrayList<>(); + for (int i = 0; i < Array.getLength(value); i++) { + collection.add(Array.get(value, i)); + } + } else if (value instanceof Collection) { + collection = (Collection) value; + } else { + collection = Arrays.asList(value); + } + final List list = new ArrayList(collection.size()); + for (final Object item : collection) { + if (item instanceof Record) { + list.add(toMap((Record) item, true)); + } else { + list.add(item); + } + } + value = list; + break; + default: + } + result.put(entry.getKey(), value); + } + } + }); + return result; + } catch (Exception e) { + throw new RuntimeException(e); + } + } } diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/record/StandardRecord.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/record/StandardRecord.java index 4f98a3255..f5fa7ea33 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/record/StandardRecord.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/record/StandardRecord.java @@ -22,6 +22,7 @@ import org.slf4j.LoggerFactory; import java.util.*; +import java.util.stream.Collectors; /** @@ -60,12 +61,26 @@ public StandardRecord(Record toClone) { @Override public String toString() { - return "Record{" + - "fields=" + fields + - ", time=" + getTime() + - ", type='" + getType() + '\'' + - ", id='" + getId() + '\'' + - '}'; + return toString(1); + } + + @Override + public String toString(int deepness, String indentationString) { + if (deepness < 0) throw new IllegalArgumentException("deepness must be grater than 0 ! [" + deepness + "]"); + String deepnessStr = String.join("", Collections.nCopies(deepness, indentationString)); + String deepnessStrMinus1 = ""; + if (deepness > 0) { + deepnessStrMinus1 = String.join("", Collections.nCopies(deepness - 1, indentationString)); + } + String fieldAsString = fields.keySet().stream() + .map(key -> fields.get(key).toString(deepness + 1)) + .collect(Collectors.joining(",\n" + deepnessStr, deepnessStr, "\n" + deepnessStrMinus1)); + return "Record{\n" + fieldAsString + "}"; + } + + @Override + public String toString(int deepness) { + return toString(deepness, " "); } @Override @@ -94,14 +109,14 @@ public int hashCode() { @Override public Position getPosition() { if (hasPosition()) - return (Position) getField(FieldDictionary.RECORD_POSITION).asRecord(); + return (Position) getField(FieldDictionary.RECORD_POSITION).getRawValue(); else return null; } @Override public Record setPosition(Position position) { if (position != null) - setRecordField(FieldDictionary.RECORD_POSITION, position); + setObjectField(FieldDictionary.RECORD_POSITION, position); return this; } @@ -493,4 +508,12 @@ public Record addError(String errorType, ComponentLog logger, String errorMessag public Collection getErrors() { return new ArrayList<>(errors); } + + @Override + public boolean checkFieldIsSet(String fieldName) { + if (this.hasField(fieldName)) { + return this.getField(fieldName).getRawValue() != null; + } + return false; + } } diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/DatastoreClientService.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/DatastoreClientService.java index 22ea02d91..7ae036899 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/DatastoreClientService.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/DatastoreClientService.java @@ -18,10 +18,11 @@ import com.hurence.logisland.annotation.documentation.CapabilityDescription; import com.hurence.logisland.annotation.documentation.Tags; -import com.hurence.logisland.component.AllowableValue; import com.hurence.logisland.component.PropertyDescriptor; import com.hurence.logisland.controller.ControllerService; import com.hurence.logisland.record.Record; +import com.hurence.logisland.service.datastore.model.MultiGetQueryRecord; +import com.hurence.logisland.service.datastore.model.MultiGetResponseRecord; import com.hurence.logisland.validator.StandardValidators; import java.util.*; @@ -60,6 +61,18 @@ public interface DatastoreClientService extends ControllerService { * Collection handling section * ********************************************************************/ + /** + * Wait until specified collection is ready to be used. + */ + void waitUntilCollectionReady(String name, long timeoutMilli) throws DatastoreClientServiceException; + + /** + * Wait until specified collection is ready to be used. + */ + default void waitUntilCollectionReady(String name) throws DatastoreClientServiceException { + waitUntilCollectionReady(name, 10000L); + } + /** * Create the specified collection or index or table or bucket. * Specify namespace as dotted notation like in `global.users` @@ -87,6 +100,15 @@ public interface DatastoreClientService extends ControllerService { */ void refreshCollection(String name) throws DatastoreClientServiceException; + /** + * Wait until the specified collection has integrated all previously-saved data. + */ + default void refreshCollections(String[] names) throws DatastoreClientServiceException { + for (String name : names) { + refreshCollection(name); + } + } + /** * Copy the contents of srcIndex into dstIndex. diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/MultiGetQueryRecord.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/MultiGetQueryRecord.java similarity index 94% rename from logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/MultiGetQueryRecord.java rename to logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/MultiGetQueryRecord.java index f6548c6ce..42538f26e 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/MultiGetQueryRecord.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/MultiGetQueryRecord.java @@ -13,9 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.hurence.logisland.service.datastore; +package com.hurence.logisland.service.datastore.model; +import com.hurence.logisland.service.datastore.model.exception.InvalidMultiGetQueryRecordException; + import java.util.List; public class MultiGetQueryRecord { diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/MultiGetQueryRecordBuilder.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/MultiGetQueryRecordBuilder.java similarity index 96% rename from logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/MultiGetQueryRecordBuilder.java rename to logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/MultiGetQueryRecordBuilder.java index 110155ca1..9afeba2e6 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/MultiGetQueryRecordBuilder.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/MultiGetQueryRecordBuilder.java @@ -13,7 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.hurence.logisland.service.datastore; +package com.hurence.logisland.service.datastore.model; + +import com.hurence.logisland.service.datastore.model.exception.InvalidMultiGetQueryRecordException; import java.util.*; diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/MultiGetResponseRecord.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/MultiGetResponseRecord.java similarity index 97% rename from logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/MultiGetResponseRecord.java rename to logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/MultiGetResponseRecord.java index cf74bce52..1d4277c32 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/MultiGetResponseRecord.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/MultiGetResponseRecord.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.hurence.logisland.service.datastore; +package com.hurence.logisland.service.datastore.model; import java.util.Map; diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/MultiQueryRecord.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/MultiQueryRecord.java new file mode 100644 index 000000000..cac41e15d --- /dev/null +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/MultiQueryRecord.java @@ -0,0 +1,33 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.service.datastore.model; + + +import java.util.List; + +public class MultiQueryRecord { + + private final List queries; + + + public MultiQueryRecord(List queries) { + this.queries = queries; + } + + public List getQueries() { + return queries; + } +} diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/MultiQueryResponseRecord.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/MultiQueryResponseRecord.java new file mode 100644 index 000000000..7fc3fa638 --- /dev/null +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/MultiQueryResponseRecord.java @@ -0,0 +1,56 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.service.datastore.model; + + +import com.hurence.logisland.service.datastore.model.QueryResponseRecord; +import com.hurence.logisland.service.datastore.model.ResponseRecord; + +import java.util.List; +import java.util.stream.Collectors; + +public class MultiQueryResponseRecord { + + private final List responses; + + public MultiQueryResponseRecord(List responses) { + this.responses = responses; + } + + public long getTotalMatched() { + return responses.stream() + .map(QueryResponseRecord::getTotalMatched) + .reduce(0L, Long::sum); + } + + public List getResponses() { + return responses; + } + + public List getDocs() { + return responses.stream() + .map(QueryResponseRecord::getDocs) + .flatMap(List::stream) + .collect(Collectors.toList()); + } + + @Override + public String toString() { + return "MultiQueryResponseRecord{" + + "responses=" + responses + + '}'; + } +} diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/QueryRecord.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/QueryRecord.java new file mode 100644 index 000000000..14b358e60 --- /dev/null +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/QueryRecord.java @@ -0,0 +1,100 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.service.datastore.model; + + +import com.hurence.logisland.service.datastore.model.bool.BoolCondition; +import com.hurence.logisland.service.datastore.model.bool.BoolQueryRecord; +import com.hurence.logisland.service.datastore.model.bool.BoolQueryRecordRoot; + +import java.util.ArrayList; +import java.util.List; + +public class QueryRecord { + + private int size = -1; + private boolean refresh = false; + private final List collections; + private final List types; + private final BoolQueryRecordRoot boolQuery; + private final List sortQueries; + + public QueryRecord() { + this.collections = new ArrayList<>(); + this.boolQuery = new BoolQueryRecordRoot(); + this.sortQueries = new ArrayList<>(); + this.types = new ArrayList<>(); + } + + public QueryRecord addBoolQuery(BoolQueryRecord boolQuery, BoolCondition condition) { + this.boolQuery.addBoolQuery(boolQuery, condition); + return this; + } + + public QueryRecord addSortQuery(SortQueryRecord sortQuery) { + this.sortQueries.add(sortQuery); + return this; + } + + public QueryRecord addCollection(String collection) { + this.collections.add(collection); + return this; + } + + public QueryRecord addCollections(List collection) { + this.collections.addAll(collection); + return this; + } + + public QueryRecord size(int size) { + this.size = size; + return this; + } + + public List getCollections() { + return collections; + } + + public boolean getRefresh() { + return refresh; + } + + public QueryRecord setRefresh(boolean refresh) { + this.refresh = refresh; + return this; + } + + public QueryRecord addType(String type) { + this.types.add(type); + return this; + } + + public int getSize() { + return size; + } + + public List getTypes() { + return types; + } + + public List getSortQueries() { + return sortQueries; + } + + public BoolQueryRecordRoot getBoolQuery() { + return boolQuery; + } +} diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/QueryResponseRecord.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/QueryResponseRecord.java new file mode 100644 index 000000000..5d7a3c2ab --- /dev/null +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/QueryResponseRecord.java @@ -0,0 +1,47 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.service.datastore.model; + + +import java.util.List; + +public class QueryResponseRecord { + + private final long totalMatched; + private final List docs; + + + public QueryResponseRecord(long totalMatched, List docs) { + this.totalMatched = totalMatched; + this.docs = docs; + } + + public long getTotalMatched() { + return totalMatched; + } + + public List getDocs() { + return docs; + } + + @Override + public String toString() { + return "QueryResponseRecord{" + + "totalMatched=" + totalMatched + + ", docs=" + docs + + '}'; + } +} diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/ResponseRecord.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/ResponseRecord.java new file mode 100644 index 000000000..3d6bd4b99 --- /dev/null +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/ResponseRecord.java @@ -0,0 +1,62 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.service.datastore.model; + + +import java.util.Map; + +public class ResponseRecord { + + private final String collectionName; + private final String typeName; + private final String id; + private final Map retrievedfields; + + public ResponseRecord(final String collectionName, final String typeName, final String documentId, final Map retrievedfields) { + this.collectionName = collectionName; + this.typeName = typeName; + this.id = documentId; + this.retrievedfields = retrievedfields; + } + + public String getCollectionName() { + return collectionName; + } + + public String getTypeName() { + return typeName; + } + + public String getId() { + return id; + } + + public Map getRetrievedFields() { + return retrievedfields; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(collectionName) + .append(' ') + .append(typeName) + .append(' ') + .append(retrievedfields == null?"null":retrievedfields.toString()); + + return sb.toString(); + } +} diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/SortOrder.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/SortOrder.java new file mode 100644 index 000000000..61bd70e35 --- /dev/null +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/SortOrder.java @@ -0,0 +1,20 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.service.datastore.model; + +public enum SortOrder { + ASC,DESC +} diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/SortQueryRecord.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/SortQueryRecord.java new file mode 100644 index 000000000..563c1d0f6 --- /dev/null +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/SortQueryRecord.java @@ -0,0 +1,57 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.service.datastore.model; + +public class SortQueryRecord { + + private String fieldName; + private SortOrder sortingOrder = SortOrder.ASC; + + public SortQueryRecord(String fieldName) { + this.fieldName = fieldName; + } + + public SortQueryRecord(String fieldName, SortOrder sortingOrder) { + this.fieldName = fieldName; + this.sortingOrder = sortingOrder; + } + + public String getFieldName() { + return fieldName; + } + + public SortQueryRecord setFieldName(String fieldName) { + this.fieldName = fieldName; + return this; + } + + public boolean isAscendent() { + return sortingOrder == SortOrder.ASC; + } + + public boolean isDescendant() { + return sortingOrder == SortOrder.DESC; + } + + public SortOrder getSortingOrder() { + return sortingOrder; + } + + public SortQueryRecord setSortingOrder(SortOrder sortingOrder) { + this.sortingOrder = sortingOrder; + return this; + } +} diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/bool/BoolCondition.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/bool/BoolCondition.java new file mode 100644 index 000000000..4cd258e7c --- /dev/null +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/bool/BoolCondition.java @@ -0,0 +1,20 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.service.datastore.model.bool; + +public enum BoolCondition { + MUSTNOT, MUST, SHOULD +} \ No newline at end of file diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/bool/BoolNode.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/bool/BoolNode.java new file mode 100644 index 000000000..81fb1eba9 --- /dev/null +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/bool/BoolNode.java @@ -0,0 +1,86 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.service.datastore.model.bool; + +import java.util.ArrayList; +import java.util.List; + +public class BoolNode { + private T data; + private BoolNode parent; + private BoolCondition boolCondition; + private List> children = new ArrayList<>(); + + public boolean isRoot() { + return parent == null; + } + + public boolean isLeaf() { + return children.size() == 0; + } + + public T getData() { + return data; + } + + public BoolNode setData(T data) { + this.data = data; + return this; + } + + public BoolNode getParent() { + return parent; + } + + public BoolNode setParent(BoolNode parent) { + this.parent = parent; + return this; + } + + public List> getChildren() { + return children; + } + + public BoolNode setChildren(List> children) { + this.children = children; + return this; + } + + public BoolNode addChild(BoolNode child) { + child.setParent(this); + this.children.add(child); + return this; + } + + public BoolNode addChild(T childData) { + BoolNode childNode = new BoolNode() + .setData(childData) + .setParent(this) + .setBoolCondition(BoolCondition.MUST); + this.children.add(childNode); + return this; + } + + public BoolCondition getBoolCondition() { + return boolCondition; + } + + public BoolNode setBoolCondition(BoolCondition boolCondition) { + this.boolCondition = boolCondition; + return this; + } + +} \ No newline at end of file diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/bool/BoolQueryRecord.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/bool/BoolQueryRecord.java new file mode 100644 index 000000000..c1b074a73 --- /dev/null +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/bool/BoolQueryRecord.java @@ -0,0 +1,18 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.service.datastore.model.bool; + +public interface BoolQueryRecord { } diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/bool/BoolQueryRecordRoot.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/bool/BoolQueryRecordRoot.java new file mode 100644 index 000000000..e2b4df1a7 --- /dev/null +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/bool/BoolQueryRecordRoot.java @@ -0,0 +1,55 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.service.datastore.model.bool; + +import java.util.List; + +public class BoolQueryRecordRoot implements BoolQueryRecord { + BoolNode rootNode; + + public BoolQueryRecordRoot() { + rootNode = new BoolNode<>(); + } + + public List> getChildren() { + return rootNode.getChildren(); + } + + public BoolQueryRecordRoot addBoolQuery(BoolQueryRecord query, BoolCondition condition) { + BoolNode childNode = createBoolNode(query) + .setBoolCondition(condition); + rootNode.addChild(childNode); + return this; + } + + public BoolQueryRecordRoot addMust(BoolQueryRecord query) { + return addBoolQuery(query, BoolCondition.MUST); + } + + public BoolQueryRecordRoot addShould(BoolQueryRecord query) { + return addBoolQuery(query, BoolCondition.SHOULD); + } + + public BoolQueryRecordRoot addMustNot(BoolQueryRecord query) { + return addBoolQuery(query, BoolCondition.MUSTNOT); + } + + private BoolNode createBoolNode(BoolQueryRecord query) { + return new BoolNode() + .setData(query) + .setParent(rootNode); + } +} diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/bool/RangeQueryRecord.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/bool/RangeQueryRecord.java new file mode 100644 index 000000000..12c4003ea --- /dev/null +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/bool/RangeQueryRecord.java @@ -0,0 +1,108 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.service.datastore.model.bool; + +public class RangeQueryRecord implements BoolQueryRecord { + public static final boolean DEFAULT_INCLUDE_UPPER = true; + public static final boolean DEFAULT_INCLUDE_LOWER = true; + + private String fieldName; + private Object from = null; + private Object to = null; + private boolean includeLower = DEFAULT_INCLUDE_LOWER; + private boolean includeUpper = DEFAULT_INCLUDE_UPPER; + + public RangeQueryRecord(String fieldName) { + this.fieldName = fieldName; + } + + public String getFieldName() { + return fieldName; + } + + public RangeQueryRecord setFieldName(String fieldName) { + this.fieldName = fieldName; + return this; + } + + public Object getFrom() { + return from; + } + + /** + * set min + * @param from + * @return + */ + public RangeQueryRecord setFrom(Object from) { + this.from = from; + return this; + } + + + public Object getTo() { + return to; + } + + /** + * set max + * @param to + * @return + */ + public RangeQueryRecord setTo(Object to) { + this.to = to; + return this; + } + + public boolean isIncludeLower() { + return includeLower; + } + + /** + * include min ? + * @param includeLower + * @return + */ + public RangeQueryRecord setIncludeLower(boolean includeLower) { + this.includeLower = includeLower; + return this; + } + + public boolean isIncludeUpper() { + return includeUpper; + } + + /** + * include max ? + * @param includeUpper + * @return + */ + public RangeQueryRecord setIncludeUpper(boolean includeUpper) { + this.includeUpper = includeUpper; + return this; + } + + @Override + public String toString() { + return "RangeQueryRecord{" + + "fieldName='" + fieldName + '\'' + + ", from=" + from + + ", to=" + to + + ", includeLower=" + includeLower + + ", includeUpper=" + includeUpper + + '}'; + } +} diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/bool/TermQueryRecord.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/bool/TermQueryRecord.java new file mode 100644 index 000000000..d4a764cee --- /dev/null +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/bool/TermQueryRecord.java @@ -0,0 +1,45 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.service.datastore.model.bool; + +import com.hurence.logisland.service.datastore.model.bool.BoolQueryRecord; + +public class TermQueryRecord implements BoolQueryRecord { + private final String fieldName; + private final String fieldValue; + + public TermQueryRecord(String fieldName, String fieldValue) { + this.fieldName = fieldName; + this.fieldValue = fieldValue; + } + + public String getFieldName() { + return fieldName; + } + + public String getFieldValue() { + return fieldValue; + } + + + @Override + public String toString() { + return "TermQueryRecord{" + + "fieldName='" + fieldName + '\'' + + ", fieldValue='" + fieldValue + '\'' + + '}'; + } +} diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/bool/WildCardQueryRecord.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/bool/WildCardQueryRecord.java new file mode 100644 index 000000000..035a3396c --- /dev/null +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/bool/WildCardQueryRecord.java @@ -0,0 +1,45 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.service.datastore.model.bool; + +import com.hurence.logisland.service.datastore.model.bool.BoolQueryRecord; + +public class WildCardQueryRecord implements BoolQueryRecord { + private final String fieldName; + private final String fieldValue; + + public WildCardQueryRecord(String fieldName, String fieldValue) { + this.fieldName = fieldName; + this.fieldValue = fieldValue; + } + + public String getFieldName() { + return fieldName; + } + + public String getFieldValue() { + return fieldValue; + } + + + @Override + public String toString() { + return "WildCardQueryRecord{" + + "fieldName='" + fieldName + '\'' + + ", fieldValue='" + fieldValue + '\'' + + '}'; + } +} diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/InvalidMultiGetQueryRecordException.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/exception/InvalidMultiGetQueryRecordException.java similarity index 94% rename from logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/InvalidMultiGetQueryRecordException.java rename to logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/exception/InvalidMultiGetQueryRecordException.java index 1fe8168bc..ed2a595e4 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/InvalidMultiGetQueryRecordException.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/datastore/model/exception/InvalidMultiGetQueryRecordException.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.hurence.logisland.service.datastore; +package com.hurence.logisland.service.datastore.model.exception; /** * Indicates an invalid MultiGetQueryRecord diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/rest/MockRestClientService.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/rest/MockRestClientService.java index f69e52898..eed5a2f2e 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/rest/MockRestClientService.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/rest/MockRestClientService.java @@ -1,3 +1,18 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.hurence.logisland.service.rest; import com.hurence.logisland.component.PropertyDescriptor; diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/rest/RestClientService.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/rest/RestClientService.java index 8e51eca0b..aaca9adde 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/rest/RestClientService.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/service/rest/RestClientService.java @@ -1,3 +1,18 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.hurence.logisland.service.rest; import com.hurence.logisland.component.PropertyDescriptor; diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/stream/MockRecordStream.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/stream/MockRecordStream.java index 5534f4fe3..32c593e7b 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/stream/MockRecordStream.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/stream/MockRecordStream.java @@ -46,5 +46,4 @@ public final List getSupportedPropertyDescriptors() { return Collections.unmodifiableList(descriptors); } - } diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/stream/RecordStream.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/stream/RecordStream.java index fa55dd457..b49757ad9 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/stream/RecordStream.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/stream/RecordStream.java @@ -29,4 +29,5 @@ public interface RecordStream extends ConfigurableComponent { * stop the stream processing */ void stop(); + } diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/stream/StandardStreamContext.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/stream/StandardStreamContext.java index 48c8d2354..773c3e2ba 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/stream/StandardStreamContext.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/stream/StandardStreamContext.java @@ -28,7 +28,6 @@ public class StandardStreamContext extends AbstractConfiguredComponent implements StreamContext { private final List processContexts = new ArrayList<>(); - private final Instant creationDate = Instant.now(); public StandardStreamContext(final RecordStream recordStream, final String id) { super(recordStream, id); @@ -86,9 +85,18 @@ public PropertyValue newPropertyValue(final String rawValue) { } @Override - public void verifyModifiable() throws IllegalStateException { - + public boolean isValid(boolean strictCheck) { + boolean streamValid = super.isValid(strictCheck); + if (!streamValid) { + getLogger().error("conf of stream is not valid !"); + } + boolean processorsValid = true; + for (final ProcessContext processContext : processContexts) { + if (!processContext.isValid(strictCheck)) { + processorsValid = false; + } + } + return streamValid && processorsValid; } - } diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/validator/Configuration.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/validator/Configuration.java new file mode 100644 index 000000000..f21c6aa53 --- /dev/null +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/validator/Configuration.java @@ -0,0 +1,44 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.validator; + +import com.hurence.logisland.component.PropertyDescriptor; +import com.hurence.logisland.component.PropertyValue; +import com.hurence.logisland.controller.ControllerService; +import com.hurence.logisland.controller.ControllerServiceLookup; + +import java.util.Map; + + + + + + +public interface Configuration { + + /** + * @param property being validated + * @return a PropertyValue that encapsulates the value configured for the + * given PropertyDescriptor + */ + PropertyValue getPropertyValue(PropertyDescriptor property); + + /** + * @return a Map of all configured Properties + */ + Map getProperties(); + +} diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/validator/StandardValidators.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/validator/StandardValidators.java index 7404b72e9..7d26e4c4b 100644 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/validator/StandardValidators.java +++ b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/validator/StandardValidators.java @@ -24,6 +24,11 @@ import java.nio.charset.UnsupportedCharsetException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.text.SimpleDateFormat; +import java.time.DateTimeException; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.time.zone.ZoneRulesException; import java.util.Arrays; import java.util.Locale; import java.util.Objects; @@ -116,6 +121,28 @@ public ValidationResult validate(final String subject, final String value) { } }; + public static final Validator CHAR_VALIDATOR = new Validator() { + @Override + public ValidationResult validate(final String subject, final String value) { + String reason = null; + try { + if (value == null) { + reason = "null is not a valid character"; + } else { + if (value.length() != 1) { + reason = "Not a valid character !"; + } else { + value.charAt(0); + } + } + } catch (final NumberFormatException e) { + reason = "Not a valid character"; + } + + return new ValidationResult.Builder().subject(subject).input(value).explanation(reason).valid(reason == null).build(); + } + }; + public static final Validator POSITIVE_DOUBLE_VALIDATOR = new Validator() { @Override public ValidationResult validate(final String subject, final String value) { @@ -171,6 +198,37 @@ public ValidationResult validate(final String subject, final String value) { }; + public static final Validator SIMPLE_DATE_FORMAT_VALIDATOR = new Validator() { + @Override + public ValidationResult validate(final String subject, final String value) { + String reason = null; + try { + new SimpleDateFormat(value); + } catch (final NumberFormatException e) { + reason = "not a valid " + SimpleDateFormat.class.getCanonicalName(); + } + + return new ValidationResult.Builder().subject(subject).input(value).explanation(reason).valid(reason == null).build(); + } + }; + + public static final Validator DATE_TIME_FORMATTER_VALIDATOR = new Validator() { + @Override + public ValidationResult validate(final String subject, final String value) { + String reason = null; + try { + DateTimeFormatter.ofPattern(value); + } /*catch (final NumberFormatException e) { + reason = "not a valid " + DateTimeFormatter.class.getCanonicalName(); + }*/ catch (final Exception e) { + reason = "not a valid " + DateTimeFormatter.class.getCanonicalName() + + " caused by : " + e.getMessage(); + } + + return new ValidationResult.Builder().subject(subject).input(value).explanation(reason).valid(reason == null).build(); + } + }; + public static final Validator BOOLEAN_VALIDATOR = new Validator() { @Override public ValidationResult validate(final String subject, final String value) { @@ -262,6 +320,39 @@ public ValidationResult validate(final String subject, final String value) { } }; + /** + * input should be separated by "," and optionnaly separated again with ":". Sub group should not be more than 2 + * + * Valid example : + * -a,b,v,d + * -a:r,b,v:m,d + * -a:i,b:zzz,v:pp,d:po + * Not Valid example : + * -a:a:a,b,v,d + * -a:b,b:p,v:g:g,d:a + */ + public static final Validator COMMA_SEPARATED_LIST_COLON_SUB_SEPARATOR_VALIDATOR = new Validator() { + @Override + public ValidationResult validate(final String subject, final String value) { + String reason = null; + try { + String[] fieldsArr = value.split("\\s*,\\s*"); + for (String field : fieldsArr) { + if (field.contains(":")) { + String[] fieldPair = field.split("\\s*:\\s*"); + if (fieldPair.length > 2) { + reason = "An element of the list contain several ':'"; + } + } + } + } catch (final Exception e) { + reason = "not a comma separated list"; + } + return new ValidationResult.Builder().subject(subject).input(value).explanation(reason).valid(reason == null).build(); + } + }; + + public static final Validator COMMA_SEPARATED_LIST_VALIDATOR = new Validator() { @Override public ValidationResult validate(final String subject, final String value) { @@ -398,6 +489,27 @@ public ValidationResult validate(final String subject, final String value) { } }; + /** + * ZoneId Validators + */ + public static final Validator ZONE_ID_VALIDATOR = new Validator() { + @Override + public ValidationResult validate(final String subject, final String value) { + String reason = null; + try { + ZoneId.of(value); + } catch (Exception ex) { + if (ex.getMessage() != null) { + reason = ex.getMessage(); + } else { + reason = "Not a valid ZoneId for your system."; + } + reason += "\n Current supported ZoneId for system are : " + ZoneId.getAvailableZoneIds(); + } + return new ValidationResult.Builder().subject(subject).input(value).explanation(reason).valid(reason == null).build(); + } + }; + /** * {@link Validator} that ensures that value has 1+ non-whitespace * characters diff --git a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/validator/ValidationContext.java b/logisland-core/logisland-api/src/main/java/com/hurence/logisland/validator/ValidationContext.java deleted file mode 100644 index 076917381..000000000 --- a/logisland-core/logisland-api/src/main/java/com/hurence/logisland/validator/ValidationContext.java +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.validator; - -import com.hurence.logisland.component.PropertyDescriptor; -import com.hurence.logisland.component.PropertyValue; -import com.hurence.logisland.controller.ControllerService; -import com.hurence.logisland.controller.ControllerServiceLookup; - -import java.util.Map; - - - - - - -public interface ValidationContext { - - - - /** - * @return the {@link ControllerServiceLookup} which can be used to obtain - * Controller Services - */ - ControllerServiceLookup getControllerServiceLookup(); - - /** - * @param controllerService to lookup the validation context of - * @return a ValidationContext that is appropriate for validating the given - * {@link ControllerService} - */ - ValidationContext getControllerServiceValidationContext(ControllerService controllerService); - - /** - * @param property being validated - * @return a PropertyValue that encapsulates the value configured for the - * given PropertyDescriptor - */ - PropertyValue getPropertyValue(PropertyDescriptor property); - - /** - * @param value to make a PropertyValue object for - * @return a PropertyValue that represents the given value - */ - PropertyValue newPropertyValue(String value); - - /** - * @return a Map of all configured Properties - */ - Map getProperties(); - - - /** - * @param value to test whether expression language is present - * @return true if the given value contains a NiFi Expression - * Language expression, false if it does not - */ - boolean isExpressionLanguagePresent(String value); - - /** - * @param propertyName to test whether expression language is supported - * @return true if the property with the given name supports - * the NiFi Expression Language, false if the property does not - * support the Expression Language or is not a valid property name - */ - boolean isExpressionLanguageSupported(String propertyName); - -} diff --git a/logisland-core/logisland-engines/logisland-engine-spark_1_6/pom.xml b/logisland-core/logisland-engines/logisland-engine-spark_1_6/pom.xml index c90ece26f..cb92410fc 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_1_6/pom.xml +++ b/logisland-core/logisland-engines/logisland-engine-spark_1_6/pom.xml @@ -23,7 +23,7 @@ http://www.w3.org/2001/XMLSchema-instance "> com.hurence.logisland logisland-engines - 1.3.0 + 1.4.0 logisland-engine-spark_1_6 jar @@ -110,6 +110,7 @@ http://www.w3.org/2001/XMLSchema-instance "> com.fasterxml.jackson.core jackson-databind + ${jackson.version} provided @@ -138,32 +139,6 @@ http://www.w3.org/2001/XMLSchema-instance "> 4.13.1 test - - com.hurence.logisland - logisland-service-hbase_1_1_2-client - ${project.version} - test - - - com.hurence.logisland - logisland-service-hbase-api - ${project.version} - test - - - com.hurence.logisland - logisland-processor-hbase - ${project.version} - test - - - - - org.apache.hbase - hbase-client - 1.1.2.2.4.0.0-169 - test - diff --git a/logisland-core/logisland-engines/logisland-engine-spark_1_6/src/main/scala/com/hurence/logisland/engine/spark/KafkaStreamProcessingEngine.scala b/logisland-core/logisland-engines/logisland-engine-spark_1_6/src/main/scala/com/hurence/logisland/engine/spark/KafkaStreamProcessingEngine.scala index a742978a3..8286d4758 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_1_6/src/main/scala/com/hurence/logisland/engine/spark/KafkaStreamProcessingEngine.scala +++ b/logisland-core/logisland-engines/logisland-engine-spark_1_6/src/main/scala/com/hurence/logisland/engine/spark/KafkaStreamProcessingEngine.scala @@ -318,6 +318,20 @@ object KafkaStreamProcessingEngine { .description("The maximum number of total executor core with mesos.") .required(false) .build + //SPARK STANDALONE CLUSTER OPTIONS + val SPARK_TOTAL_EXECUTOR_CORES = new PropertyDescriptor.Builder() + .name("spark.total.executor.cores") + .description("The total number of core of all executors") + .required(false) + .addValidator(StandardValidators.POSITIVE_INTEGER_VALIDATOR) + .build + + val SPARK_SUPERVISE = new PropertyDescriptor.Builder() + .name("spark.supervise") + .description("activate supervise option or not of spark standalone cluster (see documentation)") + .required(false) + .addValidator(StandardValidators.BOOLEAN_VALIDATOR) + .build } @@ -359,6 +373,8 @@ class KafkaStreamProcessingEngine extends AbstractProcessingEngine { descriptors.add(KafkaStreamProcessingEngine.SPARK_PROPERTIES_FILE_PATH) descriptors.add(KafkaStreamProcessingEngine.JAVA_MESOS_LIBRARY_PATH) descriptors.add(KafkaStreamProcessingEngine.SPARK_MESOS_CORE_MAX) + descriptors.add(KafkaStreamProcessingEngine.SPARK_TOTAL_EXECUTOR_CORES) + descriptors.add(KafkaStreamProcessingEngine.SPARK_SUPERVISE) Collections.unmodifiableList(descriptors) } @@ -471,8 +487,11 @@ class KafkaStreamProcessingEngine extends AbstractProcessingEngine { ssc } + override def softStop(engineContext: EngineContext): Unit = { + stop(engineContext) + } - override def shutdown(engineContext: EngineContext) = { + override def stop(engineContext: EngineContext) = { engineContext.getStreamContexts.foreach(streamingContext => { try { @@ -518,15 +537,6 @@ class KafkaStreamProcessingEngine extends AbstractProcessingEngine { } } } - - /** - * Reset the engine by stopping the streaming context. - * - * @param engineContext - */ - override def reset(engineContext: EngineContext): Unit = { - //not supported - } } diff --git a/logisland-core/logisland-engines/logisland-engine-spark_1_6/src/main/scala/com/hurence/logisland/stream/spark/KafkaRecordStreamParallelProcessing.scala b/logisland-core/logisland-engines/logisland-engine-spark_1_6/src/main/scala/com/hurence/logisland/stream/spark/KafkaRecordStreamParallelProcessing.scala index fdc43f516..7fdb6127d 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_1_6/src/main/scala/com/hurence/logisland/stream/spark/KafkaRecordStreamParallelProcessing.scala +++ b/logisland-core/logisland-engines/logisland-engine-spark_1_6/src/main/scala/com/hurence/logisland/stream/spark/KafkaRecordStreamParallelProcessing.scala @@ -184,8 +184,9 @@ class KafkaRecordStreamParallelProcessing extends AbstractKafkaRecordStream { processorContext.setControllerServiceLookup(controllerServiceLookup) } processor.init(processorContext) + processor.start() outgoingEvents = processor.process(processorContext, incomingEvents) - + processor.stop() /** * compute metrics */ diff --git a/logisland-core/logisland-engines/logisland-engine-spark_1_6/src/test/java/com/hurence/logisland/engine/HBaseServiceTest.java b/logisland-core/logisland-engines/logisland-engine-spark_1_6/src/test/java/com/hurence/logisland/engine/HBaseServiceTest.java index 267d38a6e..dcdbff46a 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_1_6/src/test/java/com/hurence/logisland/engine/HBaseServiceTest.java +++ b/logisland-core/logisland-engines/logisland-engine-spark_1_6/src/test/java/com/hurence/logisland/engine/HBaseServiceTest.java @@ -91,7 +91,7 @@ public void setUp() throws InterruptedException, IOException { if (checkpointDir.isDirectory()) FileUtils.forceDelete(checkpointDir);*/ - Optional instance = ComponentFactory.getEngineContext(engineConfiguration); + Optional instance = ComponentFactory.buildAndSetUpEngineContext(engineConfiguration); assertTrue(instance.isPresent()); assertTrue(instance.get().isValid()); ProcessingEngine engine = instance.get().getEngine(); @@ -103,7 +103,7 @@ public void setUp() throws InterruptedException, IOException { public void run() { System.setProperty("hadoop.home.dir", "/"); engine.start(engineContext); - engine.shutdown(engineContext); + engine.stop(engineContext); System.out.println("done"); } }; diff --git a/logisland-core/logisland-engines/logisland-engine-spark_1_6/src/test/java/com/hurence/logisland/engine/RecordStreamProcessingDebuggerTest.java b/logisland-core/logisland-engines/logisland-engine-spark_1_6/src/test/java/com/hurence/logisland/engine/RecordStreamProcessingDebuggerTest.java index 0ce0b6839..ac8160677 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_1_6/src/test/java/com/hurence/logisland/engine/RecordStreamProcessingDebuggerTest.java +++ b/logisland-core/logisland-engines/logisland-engine-spark_1_6/src/test/java/com/hurence/logisland/engine/RecordStreamProcessingDebuggerTest.java @@ -55,7 +55,7 @@ public void remoteTest() { try { // instanciate engine and all the processor from the config - Optional engineInstance = ComponentFactory.getEngineContext(engineConf); + Optional engineInstance = ComponentFactory.buildAndSetUpEngineContext(engineConf); assert engineInstance.isPresent(); assert engineInstance.get().isValid(); diff --git a/logisland-core/logisland-engines/logisland-engine-spark_1_6/src/test/java/com/hurence/logisland/engine/SparkRecordStreamProcessingTest.java b/logisland-core/logisland-engines/logisland-engine-spark_1_6/src/test/java/com/hurence/logisland/engine/SparkRecordStreamProcessingTest.java index a8ab42796..f02d94717 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_1_6/src/test/java/com/hurence/logisland/engine/SparkRecordStreamProcessingTest.java +++ b/logisland-core/logisland-engines/logisland-engine-spark_1_6/src/test/java/com/hurence/logisland/engine/SparkRecordStreamProcessingTest.java @@ -84,7 +84,7 @@ public void setUp() throws InterruptedException, IOException { if (checkpointDir.isDirectory()) FileUtils.forceDelete(checkpointDir);*/ - Optional instance = ComponentFactory.getEngineContext(engineConfiguration); + Optional instance = ComponentFactory.buildAndSetUpEngineContext(engineConfiguration); assertTrue(instance.isPresent()); assertTrue(instance.get().isValid()); ProcessingEngine engine = instance.get().getEngine(); @@ -96,7 +96,7 @@ public void setUp() throws InterruptedException, IOException { public void run() { System.setProperty("hadoop.home.dir", "/"); engine.start(engineContext); - engine.shutdown(engineContext); + engine.stop(engineContext); System.out.println("done"); } }; diff --git a/logisland-core/logisland-engines/logisland-engine-spark_1_6/src/test/java/com/hurence/logisland/engine/spark/SparkEngineConfTest.java b/logisland-core/logisland-engines/logisland-engine-spark_1_6/src/test/java/com/hurence/logisland/engine/spark/SparkEngineConfTest.java index 58eb62588..d082c89db 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_1_6/src/test/java/com/hurence/logisland/engine/spark/SparkEngineConfTest.java +++ b/logisland-core/logisland-engines/logisland-engine-spark_1_6/src/test/java/com/hurence/logisland/engine/spark/SparkEngineConfTest.java @@ -18,14 +18,9 @@ import com.hurence.logisland.component.ComponentFactory; import com.hurence.logisland.component.ComponentType; import com.hurence.logisland.config.EngineConfiguration; -import com.hurence.logisland.config.ProcessorConfiguration; -import com.hurence.logisland.config.StreamConfiguration; import com.hurence.logisland.engine.EngineContext; import com.hurence.logisland.engine.spark.KafkaStreamProcessingEngine; -import com.hurence.logisland.stream.spark.*; -import com.hurence.logisland.util.runner.MockProcessor; import org.junit.Assert; -import org.junit.Ignore; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -129,14 +124,14 @@ public void somePropertiesConfigTest() { private void testConfIsValid(EngineConfiguration engineConf) { - Optional engineInstance = ComponentFactory.getEngineContext(engineConf); + Optional engineInstance = ComponentFactory.buildAndSetUpEngineContext(engineConf); Assert.assertTrue(engineInstance.isPresent()); Assert.assertTrue(engineInstance.get().isValid()); engineInstance.get(); } private void testConfIsNotValid(EngineConfiguration engineConf) { - Optional engineInstance = ComponentFactory.getEngineContext(engineConf); + Optional engineInstance = ComponentFactory.buildAndSetUpEngineContext(engineConf); Assert.assertTrue(engineInstance.isPresent()); Assert.assertFalse(engineInstance.get().isValid()); engineInstance.get(); diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_1/pom.xml b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_1/pom.xml index 8eb88af07..b28c9aadf 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_1/pom.xml +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_1/pom.xml @@ -6,7 +6,7 @@ http://www.w3.org/2001/XMLSchema-instance "> com.hurence.logisland logisland-engine-spark_2_X - 1.3.0 + 1.4.0 logisland-engine-spark_2_1 jar diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_3/pom.xml b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_3/pom.xml index f30a6bed9..0dc740309 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_3/pom.xml +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_3/pom.xml @@ -6,7 +6,7 @@ http://www.w3.org/2001/XMLSchema-instance "> com.hurence.logisland logisland-engine-spark_2_X - 1.3.0 + 1.4.0 logisland-engine-spark_2_3 jar @@ -125,7 +125,7 @@ http://www.w3.org/2001/XMLSchema-instance "> com.banzaicloud spark-metrics_2.11 - 2.3-1.1.0 + 2.3-2.1.2 io.prometheus @@ -189,7 +189,9 @@ http://www.w3.org/2001/XMLSchema-instance "> *:* META-INF/license/** - META-INF/* + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA META-INF/maven/** LICENSE NOTICE diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_4/pom.xml b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_4/pom.xml new file mode 100644 index 000000000..50d8850f7 --- /dev/null +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_4/pom.xml @@ -0,0 +1,215 @@ + + + 4.0.0 + + com.hurence.logisland + logisland-engine-spark_2_X + 1.4.0 + + logisland-engine-spark_2_4 + jar + + + + 2.11 + 2.11.8 + 2.4.0 + 0-10 + 0.10.2.1 + + + + + + + + org.apache.kafka + kafka_${scala.binary.version} + ${kafka.version} + true + runtime + + + + org.apache.kafka + kafka-clients + ${kafka.version} + true + runtime + + + org.apache.bahir + spark-sql-streaming-mqtt_${scala.binary.version} + 2.3.2 + runtime + true + + + + org.apache.spark + spark-core_${scala.binary.version} + ${spark.version} + provided + + + com.google.guava + guava + + + + + org.apache.spark + spark-streaming_${scala.binary.version} + ${spark.version} + provided + + + org.apache.spark + spark-sql_${scala.binary.version} + ${spark.version} + provided + + + org.apache.spark + spark-mllib_${scala.binary.version} + ${spark.version} + provided + + + org.apache.spark + spark-streaming-kafka-0-10_${scala.binary.version} + ${spark.version} + runtime + true + + + org.apache.spark + spark-sql-kafka-0-10_${scala.binary.version} + ${spark.version} + runtime + true + + + org.apache.spark + spark-streaming-kafka-assembly_${scala.binary.version} + ${spark.version} + runtime + true + + + + + + + com.hurence.logisland + logisland-engine-spark_2_common + ${project.version} + + + org.apache.spark + spark-sql_${scala.binary.version} + provided + + + + org.scala-lang + scala-library + ${scala.version} + provided + true + + + com.banzaicloud + spark-metrics_${scala.binary.version} + 2.4-1.0.5 + + + io.prometheus + simpleclient + 0.0.23 + + + io.prometheus + simpleclient_dropwizard + 0.0.23 + + + io.prometheus + simpleclient_pushgateway + 0.0.23 + + + + + + + + + org.immutables.tools + maven-shade-plugin + 4 + + + package + + shade + + + + + com.fasterxml.jackson.datatype:jackson-datatype-jsr310 + com.fasterxml.jackson.datatype:jackson-datatype-jdk8 + com.hurence.logisland:logisland-engine-spark_2_common + *:* + + + com.fasterxml.jackson.core:* + com.fasterxml.jackson.databind:* + com.fasterxml.jackson.jaxrs*:* + com.fasterxml.jackson.module:jackson-module-jaxb-annotations + org.scala-lang:* + org.scalatest:* + org.apache.zookeeper:* + com.google.guava:* + org.apache.commons:* + org.slf4j:* + log4j:* + org.yaml:* + org.eclipse.jetty:* + org.glassfish.hk2*:* + org.glassfish.jersey*:* + + + + + *:* + + META-INF/license/** + META-INF/* + META-INF/maven/** + LICENSE + NOTICE + /*.txt + build.properties + + + + + + + + + + + + + + + banzaicloud-github + https://raw.github.com/banzaicloud/spark-metrics/master/maven-repo/releases + + + diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_4/src/main/java/com/hurence/logisland/util/spark/Spark24Platform.java b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_4/src/main/java/com/hurence/logisland/util/spark/Spark24Platform.java new file mode 100644 index 000000000..4383f2597 --- /dev/null +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_4/src/main/java/com/hurence/logisland/util/spark/Spark24Platform.java @@ -0,0 +1,30 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.util.spark; + +import org.apache.spark.rdd.RDD; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; +import org.apache.spark.sql.SQLContext; +import org.apache.spark.sql.catalyst.InternalRow; +import org.apache.spark.sql.types.StructType; + +public class Spark24Platform implements SparkPlatform { + @Override + public Dataset createStreamingDataFrame(SQLContext sqlContext, RDD catalystRows, StructType schema) { + return sqlContext.internalCreateDataFrame(catalystRows, schema, true); + } +} diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_4/src/main/resources/META-INF/services/com.hurence.logisland.util.spark.SparkPlatform b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_4/src/main/resources/META-INF/services/com.hurence.logisland.util.spark.SparkPlatform new file mode 100644 index 000000000..405b9bf4e --- /dev/null +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_4/src/main/resources/META-INF/services/com.hurence.logisland.util.spark.SparkPlatform @@ -0,0 +1 @@ +com.hurence.logisland.util.spark.Spark24Platform \ No newline at end of file diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/pom.xml b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/pom.xml index 73075199f..7c708e067 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/pom.xml +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/pom.xml @@ -6,7 +6,7 @@ http://www.w3.org/2001/XMLSchema-instance "> com.hurence.logisland logisland-engine-spark_2_X - 1.3.0 + 1.4.0 logisland-engine-spark_2_common jar @@ -22,11 +22,14 @@ http://www.w3.org/2001/XMLSchema-instance "> 2.3.3 0.10.2.1 2.11.8 - 2.11 2.6.6 + 2.3.14.1 + 2.7.0 + 2.7.0 + 7.14.1 + 4.0.0 - @@ -41,7 +44,6 @@ http://www.w3.org/2001/XMLSchema-instance "> ${scala.version} - org.apache.kafka kafka-clients @@ -51,12 +53,11 @@ http://www.w3.org/2001/XMLSchema-instance "> org.apache.kafka - kafka_2.11 + kafka_${scala.binary.version} ${kafka.version} compile - org.apache.spark spark-core_${scala.binary.version} @@ -91,6 +92,16 @@ http://www.w3.org/2001/XMLSchema-instance "> org.apache.spark spark-streaming-kafka-0-10_${scala.binary.version} ${spark.version} + + + + net.jpountz.lz4 + lz4 + + org.apache.spark @@ -98,6 +109,35 @@ http://www.w3.org/2001/XMLSchema-instance "> ${spark.version} + + org.elasticsearch + elasticsearch-spark-20_${scala.binary.version} + ${elasticsearch.version} + + + org.apache.spark + spark-sql_${scala.binary.version} + + + org.apache.spark + spark-streaming_${scala.binary.version} + + + org.apache.spark + spark-catalyst_${scala.binary.version} + + + org.apache.spark + spark-yarn_${scala.binary.version} + + + + + + com.databricks + spark-avro_${scala.binary.version} + ${spark-avro.version} + org.apache.kafka @@ -112,6 +152,16 @@ http://www.w3.org/2001/XMLSchema-instance "> ${kafka.version} test test + + + + net.jpountz.lz4 + lz4 + + org.scalatest @@ -123,7 +173,6 @@ http://www.w3.org/2001/XMLSchema-instance "> - com.hurence.logisland logisland-api @@ -136,25 +185,17 @@ http://www.w3.org/2001/XMLSchema-instance "> ${project.version} provided - - com.hurence.logisland - logisland-processor-timeseries - ${project.version} - provided - com.hurence.logisland logisland-plugin-support ${project.version} - provided com.typesafe.scala-logging scala-logging-slf4j_${scala.binary.version} 2.1.2 - @@ -162,7 +203,6 @@ http://www.w3.org/2001/XMLSchema-instance "> com.groupon.dse spark-metrics 2.0.0 - @@ -170,44 +210,66 @@ http://www.w3.org/2001/XMLSchema-instance "> org.apache.spark spark-core_${scala.binary.version} provided - org.apache.spark spark-sql_${scala.binary.version} provided - org.apache.spark spark-streaming_${scala.binary.version} provided - org.apache.spark spark-streaming-kafka-0-10_${scala.binary.version} - org.apache.spark spark-sql-kafka-0-10_${scala.binary.version} + + + org.elasticsearch + elasticsearch-spark-20_${scala.binary.version} + ${elasticsearch.version} + + + org.apache.spark + spark-sql_${scala.binary.version} + + + org.apache.spark + spark-streaming_${scala.binary.version} + + + org.apache.spark + spark-catalyst_${scala.binary.version} + + + org.apache.spark + spark-yarn_${scala.binary.version} + + + + com.databricks + spark-avro_${scala.binary.version} + ${spark-avro.version} + org.apache.bahir - spark-sql-streaming-mqtt_2.11 + spark-sql-streaming-mqtt_${scala.binary.version} 2.3.2 - org.apache.kafka connect-api ${kafka.version} - org.apache.kafka @@ -239,7 +301,6 @@ http://www.w3.org/2001/XMLSchema-instance "> jackson-core ${jackson.version} provided - com.fasterxml.jackson.core @@ -252,25 +313,21 @@ http://www.w3.org/2001/XMLSchema-instance "> com.fasterxml.jackson.core jackson-annotations provided - com.fasterxml.jackson.module jackson-module-parameter-names ${jackson.version} - com.fasterxml.jackson.datatype jackson-datatype-jdk8 ${jackson.version} - com.fasterxml.jackson.datatype jackson-datatype-jsr310 ${jackson.version} - org.apache.commons @@ -281,7 +338,6 @@ http://www.w3.org/2001/XMLSchema-instance "> org.hibernate hibernate-validator 5.1.3.Final - @@ -289,7 +345,6 @@ http://www.w3.org/2001/XMLSchema-instance "> org.glassfish javax.el 3.0.0 - @@ -298,7 +353,6 @@ http://www.w3.org/2001/XMLSchema-instance "> org.scala-lang scala-compiler provided - @@ -319,7 +373,6 @@ http://www.w3.org/2001/XMLSchema-instance "> org.apache.kafka kafka_2.11 - @@ -330,7 +383,6 @@ http://www.w3.org/2001/XMLSchema-instance "> test - org.apache.kafka kafka-clients @@ -342,7 +394,6 @@ http://www.w3.org/2001/XMLSchema-instance "> io.swagger swagger-core ${swagger-core-version} - @@ -358,7 +409,6 @@ http://www.w3.org/2001/XMLSchema-instance "> com.squareup.okhttp3 okhttp-urlconnection 3.10.0 - @@ -376,14 +426,49 @@ http://www.w3.org/2001/XMLSchema-instance "> 5.1.3.RELEASE + + + com.microsoft.azure + azure-eventhubs-spark_${scala.binary.version} + ${eventhubs.version} + + + + com.hurence.logisland + logisland-bootstrap + ${project.version} + provided + + + + + org.apache.hadoop + hadoop-azure + ${hadoop-azure.version} + + + org.apache.hadoop + hadoop-common + ${hadoop-common.version} + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.2 + + + false + + net.alchim31.maven scala-maven-plugin - 3.2.2 + 4.3.1 scala-compile-first @@ -416,6 +501,9 @@ http://www.w3.org/2001/XMLSchema-instance "> -unchecked -deprecation + + -Xmax-classfile-name + 140 -Xms64m diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/java/com/hurence/logisland/connect/converter/LogIslandRecordConverter.java b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/java/com/hurence/logisland/connect/converter/LogIslandRecordConverter.java index 09d622b42..26b3ff34b 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/java/com/hurence/logisland/connect/converter/LogIslandRecordConverter.java +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/java/com/hurence/logisland/connect/converter/LogIslandRecordConverter.java @@ -1,12 +1,12 @@ /** * Copyright (C) 2016 Hurence (support@hurence.com) - *

+ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

+ * + * 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. @@ -51,7 +51,7 @@ public class LogIslandRecordConverter implements Converter { /** * The record type to use. If not provided {@link LogIslandRecordConverter#PROPERTY_RECORD_TYPE} will be used. */ - public static final String PROPERTY_RECORD_TYPE = StreamProperties.RECORD_TYPE().getName(); + public static final String PROPERTY_RECORD_TYPE = "record.type"; /** * The default type for logisland {@link Record} created by this converter. diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/java/com/hurence/logisland/connect/sink/KafkaConnectStreamSink.java b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/java/com/hurence/logisland/connect/sink/KafkaConnectStreamSink.java index d84170198..095650a36 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/java/com/hurence/logisland/connect/sink/KafkaConnectStreamSink.java +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/java/com/hurence/logisland/connect/sink/KafkaConnectStreamSink.java @@ -18,7 +18,6 @@ import com.google.common.collect.ListMultimap; import com.google.common.collect.Multimaps; import com.hurence.logisland.connect.AbstractKafkaConnectComponent; -import com.hurence.logisland.connect.source.KafkaConnectStreamSourceProvider; import org.apache.kafka.clients.consumer.OffsetAndMetadata; import org.apache.kafka.common.TopicPartition; import org.apache.kafka.connect.data.SchemaAndValue; diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/java/com/hurence/logisland/connect/source/KafkaConnectStreamSource.java b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/java/com/hurence/logisland/connect/source/KafkaConnectStreamSource.java index 38ef3d526..5ec603720 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/java/com/hurence/logisland/connect/source/KafkaConnectStreamSource.java +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/java/com/hurence/logisland/connect/source/KafkaConnectStreamSource.java @@ -1,12 +1,12 @@ /** * Copyright (C) 2016 Hurence (support@hurence.com) - *

+ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

+ * + * 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. diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/java/com/hurence/logisland/engine/spark/remote/RemoteApiComponentFactory.java b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/java/com/hurence/logisland/engine/spark/remote/RemoteApiComponentFactory.java index a9748cffc..035409fcc 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/java/com/hurence/logisland/engine/spark/remote/RemoteApiComponentFactory.java +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/java/com/hurence/logisland/engine/spark/remote/RemoteApiComponentFactory.java @@ -16,18 +16,13 @@ package com.hurence.logisland.engine.spark.remote; import com.hurence.logisland.component.ComponentFactory; -import com.hurence.logisland.component.ConfigurableComponent; -import com.hurence.logisland.component.PropertyDescriptor; import com.hurence.logisland.config.ControllerServiceConfiguration; -import com.hurence.logisland.controller.ControllerService; +import com.hurence.logisland.config.ProcessorConfiguration; +import com.hurence.logisland.config.StreamConfiguration; import com.hurence.logisland.controller.ControllerServiceInitializationContext; -import com.hurence.logisland.controller.StandardControllerServiceContext; import com.hurence.logisland.engine.EngineContext; import com.hurence.logisland.engine.spark.remote.model.*; import com.hurence.logisland.processor.ProcessContext; -import com.hurence.logisland.processor.StandardProcessContext; -import com.hurence.logisland.stream.RecordStream; -import com.hurence.logisland.stream.StandardStreamContext; import com.hurence.logisland.stream.StreamContext; import org.apache.spark.SparkContext; import org.slf4j.Logger; @@ -50,38 +45,24 @@ public class RemoteApiComponentFactory { private static final Logger logger = LoggerFactory.getLogger(RemoteApiComponentFactory.class); - /** * Instantiates a stream from of configuration * * @param stream * @return */ - public StreamContext getStreamContext(Stream stream) { - try { - final RecordStream recordStream = ComponentFactory.loadComponent(stream.getComponent()); - final StreamContext instance = - new StandardStreamContext(recordStream, stream.getName()); - - // instantiate each related processor - stream.getPipeline().getProcessors().stream() - .map(this::getProcessContext) - .forEach(instance::addProcessContext); - - - // set the config properties - configureComponent(recordStream, stream.getConfig()) - .forEach((k, s) -> instance.setProperty(k, s)); - if (!instance.isValid()) { - throw new IllegalArgumentException("Stream is not valid"); - } - - logger.info("created stream {}", stream.getName()); - return instance; - - } catch (ClassNotFoundException e) { - throw new RuntimeException("unable to instantiate stream " + stream.getName(), e); - } + private StreamContext buildAndSetupStreamContext(Stream stream) { + StreamConfiguration configuration = new StreamConfiguration(); + configuration.setStream(stream.getName()); + configuration.setComponent(stream.getComponent()); + configuration.setDocumentation(stream.getDocumentation()); + configuration.setType("stream"); + configuration.setConfiguration(propsAsMap(stream.getConfig())); + stream.getPipeline().getProcessors().stream() + .map(this::getProcessorConfiguration) + .forEach(configuration::addProcessorConfiguration); + + return ComponentFactory.buildAndSetUpStreamContext(configuration); } /** @@ -90,30 +71,20 @@ public StreamContext getStreamContext(Stream stream) { * @param processor the processor bean. * @return optionally the constructed processor context or nothing in case of error. */ - public ProcessContext getProcessContext(Processor processor) { - try { - final com.hurence.logisland.processor.Processor processorInstance = ComponentFactory.loadComponent(processor.getComponent()); - final ProcessContext processContext = - new StandardProcessContext(processorInstance, processor.getName()); - - // set all properties - configureComponent(processorInstance, processor.getConfig()) - .forEach((k, s) -> processContext.setProperty(k, s)); - ; - - if (!processContext.isValid()) { - throw new IllegalArgumentException("Processor is not valid"); - } - - - logger.info("created processor {}", processor); - return processContext; - } catch (ClassNotFoundException e) { - throw new RuntimeException("unable to instantiate processor " + processor.getName(), e); - } - + private ProcessorConfiguration getProcessorConfiguration(Processor processor) { + ProcessorConfiguration configuration = new ProcessorConfiguration(); + configuration.setProcessor(processor.getName()); + configuration.setComponent(processor.getComponent()); + configuration.setDocumentation(processor.getDocumentation()); + configuration.setType("processor"); + configuration.setConfiguration(propsAsMap(processor.getConfig())); + return configuration; } + private ProcessContext buildAndSetUpProcessorContext(Processor processor) { + ProcessorConfiguration configuration = getProcessorConfiguration(processor); + return ComponentFactory.buildAndSetUpProcessContext(configuration); + } /** * Constructs controller services. @@ -121,27 +92,30 @@ public ProcessContext getProcessContext(Processor processor) { * @param service the service bean. * @return optionally the constructed service configuration or nothing in case of error. */ - public ControllerServiceConfiguration getControllerServiceConfiguration(Service service) { - try { - ControllerService cs = ComponentFactory.loadComponent(service.getComponent()); - ControllerServiceConfiguration configuration = new ControllerServiceConfiguration(); - configuration.setControllerService(service.getName()); - configuration.setComponent(service.getComponent()); - configuration.setDocumentation(service.getDocumentation()); - configuration.setType("service"); - configuration.setConfiguration(configureComponent(cs, service.getConfig())); - ControllerServiceInitializationContext ic = new StandardControllerServiceContext(cs, service.getName()); - configuration.getConfiguration().forEach((k, s) -> ic.setProperty(k, s)); - if (!ic.isValid()) { - throw new IllegalArgumentException("Service is not valid"); - } - logger.info("created service {}", service.getName()); - return configuration; - } catch (Exception e) { - throw new RuntimeException("unable to instantiate service " + service.getName(), e); - } - + private ControllerServiceInitializationContext buildAndSetUpControllerServiceContext(Service service) { + ControllerServiceConfiguration configuration = new ControllerServiceConfiguration(); + configuration.setControllerService(service.getName()); + configuration.setComponent(service.getComponent()); + configuration.setDocumentation(service.getDocumentation()); + configuration.setType("service"); + configuration.setConfiguration(propsAsMap(service.getConfig())); + return ComponentFactory.buildAndSetUpServiceContext(configuration); + } + /** + * Constructs controller services. + * + * @param service the service bean. + * @return optionally the constructed service configuration or nothing in case of error. + */ + private ControllerServiceConfiguration buildControllerServiceConfiguration(Service service) { + ControllerServiceConfiguration configuration = new ControllerServiceConfiguration(); + configuration.setControllerService(service.getName()); + configuration.setComponent(service.getComponent()); + configuration.setDocumentation(service.getDocumentation()); + configuration.setType("service"); + configuration.setConfiguration(propsAsMap(service.getConfig())); + return configuration; } /** @@ -157,35 +131,45 @@ public boolean updateEngineContext(SparkContext sparkContext, EngineContext engi if (oldDataflow == null || oldDataflow.getLastModified().isBefore(dataflow.getLastModified())) { logger.info("We have a new configuration. Resetting current engine"); logger.info("Configuring dataflow. Last change at {} is {}", dataflow.getLastModified(), dataflow.getModificationReason()); + List serviceContexts = dataflow.getServices().stream() + .map(this::buildAndSetUpControllerServiceContext) + .collect(Collectors.toList()); - - List css = dataflow.getServices().stream() - .map(this::getControllerServiceConfiguration) + List serviceConfigurations = dataflow.getServices().stream() + .map(this::buildControllerServiceConfiguration) .collect(Collectors.toList()); - List sc = dataflow.getStreams().stream() - .map(this::getStreamContext) + List streamContexts = dataflow.getStreams().stream() + .map(this::buildAndSetupStreamContext) .collect(Collectors.toList()); - sc.forEach(streamContext -> { + streamContexts.forEach(streamContext -> { if (!streamContext.isValid()) { - throw new IllegalArgumentException("Unable to validate steam " + streamContext.getIdentifier()); + throw new IllegalArgumentException("configuration of stream " + streamContext.getIdentifier() + " is not valid"); + } + }); + serviceContexts.forEach(serviceContext -> { + if (!serviceContext.isValid()) { + throw new IllegalArgumentException("configuration of service " + serviceContext.getIdentifier() + " is not valid"); } }); logger.info("Restarting engine"); - engineContext.getEngine().reset(engineContext); - css.forEach(engineContext::addControllerServiceConfiguration); - sc.forEach(engineContext::addStreamContext); + engineContext.getEngine().softStop(engineContext); + serviceContexts.forEach(engineContext::addControllerServiceContext); + serviceConfigurations.forEach(engineContext::addControllerServiceConfiguration); + + streamContexts.forEach(engineContext::addStreamContext); + PipelineConfigurationBroadcastWrapper.getInstance().refresh( engineContext.getStreamContexts().stream() .collect(Collectors.toMap(StreamContext::getIdentifier, StreamContext::getProcessContexts)) , sparkContext); updatePipelines(sparkContext, engineContext, dataflow.getStreams()); + engineContext.getEngine().start(engineContext); changed = true; - } else { //need to update pipelines? @@ -218,10 +202,10 @@ public boolean updateEngineContext(SparkContext sparkContext, EngineContext engi * @param engineContext the engine context. * @param streams the list of streams */ - public void updatePipelines(SparkContext sparkContext, EngineContext engineContext, Collection streams) { + private void updatePipelines(SparkContext sparkContext, EngineContext engineContext, Collection streams) { Map> pipelineMap = streams.stream() .collect(Collectors.toMap(Stream::getName, - s -> s.getPipeline().getProcessors().stream().map(this::getProcessContext) + s -> s.getPipeline().getProcessors().stream().map(this::buildAndSetUpProcessorContext) .collect(Collectors.toList()))); engineContext.getStreamContexts().forEach(streamContext -> { streamContext.getProcessContexts().clear(); @@ -231,19 +215,12 @@ public void updatePipelines(SparkContext sparkContext, EngineContext engineConte PipelineConfigurationBroadcastWrapper.getInstance().refresh(pipelineMap, sparkContext); } - private Map configureComponent(ConfigurableComponent component, Collection properties) { - final Map propertyMap = properties.stream().collect(Collectors.toMap(Property::getKey, Function.identity())); - return propertyMap.keySet().stream().map(component::getPropertyDescriptor) - .filter(propertyDescriptor -> propertyDescriptor != null) - .filter(propertyDescriptor -> propertyMap.containsKey(propertyDescriptor.getName()) || - (propertyDescriptor.getDefaultValue() != null && propertyDescriptor.isRequired())) - .collect(Collectors.toMap(PropertyDescriptor::getName, propertyDescriptor -> { - String value = propertyDescriptor.getDefaultValue(); - if (propertyMap.containsKey(propertyDescriptor.getName())) { - value = propertyMap.get(propertyDescriptor.getName()).getValue(); - } - return value; - })); + private static Map propsAsMap(Collection properties) { + return properties.stream().collect( + Collectors.toMap( + Property::getKey, + Property::getValue + )); } diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/java/com/hurence/logisland/util/spark/SparkConfigReader.java b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/java/com/hurence/logisland/util/spark/SparkConfigReader.java new file mode 100644 index 000000000..5e0a8348a --- /dev/null +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/java/com/hurence/logisland/util/spark/SparkConfigReader.java @@ -0,0 +1,74 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.util.spark; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import com.hurence.logisland.config.LogislandConfiguration; +import com.hurence.logisland.util.string.StringUtils; +import org.apache.spark.SparkContext; +import org.apache.spark.rdd.RDD; + +import java.util.Arrays; + +import static com.hurence.logisland.config.ConfigReader.checkLogislandConf; + +/** + * This configuration reader depends on spark. We do not want to place methods in this class in the + * com.hurence.logisland.config.ConfigReader class where the loadConfig (from local filesystem) method + * resides, as it would introduce a spark dependency in the logisland-framework module. Only the spark + * engine should have a spark dependency. So this class should be loaded from the StreamProcessingRunner + * and this will succeed only in environments where a spark 2 engine is available and used, otherwise it + * will fail to load. This will for instance be successful in the databricks environment, which is by the + * way the first purpose for which this class is being introduced. + */ +public class SparkConfigReader { + + /** + * Loads a YAML config file using (file located in the shared filesystem) + * + * @param configFilePath the path of the config file + * @return a LogislandSessionConfiguration + * @throws Exception + */ + public static LogislandConfiguration loadConfigFromSharedFS(String configFilePath) throws Exception { + ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); + + /** + * In Databricks, developers should utilize the shared SparkContext instead of creating one using the constructor. + * When running a job, you can access the shared context by calling SparkContext.getOrCreate(). + * + * Also in databricks, a path like /path/to/a/file will be loaded from DBFS so will be interpreted like + * dbfs:/path/to/a/file + */ + + SparkContext sparkContext = SparkContext.getOrCreate(); + + RDD configRdd = sparkContext.textFile(configFilePath, 1); + String[] configStringArray = (String[])configRdd.collect(); + String configString = String.join("\n", Arrays.asList(configStringArray)); + + // replace all host from environment variables + String fileContent = StringUtils.resolveEnvVars(configString, "localhost"); + + System.out.println("Configuration:\n" + fileContent); + + LogislandConfiguration logislandConf = mapper.readValue(fileContent, LogislandConfiguration.class); + checkLogislandConf(logislandConf); + + return logislandConf; + } +} diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/engine/spark/KafkaStreamProcessingEngine.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/engine/spark/KafkaStreamProcessingEngine.scala index c7ee30d8c..c338b48cc 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/engine/spark/KafkaStreamProcessingEngine.scala +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/engine/spark/KafkaStreamProcessingEngine.scala @@ -31,22 +31,23 @@ package com.hurence.logisland.engine.spark - import java.util import java.util.concurrent.Executors import java.util.regex.Pattern -import java.util.{Collections, UUID} - -import com.hurence.logisland.component.{AllowableValue, ComponentContext, PropertyDescriptor} +import java.util.{Collections, Map, UUID} +import com.hurence.logisland.component.{AllowableValue, PropertyDescriptor} +import com.hurence.logisland.engine.spark.KafkaStreamProcessingEngine.SPARK_CUSTOM_CONFIG_PREFIX import com.hurence.logisland.engine.spark.remote.PipelineConfigurationBroadcastWrapper import com.hurence.logisland.engine.{AbstractProcessingEngine, EngineContext} -import com.hurence.logisland.stream.spark.{AbstractKafkaRecordStream, SparkRecordStream} +import com.hurence.logisland.stream.spark.{SparkRecordStream, SparkStreamContext} +import com.hurence.logisland.util.spark.ControllerServiceLookupSink import com.hurence.logisland.validator.StandardValidators +import org.apache.spark.broadcast.Broadcast import org.apache.spark.groupon.metrics.UserMetricsSystem -import org.apache.spark.sql.SQLContext +import org.apache.spark.sql.{SQLContext, SparkSession} import org.apache.spark.sql.streaming.StreamingQueryListener import org.apache.spark.streaming.{Milliseconds, StreamingContext} -import org.apache.spark.{SparkConf, SparkContext, SparkEnv} +import org.apache.spark.{SparkConf, SparkContext} import org.slf4j.LoggerFactory import scala.collection.JavaConversions._ @@ -54,7 +55,6 @@ import scala.collection.JavaConversions._ object KafkaStreamProcessingEngine { - val SPARK_PROPERTIES_FILE_PATH: PropertyDescriptor = new PropertyDescriptor.Builder()//Not used in code but in logisland.sh script. Si it must be present ! .name("spark.properties.file.path") .description("for using --properties-file option while submitting spark job") @@ -72,7 +72,7 @@ object KafkaStreamProcessingEngine { val SPARK_MASTER = new PropertyDescriptor.Builder() .name("spark.master") .description("The url to Spark Master") - .required(true) + .required(false) // The regex allows "local[K]" with K as an integer, "local[*]", "yarn", "yarn-client", "yarn-cluster" and "spark://HOST[:PORT]" // there is NO support for "mesos://HOST:PORT" .addValidator(StandardValidators.createRegexMatchingValidator(Pattern.compile( @@ -80,14 +80,14 @@ object KafkaStreamProcessingEngine { "local(\\[([0-9]+|\\*)(,[0-9]+)?\\])?|" + "spark:\\/\\/[a-z0-9\\.\\-]+(:[0-9]+)?(,[a-z0-9\\.\\-]+(:[0-9]+)?)*|" + "mesos:\\/\\/((zk:\\/\\/[a-z0-9\\.\\-]+:[0-9]+(,[a-z0-9\\.\\-]+:[0-9]+)*\\/mesos)|(([0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+|[a-z][a-z0-9\\.\\-]+)(:[0-9]+)?))|" + - "k8s://.+)$"))) + "k8s:\\/\\/.+)$"))) .defaultValue("local[2]") .build val SPARK_APP_NAME = new PropertyDescriptor.Builder() .name("spark.app.name") .description("Tha application name") - .required(true) + .required(false) .addValidator(StandardValidators.createRegexMatchingValidator(Pattern.compile("^[a-zA-z0-9-_\\.]+$"))) .defaultValue("logisland") .build @@ -104,7 +104,14 @@ object KafkaStreamProcessingEngine { .name("spark.yarn.deploy-mode") .description("The yarn deploy mode") .required(false) - // .allowableValues("client", "cluster") + .allowableValues("client", "cluster") + .build + + val SPARK_DEPLOYMODE = new PropertyDescriptor.Builder() + .name("spark.deploy-mode") + .description("The spark standalone cluster deploy mode") + .required(false) + .allowableValues("client", "cluster") .build val SPARK_YARN_QUEUE = new PropertyDescriptor.Builder() @@ -261,7 +268,6 @@ object KafkaStreamProcessingEngine { .defaultValue("4") .build - val SPARK_YARN_AM_ATTEMPT_FAILURES_VALIDITY_INTERVAL = new PropertyDescriptor.Builder() .name("spark.yarn.am.attemptFailuresValidityInterval") .description("If the application runs for days or weeks without restart " + @@ -350,9 +356,35 @@ object KafkaStreamProcessingEngine { .description("The maximum number of total executor core with mesos.") .required(false) .build + //SPARK STANDALONE CLUSTER OPTIONS + val SPARK_TOTAL_EXECUTOR_CORES = new PropertyDescriptor.Builder() + .name("spark.total.executor.cores") + .description("The total number of core of all executors") + .required(false) + .addValidator(StandardValidators.POSITIVE_INTEGER_VALIDATOR) + .build -} + val SPARK_SUPERVISE = new PropertyDescriptor.Builder() + .name("spark.supervise") + .description("activate supervise option or not of spark standalone cluster (see documentation)") + .required(false) + .addValidator(StandardValidators.BOOLEAN_VALIDATOR) + .build + + val OVERWRITE_EXISTING = new AllowableValue("overwrite_existing", "overwrite existing field", "if field already exist") + val KEEP_OLD_FIELD = new AllowableValue("keep_old_field", "keep only old field value", "keep only old field") + + val SPARK_CONF_POLICY = new PropertyDescriptor.Builder() + .name("spark.conf.properties.policy") + .description("What to do when a field with the same name already exists ?") + .required(false) + .defaultValue(OVERWRITE_EXISTING.getValue()) + .allowableValues(OVERWRITE_EXISTING, KEEP_OLD_FIELD) + .build(); + + val SPARK_CUSTOM_CONFIG_PREFIX = "spark.custom.config." +} class KafkaStreamProcessingEngine extends AbstractProcessingEngine { @@ -360,34 +392,36 @@ class KafkaStreamProcessingEngine extends AbstractProcessingEngine { private val conf = new SparkConf() private var running = false protected var batchDurationMs: Int = 1000 - + protected var controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink] = null + private var sparkStreamingTimeout: Int = _ /** * Provides subclasses the ability to perform initialization logic */ - override def init(context: ComponentContext): Unit = { + override def init(context: EngineContext): Unit = { super.init(context) val engineContext = context.asInstanceOf[EngineContext] - val sparkMaster = engineContext.getPropertyValue(KafkaStreamProcessingEngine.SPARK_MASTER).asString - val appName = engineContext.getPropertyValue(KafkaStreamProcessingEngine.SPARK_APP_NAME).asString batchDurationMs = engineContext.getPropertyValue(KafkaStreamProcessingEngine.SPARK_STREAMING_BATCH_DURATION).asInteger().intValue() - - /** - * job configuration - */ - - - conf.setAppName(appName) - conf.setMaster(sparkMaster) + sparkStreamingTimeout = engineContext.getPropertyValue(KafkaStreamProcessingEngine.SPARK_STREAMING_TIMEOUT).asInteger().toInt + val conflictPolicy = engineContext.getPropertyValue(KafkaStreamProcessingEngine.SPARK_CONF_POLICY).asString def setConfProperty(conf: SparkConf, engineContext: EngineContext, propertyDescriptor: PropertyDescriptor) = { - // Need to check if the properties are set because those properties are not "requires" if (engineContext.getPropertyValue(propertyDescriptor).isSet) { - conf.set(propertyDescriptor.getName, engineContext.getPropertyValue(propertyDescriptor).asString) + if (conf.contains(propertyDescriptor.getName)) { + logger.warn("Property " + propertyDescriptor.getName + " already present in the sparkConfiguration with value " + conf.get(propertyDescriptor.getName)) + } + + if (conflictPolicy.equals(KafkaStreamProcessingEngine.OVERWRITE_EXISTING.getValue)) { + conf.set(propertyDescriptor.getName, engineContext.getPropertyValue(propertyDescriptor).asString) + logger.info("Property " + propertyDescriptor.getName + " set in the sparkConfiguration with value " + conf.get(propertyDescriptor.getName)) + } } } + setConfProperty(conf, engineContext, KafkaStreamProcessingEngine.SPARK_APP_NAME) + setConfProperty(conf, engineContext, KafkaStreamProcessingEngine.SPARK_MASTER) + setConfProperty(conf, engineContext, KafkaStreamProcessingEngine.SPARK_STREAMING_UI_RETAINED_BATCHES) setConfProperty(conf, engineContext, KafkaStreamProcessingEngine.SPARK_STREAMING_RECEIVER_WAL_ENABLE) setConfProperty(conf, engineContext, KafkaStreamProcessingEngine.SPARK_STREAMING_KAFKA_MAXRETRIES) @@ -414,32 +448,32 @@ class KafkaStreamProcessingEngine extends AbstractProcessingEngine { conf.set("spark.kryo.registrator", "com.hurence.logisland.util.spark.ProtoBufRegistrator") - if (sparkMaster startsWith "yarn") { + if (conf.get(KafkaStreamProcessingEngine.SPARK_MASTER.getName) startsWith "yarn") { // Note that SPARK_YARN_DEPLOYMODE is not used by spark itself but only by spark-submit CLI // That's why we do not need to propagate it here setConfProperty(conf, engineContext, KafkaStreamProcessingEngine.SPARK_YARN_QUEUE) } - @transient val sparkContext = getCurrentSparkContext() - - UserMetricsSystem.initialize(sparkContext, "LogislandMetrics") - + handleDynamicProperties(context.getProperties) + logger.info("Configuration from logisland main") + logger.info(conf.toDebugString) + + val sparkContext = getCurrentSparkContext() + UserMetricsSystem.initialize(sparkContext, "LogislandMetrics") /** * shutdown context gracefully */ sys.ShutdownHookThread { logger.info("Gracefully stopping Spark Streaming Application") - shutdown(engineContext) + stop(engineContext) logger.info("Application stopped") } - PipelineConfigurationBroadcastWrapper.getInstance().refresh(engineContext, sparkContext) - SQLContext.getOrCreate(getCurrentSparkContext()).streams.addListener(new StreamingQueryListener { val runMap = scala.collection.mutable.Map[UUID, String]() @@ -466,27 +500,46 @@ class KafkaStreamProcessingEngine extends AbstractProcessingEngine { executor.submit(new Runnable { override def run(): Unit = { Thread.sleep(1000); - engineContext.getEngine.reset(engineContext) + engineContext.getEngine.stop(engineContext) } }) } } }) - running = true - + val sparkMaster = conf.get(KafkaStreamProcessingEngine.SPARK_MASTER.getName) + val appName = conf.get(KafkaStreamProcessingEngine.SPARK_APP_NAME.getName) logger.info(s"spark context initialized with master:$sparkMaster, " + s"appName:$appName, " + s"batchDuration:$batchDurationMs ") logger.info(s"conf : ${conf.toDebugString}") } + protected def handleDynamicProperties(properties : Map[PropertyDescriptor, String]) = { + + properties.foreach(propertyAndValue => { + + val propertyDescriptor: PropertyDescriptor = propertyAndValue._1 + val propertyName: String = propertyDescriptor.getName + // Handle any dynamic property of the form 'spark.custom.config.XXX: someValue' properties + // which will be passed to spark configuration as property 'XXX=someValue' + if (propertyDescriptor.isDynamic && propertyName.startsWith(SPARK_CUSTOM_CONFIG_PREFIX)) { + val customSparkConfigKey: String = propertyName.substring(SPARK_CUSTOM_CONFIG_PREFIX.length) + if (customSparkConfigKey.length > 0) { // Ignore silly 'spark.custom.config.: missing_custom_key' property + val customSparkConfigValue: String = propertyAndValue._2 + conf.set(customSparkConfigKey, customSparkConfigValue) + } + } + }) + } + override def getSupportedPropertyDescriptors: util.List[PropertyDescriptor] = { val descriptors: util.List[PropertyDescriptor] = new util.ArrayList[PropertyDescriptor] descriptors.add(KafkaStreamProcessingEngine.SPARK_APP_NAME) descriptors.add(KafkaStreamProcessingEngine.SPARK_MASTER) descriptors.add(KafkaStreamProcessingEngine.SPARK_MONITORING_DRIVER_PORT) descriptors.add(KafkaStreamProcessingEngine.SPARK_YARN_DEPLOYMODE) + descriptors.add(KafkaStreamProcessingEngine.SPARK_DEPLOYMODE) descriptors.add(KafkaStreamProcessingEngine.SPARK_YARN_QUEUE) descriptors.add(KafkaStreamProcessingEngine.SPARK_DRIVER_MEMORY) descriptors.add(KafkaStreamProcessingEngine.SPARK_EXECUTOR_MEMORY) @@ -515,10 +568,29 @@ class KafkaStreamProcessingEngine extends AbstractProcessingEngine { descriptors.add(KafkaStreamProcessingEngine.SPARK_PROPERTIES_FILE_PATH) descriptors.add(KafkaStreamProcessingEngine.JAVA_MESOS_LIBRARY_PATH) descriptors.add(KafkaStreamProcessingEngine.SPARK_MESOS_CORE_MAX) + descriptors.add(KafkaStreamProcessingEngine.SPARK_TOTAL_EXECUTOR_CORES) + descriptors.add(KafkaStreamProcessingEngine.SPARK_SUPERVISE) + descriptors.add(KafkaStreamProcessingEngine.SPARK_CONF_POLICY) Collections.unmodifiableList(descriptors) } + override def getSupportedDynamicPropertyDescriptor(propertyDescriptorName: String): PropertyDescriptor = { + + // Support any custom spark configuration. + // The property name must start with SPARK_CUSTOM_CONFIG_PREFIX, the rest + // of the key will be the real key used to pass to spark configuration + if (propertyDescriptorName.startsWith(SPARK_CUSTOM_CONFIG_PREFIX)) { + return new PropertyDescriptor.Builder() + .name(propertyDescriptorName) + .expressionLanguageSupported(false) + .required(false) + .dynamic(true) + .build + } + return null + } + /** * start the engine @@ -527,60 +599,73 @@ class KafkaStreamProcessingEngine extends AbstractProcessingEngine { */ override def start(engineContext: EngineContext) = { logger.info("starting Spark Engine") - val streamingContext = createStreamingContext(engineContext) - if (!engineContext.getStreamContexts.map(p => p.getStream).filter(p => p.isInstanceOf[AbstractKafkaRecordStream]).isEmpty) { - streamingContext.start() - } - - } - - protected def getCurrentSparkStreamingContext(sparkContext: SparkContext): StreamingContext = { - return StreamingContext.getActiveOrCreate(() => - return new StreamingContext(sparkContext, Milliseconds(batchDurationMs)) + val spark = getCurrentSparkSession() + logger.info("broadCasting services") + controllerServiceLookupSink = spark.sparkContext.broadcast( + ControllerServiceLookupSink(engineContext.getControllerServiceConfigurations) ) - } - - protected def getCurrentSparkContext(): SparkContext = { - return SparkContext.getOrCreate(conf) - } - - - def createStreamingContext(engineContext: EngineContext): StreamingContext = { - - - @transient val sc = getCurrentSparkContext() - @transient val ssc = getCurrentSparkStreamingContext(sc) - val appName = sc.appName; - - + getLogger.info("Will start streams") /** * loop over processContext */ - engineContext.getStreamContexts.foreach(streamingContext => { + engineContext.getStreamContexts.foreach(logislandStreamContext => { try { - val kafkaStream = streamingContext.getStream.asInstanceOf[SparkRecordStream] - - kafkaStream.setup(appName, ssc, streamingContext, engineContext) + val kafkaStream = logislandStreamContext.getStream.asInstanceOf[SparkRecordStream] + val sparkStreamContext = new SparkStreamContext( + logislandStreamContext, + batchDurationMs, + spark, + controllerServiceLookupSink + ) + kafkaStream.init(sparkStreamContext) kafkaStream.start() } catch { case ex: Exception => throw new IllegalStateException("something bad happened, please check Kafka or cluster health", ex) } - }) - ssc + + if (!engineContext.getStreamContexts.isEmpty) { + val streamsIds = engineContext.getStreamContexts + .map(a => a.getIdentifier).toList; + logger.info("started all following streams : {}", streamsIds) + } else { + logger.error("There is no stream to start ! This should never happen as configuration should be considered" + + " wrong in this case, therefore code should never reach this code"); + } + running = true } + protected def getCurrentSparkStreamingContext(sparkContext: SparkContext): StreamingContext = { + StreamingContext.getActiveOrCreate(() => + return new StreamingContext(getCurrentSparkContext(), Milliseconds(batchDurationMs)) + ) + } - override def shutdown(engineContext: EngineContext) = { - if (running) { - running = false - logger.info(s"shutting down Spark engine") - stop(engineContext, true) - } + protected def getCurrentSparkContext(): SparkContext = { + getCurrentSparkSession().sparkContext + } + + protected def getCurrentSparkSession(): SparkSession = { + SparkSession.builder() + .config(conf) + .getOrCreate() + } + + + override def stop(engineContext: EngineContext) = { + running = false + logger.info(s"stopping Spark engine") + doStop(engineContext, true) } - def stop(engineContext: EngineContext, doStopSparkContext: Boolean) = { + override def softStop(engineContext: EngineContext): Unit = { + running = false + logger.info(s"stopping Spark engine") + doStop(engineContext, false) + } + + protected def doStop(engineContext: EngineContext, doStopSparkContext: Boolean) = { synchronized { val sc = getCurrentSparkContext(); if (!sc.isStopped) { @@ -627,18 +712,16 @@ class KafkaStreamProcessingEngine extends AbstractProcessingEngine { * */ override def awaitTermination(engineContext: EngineContext): Unit = { - var timeout = engineContext.getPropertyValue(KafkaStreamProcessingEngine.SPARK_STREAMING_TIMEOUT) - .asInteger().toInt val sc = getCurrentSparkContext() while (!sc.isStopped) { try { - if (timeout < 0) { + if (sparkStreamingTimeout < 0) { Thread.sleep(200) } else { - val toSleep = Math.min(200, timeout); + val toSleep = Math.min(200, sparkStreamingTimeout); Thread.sleep(toSleep) - timeout -= toSleep + sparkStreamingTimeout -= toSleep } } catch { case e: InterruptedException => return @@ -646,14 +729,4 @@ class KafkaStreamProcessingEngine extends AbstractProcessingEngine { } } } - - - /** - * Reset the engine by stopping the streaming context. - */ - override def reset(engineContext: EngineContext): Unit = { - shutdown(engineContext) - } - - -} +} \ No newline at end of file diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/engine/spark/RemoteApiStreamProcessingEngine.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/engine/spark/RemoteApiStreamProcessingEngine.scala index f6ef5ce60..4687ac15d 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/engine/spark/RemoteApiStreamProcessingEngine.scala +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/engine/spark/RemoteApiStreamProcessingEngine.scala @@ -24,63 +24,10 @@ import com.hurence.logisland.component.PropertyDescriptor import com.hurence.logisland.engine.EngineContext import com.hurence.logisland.engine.spark.remote.model.DataFlow import com.hurence.logisland.engine.spark.remote.{RemoteApiClient, RemoteApiComponentFactory} -import com.hurence.logisland.stream.StandardStreamContext -import com.hurence.logisland.stream.spark.DummyRecordStream + import com.hurence.logisland.validator.StandardValidators -import org.apache.spark.streaming.dstream.DStream import org.slf4j.LoggerFactory -object RemoteApiStreamProcessingEngine { - val REMOTE_API_BASE_URL = new PropertyDescriptor.Builder() - .name("remote.api.baseUrl") - .description("The base URL of the remote server providing logisland configuration") - .required(true) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .build - - val REMOTE_API_POLLING_RATE = new PropertyDescriptor.Builder() - .name("remote.api.polling.rate") - .description("Remote api polling rate in milliseconds") - .required(true) - .addValidator(StandardValidators.NON_NEGATIVE_INTEGER_VALIDATOR) - .build - - val REMOTE_API_CONFIG_PUSH_RATE = new PropertyDescriptor.Builder() - .name("remote.api.push.rate") - .description("Remote api configuration push rate in milliseconds") - .required(true) - .addValidator(StandardValidators.NON_NEGATIVE_INTEGER_VALIDATOR) - .build - - val REMOTE_API_CONNECT_TIMEOUT = new PropertyDescriptor.Builder() - .name("remote.api.timeouts.connect") - .description("Remote api connection timeout in milliseconds") - .required(false) - .defaultValue("10000") - .addValidator(StandardValidators.NON_NEGATIVE_INTEGER_VALIDATOR) - .build - - val REMOTE_API_SOCKET_TIMEOUT = new PropertyDescriptor.Builder() - .name("remote.api.timeouts.socket") - .description("Remote api default read/write socket timeout in milliseconds") - .required(false) - .defaultValue("10000") - .addValidator(StandardValidators.NON_NEGATIVE_INTEGER_VALIDATOR) - .build - - val REMOTE_API_USER = new PropertyDescriptor.Builder() - .name("remote.api.auth.user") - .description("The basic authentication user for the remote api endpoint.") - .required(false) - .build - - val REMOTE_API_PASSWORD = new PropertyDescriptor.Builder() - .name("remote.api.auth.password") - .description("The basic authentication password for the remote api endpoint.") - .required(false) - .build -} - class RemoteApiStreamProcessingEngine extends KafkaStreamProcessingEngine { private val logger = LoggerFactory.getLogger(classOf[RemoteApiStreamProcessingEngine]) @@ -143,7 +90,7 @@ class RemoteApiStreamProcessingEngine extends KafkaStreamProcessingEngine { case default: Throwable => { currentDataflow = null logger.warn("Unexpected exception while trying to poll for new dataflow configuration", default) - reset(engineContext) + softStop(engineContext) } } finally { if (changed) { @@ -178,21 +125,68 @@ class RemoteApiStreamProcessingEngine extends KafkaStreamProcessingEngine { } - override def shutdown(engineContext: EngineContext): Unit = { - super.shutdown(engineContext) + override def stop(engineContext: EngineContext): Unit = { + super.stop(engineContext) } - /** - * Reset the engine by stopping the streaming context. - */ - override def reset(engineContext: EngineContext): Unit = { - logger.info(s"Resetting engine ${ - engineContext.getIdentifier - }") - super.stop(engineContext, false) + override def softStop(engineContext: EngineContext): Unit = { + logger.info(s"Resetting engine ${engineContext.getIdentifier}") + super.softStop(engineContext) engineContext.getStreamContexts.clear() + engineContext.getControllerServiceContexts.clear() engineContext.getControllerServiceConfigurations.clear() } + } +object RemoteApiStreamProcessingEngine { + val REMOTE_API_BASE_URL = new PropertyDescriptor.Builder() + .name("remote.api.baseUrl") + .description("The base URL of the remote server providing logisland configuration") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build + + val REMOTE_API_POLLING_RATE = new PropertyDescriptor.Builder() + .name("remote.api.polling.rate") + .description("Remote api polling rate in milliseconds") + .required(true) + .addValidator(StandardValidators.NON_NEGATIVE_INTEGER_VALIDATOR) + .build + + val REMOTE_API_CONFIG_PUSH_RATE = new PropertyDescriptor.Builder() + .name("remote.api.push.rate") + .description("Remote api configuration push rate in milliseconds") + .required(true) + .addValidator(StandardValidators.NON_NEGATIVE_INTEGER_VALIDATOR) + .build + + val REMOTE_API_CONNECT_TIMEOUT = new PropertyDescriptor.Builder() + .name("remote.api.timeouts.connect") + .description("Remote api connection timeout in milliseconds") + .required(false) + .defaultValue("10000") + .addValidator(StandardValidators.NON_NEGATIVE_INTEGER_VALIDATOR) + .build + + val REMOTE_API_SOCKET_TIMEOUT = new PropertyDescriptor.Builder() + .name("remote.api.timeouts.socket") + .description("Remote api default read/write socket timeout in milliseconds") + .required(false) + .defaultValue("10000") + .addValidator(StandardValidators.NON_NEGATIVE_INTEGER_VALIDATOR) + .build + + val REMOTE_API_USER = new PropertyDescriptor.Builder() + .name("remote.api.auth.user") + .description("The basic authentication user for the remote api endpoint.") + .required(false) + .build + + val REMOTE_API_PASSWORD = new PropertyDescriptor.Builder() + .name("remote.api.auth.password") + .description("The basic authentication password for the remote api endpoint.") + .required(false) + .build +} \ No newline at end of file diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/AbstractKafkaRecordStream.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/AbstractKafkaRecordStream.scala index 15123ec11..d0d5cd4e5 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/AbstractKafkaRecordStream.scala +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/AbstractKafkaRecordStream.scala @@ -1,18 +1,18 @@ /** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ /** * Copyright (C) 2016 Hurence (support@hurence.com) * @@ -35,29 +35,34 @@ import java.io.ByteArrayInputStream import java.util import java.util.Collections -import com.hurence.logisland.component.PropertyDescriptor +import com.hurence.logisland.component.{ComponentContext, PropertyDescriptor} import com.hurence.logisland.engine.EngineContext +import com.hurence.logisland.engine.spark.KafkaStreamProcessingEngine import com.hurence.logisland.engine.spark.remote.PipelineConfigurationBroadcastWrapper import com.hurence.logisland.record.Record import com.hurence.logisland.serializer._ import com.hurence.logisland.stream.StreamProperties._ +import com.hurence.logisland.stream.spark.structured.provider.KafkaProperties.{DEFAULT_METRICS_TOPIC, ERROR_SERIALIZER, ERROR_TOPICS, INPUT_SERIALIZER, INPUT_TOPICS, KAFKA_ACKS, KAFKA_BATCH_SIZE, KAFKA_LINGER_MS, KAFKA_MANUAL_OFFSET_RESET, KAFKA_METADATA_BROKER_LIST, KAFKA_SASL_KERBEROS_SERVICE_NAME, KAFKA_SECURITY_PROTOCOL, KAFKA_TOPIC_AUTOCREATE, KAFKA_TOPIC_DEFAULT_PARTITIONS, KAFKA_TOPIC_DEFAULT_REPLICATION_FACTOR, KAFKA_ZOOKEEPER_QUORUM, OUTPUT_SERIALIZER, OUTPUT_TOPICS,AVRO_SCHEMA_URL,AVRO_SCHEMA_NAME,AVRO_SCHEMA_VERSION} import com.hurence.logisland.stream.{AbstractRecordStream, StreamContext} import com.hurence.logisland.util.kafka.KafkaSink import com.hurence.logisland.util.spark._ import kafka.admin.AdminUtils import kafka.utils.ZkUtils +import org.apache.avro.Schema import org.apache.kafka.clients.consumer.{ConsumerConfig, ConsumerRecord, OffsetAndMetadata, OffsetCommitCallback} import org.apache.kafka.clients.producer.ProducerConfig import org.apache.kafka.common.TopicPartition import org.apache.kafka.common.security.JaasUtils import org.apache.kafka.common.serialization.{ByteArrayDeserializer, ByteArraySerializer} +import org.apache.spark.SparkContext import org.apache.spark.broadcast.Broadcast import org.apache.spark.groupon.metrics.UserMetricsSystem import org.apache.spark.rdd.RDD +import org.apache.spark.sql.SparkSession import org.apache.spark.streaming.kafka010.ConsumerStrategies.Subscribe import org.apache.spark.streaming.kafka010.LocationStrategies.PreferConsistent import org.apache.spark.streaming.kafka010.{CanCommitOffsets, KafkaUtils, OffsetRange} -import org.apache.spark.streaming.{Seconds, StreamingContext} +import org.apache.spark.streaming.{Milliseconds, Seconds, StreamingContext} import org.slf4j.LoggerFactory import scala.collection.JavaConversions._ @@ -65,18 +70,13 @@ import scala.collection.JavaConversions._ abstract class AbstractKafkaRecordStream extends AbstractRecordStream with SparkRecordStream { - - val NONE_TOPIC: String = "none" private val logger = LoggerFactory.getLogger(this.getClass) - protected var kafkaSink: Broadcast[KafkaSink] = null - protected var appName: String = "" - @transient protected var ssc: StreamingContext = null - protected var streamContext: StreamContext = null - protected var engineContext: EngineContext = null - protected var controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink] = null + val NONE_TOPIC: String = "none" + + protected var kafkaSink: Broadcast[KafkaSink] = _ + protected var sparkStreamContext: SparkStreamContext = _ protected var needMetricsReset = false - protected var securityProtocol = "" - protected var saslKbServiceName = "" + protected var batchDurationMs: Int = _ override def getSupportedPropertyDescriptors: util.List[PropertyDescriptor] = { val descriptors: util.List[PropertyDescriptor] = new util.ArrayList[PropertyDescriptor] @@ -84,6 +84,7 @@ abstract class AbstractKafkaRecordStream extends AbstractRecordStream with Spark descriptors.add(INPUT_TOPICS) descriptors.add(OUTPUT_TOPICS) descriptors.add(AVRO_INPUT_SCHEMA) + descriptors.add(AVRO_SCHEMA_URL) descriptors.add(AVRO_OUTPUT_SCHEMA) descriptors.add(INPUT_SERIALIZER) descriptors.add(OUTPUT_SERIALIZER) @@ -105,46 +106,62 @@ abstract class AbstractKafkaRecordStream extends AbstractRecordStream with Spark } - override def setup(appName: String, ssc: StreamingContext, streamContext: StreamContext, engineContext: EngineContext) = { - this.appName = appName - this.ssc = ssc - this.streamContext = streamContext - this.engineContext = engineContext + override def init(sparkStreamContext: SparkStreamContext) = { + super.init(sparkStreamContext.logislandStreamContext) + this.sparkStreamContext = sparkStreamContext + if (sparkStreamContext.logislandStreamContext + .getPropertyValue(KafkaStreamProcessingEngine.SPARK_STREAMING_BATCH_DURATION).isSet) { + this.batchDurationMs = sparkStreamContext.logislandStreamContext + .getPropertyValue(KafkaStreamProcessingEngine.SPARK_STREAMING_BATCH_DURATION).asInteger() + } else { + this.batchDurationMs = sparkStreamContext.defaultBatchDurationMs + } } - override def getStreamContext(): StreamingContext = this.ssc + protected def getCurrentSparkStreamingContext(): StreamingContext = { + StreamingContext.getActiveOrCreate(() => + return new StreamingContext(spark.sparkContext, Milliseconds(batchDurationMs)) + ) + } + protected def spark = sparkStreamContext.spark + + protected def sparkContext = sparkStreamContext.spark.sparkContext + + protected def sqlContext = sparkStreamContext.spark.sqlContext + + protected def appName = sparkContext.appName override def start() = { - if (ssc == null) + if (spark == null) throw new IllegalStateException("stream not initialized") try { // Define the Kafka parameters, broker list must be specified - val inputTopics = streamContext.getPropertyValue(INPUT_TOPICS).asString.split(",").toSet - val outputTopics = streamContext.getPropertyValue(OUTPUT_TOPICS).asString.split(",").toSet - val errorTopics = streamContext.getPropertyValue(ERROR_TOPICS).asString.split(",").toSet + val inputTopics = sparkStreamContext.logislandStreamContext.getPropertyValue(INPUT_TOPICS).asString.split(",").toSet + val outputTopics = sparkStreamContext.logislandStreamContext.getPropertyValue(OUTPUT_TOPICS).asString.split(",").toSet + val errorTopics = sparkStreamContext.logislandStreamContext.getPropertyValue(ERROR_TOPICS).asString.split(",").toSet val metricsTopics = DEFAULT_METRICS_TOPIC.getValue.split(",").toSet - val topicAutocreate = streamContext.getPropertyValue(KAFKA_TOPIC_AUTOCREATE).asBoolean().booleanValue() - val topicDefaultPartitions = streamContext.getPropertyValue(KAFKA_TOPIC_DEFAULT_PARTITIONS).asInteger().intValue() - val topicDefaultReplicationFactor = streamContext.getPropertyValue(KAFKA_TOPIC_DEFAULT_REPLICATION_FACTOR).asInteger().intValue() - val brokerList = streamContext.getPropertyValue(KAFKA_METADATA_BROKER_LIST).asString - val zkQuorum = streamContext.getPropertyValue(KAFKA_ZOOKEEPER_QUORUM).asString + val topicAutocreate = sparkStreamContext.logislandStreamContext.getPropertyValue(KAFKA_TOPIC_AUTOCREATE).asBoolean().booleanValue() + val topicDefaultPartitions = sparkStreamContext.logislandStreamContext.getPropertyValue(KAFKA_TOPIC_DEFAULT_PARTITIONS).asInteger().intValue() + val topicDefaultReplicationFactor = sparkStreamContext.logislandStreamContext.getPropertyValue(KAFKA_TOPIC_DEFAULT_REPLICATION_FACTOR).asInteger().intValue() + val brokerList = sparkStreamContext.logislandStreamContext.getPropertyValue(KAFKA_METADATA_BROKER_LIST).asString + val zkQuorum = sparkStreamContext.logislandStreamContext.getPropertyValue(KAFKA_ZOOKEEPER_QUORUM).asString - val kafkaBatchSize = streamContext.getPropertyValue(KAFKA_BATCH_SIZE).asString - val kafkaLingerMs = streamContext.getPropertyValue(KAFKA_LINGER_MS).asString - val kafkaAcks = streamContext.getPropertyValue(KAFKA_ACKS).asString - val kafkaOffset = streamContext.getPropertyValue(KAFKA_MANUAL_OFFSET_RESET).asString + val kafkaBatchSize = sparkStreamContext.logislandStreamContext.getPropertyValue(KAFKA_BATCH_SIZE).asString + val kafkaLingerMs = sparkStreamContext.logislandStreamContext.getPropertyValue(KAFKA_LINGER_MS).asString + val kafkaAcks = sparkStreamContext.logislandStreamContext.getPropertyValue(KAFKA_ACKS).asString + val kafkaOffset = sparkStreamContext.logislandStreamContext.getPropertyValue(KAFKA_MANUAL_OFFSET_RESET).asString - securityProtocol = streamContext.getPropertyValue(KAFKA_SECURITY_PROTOCOL).asString - saslKbServiceName = streamContext.getPropertyValue(KAFKA_SASL_KERBEROS_SERVICE_NAME).asString() + val securityProtocol = sparkStreamContext.logislandStreamContext.getPropertyValue(KAFKA_SECURITY_PROTOCOL).asString + val saslKbServiceName = sparkStreamContext.logislandStreamContext.getPropertyValue(KAFKA_SASL_KERBEROS_SERVICE_NAME).asString() val kafkaSinkParams = Map( ProducerConfig.BOOTSTRAP_SERVERS_CONFIG -> brokerList, - ProducerConfig.CLIENT_ID_CONFIG -> appName, + ProducerConfig.CLIENT_ID_CONFIG -> appName,//TODO should be the app name or stream name ? ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG -> classOf[ByteArraySerializer].getCanonicalName, ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG -> classOf[ByteArraySerializer].getName, "security.protocol" -> securityProtocol, @@ -156,10 +173,7 @@ abstract class AbstractKafkaRecordStream extends AbstractRecordStream with Spark ProducerConfig.RETRY_BACKOFF_MS_CONFIG -> "1000", ProducerConfig.RECONNECT_BACKOFF_MS_CONFIG -> "1000") - kafkaSink = ssc.sparkContext.broadcast(KafkaSink(kafkaSinkParams)) - controllerServiceLookupSink = ssc.sparkContext.broadcast( - ControllerServiceLookupSink(engineContext.getControllerServiceConfigurations) - ) + kafkaSink = spark.sparkContext.broadcast(KafkaSink(kafkaSinkParams)) // TODO deprecate topic creation here (must be done through the agent) if (topicAutocreate) { @@ -177,7 +191,7 @@ abstract class AbstractKafkaRecordStream extends AbstractRecordStream with Spark ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG -> classOf[ByteArrayDeserializer], "security.protocol" -> securityProtocol, "sasl.kerberos.service.name" -> saslKbServiceName, - ConsumerConfig.GROUP_ID_CONFIG -> appName, + ConsumerConfig.GROUP_ID_CONFIG -> appName,//TODO should be the app name or stream name ? ConsumerConfig.RECONNECT_BACKOFF_MS_CONFIG -> "50", ConsumerConfig.RETRY_BACKOFF_MS_CONFIG -> "100", ConsumerConfig.AUTO_OFFSET_RESET_CONFIG -> kafkaOffset, @@ -187,24 +201,23 @@ abstract class AbstractKafkaRecordStream extends AbstractRecordStream with Spark ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG -> "5000"*/ ) - logger.info(s"starting Kafka direct stream on topics $inputTopics from $kafkaOffset offsets") @transient val kafkaStream = KafkaUtils.createDirectStream[Array[Byte], Array[Byte]]( - ssc, + getCurrentSparkStreamingContext(), PreferConsistent, Subscribe[Array[Byte], Array[Byte]](inputTopics, kafkaParams) ) // do the parallel processing - val stream = if (streamContext.getPropertyValue(WINDOW_DURATION).isSet) { - if (streamContext.getPropertyValue(SLIDE_DURATION).isSet) + val stream = if (sparkStreamContext.logislandStreamContext.getPropertyValue(WINDOW_DURATION).isSet) { + if (sparkStreamContext.logislandStreamContext.getPropertyValue(SLIDE_DURATION).isSet) kafkaStream.window( - Seconds(streamContext.getPropertyValue(WINDOW_DURATION).asLong()), - Seconds(streamContext.getPropertyValue(SLIDE_DURATION).asLong()) + Seconds(sparkStreamContext.logislandStreamContext.getPropertyValue(WINDOW_DURATION).asLong()), + Seconds(sparkStreamContext.logislandStreamContext.getPropertyValue(SLIDE_DURATION).asLong()) ) else - kafkaStream.window(Seconds(streamContext.getPropertyValue(WINDOW_DURATION).asLong())) + kafkaStream.window(Seconds(sparkStreamContext.logislandStreamContext.getPropertyValue(WINDOW_DURATION).asLong())) } else kafkaStream @@ -212,9 +225,9 @@ abstract class AbstractKafkaRecordStream extends AbstractRecordStream with Spark stream .foreachRDD(rdd => { - this.streamContext.getProcessContexts().clear(); - this.streamContext.getProcessContexts().addAll( - PipelineConfigurationBroadcastWrapper.getInstance().get(this.streamContext.getIdentifier)) + this.sparkStreamContext.logislandStreamContext.getProcessContexts().clear(); + this.sparkStreamContext.logislandStreamContext.getProcessContexts().addAll( + PipelineConfigurationBroadcastWrapper.getInstance().get(this.sparkStreamContext.logislandStreamContext.getIdentifier)) if (!rdd.isEmpty()) { @@ -240,11 +253,11 @@ abstract class AbstractKafkaRecordStream extends AbstractRecordStream with Spark try { for (partitionId <- 0 to rdd.getNumPartitions) { - val pipelineMetricPrefix = streamContext.getIdentifier + "." + + val pipelineMetricPrefix = sparkStreamContext.logislandStreamContext.getIdentifier + "." + "partition" + partitionId + "." val pipelineTimerContext = UserMetricsSystem.timer(pipelineMetricPrefix + "Pipeline.processing_time_ms").time() - streamContext.getProcessContexts.foreach(processorContext => { + sparkStreamContext.logislandStreamContext.getProcessContexts.foreach(processorContext => { UserMetricsSystem.timer(pipelineMetricPrefix + processorContext.getIdentifier + ".processing_time_ms") .time() .stop() @@ -303,7 +316,6 @@ abstract class AbstractKafkaRecordStream extends AbstractRecordStream with Spark val bais = new ByteArrayInputStream(rawEvent.value()) val deserialized = serializer.deserialize(bais) bais.close() - Some(deserialized) } catch { case t: Throwable => diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/DummyRecordStream.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/DummyRecordStream.scala deleted file mode 100644 index fec79e1cd..000000000 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/DummyRecordStream.scala +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.stream.spark - -import java.util - -import com.hurence.logisland.component.PropertyDescriptor -import com.hurence.logisland.engine.EngineContext -import com.hurence.logisland.stream.{AbstractRecordStream, StreamContext} -import com.hurence.logisland.util.spark.SparkUtils -import org.apache.spark.storage.StorageLevel -import org.apache.spark.streaming.StreamingContext -import org.apache.spark.streaming.receiver.Receiver - -class DummyRecordStream extends AbstractRecordStream with SparkRecordStream { - - @transient private var streamingContext: StreamingContext = _ - - /** - * Allows subclasses to register which property descriptor objects are - * supported. - * - * @return PropertyDescriptor objects this processor currently supports - */ - override def getSupportedPropertyDescriptors: util.List[PropertyDescriptor] = { - return new util.ArrayList[PropertyDescriptor]() - } - - override def start(): Unit = { - val stream = streamingContext.receiverStream(new Receiver[Long](StorageLevel.NONE) { - override def onStart(): Unit = {} - - override def onStop(): Unit = {} - }) - stream.foreachRDD(rdd => { - //do nothing :) - }) - stream.start() - - } - - /** - * setup the stream with spark app properties - * - * @param appName - * @param ssc - * @param streamContext - */ - override def setup(appName: String, ssc: StreamingContext, streamContext: StreamContext, engineContext: EngineContext): Unit = { - streamingContext = ssc - - } - - override def getStreamContext(): StreamingContext = streamingContext -} diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/KafkaRecordStreamDebugger.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/KafkaRecordStreamDebugger.scala index 3af102811..9f3db3530 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/KafkaRecordStreamDebugger.scala +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/KafkaRecordStreamDebugger.scala @@ -34,6 +34,7 @@ import java.util import java.util.Collections import com.hurence.logisland.record.{FieldDictionary, Record, RecordUtils} +import com.hurence.logisland.stream.StreamContext import com.hurence.logisland.util.record.RecordSchemaUtil import com.hurence.logisland.util.spark.ProcessorMetrics import org.apache.avro.Schema @@ -45,6 +46,7 @@ import org.slf4j.LoggerFactory import scala.collection.JavaConversions._ import com.hurence.logisland.stream.StreamProperties._ +import com.hurence.logisland.stream.spark.structured.provider.KafkaProperties.{ERROR_SERIALIZER, ERROR_TOPICS, INPUT_SERIALIZER, INPUT_TOPICS, KAFKA_METADATA_BROKER_LIST, OUTPUT_SERIALIZER, OUTPUT_TOPICS} class KafkaRecordStreamDebugger extends AbstractKafkaRecordStream { val logger = LoggerFactory.getLogger(this.getClass.getName) @@ -60,10 +62,10 @@ class KafkaRecordStreamDebugger extends AbstractKafkaRecordStream { // Cast the rdd to an interface that lets us get an array of OffsetRange val offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges - val inputTopics = streamContext.getPropertyValue(INPUT_TOPICS).asString - val outputTopics = streamContext.getPropertyValue(OUTPUT_TOPICS).asString - val errorTopics = streamContext.getPropertyValue(ERROR_TOPICS).asString - val brokerList = streamContext.getPropertyValue(KAFKA_METADATA_BROKER_LIST).asString + val inputTopics = sparkStreamContext.logislandStreamContext.getPropertyValue(INPUT_TOPICS).asString + val outputTopics = sparkStreamContext.logislandStreamContext.getPropertyValue(OUTPUT_TOPICS).asString + val errorTopics = sparkStreamContext.logislandStreamContext.getPropertyValue(ERROR_TOPICS).asString + val brokerList = sparkStreamContext.logislandStreamContext.getPropertyValue(KAFKA_METADATA_BROKER_LIST).asString rdd.foreachPartition(partition => { @@ -80,14 +82,14 @@ class KafkaRecordStreamDebugger extends AbstractKafkaRecordStream { * create serializers */ val deserializer = getSerializer( - streamContext.getPropertyValue(INPUT_SERIALIZER).asString, - streamContext.getPropertyValue(AVRO_INPUT_SCHEMA).asString) + sparkStreamContext.logislandStreamContext.getPropertyValue(INPUT_SERIALIZER).asString, + sparkStreamContext.logislandStreamContext.getPropertyValue(AVRO_INPUT_SCHEMA).asString) val serializer = getSerializer( - streamContext.getPropertyValue(OUTPUT_SERIALIZER).asString, - streamContext.getPropertyValue(AVRO_OUTPUT_SCHEMA).asString) + sparkStreamContext.logislandStreamContext.getPropertyValue(OUTPUT_SERIALIZER).asString, + sparkStreamContext.logislandStreamContext.getPropertyValue(AVRO_OUTPUT_SCHEMA).asString) val errorSerializer = getSerializer( - streamContext.getPropertyValue(ERROR_SERIALIZER).asString, - streamContext.getPropertyValue(AVRO_OUTPUT_SCHEMA).asString) + sparkStreamContext.logislandStreamContext.getPropertyValue(ERROR_SERIALIZER).asString, + sparkStreamContext.logislandStreamContext.getPropertyValue(AVRO_OUTPUT_SCHEMA).asString) /** * process events by chaining output records @@ -98,7 +100,7 @@ class KafkaRecordStreamDebugger extends AbstractKafkaRecordStream { val processingMetrics: util.Collection[Record] = new util.ArrayList[Record]() logger.info("start processing") - streamContext.getProcessContexts.foreach(processorContext => { + sparkStreamContext.logislandStreamContext.getProcessContexts.foreach(processorContext => { val startTime = System.currentTimeMillis() val processor = processorContext.getProcessor @@ -109,7 +111,7 @@ class KafkaRecordStreamDebugger extends AbstractKafkaRecordStream { * if there's no serializer we assume that we need to compute a Record from K/V */ incomingEvents = if ( - streamContext.getPropertyValue(INPUT_SERIALIZER).asString + sparkStreamContext.logislandStreamContext.getPropertyValue(INPUT_SERIALIZER).asString == NO_SERIALIZER.getValue) { // parser partition.map(rawMessage => { @@ -139,9 +141,9 @@ class KafkaRecordStreamDebugger extends AbstractKafkaRecordStream { /** * Do we make records compliant with a given Avro schema ? */ - if (streamContext.getPropertyValue(AVRO_OUTPUT_SCHEMA).isSet) { + if (sparkStreamContext.logislandStreamContext.getPropertyValue(AVRO_OUTPUT_SCHEMA).isSet) { try { - val strSchema = streamContext.getPropertyValue(AVRO_OUTPUT_SCHEMA).asString() + val strSchema = sparkStreamContext.logislandStreamContext.getPropertyValue(AVRO_OUTPUT_SCHEMA).asString() val schema = RecordSchemaUtil.compileSchema(strSchema) @@ -161,13 +163,13 @@ class KafkaRecordStreamDebugger extends AbstractKafkaRecordStream { * push outgoing events and errors to Kafka */ kafkaSink.value.produce( - streamContext.getPropertyValue(OUTPUT_TOPICS).asString, + sparkStreamContext.logislandStreamContext.getPropertyValue(OUTPUT_TOPICS).asString, outgoingEvents.toList, serializer ) kafkaSink.value.produce( - streamContext.getPropertyValue(ERROR_TOPICS).asString, + sparkStreamContext.logislandStreamContext.getPropertyValue(ERROR_TOPICS).asString, outgoingEvents.filter(r => r.hasField(FieldDictionary.RECORD_ERRORS)).toList, errorSerializer ) @@ -186,6 +188,8 @@ class KafkaRecordStreamDebugger extends AbstractKafkaRecordStream { } None } + + } diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/KafkaRecordStreamHDFSBurner.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/KafkaRecordStreamHDFSBurner.scala index 3cf4fdc3a..fde46216f 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/KafkaRecordStreamHDFSBurner.scala +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/KafkaRecordStreamHDFSBurner.scala @@ -13,21 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ /** * Copyright (C) 2016 Hurence (bailet.thomas@gmail.com) * @@ -52,7 +37,10 @@ import java.util.Collections import com.hurence.logisland.component.PropertyDescriptor import com.hurence.logisland.record.{FieldDictionary, FieldType} import com.hurence.logisland.stream.StreamProperties._ +import com.hurence.logisland.stream.spark.KafkaRecordStreamHDFSBurner.{DATE_FORMAT, EXCLUDE_ERRORS, INPUT_FORMAT, NUM_PARTITIONS, OUTPUT_FOLDER_PATH, OUTPUT_FORMAT, RECORD_TYPE} +import com.hurence.logisland.stream.spark.structured.provider.KafkaProperties.INPUT_SERIALIZER import com.hurence.logisland.util.spark.SparkUtils +import com.hurence.logisland.validator.StandardValidators import org.apache.kafka.clients.consumer.ConsumerRecord import org.apache.spark.rdd.RDD import org.apache.spark.sql.types._ @@ -103,19 +91,11 @@ class KafkaRecordStreamHDFSBurner extends AbstractKafkaRecordStream { // Cast the rdd to an interface that lets us get an array of OffsetRange val offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges - // Get the singleton instance of SQLContext - val sqlContext = SparkSession - .builder() - .appName(appName) - .config(ssc.sparkContext.getConf) - .getOrCreate() - - // this is used to implicitly convert an RDD to a DataFrame. val deserializer = getSerializer( - streamContext.getPropertyValue(INPUT_SERIALIZER).asString, - streamContext.getPropertyValue(AVRO_INPUT_SCHEMA).asString) + sparkStreamContext.logislandStreamContext.getPropertyValue(INPUT_SERIALIZER).asString, + sparkStreamContext.logislandStreamContext.getPropertyValue(AVRO_INPUT_SCHEMA).asString) val records = rdd.mapPartitions(p => deserializeRecords(p, deserializer).iterator) @@ -124,14 +104,14 @@ class KafkaRecordStreamHDFSBurner extends AbstractKafkaRecordStream { if (!records.isEmpty()) { - val sdf = new SimpleDateFormat(streamContext.getPropertyValue(DATE_FORMAT).asString) + val sdf = new SimpleDateFormat(sparkStreamContext.logislandStreamContext.getPropertyValue(DATE_FORMAT).asString) - val numPartitions = streamContext.getPropertyValue(NUM_PARTITIONS).asInteger() - val outputFormat = streamContext.getPropertyValue(OUTPUT_FORMAT).asString() - val doExcludeErrors = streamContext.getPropertyValue(EXCLUDE_ERRORS).asBoolean() - val recordType = streamContext.getPropertyValue(RECORD_TYPE).asString() - val outPath = streamContext.getPropertyValue(OUTPUT_FOLDER_PATH).asString() + val numPartitions = sparkStreamContext.logislandStreamContext.getPropertyValue(NUM_PARTITIONS).asInteger() + val outputFormat = sparkStreamContext.logislandStreamContext.getPropertyValue(OUTPUT_FORMAT).asString() + val doExcludeErrors = sparkStreamContext.logislandStreamContext.getPropertyValue(EXCLUDE_ERRORS).asBoolean() + val recordType = sparkStreamContext.logislandStreamContext.getPropertyValue(RECORD_TYPE).asString() + val outPath = sparkStreamContext.logislandStreamContext.getPropertyValue(OUTPUT_FOLDER_PATH).asString() val records = rdd.mapPartitions(p => deserializeRecords(p, deserializer).iterator) .filter(r => @@ -152,7 +132,7 @@ class KafkaRecordStreamHDFSBurner extends AbstractKafkaRecordStream { if (!records.isEmpty()) { var df: DataFrame = null; - val inputFormat = streamContext.getPropertyValue(INPUT_FORMAT).asString() + val inputFormat = sparkStreamContext.logislandStreamContext.getPropertyValue(INPUT_FORMAT).asString() if (inputFormat.isEmpty) { val schema = SparkUtils.convertFieldsNameToSchema(records.take(1)(0)) @@ -169,7 +149,8 @@ class KafkaRecordStreamHDFSBurner extends AbstractKafkaRecordStream { df = sqlContext.createDataFrame(rows, schema) } else { if ("json".equals(inputFormat)) { - import sqlContext.implicits._ + val mySqlContext = sqlContext + import mySqlContext.implicits._ val rdf = records.map(record => (record.getType, record.getField(FieldDictionary.RECORD_DAYTIME).asString)) .toDF(FieldDictionary.RECORD_TYPE, FieldDictionary.RECORD_DAYTIME) val json = sqlContext.read.json(records.map(record => record.getField(FieldDictionary.RECORD_VALUE).asString())) @@ -224,6 +205,66 @@ class KafkaRecordStreamHDFSBurner extends AbstractKafkaRecordStream { } None } + + +} + +object KafkaRecordStreamHDFSBurner { + + val OUTPUT_FOLDER_PATH = new PropertyDescriptor.Builder() + .name("output.folder.path") + .description("the location where to put files : file:///tmp/out") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build + + + val INPUT_FORMAT = new PropertyDescriptor.Builder() + .name("input.format") + .description("Used to load data from a raw record_value. Only json supported") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("") + .build + + val OUTPUT_FORMAT = new PropertyDescriptor.Builder() + .name("output.format") + .description("can be parquet, orc csv") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .allowableValues(FILE_FORMAT_PARQUET, FILE_FORMAT_TXT, FILE_FORMAT_JSON, FILE_FORMAT_JSON) + .build + + val RECORD_TYPE = new PropertyDescriptor.Builder() + .name("record.type") + .description("the type of event to filter") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build + + val NUM_PARTITIONS = new PropertyDescriptor.Builder() + .name("num.partitions") + .description("the numbers of physical files on HDFS") + .required(false) + .addValidator(StandardValidators.POSITIVE_INTEGER_VALIDATOR) + .defaultValue("4") + .build + + val EXCLUDE_ERRORS = new PropertyDescriptor.Builder() + .name("exclude.errors") + .description("do we include records with errors ?") + .required(false) + .addValidator(StandardValidators.BOOLEAN_VALIDATOR) + .defaultValue("true") + .build + + val DATE_FORMAT = new PropertyDescriptor.Builder() + .name("date.format") + .description("The format of the date for the partition") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("yyyy-MM-dd") + .build } diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/KafkaRecordStreamParallelProcessing.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/KafkaRecordStreamParallelProcessing.scala index 4fef443f3..b55d9b933 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/KafkaRecordStreamParallelProcessing.scala +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/KafkaRecordStreamParallelProcessing.scala @@ -32,22 +32,21 @@ package com.hurence.logisland.stream.spark import java.util import java.util.Collections - import com.hurence.logisland.component.PropertyDescriptor import com.hurence.logisland.record.{FieldDictionary, Record, RecordUtils} +import com.hurence.logisland.stream.StreamProperties._ +import com.hurence.logisland.stream.spark.structured.provider.KafkaProperties.{ERROR_SERIALIZER, ERROR_TOPICS, INPUT_SERIALIZER, INPUT_TOPICS, KAFKA_METADATA_BROKER_LIST, OUTPUT_SERIALIZER, OUTPUT_TOPICS,AVRO_SCHEMA_URL} import com.hurence.logisland.util.record.RecordSchemaUtil import com.hurence.logisland.util.spark.ProcessorMetrics -import org.apache.avro.Schema import org.apache.kafka.clients.consumer.ConsumerRecord import org.apache.kafka.common.errors.OffsetOutOfRangeException import org.apache.spark.TaskContext -import org.apache.spark.groupon.metrics.{SparkMeter, UserMetricsSystem} +import org.apache.spark.groupon.metrics.UserMetricsSystem import org.apache.spark.rdd.RDD -import org.apache.spark.streaming.kafka010.{CanCommitOffsets, HasOffsetRanges, OffsetRange} +import org.apache.spark.streaming.kafka010.{HasOffsetRanges, OffsetRange} import org.slf4j.LoggerFactory import scala.collection.JavaConversions._ -import com.hurence.logisland.stream.StreamProperties._ class KafkaRecordStreamParallelProcessing extends AbstractKafkaRecordStream { @@ -60,6 +59,8 @@ class KafkaRecordStreamParallelProcessing extends AbstractKafkaRecordStream { Collections.unmodifiableList(descriptors) } + + /** * launch the chain of processing for each partition of the RDD in parallel * @@ -81,23 +82,31 @@ class KafkaRecordStreamParallelProcessing extends AbstractKafkaRecordStream { val partitionId = TaskContext.get.partitionId() val offsetRange = offsetRanges(TaskContext.get.partitionId) - val pipelineMetricPrefix = streamContext.getIdentifier + "." + + val pipelineMetricPrefix = sparkStreamContext.logislandStreamContext.getIdentifier + "." + "partition" + partitionId + "." val pipelineTimerContext = UserMetricsSystem.timer(pipelineMetricPrefix + "Pipeline.processing_time_ms" ).time() + var inputSchema = "" + if (sparkStreamContext.logislandStreamContext.getPropertyValue(AVRO_SCHEMA_URL).isSet) { + val registryUrl = sparkStreamContext.logislandStreamContext.getPropertyValue(AVRO_SCHEMA_URL).asString + inputSchema = "{\"registryUrl\":\"" + registryUrl + "\"}" + logger.info("Using schema json " + inputSchema) + } else { + inputSchema = sparkStreamContext.logislandStreamContext.getPropertyValue(AVRO_INPUT_SCHEMA).asString + } /** * create serializers */ val deserializer = getSerializer( - streamContext.getPropertyValue(INPUT_SERIALIZER).asString, - streamContext.getPropertyValue(AVRO_INPUT_SCHEMA).asString) + sparkStreamContext.logislandStreamContext.getPropertyValue(INPUT_SERIALIZER).asString, + inputSchema) val serializer = getSerializer( - streamContext.getPropertyValue(OUTPUT_SERIALIZER).asString, - streamContext.getPropertyValue(AVRO_OUTPUT_SCHEMA).asString) + sparkStreamContext.logislandStreamContext.getPropertyValue(OUTPUT_SERIALIZER).asString, + sparkStreamContext.logislandStreamContext.getPropertyValue(AVRO_OUTPUT_SCHEMA).asString) val errorSerializer = getSerializer( - streamContext.getPropertyValue(ERROR_SERIALIZER).asString, - streamContext.getPropertyValue(AVRO_OUTPUT_SCHEMA).asString) + sparkStreamContext.logislandStreamContext.getPropertyValue(ERROR_SERIALIZER).asString, + sparkStreamContext.logislandStreamContext.getPropertyValue(AVRO_OUTPUT_SCHEMA).asString) /** * process events by chaining output records @@ -106,7 +115,7 @@ class KafkaRecordStreamParallelProcessing extends AbstractKafkaRecordStream { var incomingEvents: util.Collection[Record] = Collections.emptyList() var outgoingEvents: util.Collection[Record] = Collections.emptyList() - streamContext.getProcessContexts.foreach(processorContext => { + sparkStreamContext.logislandStreamContext.getProcessContexts.foreach(processorContext => { val startTime = System.currentTimeMillis() val processor = processorContext.getProcessor @@ -118,7 +127,7 @@ class KafkaRecordStreamParallelProcessing extends AbstractKafkaRecordStream { */ if (firstPass) { incomingEvents = if ( - streamContext.getPropertyValue(INPUT_SERIALIZER).asString + sparkStreamContext.logislandStreamContext.getPropertyValue(INPUT_SERIALIZER).asString == NO_SERIALIZER.getValue) { // parser partition.map(rawMessage => { @@ -140,16 +149,16 @@ class KafkaRecordStreamParallelProcessing extends AbstractKafkaRecordStream { * process incoming events */ if (processor.hasControllerService) { - val controllerServiceLookup = controllerServiceLookupSink.value.getControllerServiceLookup() + val controllerServiceLookup = sparkStreamContext.broadCastedControllerServiceLookupSink.value.getControllerServiceLookup() processorContext.setControllerServiceLookup(controllerServiceLookup) } if (!processor.isInitialized) { processor.init(processorContext) } - + processor.start() outgoingEvents = processor.process(processorContext, incomingEvents) - + processor.stop() /** * compute metrics */ @@ -168,9 +177,9 @@ class KafkaRecordStreamParallelProcessing extends AbstractKafkaRecordStream { /** * Do we make records compliant with a given Avro schema ? */ - if (streamContext.getPropertyValue(AVRO_OUTPUT_SCHEMA).isSet) { + if (sparkStreamContext.logislandStreamContext.getPropertyValue(AVRO_OUTPUT_SCHEMA).isSet) { try { - val strSchema = streamContext.getPropertyValue(AVRO_OUTPUT_SCHEMA).asString() + val strSchema = sparkStreamContext.logislandStreamContext.getPropertyValue(AVRO_OUTPUT_SCHEMA).asString() val schema = RecordSchemaUtil.compileSchema(strSchema) outgoingEvents = outgoingEvents.map(record => RecordSchemaUtil.convertToValidRecord(record, schema)) @@ -186,13 +195,13 @@ class KafkaRecordStreamParallelProcessing extends AbstractKafkaRecordStream { * push outgoing events and errors to Kafka */ kafkaSink.value.produce( - streamContext.getPropertyValue(OUTPUT_TOPICS).asString, + sparkStreamContext.logislandStreamContext.getPropertyValue(OUTPUT_TOPICS).asString, outgoingEvents.toList, serializer ) kafkaSink.value.produce( - streamContext.getPropertyValue(ERROR_TOPICS).asString, + sparkStreamContext.logislandStreamContext.getPropertyValue(ERROR_TOPICS).asString, outgoingEvents.filter(r => r.hasField(FieldDictionary.RECORD_ERRORS)).toList, errorSerializer ) @@ -202,8 +211,8 @@ class KafkaRecordStreamParallelProcessing extends AbstractKafkaRecordStream { } catch { case ex: OffsetOutOfRangeException => - val inputTopics = streamContext.getPropertyValue(INPUT_TOPICS).asString - val brokerList = streamContext.getPropertyValue(KAFKA_METADATA_BROKER_LIST).asString + val inputTopics = sparkStreamContext.logislandStreamContext.getPropertyValue(INPUT_TOPICS).asString + val brokerList = sparkStreamContext.logislandStreamContext.getPropertyValue(KAFKA_METADATA_BROKER_LIST).asString /* val latestOffsetsString = zkSink.value.loadOffsetRangesFromZookeeper( brokerList, appName, @@ -222,5 +231,6 @@ class KafkaRecordStreamParallelProcessing extends AbstractKafkaRecordStream { } else None } + } diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/KafkaRecordStreamSQLAggregator.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/KafkaRecordStreamSQLAggregator.scala index bdc723ede..e8c3ba8f7 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/KafkaRecordStreamSQLAggregator.scala +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/KafkaRecordStreamSQLAggregator.scala @@ -36,18 +36,18 @@ import java.util.Collections import com.hurence.logisland.annotation.documentation.{CapabilityDescription, Tags} import com.hurence.logisland.component.PropertyDescriptor import com.hurence.logisland.record.{FieldDictionary, Record} -import com.hurence.logisland.util.spark.{ProcessorMetrics, SparkUtils} +import com.hurence.logisland.stream.StreamProperties._ +import com.hurence.logisland.stream.spark.KafkaRecordStreamSQLAggregator.{MAX_RESULTS_COUNT, OUTPUT_RECORD_TYPE, SQL_QUERY} +import com.hurence.logisland.stream.spark.structured.provider.KafkaProperties.{ERROR_SERIALIZER, ERROR_TOPICS, INPUT_SERIALIZER, INPUT_TOPICS, OUTPUT_SERIALIZER, OUTPUT_TOPICS} +import com.hurence.logisland.util.spark.SparkUtils import com.hurence.logisland.validator.StandardValidators import org.apache.avro.Schema import org.apache.kafka.clients.consumer.ConsumerRecord import org.apache.spark.rdd.RDD import org.apache.spark.sql.SparkSession -import org.apache.spark.streaming.kafka010.{HasOffsetRanges, OffsetRange} +import org.apache.spark.streaming.kafka010.OffsetRange import org.slf4j.LoggerFactory -import scala.collection.JavaConversions._ -import com.hurence.logisland.stream.StreamProperties._ - @Tags(Array("stream", "SQL", "query", "record")) @CapabilityDescription("This is a stream capable of SQL query interpretations.") @@ -65,23 +65,17 @@ class KafkaRecordStreamSQLAggregator extends AbstractKafkaRecordStream { Collections.unmodifiableList(descriptors) } + override def process(rdd: RDD[ConsumerRecord[Array[Byte], Array[Byte]]]): Option[Array[OffsetRange]] = { if (!rdd.isEmpty()) { // Cast the rdd to an interface that lets us get an array of OffsetRange // val offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges - - val sqlContext = SparkSession - .builder() - .appName(appName) - .config(ssc.sparkContext.getConf) - .getOrCreate() - // this is used to implicitly convert an RDD to a DataFrame. @transient lazy val deserializer = getSerializer( - streamContext.getPropertyValue(INPUT_SERIALIZER).asString, - streamContext.getPropertyValue(AVRO_INPUT_SCHEMA).asString) + sparkStreamContext.logislandStreamContext.getPropertyValue(INPUT_SERIALIZER).asString, + sparkStreamContext.logislandStreamContext.getPropertyValue(AVRO_INPUT_SCHEMA).asString) - val inputTopics = streamContext.getPropertyValue(INPUT_TOPICS).asString + val inputTopics = sparkStreamContext.logislandStreamContext.getPropertyValue(INPUT_TOPICS).asString //here how to handle elements that are not successfully deserialized ??? //currently we lose them ! @@ -93,7 +87,7 @@ class KafkaRecordStreamSQLAggregator extends AbstractKafkaRecordStream { */ val schema = try { val parser = new Schema.Parser - val schema = parser.parse(streamContext.getPropertyValue(AVRO_INPUT_SCHEMA).asString) + val schema = parser.parse(sparkStreamContext.logislandStreamContext.getPropertyValue(AVRO_INPUT_SCHEMA).asString) SparkUtils.convertAvroSchemaToDataframeSchema(schema) } catch { @@ -113,8 +107,8 @@ class KafkaRecordStreamSQLAggregator extends AbstractKafkaRecordStream { - val query = streamContext.getPropertyValue(SQL_QUERY).asString() - val outputRecordType = streamContext.getPropertyValue(OUTPUT_RECORD_TYPE).asString() + val query = sparkStreamContext.logislandStreamContext.getPropertyValue(SQL_QUERY).asString() + val outputRecordType = sparkStreamContext.logislandStreamContext.getPropertyValue(OUTPUT_RECORD_TYPE).asString() sqlContext.sql(query).rdd .foreachPartition(rows => { @@ -123,11 +117,11 @@ class KafkaRecordStreamSQLAggregator extends AbstractKafkaRecordStream { * create serializers */ val serializer = getSerializer( - streamContext.getPropertyValue(OUTPUT_SERIALIZER).asString, - streamContext.getPropertyValue(AVRO_OUTPUT_SCHEMA).asString) + sparkStreamContext.logislandStreamContext.getPropertyValue(OUTPUT_SERIALIZER).asString, + sparkStreamContext.logislandStreamContext.getPropertyValue(AVRO_OUTPUT_SCHEMA).asString) val errorSerializer = getSerializer( - streamContext.getPropertyValue(ERROR_SERIALIZER).asString, - streamContext.getPropertyValue(AVRO_OUTPUT_SCHEMA).asString) + sparkStreamContext.logislandStreamContext.getPropertyValue(ERROR_SERIALIZER).asString, + sparkStreamContext.logislandStreamContext.getPropertyValue(AVRO_OUTPUT_SCHEMA).asString) @@ -136,13 +130,13 @@ class KafkaRecordStreamSQLAggregator extends AbstractKafkaRecordStream { * push outgoing events and errors to Kafka */ kafkaSink.value.produce( - streamContext.getPropertyValue(OUTPUT_TOPICS).asString, + sparkStreamContext.logislandStreamContext.getPropertyValue(OUTPUT_TOPICS).asString, outgoingEvents, serializer ) kafkaSink.value.produce( - streamContext.getPropertyValue(ERROR_TOPICS).asString, + sparkStreamContext.logislandStreamContext.getPropertyValue(ERROR_TOPICS).asString, outgoingEvents.filter(r => r.hasField(FieldDictionary.RECORD_ERRORS)), errorSerializer ) @@ -155,6 +149,36 @@ class KafkaRecordStreamSQLAggregator extends AbstractKafkaRecordStream { } None } + } +object KafkaRecordStreamSQLAggregator { + + val SQL_QUERY = new PropertyDescriptor.Builder() + .name("sql.query") + .description("The SQL query to execute, " + + "please note that the table name must exists in input topics names") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build + + val MAX_RESULTS_COUNT = new PropertyDescriptor.Builder() + .name("max.results.count") + .description("the max number of rows to output. (-1 for no limit)") + .required(false) + .addValidator(StandardValidators.INTEGER_VALIDATOR) + .defaultValue("-1") + .build + + val OUTPUT_RECORD_TYPE = new PropertyDescriptor.Builder() + .name("output.record.type") + .description("the output type of the record") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("aggregation") + .build + +} + + diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/SparkRecordStream.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/SparkRecordStream.scala index 19cff7c7b..480c64abf 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/SparkRecordStream.scala +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/SparkRecordStream.scala @@ -15,20 +15,14 @@ */ package com.hurence.logisland.stream.spark -import com.hurence.logisland.engine.EngineContext import com.hurence.logisland.stream.{RecordStream, StreamContext} -import org.apache.spark.streaming.StreamingContext trait SparkRecordStream extends RecordStream { /** - * ssetup the stream with spark app properties + * init the stream with spark streaming context * - * @param appName - * @param ssc - * @param streamContext */ - def setup(appName: String,ssc: StreamingContext, streamContext: StreamContext, engineContext: EngineContext) - def getStreamContext() : StreamingContext + def init(sparkStreamContext: SparkStreamContext): Unit } diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/SparkStreamContext.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/SparkStreamContext.scala new file mode 100644 index 000000000..acb7addee --- /dev/null +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/SparkStreamContext.scala @@ -0,0 +1,29 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.stream.spark + +import com.hurence.logisland.stream.{StandardStreamContext, StreamContext} +import com.hurence.logisland.util.spark.ControllerServiceLookupSink +import org.apache.spark.broadcast.Broadcast +import org.apache.spark.sql.SparkSession +import org.apache.spark.streaming.StreamingContext + +case class SparkStreamContext(logislandStreamContext: StreamContext, + defaultBatchDurationMs: Int, + @transient spark: SparkSession, + broadCastedControllerServiceLookupSink: Broadcast[ControllerServiceLookupSink]) { + +} \ No newline at end of file diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/StreamProperties.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/StreamProperties.scala new file mode 100644 index 000000000..25fa76528 --- /dev/null +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/StreamProperties.scala @@ -0,0 +1,115 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.stream + +import com.hurence.logisland.component.{AllowableValue, PropertyDescriptor} +import com.hurence.logisland.serializer._ +import com.hurence.logisland.stream.spark.structured.provider.{StructuredStreamProviderServiceReader, StructuredStreamProviderServiceWriter} +import com.hurence.logisland.validator.{StandardValidators, ValidationResult, Validator} + +/* + * 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. + */ +object StreamProperties { + + // General props + val AVRO_INPUT_SCHEMA: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("avro.input.schema") + .description("the avro schema definition") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build + + val AVRO_OUTPUT_SCHEMA: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("avro.output.schema") + .description("the avro schema definition for the output serialization") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build + + val AVRO_SERIALIZER = new AllowableValue(classOf[AvroSerializer].getName, + "avro serialization", "serialize events as avro blocs") + val CONFLUENT_SERIALIZER = new AllowableValue(classOf[ConfluentSerializer].getName, + "confluent avro serialization", "serialize events as avro blocs with the confluent ID from a schema registry") + val JSON_SERIALIZER = new AllowableValue(classOf[JsonSerializer].getName, + "json serialization", "serialize events as json blocs") + val EXTENDED_JSON_SERIALIZER = new AllowableValue(classOf[ExtendedJsonSerializer].getName, + "extended json serialization", "serialize events as json blocs supporting nested objects/arrays") + val KRYO_SERIALIZER = new AllowableValue(classOf[KryoSerializer].getName, + "kryo serialization", "serialize events as binary blocs") + val STRING_SERIALIZER = new AllowableValue(classOf[StringSerializer].getName, + "string serialization", "serialize events as string") + val BYTESARRAY_SERIALIZER = new AllowableValue(classOf[BytesArraySerializer].getName, + "byte array serialization", "serialize events as byte arrays") + val KURA_PROTOCOL_BUFFER_SERIALIZER = new AllowableValue(classOf[KuraProtobufSerializer].getName, + "Kura Protobuf serialization", "serialize events as Kura protocol buffer") + val NO_SERIALIZER = new AllowableValue("none", "no serialization", "send events as bytes") + + val LATEST_OFFSET = new AllowableValue("latest", "latest", "the offset to the latest offset") + val EARLIEST_OFFSET = new AllowableValue("earliest", "earliest offset", "the offset to the earliest offset") + val NONE_OFFSET = new AllowableValue("none", "none offset", "the latest saved offset") + + val WINDOW_DURATION: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("window.duration") + .description("all the elements in seen in a sliding window of time over. windowDuration = width of the window; must be a multiple of batching interval") + .addValidator(StandardValidators.LONG_VALIDATOR) + .required(false) + .build + + val SLIDE_DURATION: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("slide.duration") + .description("sliding interval of the window (i.e., the interval after which the new DStream will generate RDDs); must be a multiple of batching interval") + .addValidator(StandardValidators.LONG_VALIDATOR) + .required(false) + .build + + ////////////////////////////////////// + // HDFS options + ////////////////////////////////////// + val FILE_FORMAT_PARQUET = "parquet" + val FILE_FORMAT_ORC = "orc" + val FILE_FORMAT_JSON = "json" + val FILE_FORMAT_TXT = "txt" + +} diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/package.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/package.scala deleted file mode 100644 index 2d0a29758..000000000 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/package.scala +++ /dev/null @@ -1,628 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.stream - -import com.hurence.logisland.component.{AllowableValue, PropertyDescriptor} -import com.hurence.logisland.serializer._ -import com.hurence.logisland.stream.spark.structured.provider.StructuredStreamProviderService -import com.hurence.logisland.validator.StandardValidators - -/* - * 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. - */ -object StreamProperties { - - val NONE_TOPIC = "none" - - val DEFAULT_RAW_TOPIC = new AllowableValue("logisland_raw", "default raw topic", "the incoming non structured topic") - val DEFAULT_RECORDS_TOPIC = new AllowableValue("logisland_records", "default events topic", "the outgoing structured topic") - val DEFAULT_ERRORS_TOPIC = new AllowableValue("logisland_errors", "default raw topic", "the outgoing structured error topic") - val DEFAULT_METRICS_TOPIC = new AllowableValue("logisland_metrics", "default metrics topic", "the topic to place processing metrics") - - val INPUT_TOPICS: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("kafka.input.topics") - .description("Sets the input Kafka topic name") - .required(true) - .defaultValue(DEFAULT_RAW_TOPIC.getValue) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .build - - val OUTPUT_TOPICS: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("kafka.output.topics") - .description("Sets the output Kafka topic name") - .required(true) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .defaultValue(DEFAULT_RECORDS_TOPIC.getValue) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .build - - val ERROR_TOPICS: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("kafka.error.topics") - .description("Sets the error topics Kafka topic name") - .required(false) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .defaultValue(DEFAULT_ERRORS_TOPIC.getValue) - .build - - val INPUT_TOPICS_PARTITIONS: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("kafka.input.topics.partitions") - .description("if autoCreate is set to true, this will set the number of partition at topic creation time") - .required(false) - .addValidator(StandardValidators.INTEGER_VALIDATOR) - .defaultValue("20") - .build - - val OUTPUT_TOPICS_PARTITIONS: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("kafka.output.topics.partitions") - .description("if autoCreate is set to true, this will set the number of partition at topic creation time") - .required(false) - .addValidator(StandardValidators.INTEGER_VALIDATOR) - .defaultValue("20") - .build - - val AVRO_INPUT_SCHEMA: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("avro.input.schema") - .description("the avro schema definition") - .required(false) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .build - - val AVRO_OUTPUT_SCHEMA: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("avro.output.schema") - .description("the avro schema definition for the output serialization") - .required(false) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .build - - val AVRO_SERIALIZER = new AllowableValue(classOf[AvroSerializer].getName, - "avro serialization", "serialize events as avro blocs") - val JSON_SERIALIZER = new AllowableValue(classOf[JsonSerializer].getName, - "json serialization", "serialize events as json blocs") - val EXTENDED_JSON_SERIALIZER = new AllowableValue(classOf[ExtendedJsonSerializer].getName, - "extended json serialization", "serialize events as json blocs supporting nested objects/arrays") - val KRYO_SERIALIZER = new AllowableValue(classOf[KryoSerializer].getName, - "kryo serialization", "serialize events as binary blocs") - val STRING_SERIALIZER = new AllowableValue(classOf[StringSerializer].getName, - "string serialization", "serialize events as string") - val BYTESARRAY_SERIALIZER = new AllowableValue(classOf[BytesArraySerializer].getName, - "byte array serialization", "serialize events as byte arrays") - val KURA_PROTOCOL_BUFFER_SERIALIZER = new AllowableValue(classOf[KuraProtobufSerializer].getName, - "Kura Protobuf serialization", "serialize events as Kura protocol buffer") - val NO_SERIALIZER = new AllowableValue("none", "no serialization", "send events as bytes") - - val INPUT_SERIALIZER: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("kafka.input.topics.serializer") - .description("") - .required(false) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, EXTENDED_JSON_SERIALIZER, AVRO_SERIALIZER, BYTESARRAY_SERIALIZER, STRING_SERIALIZER, NO_SERIALIZER) - .defaultValue(KRYO_SERIALIZER.getValue) - .build - - val OUTPUT_SERIALIZER: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("kafka.output.topics.serializer") - .description("") - .required(false) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, EXTENDED_JSON_SERIALIZER, AVRO_SERIALIZER, BYTESARRAY_SERIALIZER, STRING_SERIALIZER, NO_SERIALIZER) - .defaultValue(KRYO_SERIALIZER.getValue) - .build - - val ERROR_SERIALIZER: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("kafka.error.topics.serializer") - .description("") - .required(false) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .defaultValue(JSON_SERIALIZER.getValue) - .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, EXTENDED_JSON_SERIALIZER, AVRO_SERIALIZER, BYTESARRAY_SERIALIZER, STRING_SERIALIZER, NO_SERIALIZER) - .build - - - val KAFKA_TOPIC_AUTOCREATE: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("kafka.topic.autoCreate") - .description("define wether a topic should be created automatically if not already exists") - .required(false) - .addValidator(StandardValidators.BOOLEAN_VALIDATOR) - .defaultValue("true") - .build - - val KAFKA_TOPIC_DEFAULT_PARTITIONS: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("kafka.topic.default.partitions") - .description("if autoCreate is set to true, this will set the number of partition at topic creation time") - .required(false) - .addValidator(StandardValidators.INTEGER_VALIDATOR) - .defaultValue("3") - .build - - val KAFKA_TOPIC_DEFAULT_REPLICATION_FACTOR: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("kafka.topic.default.replicationFactor") - .description("if autoCreate is set to true, this will set the number of replica for each partition at topic creation time") - .required(false) - .addValidator(StandardValidators.INTEGER_VALIDATOR) - .defaultValue("1") - .build - - val KAFKA_METADATA_BROKER_LIST: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("kafka.metadata.broker.list") - .description("a comma separated list of host:port brokers") - .required(true) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .defaultValue("localhost:9092") - .build - - val KAFKA_ZOOKEEPER_QUORUM: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("kafka.zookeeper.quorum") - .description("") - .required(true) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .defaultValue("localhost:2181") - .build - - val LATEST_OFFSET = new AllowableValue("latest", "latest", "the offset to the latest offset") - val EARLIEST_OFFSET = new AllowableValue("earliest", "earliest offset", "the offset to the earliest offset") - val NONE_OFFSET = new AllowableValue("none", "none offset", "the latest saved offset") - - val KAFKA_MANUAL_OFFSET_RESET: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("kafka.manual.offset.reset") - .description("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):\n" + - "earliest: automatically reset the offset to the earliest offset\n" + - "latest: automatically reset the offset to the latest offset\n" + - "none: throw exception to the consumer if no previous offset is found for the consumer's group\n" + - "anything else: throw exception to the consumer.") - .required(false) - .allowableValues(LATEST_OFFSET, EARLIEST_OFFSET, NONE_OFFSET) - .defaultValue(EARLIEST_OFFSET.getValue) - .build - - - val KAFKA_BATCH_SIZE: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("kafka.batch.size") - .description("measures batch size in total bytes instead of the number of messages. " + - "It controls how many bytes of data to collect before sending messages to the Kafka broker. " + - "Set this as high as possible, without exceeding available memory. The default value is 16384.\n\n" + - "If you increase the size of your buffer, it might never get full." + - "The Producer sends the information eventually, based on other triggers, such as linger time in milliseconds. " + - "Although you can impair memory usage by setting the buffer batch size too high, " + - "this does not impact latency.\n\n" + - "If your producer is sending all the time, " + - "you are probably getting the best throughput possible. If the producer is often idle, " + - "you might not be writing enough data to warrant the current allocation of resources.") - .required(false) - .addValidator(StandardValidators.INTEGER_VALIDATOR) - .defaultValue("16384") - .build - - - val KAFKA_LINGER_MS: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("kafka.linger.ms") - .description("linger.ms sets the maximum time to buffer data in asynchronous mode. " + - "For example, a setting of 100 batches 100ms of messages to send at once. " + - "This improves throughput, but the buffering adds message delivery latency.\n\n" + - "By default, the producer does not wait. It sends the buffer any time data is available.\n\n" + - "Instead of sending immediately, you can set linger.ms to 5 and send more messages in one batch." + - " This would reduce the number of requests sent, but would add up to 5 milliseconds of latency to records " + - "sent, even if the load on the system does not warrant the delay.\n\n" + - "The farther away the broker is from the producer, the more overhead required to send messages. " + - "Increase linger.ms for higher latency and higher throughput in your producer.") - .required(false) - .addValidator(StandardValidators.INTEGER_VALIDATOR) - .defaultValue("5") - .build - - val KAFKA_ACKS: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("kafka.acks") - .description("The number of acknowledgments the producer requires the leader to have received before considering a request complete. This controls the " - + " durability of records that are sent. The following settings are common: " - + "

    " - + "
  • acks=0 If set to zero then the producer will not wait for any acknowledgment from the" - + " server at all. The record will be immediately added to the socket buffer and considered sent. No guarantee can be" - + " made that the server has received the record in this case, and the retries configuration will not" - + " take effect (as the client won't generally know of any failures). The offset given back for each record will" - + " always be set to -1." - + "
  • acks=1 This will mean the leader will write the record to its local log but will respond" - + " without awaiting full acknowledgement from all followers. In this case should the leader fail immediately after" - + " acknowledging the record but before the followers have replicated it then the record will be lost." - + "
  • acks=all This means the leader will wait for the full set of in-sync replicas to" - + " acknowledge the record. This guarantees that the record will not be lost as long as at least one in-sync replica" - + " remains alive. This is the strongest available guarantee.") - .required(false) - .defaultValue("all") - .build - - - val WINDOW_DURATION: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("window.duration") - .description("all the elements in seen in a sliding window of time over. windowDuration = width of the window; must be a multiple of batching interval") - .addValidator(StandardValidators.LONG_VALIDATOR) - .required(false) - .build - - val SLIDE_DURATION: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("slide.duration") - .description("sliding interval of the window (i.e., the interval after which the new DStream will generate RDDs); must be a multiple of batching interval") - .addValidator(StandardValidators.LONG_VALIDATOR) - .required(false) - .build - - val GROUPBY: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("groupby") - .description("comma separated list of fields to group the partition by") - .addValidator(StandardValidators.COMMA_SEPARATED_LIST_VALIDATOR) - .required(false) - .build - - val STATE_TIMEOUT_MS: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("state.timeout.ms") - .description("the time in ms before we invalidate the microbatch state") - .addValidator(StandardValidators.LONG_VALIDATOR) - .required(false) - .defaultValue("2000") - .build - - val CHUNK_SIZE: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("chunk.size") - .description("the number of records to group into chunks") - .addValidator(StandardValidators.INTEGER_VALIDATOR) - .required(false) - .defaultValue("100") - .build - - - - -val KAFKA_STARTING_OFFSETS: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("kafka.startingOffsets") - .description("\"earliest\", \"latest\", or json string \"\"\" {\"topicA\":{\"0\":23,\"1\":-1},\"topicB\":{\"0\":-2}} \"\"\"" + - "The start point when a query is started, either \"earliest\" which is from the earliest offsets, " + - "\"latest\" which is just from the latest offsets, or a json string specifying a starting offset for each TopicPartition. " + - "In the json, -2 as an offset can be used to refer to earliest, -1 to latest. " + - "Note: this only applies when a new query is started, and that resuming will always pick up from where the query " + - "left off. Newly discovered partitions during a query will start at earliest.") - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .required(false) - .defaultValue("earliest") - .build - - val KAFKA_FAIL_ON_DATA_LOSS: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("kafka.failOnDataLoss") - .description("Whether to fail the query when it's possible that data is lost" + - " (e.g., topics are deleted, or offsets are out of range). This may be a false alarm. " + - "You can disable it when it doesn't work as you expected. " + - "Batch queries will always fail if it fails to read any data from the provided offsets due to lost data.") - .addValidator(StandardValidators.BOOLEAN_VALIDATOR) - .required(false) - .defaultValue("true") - .build - - val KAFKA_MAX_OFFSETS_PER_TRIGGER: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("kafka.maxOffsetsPerTrigger") - .description("Rate limit on maximum number of offsets processed per trigger interval. " + - "The specified total number of offsets will be proportionally split across topicPartitions of different volume.") - .addValidator(StandardValidators.LONG_VALIDATOR) - .required(false) - .build - - - ////////////////////////////////////// - // MQTT options - ////////////////////////////////////// - - val MQTT_BROKER_URL: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("mqtt.broker.url") - .description("brokerUrl A url MqttClient connects to. Set this or path as the url of the Mqtt Server. e.g. tcp://localhost:1883") - .addValidator(StandardValidators.URL_VALIDATOR) - .defaultValue("tcp://localhost:1883") - .required(false) - .build - - val MQTT_PERSISTENCE: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("mqtt.persistence") - .description("persistence By default it is used for storing incoming messages on disk. " + - "If memory is provided as value for this option, then recovery on restart is not supported.") - .defaultValue("memory") - .required(false) - .build - - val MQTT_TOPIC: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("mqtt.topic") - .description("Topic MqttClient subscribes to.") - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .required(true) - .build - - val MQTT_CLIENTID: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("mqtt.client.id") - .description("clientID this client is associated. Provide the same value to recover a stopped client.") - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .required(true) - .build - - val MQTT_QOS: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("mqtt.qos") - .description(" QoS The maximum quality of service to subscribe each topic at.Messages published at a lower " + - "quality of service will be received at the published QoS.Messages published at a higher quality of " + - "service will be received using the QoS specified on the subscribe") - .addValidator(StandardValidators.INTEGER_VALIDATOR) - .defaultValue("0") - .required(false) - .build - - val MQTT_USERNAME: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("mqtt.username") - .description(" username Sets the user name to use for the connection to Mqtt Server. " + - "Do not set it, if server does not need this. Setting it empty will lead to errors.") - .required(false) - .build - - val MQTT_PASSWORD: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("mqtt.password") - .description("password Sets the password to use for the connection") - .required(false) - .build - - val MQTT_CLEAN_SESSION: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("mqtt.clean.session") - .description("cleanSession Setting it true starts a clean session, removes all checkpointed messages by " + - "a previous run of this source. This is set to false by default.") - .addValidator(StandardValidators.BOOLEAN_VALIDATOR) - .defaultValue("true") - .required(false) - .build - - val MQTT_CONNECTION_TIMEOUT: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("mqtt.connection.timeout") - .description("connectionTimeout Sets the connection timeout, a value of 0 is interpreted as " + - "wait until client connects. See MqttConnectOptions.setConnectionTimeout for more information") - .addValidator(StandardValidators.INTEGER_VALIDATOR) - .defaultValue("5000") - .required(false) - .build - - val MQTT_KEEP_ALIVE: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("mqtt.keep.alive") - .description("keepAlive Same as MqttConnectOptions.setKeepAliveInterval.") - .addValidator(StandardValidators.INTEGER_VALIDATOR) - .defaultValue("5000") - .required(false) - .build - - - val MQTT_VERSION: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("mqtt.version") - .description("mqttVersion Same as MqttConnectOptions.setMqttVersion") - .addValidator(StandardValidators.INTEGER_VALIDATOR) - .defaultValue("5000") - .required(false) - .build - - val READ_TOPICS: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("read.topics") - .description("the input path for any topic to be read from") - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .required(true) - .build - - val READ_TOPICS_SERIALIZER: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("read.topics.serializer") - .description("the serializer to use") - .required(true) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, EXTENDED_JSON_SERIALIZER, AVRO_SERIALIZER, BYTESARRAY_SERIALIZER, STRING_SERIALIZER, NO_SERIALIZER, KURA_PROTOCOL_BUFFER_SERIALIZER) - .defaultValue(NO_SERIALIZER.getValue) - .build - - val READ_TOPICS_KEY_SERIALIZER: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("read.topics.key.serializer") - .description("The key serializer to use") - .required(true) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, EXTENDED_JSON_SERIALIZER, AVRO_SERIALIZER, BYTESARRAY_SERIALIZER, KURA_PROTOCOL_BUFFER_SERIALIZER, STRING_SERIALIZER, NO_SERIALIZER) - .defaultValue(NO_SERIALIZER.getValue) - .build - - val READ_STREAM_SERVICE_PROVIDER: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("read.stream.service.provider") - .description("the controller service that gives connection information") - .required(true) - .identifiesControllerService(classOf[StructuredStreamProviderService]) - .build - - - val WRITE_TOPICS: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("write.topics") - .description("the input path for any topic to be written to") - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .required(true) - .build - - val WRITE_TOPICS_SERIALIZER: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("write.topics.serializer") - .description("the serializer to use") - .required(true) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, EXTENDED_JSON_SERIALIZER, AVRO_SERIALIZER, BYTESARRAY_SERIALIZER, STRING_SERIALIZER, NO_SERIALIZER, KURA_PROTOCOL_BUFFER_SERIALIZER) - .defaultValue(NO_SERIALIZER.getValue) - .build - - val WRITE_TOPICS_KEY_SERIALIZER: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("write.topics.key.serializer") - .description("The key serializer to use") - .required(true) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, EXTENDED_JSON_SERIALIZER, AVRO_SERIALIZER, BYTESARRAY_SERIALIZER, STRING_SERIALIZER, NO_SERIALIZER, KURA_PROTOCOL_BUFFER_SERIALIZER) - .defaultValue(NO_SERIALIZER.getValue) - .build - - val WRITE_STREAM_SERVICE_PROVIDER: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("write.stream.service.provider") - .description("the controller service that gives connection information") - .required(true) - .identifiesControllerService(classOf[StructuredStreamProviderService]) - .build - - - ////////////////////////////////////// - // HDFS options - ////////////////////////////////////// - val FILE_FORMAT_PARQUET = "parquet" - val FILE_FORMAT_ORC = "orc" - val FILE_FORMAT_JSON = "json" - val FILE_FORMAT_TXT = "txt" - - val OUTPUT_FOLDER_PATH = new PropertyDescriptor.Builder() - .name("output.folder.path") - .description("the location where to put files : file:///tmp/out") - .required(true) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .build - - - val INPUT_FORMAT = new PropertyDescriptor.Builder() - .name("input.format") - .description("Used to load data from a raw record_value. Only json supported") - .required(false) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .defaultValue("") - .build - - val OUTPUT_FORMAT = new PropertyDescriptor.Builder() - .name("output.format") - .description("can be parquet, orc csv") - .required(true) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .allowableValues(FILE_FORMAT_PARQUET, FILE_FORMAT_TXT, FILE_FORMAT_JSON, FILE_FORMAT_JSON) - .build - - val RECORD_TYPE = new PropertyDescriptor.Builder() - .name("record.type") - .description("the type of event to filter") - .required(true) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .build - - val NUM_PARTITIONS = new PropertyDescriptor.Builder() - .name("num.partitions") - .description("the numbers of physical files on HDFS") - .required(false) - .addValidator(StandardValidators.POSITIVE_INTEGER_VALIDATOR) - .defaultValue("4") - .build - - val EXCLUDE_ERRORS = new PropertyDescriptor.Builder() - .name("exclude.errors") - .description("do we include records with errors ?") - .required(false) - .addValidator(StandardValidators.BOOLEAN_VALIDATOR) - .defaultValue("true") - .build - - val DATE_FORMAT = new PropertyDescriptor.Builder() - .name("date.format") - .description("The format of the date for the partition") - .required(false) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .defaultValue("yyyy-MM-dd") - .build - - - ////////////////////////////////////// - // SQL options - ////////////////////////////////////// - val SQL_QUERY = new PropertyDescriptor.Builder() - .name("sql.query") - .description("The SQL query to execute, " + - "please note that the table name must exists in input topics names") - .required(true) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .build - - val MAX_RESULTS_COUNT = new PropertyDescriptor.Builder() - .name("max.results.count") - .description("the max number of rows to output. (-1 for no limit)") - .required(false) - .addValidator(StandardValidators.INTEGER_VALIDATOR) - .defaultValue("-1") - .build - - val OUTPUT_RECORD_TYPE = new PropertyDescriptor.Builder() - .name("output.record.type") - .description("the output type of the record") - .required(false) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .defaultValue("aggregation") - .build - - - ////////////////////////////////////// - // Security options - ////////////////////////////////////// - - val PLAINTEXT = new AllowableValue("PLAINTEXT", "PLAINTEXT", "Un-authenticated, non-encrypted channel") - val SSL = new AllowableValue("SSL", "SSL", "SSL channel") - val SASL_PLAINTEXT = new AllowableValue("SASL_PLAINTEXT", "SASL_PLAINTEXT", "SASL authenticated, non-encrypted channel") - val SASL_SSL = new AllowableValue("SASL_SSL", "SASL_SSL", "SASL authenticated, SSL channel") - - val KAFKA_SECURITY_PROTOCOL: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("kafka.security.protocol") - .description("kafka.security.protocol sets the value of of the security protocol \n" + - "Apache Kafka® brokers supports client authentication via SASL. " + - "SASL authentication can be enabled concurrently with SSL encryption " + - "(SSL client authentication will be disabled).\n\nThe supported SASL mechanisms are:") - .required(false) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .defaultValue(PLAINTEXT.getValue) - .allowableValues(PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL) - .build - - val KAFKA_SASL_KERBEROS_SERVICE_NAME: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("kafka.sasl.kerberos.service.name") - .description("follow the guide here to configure your job to work with kerberos authentification \n" + - "https://docs.confluent.io/2.0.0/kafka/sasl.html") - .required(false) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .defaultValue("kafka") - .build - -} diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/provider/KafkaConnectBaseProviderService.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/provider/KafkaConnectBaseProviderService.scala index 61d3d2592..f61762b0d 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/provider/KafkaConnectBaseProviderService.scala +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/provider/KafkaConnectBaseProviderService.scala @@ -23,13 +23,15 @@ import com.hurence.logisland.component.{InitializationException, PropertyDescrip import com.hurence.logisland.controller.{AbstractControllerService, ControllerServiceInitializationContext} import com.hurence.logisland.record.Record import com.hurence.logisland.stream.StreamContext -import com.hurence.logisland.stream.spark.structured.provider.StructuredStreamProviderService +import com.hurence.logisland.stream.spark.structured.provider.{StructuredStreamProviderServiceReader, StructuredStreamProviderServiceWriter} import com.hurence.logisland.util.spark.ControllerServiceLookupSink import org.apache.spark.broadcast.Broadcast -import org.apache.spark.sql.streaming.DataStreamWriter +import org.apache.spark.sql.streaming.{DataStreamWriter, StreamingQuery} import org.apache.spark.sql.{Dataset, SparkSession} -class KafkaConnectBaseProviderService extends AbstractControllerService with StructuredStreamProviderService { +class KafkaConnectBaseProviderService extends AbstractControllerService + with StructuredStreamProviderServiceReader + with StructuredStreamProviderServiceWriter { var connectorProperties = "" var keyConverter = "" @@ -90,10 +92,9 @@ class KafkaConnectBaseProviderService extends AbstractControllerService with Str * create a streaming DataFrame that represents data received * * @param spark - * @param streamContext * @return DataFrame currently loaded */ - override def read(spark: SparkSession, streamContext: StreamContext): Dataset[Record] = { + override def read(spark: SparkSession): Dataset[Record] = { throw new UnsupportedOperationException("Operation not supported. Please be sure to use the right component") } @@ -101,10 +102,9 @@ class KafkaConnectBaseProviderService extends AbstractControllerService with Str /** * create a streaming DataFrame that represents data to be written * - * @param streamContext * @return DataFrame currently loaded */ - override def write(df: Dataset[Record], controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink], streamContext: StreamContext): DataStreamWriter[_] = { + override def write(df: Dataset[Record], controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink]): DataStreamWriter[_] = { throw new UnsupportedOperationException("Operation not supported. Please be sure to use the right component") } diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/provider/KafkaConnectStructuredSinkProviderService.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/provider/KafkaConnectStructuredSinkProviderService.scala index 066a41711..0e2c4ed56 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/provider/KafkaConnectStructuredSinkProviderService.scala +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/provider/KafkaConnectStructuredSinkProviderService.scala @@ -13,110 +13,193 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.hurence.logisland.stream.spark.provider +import java.io.ByteArrayOutputStream +import java.util +import java.util.Collections + import com.hurence.logisland.annotation.lifecycle.OnEnabled -import com.hurence.logisland.component.InitializationException +import com.hurence.logisland.component.{InitializationException, PropertyDescriptor} import com.hurence.logisland.connect.Utils import com.hurence.logisland.connect.sink.KafkaConnectStreamSink import com.hurence.logisland.controller.ControllerServiceInitializationContext -import com.hurence.logisland.record.{FieldDictionary, Record} -import com.hurence.logisland.stream.{StreamContext, StreamProperties} +import com.hurence.logisland.record.{FieldDictionary, FieldType, Record, StandardRecord} +import com.hurence.logisland.serializer.{RecordSerializer, SerializerProvider} +import com.hurence.logisland.stream.StreamProperties._ +import com.hurence.logisland.stream.spark.provider.KafkaConnectStructuredSinkProviderService.{AVRO_WRITE_VALUE_SCHEMA, WRITE_KEY_SERIALIZER, WRITE_TOPICS, WRITE_VALUE_SERIALIZER} +import com.hurence.logisland.stream.spark.structured.provider.SerializingTool import com.hurence.logisland.util.spark.ControllerServiceLookupSink -import org.apache.kafka.connect.sink.SinkConnector +import com.hurence.logisland.validator.StandardValidators import org.apache.spark.TaskContext import org.apache.spark.broadcast.Broadcast import org.apache.spark.sql._ -import org.apache.spark.sql.streaming.DataStreamWriter +import org.apache.spark.sql.streaming.StreamingQuery class KafkaConnectStructuredSinkProviderService extends KafkaConnectBaseProviderService { - var maxPartitions = 1 - @transient var writer: KafkaConnectStreamSink = null - - @OnEnabled - @throws[InitializationException] - override def init(context: ControllerServiceInitializationContext): Unit = { - super.init(context) - this.synchronized { - try { - maxPartitions = maxConfigurations - if (context.getPropertyValue(StreamOptions.KAFKA_CONNECT_MAX_PARTITIONS).isSet) { - maxPartitions = context.getPropertyValue(StreamOptions.KAFKA_CONNECT_MAX_PARTITIONS).asInteger() - } - } catch { - case e: Exception => - throw new InitializationException(e) - } + var maxPartitions = 1 + @transient var writer: KafkaConnectStreamSink = null + + var outputTopicName: String = null + var writeValueSerializer: RecordSerializer = null + var writeKeySerializer: RecordSerializer = null + + /** + * Allows subclasses to register which property descriptor objects are + * supported. + * + * @return PropertyDescriptor objects this processor currently supports + */ + override def getSupportedPropertyDescriptors() = { + val descriptors: util.List[PropertyDescriptor] = new util.ArrayList[PropertyDescriptor] + descriptors.addAll(super.getSupportedPropertyDescriptors()) + descriptors.add(WRITE_TOPICS) + descriptors.add(WRITE_VALUE_SERIALIZER) + descriptors.add(AVRO_WRITE_VALUE_SCHEMA) + descriptors.add(WRITE_KEY_SERIALIZER) + Collections.unmodifiableList(descriptors) + } + + @OnEnabled + @throws[InitializationException] + override def init(context: ControllerServiceInitializationContext): Unit = { + super.init(context) + this.synchronized { + try { + maxPartitions = maxConfigurations + if (context.getPropertyValue(StreamOptions.KAFKA_CONNECT_MAX_PARTITIONS).isSet) { + maxPartitions = context.getPropertyValue(StreamOptions.KAFKA_CONNECT_MAX_PARTITIONS).asInteger() } + outputTopicName = context.getPropertyValue(WRITE_TOPICS).asString().split(",")(0).trim + writeValueSerializer = SerializerProvider.getSerializer( + context.getPropertyValue(WRITE_VALUE_SERIALIZER).asString, + context.getPropertyValue(AVRO_WRITE_VALUE_SCHEMA).asString) + writeKeySerializer = SerializerProvider.getSerializer( + context.getPropertyValue(WRITE_KEY_SERIALIZER).asString, null) + } catch { + case e: Exception => + throw new InitializationException(e) + } } + } - /** - * create a streaming DataFrame that represents data to be written - * - * @param streamContext - * @return DataFrame currently loaded - */ - override def write(df: Dataset[Record], controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink], streamContext: StreamContext): DataStreamWriter[_] = { - implicit val encoder = Encoders.tuple(Encoders.BINARY, Encoders.BINARY) - val df2 = df - .mapPartitions(record => record.map(record => (record.getField(FieldDictionary.RECORD_KEY).getRawValue().asInstanceOf[Array[Byte]], - record.getField(FieldDictionary.RECORD_VALUE).getRawValue().asInstanceOf[Array[Byte]]))) - .toDF("key", "value") - - val topicName = streamContext.getPropertyValue(StreamProperties.WRITE_TOPICS).asString().split(",")(0).trim - - def writer() = controllerServiceLookupSink.value.getControllerService(getIdentifier).asInstanceOf[KafkaConnectStructuredSinkProviderService] - .createWriter(SparkSession.builder().getOrCreate().sqlContext, streamContext, topicName) - - df2/*.repartition(maxPartitions, df2.col("key"))*/ - .writeStream - .foreach(new ForeachWriter[Row] { - - override def process(value: Row): Unit = { - writer().enqueueOnPartition(TaskContext.getPartitionId(), value.getAs(0), value.getAs(1)) - } - - override def close(errorOrNull: Throwable): Unit = { - if (errorOrNull != null) { - logger.error("Error while storing data", errorOrNull) - } - writer().flushPartition(TaskContext.getPartitionId()) - } - - override def open(partitionId: Long, version: Long): Boolean = { - writer().openPartition(partitionId.intValue()) - } - }) - } + /** + * create a streaming DataFrame that represents data to be written + * + * @return DataFrame currently loaded + */ + override def write(df: Dataset[Record], controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink]) = { + implicit val encoder = Encoders.tuple(Encoders.BINARY, Encoders.BINARY) + + implicit val recordEncoder = org.apache.spark.sql.Encoders.kryo[Record] + // Write key-value data from a DataFrame to a specific event hub specified in an option + val df2 = df + .mapPartitions(record => record.map(record => SerializingTool.serializeRecords(writeValueSerializer, writeKeySerializer, record))) + .mapPartitions(record => record.map(record => (record.getField(FieldDictionary.RECORD_KEY).getRawValue().asInstanceOf[Array[Byte]], + record.getField(FieldDictionary.RECORD_VALUE).getRawValue().asInstanceOf[Array[Byte]]))) + .toDF("key", "value") - def createWriter(sqlContext: SQLContext, streamContext: StreamContext, topic: String): KafkaConnectStreamSink = - synchronized { - - if (writer == null) { - val keyConverterInstance = Utils.createConverter(keyConverter, keyConverterProperties, true) - val valueConverterInstance = Utils.createConverter(valueConverter, valueConverterProperties, false) - //create the right backing store - val offsetBackingStoreInstance = Utils.createOffsetBackingStore(offsetBackingStore, Utils.propertiesToMap(offsetBackingStoreProperties)) - - writer = new KafkaConnectStreamSink( - sqlContext, - Utils.propertiesToMap(connectorProperties), - keyConverterInstance, - valueConverterInstance, - offsetBackingStoreInstance, - maxConfigurations, - topic, - delegateConnectorClass, - streamContext.getIdentifier) - writer.start() - } - - writer + def writer() = controllerServiceLookupSink.value.getControllerService(getIdentifier).asInstanceOf[KafkaConnectStructuredSinkProviderService] + .createWriter(SparkSession.builder().getOrCreate().sqlContext, outputTopicName) + + df2 /*.repartition(maxPartitions, df2.col("key"))*/ + .writeStream + .foreach(new ForeachWriter[Row] { + + override def process(value: Row): Unit = { + writer().enqueueOnPartition(TaskContext.getPartitionId(), value.getAs(0), value.getAs(1)) } + override def close(errorOrNull: Throwable): Unit = { + if (errorOrNull != null) { + getLogger.error("Error while storing data", errorOrNull) + } + writer().flushPartition(TaskContext.getPartitionId()) + } + + override def open(partitionId: Long, version: Long): Boolean = { + writer().openPartition(partitionId.intValue()) + } + }) + } + + + def createWriter(sqlContext: SQLContext, topic: String): KafkaConnectStreamSink = + synchronized { + if (writer == null) { + val keyConverterInstance = Utils.createConverter(keyConverter, keyConverterProperties, true) + val valueConverterInstance = Utils.createConverter(valueConverter, valueConverterProperties, false) + //create the right backing store + val offsetBackingStoreInstance = Utils.createOffsetBackingStore(offsetBackingStore, Utils.propertiesToMap(offsetBackingStoreProperties)) + + writer = new KafkaConnectStreamSink( + sqlContext, + Utils.propertiesToMap(connectorProperties), + keyConverterInstance, + valueConverterInstance, + offsetBackingStoreInstance, + maxConfigurations, + topic, + delegateConnectorClass, + getIdentifier) + writer.start() + } + + writer + } + + +} +object KafkaConnectStructuredSinkProviderService { + val WRITE_TOPICS: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("write.topics") + .description("the input path for any topic to be written to") + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .required(true) + .build + + val WRITE_VALUE_SERIALIZER: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("write.value.serializer") + .description("the serializer to use to serialize records into value topic messages") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, EXTENDED_JSON_SERIALIZER, AVRO_SERIALIZER, BYTESARRAY_SERIALIZER, STRING_SERIALIZER, NO_SERIALIZER, KURA_PROTOCOL_BUFFER_SERIALIZER) + .defaultValue(NO_SERIALIZER.getValue) + .build + + val AVRO_WRITE_VALUE_SCHEMA: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("write.value.schema") + .description("the avro schema definition") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build + + val WRITE_KEY_SERIALIZER: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("write.key.serializer") + .description("The key serializer to use") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, EXTENDED_JSON_SERIALIZER, AVRO_SERIALIZER, BYTESARRAY_SERIALIZER, STRING_SERIALIZER, NO_SERIALIZER, KURA_PROTOCOL_BUFFER_SERIALIZER) + .defaultValue(NO_SERIALIZER.getValue) + .build } diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/provider/KafkaConnectStructuredSourceProviderService.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/provider/KafkaConnectStructuredSourceProviderService.scala index 97b30d87b..f7f64c5f1 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/provider/KafkaConnectStructuredSourceProviderService.scala +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/provider/KafkaConnectStructuredSourceProviderService.scala @@ -13,71 +13,132 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.hurence.logisland.stream.spark.provider +import java.util +import java.util.Collections + import com.hurence.logisland.annotation.lifecycle.OnEnabled -import com.hurence.logisland.component.InitializationException +import com.hurence.logisland.component.{InitializationException, PropertyDescriptor} import com.hurence.logisland.controller.ControllerServiceInitializationContext import com.hurence.logisland.record.{FieldDictionary, FieldType, Record, StandardRecord} -import com.hurence.logisland.stream.StreamContext +import com.hurence.logisland.serializer.{NoopSerializer, RecordSerializer, SerializerProvider} +import com.hurence.logisland.stream.StreamProperties._ +import com.hurence.logisland.stream.spark.provider.KafkaConnectStructuredSourceProviderService.{AVRO_READ_VALUE_SCHEMA, READ_VALUE_SERIALIZER} +import com.hurence.logisland.stream.spark.structured.provider.SerializingTool +import com.hurence.logisland.validator.StandardValidators import org.apache.spark.SparkContext import org.apache.spark.sql.{Dataset, SparkSession} class KafkaConnectStructuredSourceProviderService extends KafkaConnectBaseProviderService { - var maxPartitions = 1 + var maxPartitions = 1 + var readValueSerializer: RecordSerializer = null - @OnEnabled - @throws[InitializationException] - override def init(context: ControllerServiceInitializationContext): Unit = { - super.init(context) - this.synchronized { - try { - maxPartitions = SparkContext.getOrCreate().defaultParallelism - if (context.getPropertyValue(StreamOptions.KAFKA_CONNECT_MAX_PARTITIONS).isSet) { - maxPartitions = context.getPropertyValue(StreamOptions.KAFKA_CONNECT_MAX_PARTITIONS).asInteger() - } - } catch { - case e: Exception => - throw new InitializationException(e) - } + /** + * Allows subclasses to register which property descriptor objects are + * supported. + * + * @return PropertyDescriptor objects this processor currently supports + */ + override def getSupportedPropertyDescriptors() = { + val descriptors: util.List[PropertyDescriptor] = new util.ArrayList[PropertyDescriptor] + descriptors.addAll(super.getSupportedPropertyDescriptors()) + descriptors.add(READ_VALUE_SERIALIZER) + descriptors.add(AVRO_READ_VALUE_SCHEMA) + Collections.unmodifiableList(descriptors) + } + + @OnEnabled + @throws[InitializationException] + override def init(context: ControllerServiceInitializationContext): Unit = { + super.init(context) + this.synchronized { + try { + maxPartitions = SparkContext.getOrCreate().defaultParallelism + if (context.getPropertyValue(StreamOptions.KAFKA_CONNECT_MAX_PARTITIONS).isSet) { + maxPartitions = context.getPropertyValue(StreamOptions.KAFKA_CONNECT_MAX_PARTITIONS).asInteger() } + readValueSerializer = SerializerProvider.getSerializer( + context.getPropertyValue(READ_VALUE_SERIALIZER).asString, + context.getPropertyValue(AVRO_READ_VALUE_SCHEMA).asString) + } catch { + case e: Exception => + throw new InitializationException(e) + } } + } - /** - * create a streaming DataFrame that represents data received - * - * @param spark - * @param streamContext - * @return DataFrame currently loaded - */ - override def read(spark: SparkSession, streamContext: StreamContext): Dataset[Record] = { - import spark.implicits._ - implicit val recordEncoder = org.apache.spark.sql.Encoders.kryo[Record] + /** + * create a streaming DataFrame that represents data received + * + * @param spark + * @return DataFrame currently loaded + */ + override def read(spark: SparkSession): Dataset[Record] = { + import spark.implicits._ + implicit val recordEncoder = org.apache.spark.sql.Encoders.kryo[Record] - getLogger.info(s"Connecting kafka-connect source $delegateConnectorClass") - spark.readStream - .format("com.hurence.logisland.connect.source.KafkaConnectStreamSourceProvider") - .option(StreamOptions.KAFKA_CONNECT_CONNECTOR_PROPERTIES.getName, connectorProperties) - .option(StreamOptions.KAFKA_CONNECT_KEY_CONVERTER.getName, keyConverter) - .option(StreamOptions.KAFKA_CONNECT_KEY_CONVERTER_PROPERTIES.getName, keyConverterProperties) - .option(StreamOptions.KAFKA_CONNECT_VALUE_CONVERTER.getName, valueConverter) - .option(StreamOptions.KAFKA_CONNECT_VALUE_CONVERTER_PROPERTIES.getName, valueConverterProperties) - .option(StreamOptions.KAFKA_CONNECT_MAX_TASKS.getName, maxConfigurations) - .option(StreamOptions.KAFKA_CONNECT_CONNECTOR_CLASS.getName, delegateConnectorClass) - .option(StreamOptions.KAFKA_CONNECT_OFFSET_BACKING_STORE.getName, offsetBackingStore) - .option(StreamOptions.KAFKA_CONNECT_OFFSET_BACKING_STORE_PROPERTIES.getName, offsetBackingStoreProperties) - .load(streamContext.getIdentifier) - //Topic, Partition, Key, Value - .as[(String, String, String, Array[Byte], Array[Byte])] - .map(r => - new StandardRecord("kafka_connect") - .setField(FieldDictionary.RECORD_KEY, FieldType.BYTES, r._4) - .setField(FieldDictionary.RECORD_VALUE, FieldType.BYTES, r._5)) - .coalesce(maxPartitions) - } + getLogger.info(s"Connecting kafka-connect source $delegateConnectorClass") + spark.readStream + .format("com.hurence.logisland.connect.source.KafkaConnectStreamSourceProvider") + .option(StreamOptions.KAFKA_CONNECT_CONNECTOR_PROPERTIES.getName, connectorProperties) + .option(StreamOptions.KAFKA_CONNECT_KEY_CONVERTER.getName, keyConverter) + .option(StreamOptions.KAFKA_CONNECT_KEY_CONVERTER_PROPERTIES.getName, keyConverterProperties) + .option(StreamOptions.KAFKA_CONNECT_VALUE_CONVERTER.getName, valueConverter) + .option(StreamOptions.KAFKA_CONNECT_VALUE_CONVERTER_PROPERTIES.getName, valueConverterProperties) + .option(StreamOptions.KAFKA_CONNECT_MAX_TASKS.getName, maxConfigurations) + .option(StreamOptions.KAFKA_CONNECT_CONNECTOR_CLASS.getName, delegateConnectorClass) + .option(StreamOptions.KAFKA_CONNECT_OFFSET_BACKING_STORE.getName, offsetBackingStore) + .option(StreamOptions.KAFKA_CONNECT_OFFSET_BACKING_STORE_PROPERTIES.getName, offsetBackingStoreProperties) + .load() + //topic, sourcePartition, sourceOffset, key, value + .as[(String, String, String, Array[Byte], Array[Byte])] + .flatMap(r => { + readValueSerializer match { + case sr: NoopSerializer => Some(new StandardRecord("kafka_connect") + .setField(FieldDictionary.RECORD_KEY, FieldType.BYTES, r._4) + .setField(FieldDictionary.RECORD_VALUE, FieldType.BYTES, r._5)) + case _ => SerializingTool.deserializeRecords(readValueSerializer, r._5) + } + }) + .coalesce(maxPartitions) + } + +} + +object KafkaConnectStructuredSourceProviderService { + val READ_VALUE_SERIALIZER: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("read.value.serializer") + .description("the serializer to use to deserialize value of topic messages as record") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, EXTENDED_JSON_SERIALIZER, AVRO_SERIALIZER, BYTESARRAY_SERIALIZER, STRING_SERIALIZER, NO_SERIALIZER, KURA_PROTOCOL_BUFFER_SERIALIZER) + .defaultValue(NO_SERIALIZER.getValue) + .build + val AVRO_READ_VALUE_SCHEMA: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("read.value.schema") + .description("the avro schema definition") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build } diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/SparkPipeLineMethods.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/SparkPipeLineMethods.scala new file mode 100644 index 000000000..2744726c7 --- /dev/null +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/SparkPipeLineMethods.scala @@ -0,0 +1,204 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.stream.spark.structured + +import java.util +import java.util.Date + +import com.hurence.logisland.record.{FieldDictionary, Record, StandardRecord} +import com.hurence.logisland.stream.StreamContext +import com.hurence.logisland.stream.spark.SparkStreamContext +import com.hurence.logisland.util.spark.{ControllerServiceLookupSink, ProcessorMetrics} +import org.apache.spark.broadcast.Broadcast +import org.apache.spark.groupon.metrics.UserMetricsSystem +import org.apache.spark.sql.streaming.GroupState +import org.slf4j.LoggerFactory + +import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ + + +class SparkPipeLineMethods(val streamContext: StreamContext, + val controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink]) extends Serializable { + + def this(sparkStreamContext: SparkStreamContext) { + this(sparkStreamContext.logislandStreamContext, sparkStreamContext.broadCastedControllerServiceLookupSink) + } + + def executePipeline(iterator: Iterator[Record]) = { + SparkPipeLineMethods.executePipeline(controllerServiceLookupSink, streamContext, iterator) + } + + def executePipeline(key: String, iterator: Iterator[Record]) = { + SparkPipeLineMethods.executePipeline(controllerServiceLookupSink, streamContext, iterator) + } + + + def mappingFunction2(timeOutDuration: Long) + (key: String, + value: Iterator[Record], + state: GroupState[Record]): Iterator[Record] = { + SparkPipeLineMethods + .mappingFunction(controllerServiceLookupSink, + streamContext, + timeOutDuration)(key, value, state) + } + +} + +object SparkPipeLineMethods { + private val logger = LoggerFactory.getLogger(classOf[SparkPipeLineMethods]) + + private def executePipeline(controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink], + streamContext: StreamContext, + iterator: Iterator[Record]) = { + val controllerServiceLookup = controllerServiceLookupSink.value.getControllerServiceLookup() + + // convert to logisland records + var processingRecords: util.Collection[Record] = iterator.toList + + if (processingRecords.size() > 0) { + val pipelineMetricPrefix = streamContext.getIdentifier + "." + // loop over processor chain + streamContext.getProcessContexts.foreach(processorContext => { + val startTime = System.currentTimeMillis() + val processor = processorContext.getProcessor + /* + Does this cause problem ? same instance used in concurrence ? + I tested to serialize an object into a mapPArtition transformation + and could not find any bug related to concurrence. It seems for each partition we got a new instance + of the processor. + */ + val processorTimerContext = UserMetricsSystem.timer(pipelineMetricPrefix + + processorContext.getIdentifier + ".processing_time_ms").time() + + // injects controller service lookup into processor context + if (processor.hasControllerService) { + processorContext.setControllerServiceLookup(controllerServiceLookup) + } + + // processor setup (don't forget that) + if (!processor.isInitialized) { + processor.init(processorContext) + } + processor.start() + // do the actual processing + processingRecords = processor.process(processorContext, processingRecords) + processor.stop() + + // compute metrics + ProcessorMetrics.computeMetrics( + pipelineMetricPrefix + processorContext.getIdentifier + ".", + processingRecords, + processingRecords, + 0, + processingRecords.size, + System.currentTimeMillis() - startTime) + + processorTimerContext.stop() + }) + } + + processingRecords.asScala.iterator + } + + //1 bourrin + //process current records (enrichment) + // concatenates with old already processed + // => apply sessionization output all records + + //2 statefull intelligent + // If no state exist => init state with Es GroupSate (BESOIN UNIQUEMENT POUR REWIND car restart checkpoint devrait le sauvegarder ? => à tester) + // process current records then apply sessionization and save sessionization state in GroupSate + // WebSessions doit stoquer toutes les sous sessions accosiciés à un divolteId. Ainsi il peut mettre à jour la session correspondante aux évènements arrivants. + // + // on output tous les évènements qui ont été modifiés ainsi que toutes les sessions qui ont été modifiés. + private def sessionization(controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink], + streamContext: StreamContext, + timeOutDuration: Long) + (key: String, + value: Iterator[Record], + state: GroupState[Record]): Iterator[Record] = { + + val currentTimestamp = new Date().getTime + val inputRecords = value.toList + val allRecords = if (state.exists) state.get.getField(ALL_RECORDS).getRawValue.asInstanceOf[List[Record]] ++ inputRecords else inputRecords + // val recordChunks = allRecords.grouped(chunkSize).toList + + if (state.hasTimedOut || (state.exists && (currentTimestamp - state.get.getField(CHUNK_CREATION_TS).asLong()) >= timeOutDuration)) { + state.remove() + streamContext.getLogger.debug("TIMEOUT session " + key + ", flushing " + allRecords.size + " events.") + executePipeline(controllerServiceLookupSink, streamContext, allRecords.iterator) + } + else if (!state.exists) { + val newChunk = new StandardRecord("chunk_record") //Chunk(key, recordChunks.last) + newChunk.setObjectField(ALL_RECORDS, allRecords) + newChunk.setStringField(FieldDictionary.RECORD_KEY, key) + newChunk.setLongField(CHUNK_CREATION_TS, new Date().getTime) + streamContext.getLogger.debug("CREATE session " + key + " new session with " + allRecords.size + " events") + state.update(newChunk) + state.setTimeoutDuration(timeOutDuration) + executePipeline(controllerServiceLookupSink, streamContext, allRecords.iterator) + } + else { + val passedEvents = state.get + passedEvents.setObjectField(ALL_RECORDS, allRecords) + state.update(passedEvents) + state.setTimeoutDuration(timeOutDuration) + executePipeline(controllerServiceLookupSink, streamContext, allRecords.iterator) + } + } + + private val ALL_RECORDS = "all_records" + private val CHUNK_CREATION_TS = "chunk_creation_ts" + + + private def mappingFunction(controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink], + streamContext: StreamContext, + timeOutDuration: Long) + (key: String, + value: Iterator[Record], + state: GroupState[Record]): Iterator[Record] = { + + val currentTimestamp = new Date().getTime + val inputRecords = value.toList + val allRecords = if (state.exists) state.get.getField(ALL_RECORDS).getRawValue.asInstanceOf[List[Record]] ++ inputRecords else inputRecords + + if (state.hasTimedOut || (state.exists && (currentTimestamp - state.get.getField(CHUNK_CREATION_TS).asLong()) >= timeOutDuration)) { + state.remove() + streamContext.getLogger.debug("TIMEOUT session " + key + ", flushing " + allRecords.size + " events.") + executePipeline(controllerServiceLookupSink, streamContext, allRecords.iterator) + } + else if (!state.exists) { + val newChunk = new StandardRecord("chunk_record") //Chunk(key, recordChunks.last) + newChunk.setObjectField(ALL_RECORDS, allRecords) + newChunk.setStringField(FieldDictionary.RECORD_KEY, key) + newChunk.setLongField(CHUNK_CREATION_TS, new Date().getTime) + streamContext.getLogger.debug("CREATE session " + key + " new session with " + allRecords.size + " events") + state.update(newChunk) + state.setTimeoutDuration(timeOutDuration) + executePipeline(controllerServiceLookupSink, streamContext, allRecords.iterator) + } + else { + val passedEvents = state.get + passedEvents.setObjectField(ALL_RECORDS, allRecords) + state.update(passedEvents) + state.setTimeoutDuration(timeOutDuration) + executePipeline(controllerServiceLookupSink, streamContext, allRecords.iterator) + } + } + +} diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/StructuredStream.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/StructuredStream.scala index d5ebc9427..cc3b4223c 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/StructuredStream.scala +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/StructuredStream.scala @@ -28,157 +28,268 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.stream.spark.structured + package com.hurence.logisland.stream.spark.structured import java.util import java.util.Collections - import com.hurence.logisland.component.PropertyDescriptor -import com.hurence.logisland.engine.EngineContext import com.hurence.logisland.engine.spark.remote.PipelineConfigurationBroadcastWrapper -import com.hurence.logisland.stream.StreamProperties._ -import com.hurence.logisland.stream.spark.SparkRecordStream -import com.hurence.logisland.stream.spark.structured.provider.StructuredStreamProviderService -import com.hurence.logisland.stream.{AbstractRecordStream, StreamContext} -import com.hurence.logisland.util.spark._ -import org.apache.spark.broadcast.Broadcast +import com.hurence.logisland.record.Record +import com.hurence.logisland.runner.GlobalOptions +import com.hurence.logisland.stream.AbstractRecordStream +import com.hurence.logisland.stream.spark.structured.StructuredStream._ +import com.hurence.logisland.stream.spark.structured.provider.{StructuredStreamProviderServiceReader, StructuredStreamProviderServiceWriter} +import com.hurence.logisland.stream.spark.{SparkRecordStream, SparkStreamContext} +import com.hurence.logisland.validator.StandardValidators import org.apache.spark.groupon.metrics.UserMetricsSystem -import org.apache.spark.sql.{Dataset, SQLContext, SparkSession} -import org.apache.spark.streaming.StreamingContext -import org.slf4j.LoggerFactory - +import org.apache.spark.sql.streaming.{GroupStateTimeout, OutputMode} +import org.apache.spark.sql.{Dataset, SQLContext} class StructuredStream extends AbstractRecordStream with SparkRecordStream { - - protected var provider: StructuredStreamProviderService = _ - - - protected var appName: String = "" - @transient protected var ssc: StreamingContext = _ - @transient protected var streamContext: StreamContext = _ - protected var engineContext: EngineContext = _ - protected var controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink] = _ - protected var needMetricsReset = false - - - private val logger = LoggerFactory.getLogger(this.getClass) + @transient protected var sparkStreamContext: SparkStreamContext = _ + private var isReady = false + private var groupByField: String = _ + private var checkpointBasePath: String = _ + @transient protected var outputMode: OutputMode = _ override def getSupportedPropertyDescriptors() = { val descriptors: util.List[PropertyDescriptor] = new util.ArrayList[PropertyDescriptor] - descriptors.add(READ_STREAM_SERVICE_PROVIDER) - descriptors.add(READ_TOPICS_SERIALIZER) - descriptors.add(READ_TOPICS_KEY_SERIALIZER) descriptors.add(WRITE_STREAM_SERVICE_PROVIDER) - descriptors.add(WRITE_TOPICS_SERIALIZER) - descriptors.add(WRITE_TOPICS_KEY_SERIALIZER) - descriptors.add(GROUPBY) - descriptors.add(STATE_TIMEOUT_MS) - descriptors.add(CHUNK_SIZE) - + descriptors.add(GROUP_BY_FIELDS) + descriptors.add(SPARK_BASE_CHECKPOINT_PATH) + descriptors.add(SPARK_SQL_SHUFFLE_PARTITIONS) +// descriptors.add(STATE_TIMEOUT_DURATION_MS) +// descriptors.add(STATE_TIMEOUT_DURATION_MS) +// descriptors.add(STATEFULL_OUTPUT_MODE) Collections.unmodifiableList(descriptors) } - override def setup(appName: String, ssc: StreamingContext, streamContext: StreamContext, engineContext: EngineContext) = { - this.appName = appName - this.ssc = ssc - this.streamContext = streamContext - this.engineContext = engineContext + override def init(sparkStreamContext: SparkStreamContext) = { + super.init(sparkStreamContext.logislandStreamContext) + this.sparkStreamContext = sparkStreamContext + if (context.getPropertyValue(GROUP_BY_FIELDS).isSet) { + groupByField = context.getPropertyValue(GROUP_BY_FIELDS).asString() + } + if (context.getPropertyValue(SPARK_BASE_CHECKPOINT_PATH).isSet) { + if (GlobalOptions.checkpointLocation != null && GlobalOptions.checkpointLocation.nonEmpty) { + getLogger.warn("ignoring conf '{}' set to '{}' as " + + "checkpoint location has been specified to '{}' in command line", + Array[Object](SPARK_BASE_CHECKPOINT_PATH.getName, + context.getPropertyValue(SPARK_BASE_CHECKPOINT_PATH).asString(), + GlobalOptions.checkpointLocation)) + this.checkpointBasePath = GlobalOptions.checkpointLocation + } else { + this.checkpointBasePath = context.getPropertyValue(SPARK_BASE_CHECKPOINT_PATH).asString() + } + } +// context.getPropertyValue(STATEFULL_OUTPUT_MODE).asString() match { +// case "append" => outputMode = OutputMode.Append() +// case "update" => outputMode = OutputMode.Update() +// case "complete" => outputMode = OutputMode.Complete() +// } + isReady = true; } - override def getStreamContext(): StreamingContext = this.ssc + private def context = sparkStreamContext.logislandStreamContext + + private def sparkSession = sparkStreamContext.spark override def start() = { - if (ssc == null) + if (!isReady) throw new IllegalStateException("stream not initialized") - try { - val pipelineMetricPrefix = streamContext.getIdentifier /*+ ".partition" + partitionId*/ + "." + val pipelineMetricPrefix = context.getIdentifier /*+ ".partition" + partitionId*/ + "." val pipelineTimerContext = UserMetricsSystem.timer(pipelineMetricPrefix + "Pipeline.processing_time_ms").time() - controllerServiceLookupSink = ssc.sparkContext.broadcast( - ControllerServiceLookupSink(engineContext.getControllerServiceConfigurations) - ) - val spark = SparkSession.builder() - .config(this.ssc.sparkContext.getConf) - .getOrCreate() + sparkSession.sqlContext.setConf("spark.sql.shuffle.partitions", + context.getPropertyValue(SPARK_SQL_SHUFFLE_PARTITIONS).asString()) - spark.sqlContext.setConf("spark.sql.shuffle.partitions", "4")//TODO make this configurable - - - val controllerServiceLookup = controllerServiceLookupSink.value.getControllerServiceLookup() - streamContext.setControllerServiceLookup(controllerServiceLookup) - - - val readStreamService = streamContext.getPropertyValue(READ_STREAM_SERVICE_PROVIDER) - .asControllerService() - .asInstanceOf[StructuredStreamProviderService] + //TODO Je pense que ces deux ligne ne servent a rien + val controllerServiceLookup = sparkStreamContext.broadCastedControllerServiceLookupSink.value.getControllerServiceLookup() + context.setControllerServiceLookup(controllerServiceLookup) - //TODO stange way to update streamcontext, should'nt it be broadcasted ? + //TODO strange way to update streamcontext, should'nt it be broadcasted ? // moreover the streamcontext should always be the last updated one in this function for me. // If driver wants to change it, it should call setup which would use a broadcast value for example ? - // Unfortunately we should not attempt changes before having good unit test so that we do not broke streams - // while cleaning streams code... Indeed I am afraid the remote api engines use this strange behaviour here + // The remote api engines use this strange behaviour here // to change config on the fly when it should use the setup method (maybe using broadcast as well). // In this method start, the config should be considered already up to date in my opinion. - streamContext.getProcessContexts.clear() - streamContext.getProcessContexts.addAll( - PipelineConfigurationBroadcastWrapper.getInstance().get(streamContext.getIdentifier)) - - val readDF = readStreamService.load(spark, controllerServiceLookupSink, streamContext) - - val writeStreamService = streamContext.getPropertyValue(WRITE_STREAM_SERVICE_PROVIDER) + // So currently this stream is not compatible with remoteApi change conf on the fly... + // Anyway modification of a stream should be done at engine level !!!! stopping specific stream then init and restarting it with new StreamContext/ ProcessContext + sparkStreamContext.logislandStreamContext.getProcessContexts.clear() + sparkStreamContext.logislandStreamContext.getProcessContexts.addAll( + PipelineConfigurationBroadcastWrapper.getInstance().get(sparkStreamContext.logislandStreamContext.getIdentifier)) + + //Here we support multi source by making an union of each output dataset + val readDF = context.getPropertyValue(READ_STREAM_SERVICE_PROVIDER) + .asString().split(",").toSet[String] + .map(_.trim) + .map(serviceId => controllerServiceLookup.getControllerService(serviceId)) + .map(_.asInstanceOf[StructuredStreamProviderServiceReader]) + .map(_.read(sparkSession)) + .reduce((source1, source2) => source1.union(source2)) + + val transformedInputData: Dataset[Record] = transformInputData(readDF) + + val writerService = context.getPropertyValue(WRITE_STREAM_SERVICE_PROVIDER) .asControllerService() - .asInstanceOf[StructuredStreamProviderService] + .asInstanceOf[StructuredStreamProviderServiceWriter] + val dataStreamWriter = writerService + .write(transformedInputData, sparkStreamContext.broadCastedControllerServiceLookupSink) - // Write key-value data from a DataFrame to a specific Kafka topic specified in an option - val ds = writeStreamService.save(readDF, controllerServiceLookupSink, streamContext) - pipelineTimerContext.stop() + getLogger.info(s"Starting structured stream sink ${writerService.getIdentifier} from stream ${identifier} with checkpointLocation: $checkpointBasePath") + dataStreamWriter + .option("checkpointLocation", checkpointBasePath + "/" + identifier + "/" + writerService.getIdentifier) + .queryName(identifier + "#" + writerService.getIdentifier) + .start() + pipelineTimerContext.stop() } catch { case ex: Throwable => - logger.error("Error while processing the streaming query. ", ex) + getLogger.error("Error while processing the streaming query. ", ex) throw new IllegalStateException("Error while processing the streaming query", ex) } } - override def stop(): Unit - - = { + override def stop(): Unit = { super.stop() //stop the source - val thisStream = SQLContext.getOrCreate(getStreamContext().sparkContext).streams.active.find(stream => streamContext.getIdentifier.equals(stream.name)); + + val thisStream = SQLContext.getOrCreate(sparkSession.sparkContext).streams.active.find(stream => context.getIdentifier.equals(stream.name)); if (thisStream.isDefined) { - if (!getStreamContext().sparkContext.isStopped && thisStream.get.isActive) { + if (!sparkSession.sparkContext.isStopped && thisStream.get.isActive) { try { thisStream.get.stop() thisStream.get.awaitTermination() } catch { - case ex: Throwable => logger.warn(s"Stream ${streamContext.getIdentifier} may not have been correctly stopped") + case ex: Throwable => getLogger.warn(s"Stream ${context.getIdentifier} may not have been correctly stopped") } } } else { - logger.warn(s"Unable to find an active streaming query for stream ${streamContext.getIdentifier}") + getLogger.warn(s"Unable to find an active streaming query for stream ${context.getIdentifier}") } + this.isReady = false } -} + def transformInputData(readDF: Dataset[Record]): Dataset[Record] = { + implicit val recordEncoder = org.apache.spark.sql.Encoders.kryo[Record] + val pipelineMethods = new SparkPipeLineMethods(sparkStreamContext) + if (context.getPropertyValue(GROUP_BY_FIELDS).isSet) { + import readDF.sparkSession.implicits._ + readDF + .groupByKey(_.getField(groupByField).asString()) + .flatMapGroups((key, iterator) => { + pipelineMethods.executePipeline(key, iterator) + }) + } else { + readDF.mapPartitions(iterator => { + pipelineMethods.executePipeline(iterator) + }) + } + } +} +object StructuredStream { + // StructuredStream props + val READ_STREAM_SERVICE_PROVIDER: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("read.stream.service.provider") + .description("the controller service that gives connection information. " + + "(can be a comma separeted list for multisource)") + .required(true) + .identifiesControllerService(classOf[StructuredStreamProviderServiceReader]) + .addValidator(StandardValidators.COMMA_SEPARATED_LIST_VALIDATOR) + .build + + val WRITE_STREAM_SERVICE_PROVIDER: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("write.stream.service.provider") + .description("the controller service that gives connection information " + + "(multi sink not supported yet)") + .required(true) + .identifiesControllerService(classOf[StructuredStreamProviderServiceWriter]) + .build + + val GROUP_BY_FIELDS: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("group.by.fields") + .description("comma separated list of fields to group the partition by") + .addValidator(StandardValidators.COMMA_SEPARATED_LIST_VALIDATOR) + .required(false) + .build + + val IS_STATE_FULL: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("is.state.full") + .description("If the stream should be state full or not") + .addValidator(StandardValidators.INTEGER_VALIDATOR) + .required(true) + .defaultValue("false") + .build + + val PROCESSING_STATE_TIMEOUT_TYPE = "processing" + + val STATE_TIMEOUT_TYPE: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("state.timeout.type") + .description("the time out strategy to use for evicting cache.") + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .allowableValues(PROCESSING_STATE_TIMEOUT_TYPE) + .required(false) + .defaultValue(PROCESSING_STATE_TIMEOUT_TYPE) + .build + + val STATE_TIMEOUT_DURATION_MS: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("state.timeout.ms") + .description("the time in ms without data for specific key(s) before we invalidate the microbatch state when using "+ + STATE_TIMEOUT_TYPE + ": " + PROCESSING_STATE_TIMEOUT_TYPE + ". Default to 300000 (5 minutes)") + .addValidator(StandardValidators.LONG_VALIDATOR) + .required(false) + .defaultValue("300000") + .build + + val STATEFULL_OUTPUT_MODE: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("output.mode") + .description("output mode when using statefull stream. By default will use append") + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .required(false) + .allowableValues(StructuredStreamProviderServiceWriter.APPEND_MODE, StructuredStreamProviderServiceWriter.COMPLETE_MODE)//TODO + .defaultValue(StructuredStreamProviderServiceWriter.APPEND_MODE) + .build + + val STATE_WINDOW_FIELD: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("state.window.field") + .description("the field to use to calcul records to keep in cache (should be a timestamp field as long)") + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .required(false) + .build + + val STATE_WINDOW_TIMEOUT_MS: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("state.window.timeout.ms") + .description("the number of milliseconds for the window. We will save in cache only records in this timerange, " + + "the greater timestamp is used as upper bound. All record out of range will not be stored in cache for next batch." + + "In statefull mode, we transfer record in the given time range between batches.") + .addValidator(StandardValidators.LONG_VALIDATOR) + .required(false) + .build + + val SPARK_BASE_CHECKPOINT_PATH: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("spark.base.checkpoint.path") + .description("Path to store all checkpoint for all sink, they will be stored in" + + " ${spark.base.checkpoint.path}/${stream_id}/${service_id}. If using for instance azure filesystem to" + + " checkpoint, then use KafkaStreamProcessingEngine spark.custom.config.xxx property like to set filesystem" + + " credentials. Suppose you set something like `spark.base.checkpoint.path: wasbs://@.blob.core.windows.net/spark-checkpointing`" + + " in StructuredStream configuration, then you can set the matching SAS key under the root KafkaStreamProcessingEngine configuration" + + " with something like `spark.custom.config.fs.azure.account.key..blob.core.windows.net: +H5IuOtsebY7fO6QyyntmlRLe3G8Rv0jcye6kzE2Wz4NrU3IdB4Q8ocJY2ScY9cQrJNXxUg2WbYJPndMuQWUCQ==`") + .required(false) + .defaultValue("checkpoints") + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build; + + val SPARK_SQL_SHUFFLE_PARTITIONS: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("spark.sql.shuffle.partitions") + .description("Regular spark.sql.shuffle.partitions. Defaults to 200") + .required(false) + .defaultValue("200") + .addValidator(StandardValidators.POSITIVE_INTEGER_VALIDATOR) + .build; +} \ No newline at end of file diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/AzureEventHubProperties.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/AzureEventHubProperties.scala new file mode 100644 index 000000000..5662ea30e --- /dev/null +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/AzureEventHubProperties.scala @@ -0,0 +1,167 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.stream.spark.structured.provider + +import com.hurence.logisland.component.PropertyDescriptor +import com.hurence.logisland.validator.{StandardValidators, ValidationResult, Validator} + +object AzureEventHubProperties { + val EVENTHUBS_NAMESPACE: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("eventhubs.nameSpace") + .description("EventHubs namespace.") + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .required(true) + .build + + val EVENTHUBS_MAX_EVENTS_PER_TRIGGER: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("eventhubs.maxEventsPerTrigger") + .description("Rate limit on maximum number of events processed per trigger interval. The specified total number" + + " of events will be proportionally split across partitions of different volume.") + .addValidator(StandardValidators.LONG_VALIDATOR) + .required(false) + .build + + val EVENTHUBS_OPERATION_TIMEOUT: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("eventhubs.operationTimeout") + .description("The amount of time (in milliseconds) Event Hub API calls will be retried before throwing an exception.") + .addValidator(StandardValidators.LONG_VALIDATOR) + .required(false) + .build + + val EVENTHUBS_THREAD_POOL_SIZE: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("eventhubs.threadPoolSize") + .description("Sets the size of thread pool.") + .addValidator(StandardValidators.INTEGER_VALIDATOR) + .required(false) + .build + + val EVENTHUBS_READ_EVENT_HUB: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("eventhubs.read.eventHub") + .description("EventHub to read from.") + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .required(false) + .build + + val EVENTHUBS_READ_SAS_KEY_NAME: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("eventhubs.read.sasKeyName") + .description("SAS key name for read eventhub.") + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .required(false) + .build + + val EVENTHUBS_READ_SAS_KEY: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("eventhubs.read.sasKey") + .description("SAS key for read eventhub.") + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .required(false) + .build + + val EVENTHUBS_READ_CONSUMER_GROUP: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("eventhubs.read.consumerGroup") + .description("Consumer group name.") + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .required(false) + .build + + val EVENTHUBS_READ_POSITION_START_OF_STREAM = "start-of-stream" + val EVENTHUBS_READ_POSITION_END_OF_STREAM = "end-of-stream" + val EVENTHUBS_READ_POSITION_INSTANT_NOW = "instant-now" + + // Validator for EVENTHUBS_READ_POSITION + val EVENTHUBS_READ_POSITION_VALIDATOR: Validator = new Validator() { + override def validate(subject: String, value: String): ValidationResult = { + + // Accepted values are long, or start-of-stream or end-of-stream + var ok : Boolean = false + // Recognized string? + if ( (value == EVENTHUBS_READ_POSITION_START_OF_STREAM) || (value == EVENTHUBS_READ_POSITION_END_OF_STREAM) + || (value == EVENTHUBS_READ_POSITION_INSTANT_NOW) ) { + ok = true + } + // Long value? + try { + value.toLong + ok = true + } catch { + case e: Exception => // Not a long; + } + new ValidationResult.Builder().subject(subject).input(value).valid(ok) + .explanation(subject + " should be a long or " + EVENTHUBS_READ_POSITION_START_OF_STREAM + " or " + + EVENTHUBS_READ_POSITION_END_OF_STREAM + " or " + EVENTHUBS_READ_POSITION_INSTANT_NOW).build} + } + + val EVENTHUBS_READ_POSITION_TYPE_NAME = "eventhubs.read.positionType" + val EVENTHUBS_READ_POSITION: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("eventhubs.read.position") + .description("Start event position. This may be either " + EVENTHUBS_READ_POSITION_START_OF_STREAM + ", " + + EVENTHUBS_READ_POSITION_END_OF_STREAM + " or a long value. If this is a long value, " + + EVENTHUBS_READ_POSITION_TYPE_NAME + " should be filled to define the meaning of the value. Default value is " + + EVENTHUBS_READ_POSITION_END_OF_STREAM) + .addValidator(EVENTHUBS_READ_POSITION_VALIDATOR) + .required(false) + .defaultValue(EVENTHUBS_READ_POSITION_END_OF_STREAM) + .build + + val EVENTHUBS_READ_POSITION_TYPE_OFFSET = "offset" + val EVENTHUBS_READ_POSITION_TYPE_SEQUENCE_NUMBER = "sequenceNumber" + val EVENTHUBS_READ_POSITION_TYPE_EPOCH_MILLIS = "epochMillis" + + val EVENTHUBS_READ_POSITION_TYPE: PropertyDescriptor = new PropertyDescriptor.Builder() + .name(EVENTHUBS_READ_POSITION_TYPE_NAME) + .description("Specifies the type of the " + EVENTHUBS_READ_POSITION.getName + " value when it is a long value. " + + "This can be " + EVENTHUBS_READ_POSITION_TYPE_OFFSET + ", " + EVENTHUBS_READ_POSITION_TYPE_SEQUENCE_NUMBER + + " or " + EVENTHUBS_READ_POSITION_TYPE_EPOCH_MILLIS + ". Default value is " + EVENTHUBS_READ_POSITION_TYPE_OFFSET) + .allowableValues(EVENTHUBS_READ_POSITION_TYPE_OFFSET, EVENTHUBS_READ_POSITION_TYPE_SEQUENCE_NUMBER, + EVENTHUBS_READ_POSITION_TYPE_EPOCH_MILLIS) + .required(false) + .defaultValue(EVENTHUBS_READ_POSITION_TYPE_OFFSET) + .build + + val EVENTHUBS_READ_RECEIVER_TIMEOUT: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("eventhubs.read.receiverTimeout") + .description("The amount of time (in milliseconds) Event Hub receive calls will be retried before throwing an exception.") + .addValidator(StandardValidators.LONG_VALIDATOR) + .required(false) + .build + + val EVENTHUBS_READ_PREFETCH_COUNT: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("eventhubs.read.prefetchCount") + .description("Sets the prefetch count for the underlying receiver and controls how many events are received in advance.") + .addValidator(StandardValidators.INTEGER_VALIDATOR) + .required(false) + .build + + val EVENTHUBS_WRITE_EVENT_HUB: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("eventhubs.write.eventHub") + .description("EventHub to write to.") + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .required(false) + .build + + val EVENTHUBS_WRITE_SAS_KEY_NAME: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("eventhubs.write.sasKeyName") + .description("SAS key name for write eventhub.") + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .required(false) + .build + + val EVENTHUBS_WRITE_SAS_KEY: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("eventhubs.write.sasKey") + .description("SAS key for write eventhub.") + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .required(false) + .build +} diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/AzureEventHubsStructuredStreamProviderService.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/AzureEventHubsStructuredStreamProviderService.scala new file mode 100644 index 000000000..7d02411fe --- /dev/null +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/AzureEventHubsStructuredStreamProviderService.scala @@ -0,0 +1,429 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.stream.spark.structured.provider + +import java.time.{Duration, Instant} +import java.util +import java.util.Collections + +import com.hurence.logisland.annotation.documentation.CapabilityDescription +import com.hurence.logisland.annotation.lifecycle.OnEnabled +import com.hurence.logisland.component.{InitializationException, PropertyDescriptor} +import com.hurence.logisland.controller.{AbstractControllerService, ControllerServiceInitializationContext} +import com.hurence.logisland.record.{FieldDictionary, FieldType, Record, StandardRecord} +import com.hurence.logisland.serializer.{NoopSerializer, RecordSerializer, SerializerProvider} +import com.hurence.logisland.stream.StreamProperties._ +import com.hurence.logisland.stream.spark.structured.provider.AzureEventHubProperties.{EVENTHUBS_MAX_EVENTS_PER_TRIGGER, EVENTHUBS_NAMESPACE, EVENTHUBS_OPERATION_TIMEOUT, EVENTHUBS_READ_CONSUMER_GROUP, EVENTHUBS_READ_EVENT_HUB, EVENTHUBS_READ_POSITION, EVENTHUBS_READ_POSITION_END_OF_STREAM, EVENTHUBS_READ_POSITION_INSTANT_NOW, EVENTHUBS_READ_POSITION_START_OF_STREAM, EVENTHUBS_READ_POSITION_TYPE, EVENTHUBS_READ_POSITION_TYPE_EPOCH_MILLIS, EVENTHUBS_READ_POSITION_TYPE_OFFSET, EVENTHUBS_READ_POSITION_TYPE_SEQUENCE_NUMBER, EVENTHUBS_READ_PREFETCH_COUNT, EVENTHUBS_READ_RECEIVER_TIMEOUT, EVENTHUBS_READ_SAS_KEY, EVENTHUBS_READ_SAS_KEY_NAME, EVENTHUBS_THREAD_POOL_SIZE, EVENTHUBS_WRITE_EVENT_HUB, EVENTHUBS_WRITE_SAS_KEY, EVENTHUBS_WRITE_SAS_KEY_NAME} +import com.hurence.logisland.stream.spark.structured.provider.AzureEventHubsStructuredStreamProviderService._ +import com.hurence.logisland.util.spark.ControllerServiceLookupSink +import com.hurence.logisland.validator.StandardValidators +import org.apache.spark.broadcast.Broadcast +import org.apache.spark.eventhubs.{ConnectionStringBuilder, EventHubsConf, EventPosition} +import org.apache.spark.sql.{Dataset, SparkSession} + +/** + * Service to allow reading/writing from/to azure event hub with structured streams + * Developed using documentation at: + * https://github.com/Azure/azure-event-hubs-spark/blob/master/docs/structured-streaming-eventhubs-integration.md + */ +@CapabilityDescription("Provides a ways to use azure event hubs as input or output in StructuredStream streams") +class AzureEventHubsStructuredStreamProviderService extends AbstractControllerService + with StructuredStreamProviderServiceReader + with StructuredStreamProviderServiceWriter { + + var namespace : String = null + var readPositionString: String = null + var readPositionLong: Long = 0L + var readPositionIsString: Boolean = true + var readPositionType : String = null + var readEventHub : String = null + var readSasKeyName : String = null + var readSasKey : String = null + var readConsumerGroup : String = null + var writeEventHub : String = null + var writeSasKeyName : String = null + var writeSasKey : String = null + + var properties : Map[String, Any] = Map[String, Any]() + + var readValueSerializer: RecordSerializer = null + var writeValueSerializer: RecordSerializer = null + var writeKeySerializer: RecordSerializer = null + + + @OnEnabled + @throws[InitializationException] + override def init(context: ControllerServiceInitializationContext): Unit = { + super.init(context) + this.synchronized { + try { + + // namespace + if (!context.getPropertyValue(EVENTHUBS_NAMESPACE).isSet) { + throw new InitializationException("EventHubs service " + EVENTHUBS_NAMESPACE.getName + " not specified.") + } + namespace = context.getPropertyValue(EVENTHUBS_NAMESPACE).asString() + + // readEventHub and writeEventHub + if (!context.getPropertyValue(EVENTHUBS_READ_EVENT_HUB).isSet && + !context.getPropertyValue(EVENTHUBS_WRITE_EVENT_HUB).isSet) { + throw new InitializationException("EventHubs service must at least have a read or write event hub set.") + } + + if (context.getPropertyValue(EVENTHUBS_READ_EVENT_HUB).isSet) { + readEventHub = context.getPropertyValue(EVENTHUBS_READ_EVENT_HUB).asString() + } + + if (context.getPropertyValue(EVENTHUBS_WRITE_EVENT_HUB).isSet) { + writeEventHub = context.getPropertyValue(EVENTHUBS_WRITE_EVENT_HUB).asString() + } + + // maxEventPerTrigger + if (context.getPropertyValue(EVENTHUBS_MAX_EVENTS_PER_TRIGGER).isSet) { + properties += (EVENTHUBS_MAX_EVENTS_PER_TRIGGER.getName + -> context.getPropertyValue(EVENTHUBS_MAX_EVENTS_PER_TRIGGER).asLong().toLong) + } + + // operationTimeout + if (context.getPropertyValue(EVENTHUBS_OPERATION_TIMEOUT).isSet) { + properties += (EVENTHUBS_OPERATION_TIMEOUT.getName + -> context.getPropertyValue(EVENTHUBS_OPERATION_TIMEOUT).asLong().toLong) + } + + // threadPoolSize + if (context.getPropertyValue(EVENTHUBS_THREAD_POOL_SIZE).isSet) { + properties += (EVENTHUBS_THREAD_POOL_SIZE.getName + -> context.getPropertyValue(EVENTHUBS_THREAD_POOL_SIZE).asInteger().toInt) + } + + if ((readEventHub == null) && (writeEventHub == null)) { + throw new InitializationException("EventHubs service must at least have a read or write event hub set.") + } + + // Get read config properties + if (readEventHub != null) { + + // readPosition + val readPosition : Any = context.getPropertyValue(EVENTHUBS_READ_POSITION).asString() + + if ( (readPosition == EVENTHUBS_READ_POSITION_START_OF_STREAM) + || (readPosition == EVENTHUBS_READ_POSITION_END_OF_STREAM) + || (readPosition == EVENTHUBS_READ_POSITION_INSTANT_NOW)) { + readPositionIsString = true + readPositionString = readPosition.asInstanceOf[String] + } else { + readPositionIsString = false + readPositionLong = readPosition.asInstanceOf[String].toLong + } + + // readPositionType + readPositionType = context.getPropertyValue(EVENTHUBS_READ_POSITION_TYPE).asString() + + // readSasKeyName + if (!context.getPropertyValue(EVENTHUBS_READ_SAS_KEY_NAME).isSet) { + throw new InitializationException("EventHubs service read event hub requires " + + EVENTHUBS_READ_SAS_KEY_NAME.getName) + } + readSasKeyName = context.getPropertyValue(EVENTHUBS_READ_SAS_KEY_NAME).asString() + + // readSasKey + if (!context.getPropertyValue(EVENTHUBS_READ_SAS_KEY).isSet) { + throw new InitializationException("EventHubs service read event hub requires " + + EVENTHUBS_READ_SAS_KEY.getName) + } + readSasKey = context.getPropertyValue(EVENTHUBS_READ_SAS_KEY).asString() + + // readConsumerGroup + if (context.getPropertyValue(EVENTHUBS_READ_CONSUMER_GROUP).isSet) { + readConsumerGroup = context.getPropertyValue(EVENTHUBS_READ_CONSUMER_GROUP).asString() + } + + // readReceiverTimeout + if (context.getPropertyValue(EVENTHUBS_READ_RECEIVER_TIMEOUT).isSet) { + properties += (EVENTHUBS_READ_RECEIVER_TIMEOUT.getName + -> context.getPropertyValue(EVENTHUBS_READ_RECEIVER_TIMEOUT).asInteger().toInt) + } + + // readPrefetchCount + if (context.getPropertyValue(EVENTHUBS_READ_PREFETCH_COUNT).isSet) { + properties += (EVENTHUBS_READ_PREFETCH_COUNT.getName + -> context.getPropertyValue(EVENTHUBS_READ_PREFETCH_COUNT).asInteger().toInt) + } + } + + // Get write config properties + if (writeEventHub != null) { + + // writeSasKeyName + if (!context.getPropertyValue(EVENTHUBS_WRITE_SAS_KEY_NAME).isSet) { + throw new InitializationException("EventHubs service write event hub requires " + + EVENTHUBS_WRITE_SAS_KEY_NAME.getName) + } + writeSasKeyName = context.getPropertyValue(EVENTHUBS_WRITE_SAS_KEY_NAME).asString() + + // writeSasKey + if (!context.getPropertyValue(EVENTHUBS_WRITE_SAS_KEY).isSet) { + throw new InitializationException("EventHubs service write event hub requires " + + EVENTHUBS_WRITE_SAS_KEY.getName) + } + writeSasKey = context.getPropertyValue(EVENTHUBS_WRITE_SAS_KEY).asString() + } + readValueSerializer = SerializerProvider.getSerializer( + context.getPropertyValue(READ_VALUE_SERIALIZER).asString, + context.getPropertyValue(AVRO_READ_VALUE_SCHEMA).asString) + + writeValueSerializer = SerializerProvider.getSerializer( + context.getPropertyValue(WRITE_VALUE_SERIALIZER).asString, + context.getPropertyValue(AVRO_WRITE_VALUE_SCHEMA).asString) + + writeKeySerializer = SerializerProvider.getSerializer( + context.getPropertyValue(WRITE_KEY_SERIALIZER).asString, null) + } catch { + case e: Exception => + throw new InitializationException(e) + } + } + } + + /** + * Allows subclasses to register which property descriptor objects are + * supported. + * + * @return PropertyDescriptor objects this processor currently supports + */ + override def getSupportedPropertyDescriptors() = { + val descriptors = new util.ArrayList[PropertyDescriptor] + descriptors.add(EVENTHUBS_NAMESPACE) + descriptors.add(EVENTHUBS_MAX_EVENTS_PER_TRIGGER) + descriptors.add(EVENTHUBS_OPERATION_TIMEOUT) + descriptors.add(EVENTHUBS_THREAD_POOL_SIZE) + descriptors.add(EVENTHUBS_READ_EVENT_HUB) + descriptors.add(EVENTHUBS_READ_SAS_KEY_NAME) + descriptors.add(EVENTHUBS_READ_SAS_KEY) + descriptors.add(EVENTHUBS_READ_CONSUMER_GROUP) + descriptors.add(EVENTHUBS_READ_POSITION) + descriptors.add(EVENTHUBS_READ_POSITION_TYPE) + descriptors.add(EVENTHUBS_READ_RECEIVER_TIMEOUT) + descriptors.add(EVENTHUBS_READ_PREFETCH_COUNT) + descriptors.add(EVENTHUBS_WRITE_EVENT_HUB) + descriptors.add(EVENTHUBS_WRITE_SAS_KEY_NAME) + descriptors.add(EVENTHUBS_WRITE_SAS_KEY) + descriptors.add(READ_VALUE_SERIALIZER) + descriptors.add(AVRO_READ_VALUE_SCHEMA) + descriptors.add(WRITE_VALUE_SERIALIZER) + descriptors.add(AVRO_WRITE_VALUE_SCHEMA) + descriptors.add(WRITE_KEY_SERIALIZER) + Collections.unmodifiableList(descriptors) + } + + /** + * Applies the defined service configuration to the passed event hub configuration object + * @param eventHubsConf + */ + def applyConfig(eventHubsConf: EventHubsConf, forRead : Boolean): Unit = { + + if (forRead) { + + /** + * Properties only for read + */ + + if (readConsumerGroup != null) { + eventHubsConf.setConsumerGroup(readConsumerGroup) + } + + if (readPositionIsString) { + // Read position is a string + readPositionString match { + case EVENTHUBS_READ_POSITION_START_OF_STREAM => + eventHubsConf.setStartingPosition(EventPosition.fromStartOfStream) + case EVENTHUBS_READ_POSITION_END_OF_STREAM => + eventHubsConf.setStartingPosition(EventPosition.fromEndOfStream) + case EVENTHUBS_READ_POSITION_INSTANT_NOW => + eventHubsConf.setStartingPosition(EventPosition.fromEnqueuedTime(Instant.now())) + case _ => throw new IllegalStateException("Unsupported read position string value: " + readPositionString) + } + } else { + // Read position is a long, let's use it according to its meaning defined in readPositionType + readPositionType match { + case EVENTHUBS_READ_POSITION_TYPE_OFFSET => + eventHubsConf.setStartingPosition(EventPosition.fromOffset(readPositionLong.toString)) + case EVENTHUBS_READ_POSITION_TYPE_SEQUENCE_NUMBER => + eventHubsConf.setStartingPosition(EventPosition.fromSequenceNumber(readPositionLong)) + case EVENTHUBS_READ_POSITION_TYPE_EPOCH_MILLIS => + eventHubsConf.setStartingPosition(EventPosition.fromEnqueuedTime(Instant.ofEpochMilli(readPositionLong))) + case _ => throw new IllegalStateException("Unsupported read position type value: " + readPositionType) + } + } + + // readReceiverTimeout + val optionLong = properties.get(EVENTHUBS_READ_RECEIVER_TIMEOUT.getName).asInstanceOf[Option[Long]] + if (optionLong.isDefined) { + eventHubsConf.setReceiverTimeout(Duration.ofMillis(optionLong.get)) + } + + // readPrefetchCount + val optionInt : Option[Int] = properties.get(EVENTHUBS_READ_PREFETCH_COUNT.getName).asInstanceOf[Option[Int]] + if (optionInt.isDefined) { + eventHubsConf.setPrefetchCount(optionInt.get) + } + } + + /** + * Properties for both read or write + */ + + // maxEventPerTrigger + var optionLong : Option[Long] = properties.get(EVENTHUBS_MAX_EVENTS_PER_TRIGGER.getName).asInstanceOf[Option[Long]] + if (optionLong.isDefined) { + eventHubsConf.setMaxEventsPerTrigger(optionLong.get) + } + + // operationTimeout + optionLong = properties.get(EVENTHUBS_OPERATION_TIMEOUT.getName).asInstanceOf[Option[Long]] + if (optionLong.isDefined) { + eventHubsConf.setOperationTimeout(Duration.ofMillis(optionLong.get)) + } + + // maxEventPerTrigger + val optionInt : Option[Int] = properties.get(EVENTHUBS_THREAD_POOL_SIZE.getName).asInstanceOf[Option[Int]] + if (optionInt.isDefined) { + eventHubsConf.setThreadPoolSize(optionInt.get) + } + } + + /** + * create a streaming DataFrame that represents data received + * + * @param spark + * @return DataFrame currently loaded + */ + override def read(spark: SparkSession) = { + import spark.implicits._ + + implicit val recordEncoder = org.apache.spark.sql.Encoders.kryo[Record] + + val connectionString = ConnectionStringBuilder() + .setNamespaceName(namespace) + .setEventHubName(readEventHub) + .setSasKeyName(readSasKeyName) + .setSasKey(readSasKey) + .build + + val eventHubsConf = EventHubsConf(connectionString) + applyConfig(eventHubsConf, true) + + val options = eventHubsConf.toMap + val optionsString = options.toString() + + getLogger.info(s"Starting azure event hubs structured stream on event hub $readEventHub in $namespace namespace with configuration:\n$optionsString") + val df = spark.readStream + .format("eventhubs") + .options(options) + .load() + .selectExpr("CAST(offset AS STRING)", "CAST(body AS BINARY)") + .as[(String, Array[Byte])] + .flatMap(r => { + readValueSerializer match { + case sr: NoopSerializer => Some(new StandardRecord(readEventHub) + .setField(FieldDictionary.RECORD_KEY, FieldType.STRING, r._1) + .setField(FieldDictionary.RECORD_VALUE, FieldType.BYTES, r._2)) + case _ => SerializingTool.deserializeRecords(readValueSerializer, r._2) + } + }) + df + } + + /** + * create a streaming DataFrame that represents data received + * + * @return DataFrame currently loaded + */ + override def write(df: Dataset[Record], controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink]) = { + + import df.sparkSession.implicits._ + + val connectionString = ConnectionStringBuilder() + .setNamespaceName(namespace) + .setEventHubName(writeEventHub) + .setSasKeyName(writeSasKeyName) + .setSasKey(writeSasKey) + .build + + val eventHubsConf = EventHubsConf(connectionString) + applyConfig(eventHubsConf, false) + + implicit val recordEncoder = org.apache.spark.sql.Encoders.kryo[Record] + + getLogger.info(s"Starting azure event hubs structured stream to event hub $writeEventHub in " + + s"$namespace namespace") + + // Write key-value data from a DataFrame to a specific event hub specified in an option + df.mapPartitions(record => record.map(record => SerializingTool.serializeRecords(writeValueSerializer, writeKeySerializer, record))) + .map(r => { + (r.getField(FieldDictionary.RECORD_KEY).asString(), r.getField(FieldDictionary.RECORD_VALUE).asBytes()) + }) + .as[(String, Array[Byte])] + .toDF("partitionKey", "body") + .writeStream + .format("eventhubs") + .options(eventHubsConf.toMap) + } + +} + +object AzureEventHubsStructuredStreamProviderService { + val READ_VALUE_SERIALIZER: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("read.value.serializer") + .description("the serializer to use to deserialize value of topic messages as record") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, EXTENDED_JSON_SERIALIZER, AVRO_SERIALIZER, BYTESARRAY_SERIALIZER, STRING_SERIALIZER, NO_SERIALIZER, KURA_PROTOCOL_BUFFER_SERIALIZER) + .defaultValue(NO_SERIALIZER.getValue) + .build + + val AVRO_READ_VALUE_SCHEMA: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("read.value.schema") + .description("the avro schema definition") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build + + val WRITE_VALUE_SERIALIZER: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("write.value.serializer") + .description("the serializer to use to serialize records into value topic messages") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, EXTENDED_JSON_SERIALIZER, AVRO_SERIALIZER, BYTESARRAY_SERIALIZER, STRING_SERIALIZER, NO_SERIALIZER, KURA_PROTOCOL_BUFFER_SERIALIZER) + .defaultValue(NO_SERIALIZER.getValue) + .build + + val AVRO_WRITE_VALUE_SCHEMA: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("write.value.schema") + .description("the avro schema definition") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build + + val WRITE_KEY_SERIALIZER: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("write.key.serializer") + .description("The key serializer to use") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, EXTENDED_JSON_SERIALIZER, AVRO_SERIALIZER, BYTESARRAY_SERIALIZER, STRING_SERIALIZER, NO_SERIALIZER, KURA_PROTOCOL_BUFFER_SERIALIZER) + .defaultValue(NO_SERIALIZER.getValue) + .build +} diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/ConsoleStructuredStreamProviderService.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/ConsoleStructuredStreamProviderService.scala index af129a23d..7e3f416e0 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/ConsoleStructuredStreamProviderService.scala +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/ConsoleStructuredStreamProviderService.scala @@ -13,21 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ package com.hurence.logisland.stream.spark.structured.provider import java.util @@ -38,34 +23,21 @@ import com.hurence.logisland.annotation.lifecycle.OnEnabled import com.hurence.logisland.component.{InitializationException, PropertyDescriptor} import com.hurence.logisland.controller.{AbstractControllerService, ControllerServiceInitializationContext} import com.hurence.logisland.record.Record -import com.hurence.logisland.serializer.SerializerProvider -import com.hurence.logisland.stream.StreamContext -import com.hurence.logisland.stream.StreamProperties.{AVRO_OUTPUT_SCHEMA, WRITE_TOPICS_KEY_SERIALIZER, WRITE_TOPICS_SERIALIZER} +import com.hurence.logisland.stream.spark.structured.provider.ConsoleStructuredStreamProviderService.{NUM_ROWS_TO_SHOW, TRUNCATE_OUTPUT} +import com.hurence.logisland.stream.spark.structured.provider.StructuredStreamProviderServiceWriter.OUTPUT_MODE import com.hurence.logisland.util.spark.ControllerServiceLookupSink import com.hurence.logisland.validator.StandardValidators import org.apache.spark.broadcast.Broadcast -import org.apache.spark.sql.streaming.{DataStreamWriter, OutputMode, StreamingQuery} -import org.apache.spark.sql.{Dataset, ForeachWriter, SparkSession} +import org.apache.spark.sql.streaming.StreamingQuery +import org.apache.spark.sql.{Dataset, Encoders} @CapabilityDescription("Provide a ways to print output in console in a StructuredStream streams") -class ConsoleStructuredStreamProviderService extends AbstractControllerService with StructuredStreamProviderService { - - val NUM_ROWS_TO_SHOW: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("rows") - .description("Number of rows to print every trigger (default: 20 see spark documentation)") - .addValidator(StandardValidators.POSITIVE_LONG_VALIDATOR) - .required(true) - .build - - val TRUNCATE_OUTPUT: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("truncate") - .description("Whether to truncate the output if too long (default: true see spark documentation) ") - .addValidator(StandardValidators.BOOLEAN_VALIDATOR) - .required(false) - .build +class ConsoleStructuredStreamProviderService extends AbstractControllerService + with StructuredStreamProviderServiceWriter { var numRows: Option[Long] = _ var truncate: Option[Boolean] = _ + var outputMode: Option[String] = _ @OnEnabled @throws[InitializationException] @@ -83,6 +55,11 @@ class ConsoleStructuredStreamProviderService extends AbstractControllerService w } else { truncate = None } + if (context.getPropertyValue(OUTPUT_MODE).isSet) { + outputMode = Some(context.getPropertyValue(OUTPUT_MODE).asString()) + } else { + outputMode = None + } } catch { case e: Exception => throw new InitializationException(e) @@ -98,79 +75,21 @@ class ConsoleStructuredStreamProviderService extends AbstractControllerService w */ override def getSupportedPropertyDescriptors() = { val descriptors: util.List[PropertyDescriptor] = new util.ArrayList[PropertyDescriptor] - + descriptors.add(OUTPUT_MODE) + descriptors.add(TRUNCATE_OUTPUT) + descriptors.add(NUM_ROWS_TO_SHOW) Collections.unmodifiableList(descriptors) } /** * create a streaming DataFrame that represents data received * - * @param spark - * @param streamContext - * @return DataFrame currently loaded - */ - override def read(spark: SparkSession, streamContext: StreamContext) = { - throw new IllegalArgumentException("ConsoleStructuredStreamProviderService class does not support read operation yet"); - } - - /** - * create a streaming DataFrame that represents data received - * - * @param streamContext * @return DataFrame currently loaded */ - override def save(df: Dataset[Record], controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink], streamContext: StreamContext): StreamingQuery = { - - implicit val recordEncoder = org.apache.spark.sql.Encoders.kryo[Record] - - // make sure controller service lookup won't be serialized !! - streamContext.setControllerServiceLookup(null) - - // create serializer - val serializer = SerializerProvider.getSerializer( - streamContext.getPropertyValue(WRITE_TOPICS_SERIALIZER).asString, - streamContext.getPropertyValue(AVRO_OUTPUT_SCHEMA).asString) - - // create serializer - val keySerializer = SerializerProvider.getSerializer( - streamContext.getPropertyValue(WRITE_TOPICS_KEY_SERIALIZER).asString, null) - - // do the parallel processing - val df2 = df.mapPartitions(record => record.map(record => serializeRecords(serializer, keySerializer, record))) - - - write(df2, controllerServiceLookupSink, streamContext) - .queryName(streamContext.getIdentifier) - // .outputMode("update") - .foreach(new ForeachWriter[Record] { - def open(partitionId: Long, version: Long): Boolean = { - // open connection - true - } - - def process(record: Record) = { - println(record) - // write string to connection - } - - def close(errorOrNull: Throwable): Unit = { - // close the connection - } - }).start() - - // .processAllAvailable() - - } - /** - * create a streaming DataFrame that represents data received - * - * @param streamContext - * @return DataFrame currently loaded - */ - override def write(df: Dataset[Record], controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink], streamContext: StreamContext): DataStreamWriter[Record] = { -// implicit val myObjEncoder = org.apache.spark.sql.Encoders.kryo[Record] - - val dataStreamWriter = df.writeStream + override def write(df: Dataset[Record], controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink]) = { + val dataStreamWriter = df + .map(_.toString())(Encoders.STRING) + .writeStream .format("console") if (numRows.isDefined) { dataStreamWriter.option("numRows", numRows.get) @@ -178,6 +97,25 @@ class ConsoleStructuredStreamProviderService extends AbstractControllerService w if (truncate.isDefined) { dataStreamWriter.option("truncate", truncate.get) } + if (outputMode.isDefined) { + dataStreamWriter.outputMode(outputMode.get) + } dataStreamWriter } } + +object ConsoleStructuredStreamProviderService { + val NUM_ROWS_TO_SHOW: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("rows") + .description("Number of rows to print every trigger (default: 20 see spark documentation)") + .addValidator(StandardValidators.POSITIVE_LONG_VALIDATOR) + .required(false) + .build + + val TRUNCATE_OUTPUT: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("truncate") + .description("Whether to truncate the output if too long (default: true see spark documentation) ") + .addValidator(StandardValidators.BOOLEAN_VALIDATOR) + .required(false) + .build +} diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/ElasticSearchStructuredStreamSinkProviderService.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/ElasticSearchStructuredStreamSinkProviderService.scala new file mode 100644 index 000000000..922e8dde9 --- /dev/null +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/ElasticSearchStructuredStreamSinkProviderService.scala @@ -0,0 +1,295 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.stream.spark.structured.provider + +import com.databricks.spark.avro.SchemaConverters + +import java.util +import java.util.Collections +import com.hurence.logisland.annotation.documentation.CapabilityDescription +import com.hurence.logisland.annotation.lifecycle.OnEnabled +import com.hurence.logisland.component.{InitializationException, PropertyDescriptor} +import com.hurence.logisland.controller.{AbstractControllerService, ControllerServiceInitializationContext} +import com.hurence.logisland.record.{Field, FieldType, Record} +import com.hurence.logisland.stream.spark.structured.provider.ElasticSearchStructuredStreamSinkProviderService._ +import com.hurence.logisland.stream.spark.structured.provider.StructuredStreamProviderServiceWriter.{APPEND_MODE, COMPLETE_MODE, UPDATE_MODE} +import com.hurence.logisland.util.spark.ControllerServiceLookupSink +import com.hurence.logisland.validator.StandardValidators +import org.apache.spark.broadcast.Broadcast +import org.apache.spark.sql.catalyst.encoders.RowEncoder +import org.apache.spark.sql.types.{BooleanType, DataType, StringType, StructField, StructType} +import org.apache.spark.sql.{Dataset, Row, RowFactory} + +import scala.collection.JavaConversions._ +import org.apache.avro.Schema + +/** + * Service to allow writing to elasticsearch with structured streams + */ +@CapabilityDescription("Provides a ways to use elasticsearch as output in StructuredStream streams") +class ElasticSearchStructuredStreamSinkProviderService extends AbstractControllerService + with StructuredStreamProviderServiceWriter { + + var esNodes : String = _ + var indexName : String = _ + var esOptions : Map[String, String] = Map[String, String]() + var outputSchema : StructType = _ + var outputMode: String = _ + var debug: Boolean = false + + @OnEnabled + @throws[InitializationException] + override def init(context: ControllerServiceInitializationContext): Unit = { + super.init(context) + this.synchronized { + try { + // Es nodes (check this mandatory ES property (es.nodes) + if (!context.getPropertyValue(ES_NODES).isSet) { + throw new InitializationException(ES_NODES.getName + " not specified.") + } + esNodes = context.getPropertyValue(ES_NODES).asString() + + // Index name (check this mandatory ES property (es.resource) + if (!context.getPropertyValue(ES_RESOURCE).isSet) { + throw new InitializationException(ES_RESOURCE.getName + " not specified.") + } + indexName = context.getPropertyValue(ES_RESOURCE).asString() + + // Output schema + if (!context.getPropertyValue(OUTPUT_SCHEMA).isSet) { + throw new InitializationException(OUTPUT_SCHEMA.getName + " not specified.") + } + outputSchema = parseSchema(context) + + // Output mode + outputMode = context.getPropertyValue(OUTPUT_MODE).asString() + + debug = context.getPropertyValue(DEBUG).asBoolean() + + handleEsDynamicProperties(context.getProperties) + } catch { + case e: Exception => + throw new InitializationException(e) + } + } + } + + /** + * Converts the possed avro schema string into a spark scql schema + * @param avroSchemaString + * @return + */ + @throws[InitializationException] + private def parseSchema(context: ControllerServiceInitializationContext) : StructType = { + + // Load and parse avro schema string + val avroSchemaString : String = context.getPropertyValue(OUTPUT_SCHEMA).asString() + var schema : Schema = null + val parser: Schema.Parser = new Schema.Parser + try schema = parser.parse(avroSchemaString) + catch { + case e: Exception => + throw new InitializationException("Avro schema parsing error: " + e.getMessage + ": " + e.toString) + } + + // Convert avro schema into spark SQL schema (StructType) + var structType : StructType = new StructType() + for (field <- schema.getFields) { + structType = structType.add(field.name, SchemaConverters.toSqlType(field.schema).dataType) + } + structType + } + + /** + * Allows subclasses to register which property descriptor objects are + * supported. + * + * @return PropertyDescriptor objects this processor currently supports + */ + override def getSupportedPropertyDescriptors() = { + val descriptors = new util.ArrayList[PropertyDescriptor] + descriptors.add(ES_NODES) + descriptors.add(ES_RESOURCE) + descriptors.add(OUTPUT_SCHEMA) + descriptors.add(OUTPUT_MODE) + descriptors.add(DEBUG) + Collections.unmodifiableList(descriptors) + } + + override def getSupportedDynamicPropertyDescriptor(propertyDescriptorName: String): PropertyDescriptor = { + + // Support any custom es configuration described here: + // Inspired from https://www.elastic.co/guide/en/elasticsearch/hadoop/current/configuration.html + if (propertyDescriptorName.startsWith(ES_CONFIG_PREFIX)) { + return new PropertyDescriptor.Builder() + .name(propertyDescriptorName) + .expressionLanguageSupported(false) + .required(false) + .dynamic(true) + .build + } + return null + } + + /** + * Configure the ES write stream + * + * @return DataFrame currently loaded + */ + override def write(ds: Dataset[Record], controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink]) = { + + getLogger.info(s"Will write stream to elasticsearch $esNodes in " + + s"$indexName index") + + // Transform the dataset of Records into a dataset of Rows with the loaded + // schema + var rowDs : Dataset[Row] = ds.map( (record:Record) => { + val values = outputSchema.map( (structField : StructField) => { + val field : Field = record.getField(structField.name) + var value : Object = null + if (field != null) { + field.getType match { + case FieldType.MAP => value = convertMapFieldToRow(field, outputSchema) + case _ => value = field.getRawValue + } + // If debug mode, perform some checking on type matching to help finding + // wrong avro schema definition in output.schema + if (debug) { + checkTypes(structField.name, field.getType, value, structField.dataType) + } + } else { + // Field si absent from , set null value + } + value + }) + + RowFactory.create(values:_*) + })(RowEncoder(outputSchema)) + + rowDs.writeStream + .format(ES_FORMAT) + .outputMode(outputMode) + // Apply all es.* dynamic options + .options(esOptions) + } + /** + * Converts a record Map field to a Row matching the declared schema for the + * Map field + */ + private def convertMapFieldToRow(mapField : Field, outputSchema : StructType) : Row = { + val row : Row = null + // Extract map schema from output schema + val mapFieldName : String = mapField.getName + val mapSchema : StructType = outputSchema.fields(outputSchema.fieldIndex(mapFieldName)).dataType.asInstanceOf[StructType] + val mapFields = mapField.getRawValue.asInstanceOf[util.HashMap[String, Object]] + // Iterate through schema map (record) fields to construct the expected row + val values = mapSchema.map( (structField : StructField) => { + val fieldName = structField.name + mapFields.get(fieldName) + }) + RowFactory.create(values:_*) + } + + /** + * Check record field type vs avro schema + * @param value + */ + private def checkTypes(fieldName : String, fieldType: FieldType, value : Object, dataType: DataType) = { + + fieldType match { + case FieldType.STRING => { + if (!dataType.isInstanceOf[StringType]) { + getLogger.error("Record field " + fieldName + " is of type " + FieldType.STRING + + " but output schema expects " + dataType + ": " + value) + } + } + case FieldType.BOOLEAN => { + if (!dataType.isInstanceOf[BooleanType]) { + getLogger.error("Record field " + fieldName + " is of type " + FieldType.BOOLEAN + + " but output schema expects " + dataType + ": " + value) + } + } + case _ => // No check + } + } + + // Any es.* property described at https://www.elastic.co/guide/en/elasticsearch/hadoop/current/configuration.html + // is handled here + protected def handleEsDynamicProperties(properties : java.util.Map[PropertyDescriptor, String]) = { + + properties.foreach(propertyAndValue => { + + val propertyDescriptor: PropertyDescriptor = propertyAndValue._1 + val esConfigKey: String = propertyDescriptor.getName + // Handle any dynamic property of the form 'es.*: someValue' properties + // which will be passed as DataStreamWriter option + if (esConfigKey.startsWith(ES_CONFIG_PREFIX)) { + val customSparkConfigKey: String = esConfigKey.substring(ES_CONFIG_PREFIX.length) + if (customSparkConfigKey.length > 0) { // Ignore silly 'es.: missing_custom_key' property + val esConfigValue: String = propertyAndValue._2 + esOptions += (esConfigKey -> esConfigValue) + } + } + }) + } +} + +object ElasticSearchStructuredStreamSinkProviderService { + + val ES_FORMAT : String = "org.elasticsearch.spark.sql" + val ES_CONFIG_PREFIX = "es." + + // All ES properties are documented here: + // https://www.elastic.co/guide/en/elasticsearch/hadoop/current/configuration.html + + val ES_NODES: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("es.nodes") + .description("A comma-separated list of ElasticSearch hosts (host[:port],host2[:port2], etc.)") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build + + val ES_RESOURCE: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("es.resource") // Could also specify .option("path", indexName) instead + .description("The index to write data to. It is of the form: indexName[/typeName]") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build + + val OUTPUT_SCHEMA: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("output.schema") + .description("The output avro schema definition") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build + + // Redefine here as we want the default to be APPEND_MODE, not UPDATE_MODE + val OUTPUT_MODE: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("output.mode") + .description("Output mode for the streaming sink.") + .defaultValue(APPEND_MODE) + .allowableValues(APPEND_MODE, COMPLETE_MODE, UPDATE_MODE) + .required(false) + .build + + val DEBUG: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("debug") + .description("Whether to enable debug logs or not") + .required(false) + .defaultValue("false") + .addValidator(StandardValidators.BOOLEAN_VALIDATOR) + .build +} diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/KafkaProperties.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/KafkaProperties.scala new file mode 100644 index 000000000..ed62842a0 --- /dev/null +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/KafkaProperties.scala @@ -0,0 +1,296 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.stream.spark.structured.provider + +import com.hurence.logisland.component.{AllowableValue, PropertyDescriptor} +import com.hurence.logisland.stream.StreamProperties._ +import com.hurence.logisland.validator.StandardValidators + +object KafkaProperties { + val NONE_TOPIC = "none" + + val DEFAULT_RAW_TOPIC = new AllowableValue("logisland_raw", "default raw topic", "the incoming non structured topic") + val DEFAULT_RECORDS_TOPIC = new AllowableValue("logisland_records", "default events topic", "the outgoing structured topic") + val DEFAULT_ERRORS_TOPIC = new AllowableValue("logisland_errors", "default raw topic", "the outgoing structured error topic") + val DEFAULT_METRICS_TOPIC = new AllowableValue("logisland_metrics", "default metrics topic", "the topic to place processing metrics") + + val INPUT_TOPICS: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.input.topics") + .description("A comma-separated list of topics. The topic list to subscribe.") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build + + val INPUT_TOPIC_PATTERN: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.input.topics.pattern") + .description("Java regex string. The pattern used to subscribe to topic(s).") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build + + val OUTPUT_TOPICS: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.output.topics") + .description("Sets the output Kafka topic name") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build + + val ERROR_TOPICS: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.error.topics") + .description("Sets the error topics Kafka topic name") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue(DEFAULT_ERRORS_TOPIC.getValue) + .build + + val INPUT_TOPICS_PARTITIONS: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.input.topics.partitions") + .description("if autoCreate is set to true, this will set the number of partition at topic creation time") + .required(false) + .addValidator(StandardValidators.INTEGER_VALIDATOR) + .defaultValue("20") + .build + + val OUTPUT_TOPICS_PARTITIONS: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.output.topics.partitions") + .description("if autoCreate is set to true, this will set the number of partition at topic creation time") + .required(false) + .addValidator(StandardValidators.INTEGER_VALIDATOR) + .defaultValue("20") + .build + + val INPUT_SERIALIZER: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.input.topics.serializer") + .description("") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, EXTENDED_JSON_SERIALIZER, AVRO_SERIALIZER, BYTESARRAY_SERIALIZER, STRING_SERIALIZER, NO_SERIALIZER) + .defaultValue(KRYO_SERIALIZER.getValue) + .build + + val OUTPUT_SERIALIZER: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.output.topics.serializer") + .description("") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, EXTENDED_JSON_SERIALIZER, AVRO_SERIALIZER, BYTESARRAY_SERIALIZER, STRING_SERIALIZER, NO_SERIALIZER) + .defaultValue(KRYO_SERIALIZER.getValue) + .build + + val ERROR_SERIALIZER: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.error.topics.serializer") + .description("") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue(JSON_SERIALIZER.getValue) + .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, EXTENDED_JSON_SERIALIZER, AVRO_SERIALIZER, BYTESARRAY_SERIALIZER, STRING_SERIALIZER, NO_SERIALIZER) + .build + + + val KAFKA_TOPIC_AUTOCREATE: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.topic.autoCreate") + .description("define wether a topic should be created automatically if not already exists") + .required(false) + .addValidator(StandardValidators.BOOLEAN_VALIDATOR) + .defaultValue("true") + .build + + val KAFKA_TOPIC_DEFAULT_PARTITIONS: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.topic.default.partitions") + .description("if autoCreate is set to true, this will set the number of partition at topic creation time") + .required(false) + .addValidator(StandardValidators.INTEGER_VALIDATOR) + .defaultValue("3") + .build + + val KAFKA_TOPIC_DEFAULT_REPLICATION_FACTOR: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.topic.default.replicationFactor") + .description("if autoCreate is set to true, this will set the number of replica for each partition at topic creation time") + .required(false) + .addValidator(StandardValidators.INTEGER_VALIDATOR) + .defaultValue("1") + .build + + val KAFKA_METADATA_BROKER_LIST: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.metadata.broker.list") + .description("a comma separated list of host:port brokers") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("localhost:9092") + .build + + val KAFKA_ZOOKEEPER_QUORUM: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.zookeeper.quorum") + .description("") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("localhost:2181") + .build + + val KAFKA_MANUAL_OFFSET_RESET: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.manual.offset.reset") + .description("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):\n" + + "earliest: automatically reset the offset to the earliest offset\n" + + "latest: automatically reset the offset to the latest offset\n" + + "none: throw exception to the consumer if no previous offset is found for the consumer's group\n" + + "anything else: throw exception to the consumer.") + .required(false) + .allowableValues(LATEST_OFFSET, EARLIEST_OFFSET, NONE_OFFSET) + .defaultValue(EARLIEST_OFFSET.getValue) + .build + + + val KAFKA_BATCH_SIZE: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.batch.size") + .description("measures batch size in total bytes instead of the number of messages. " + + "It controls how many bytes of data to collect before sending messages to the Kafka broker. " + + "Set this as high as possible, without exceeding available memory. The default value is 16384.\n\n" + + "If you increase the size of your buffer, it might never get full." + + "The Producer sends the information eventually, based on other triggers, such as linger time in milliseconds. " + + "Although you can impair memory usage by setting the buffer batch size too high, " + + "this does not impact latency.\n\n" + + "If your producer is sending all the time, " + + "you are probably getting the best throughput possible. If the producer is often idle, " + + "you might not be writing enough data to warrant the current allocation of resources.") + .required(false) + .addValidator(StandardValidators.INTEGER_VALIDATOR) + .defaultValue("16384") + .build + + + val KAFKA_LINGER_MS: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.linger.ms") + .description("linger.ms sets the maximum time to buffer data in asynchronous mode. " + + "For example, a setting of 100 batches 100ms of messages to send at once. " + + "This improves throughput, but the buffering adds message delivery latency.\n\n" + + "By default, the producer does not wait. It sends the buffer any time data is available.\n\n" + + "Instead of sending immediately, you can set linger.ms to 5 and send more messages in one batch." + + " This would reduce the number of requests sent, but would add up to 5 milliseconds of latency to records " + + "sent, even if the load on the system does not warrant the delay.\n\n" + + "The farther away the broker is from the producer, the more overhead required to send messages. " + + "Increase linger.ms for higher latency and higher throughput in your producer.") + .required(false) + .addValidator(StandardValidators.INTEGER_VALIDATOR) + .defaultValue("5") + .build + + val KAFKA_ACKS: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.acks") + .description("The number of acknowledgments the producer requires the leader to have received before considering a request complete. This controls the " + + " durability of records that are sent. The following settings are common: " + + "
      " + + "
    • acks=0 If set to zero then the producer will not wait for any acknowledgment from the" + + " server at all. The record will be immediately added to the socket buffer and considered sent. No guarantee can be" + + " made that the server has received the record in this case, and the retries configuration will not" + + " take effect (as the client won't generally know of any failures). The offset given back for each record will" + + " always be set to -1." + + "
    • acks=1 This will mean the leader will write the record to its local log but will respond" + + " without awaiting full acknowledgement from all followers. In this case should the leader fail immediately after" + + " acknowledging the record but before the followers have replicated it then the record will be lost." + + "
    • acks=all This means the leader will wait for the full set of in-sync replicas to" + + " acknowledge the record. This guarantees that the record will not be lost as long as at least one in-sync replica" + + " remains alive. This is the strongest available guarantee.") + .required(false) + .defaultValue("all") + .build + + val KAFKA_STARTING_OFFSETS: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.startingOffsets") + .description("\"earliest\", \"latest\", or json string \"\"\" {\"topicA\":{\"0\":23,\"1\":-1},\"topicB\":{\"0\":-2}} \"\"\"" + + "The start point when a query is started, either \"earliest\" which is from the earliest offsets, " + + "\"latest\" which is just from the latest offsets, or a json string specifying a starting offset for each TopicPartition. " + + "In the json, -2 as an offset can be used to refer to earliest, -1 to latest. " + + "Note: this only applies when a new query is started, and that resuming will always pick up from where the query " + + "left off. Newly discovered partitions during a query will start at earliest.") + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .required(false) + .defaultValue("earliest") + .build + + val KAFKA_FAIL_ON_DATA_LOSS: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.failOnDataLoss") + .description("Whether to fail the query when it's possible that data is lost" + + " (e.g., topics are deleted, or offsets are out of range). This may be a false alarm. " + + "You can disable it when it doesn't work as you expected. " + + "Batch queries will always fail if it fails to read any data from the provided offsets due to lost data.") + .addValidator(StandardValidators.BOOLEAN_VALIDATOR) + .required(false) + .defaultValue("true") + .build + + val KAFKA_MAX_OFFSETS_PER_TRIGGER: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.maxOffsetsPerTrigger") + .description("Rate limit on maximum number of offsets processed per trigger interval. " + + "The specified total number of offsets will be proportionally split across topicPartitions of different volume.") + .addValidator(StandardValidators.LONG_VALIDATOR) + .required(false) + .build + + ////////////////////////////////////// + // Security options + ////////////////////////////////////// + + val PLAINTEXT = new AllowableValue("PLAINTEXT", "PLAINTEXT", "Un-authenticated, non-encrypted channel") + val SSL = new AllowableValue("SSL", "SSL", "SSL channel") + val SASL_PLAINTEXT = new AllowableValue("SASL_PLAINTEXT", "SASL_PLAINTEXT", "SASL authenticated, non-encrypted channel") + val SASL_SSL = new AllowableValue("SASL_SSL", "SASL_SSL", "SASL authenticated, SSL channel") + + val KAFKA_SECURITY_PROTOCOL: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.security.protocol") + .description("kafka.security.protocol sets the value of of the security protocol \n" + + "Apache Kafka® brokers supports client authentication via SASL. " + + "SASL authentication can be enabled concurrently with SSL encryption " + + "(SSL client authentication will be disabled).\n\nThe supported SASL mechanisms are:") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue(PLAINTEXT.getValue) + .allowableValues(PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL) + .build + + val KAFKA_SASL_KERBEROS_SERVICE_NAME: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.sasl.kerberos.service.name") + .description("follow the guide here to configure your job to work with kerberos authentification \n" + + "https://docs.confluent.io/2.0.0/kafka/sasl.html") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .defaultValue("kafka") + .build + + ////////////////////////////////////// + // Schema registry (Avro) + ////////////////////////////////////// + val AVRO_SCHEMA_URL: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("avro.schema.url") + .description("The avro schema url for the schema registry") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build + + val AVRO_SCHEMA_NAME: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("avro.schema.name") + .description("The avro schema name to get in the schema registry") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build + + val AVRO_SCHEMA_VERSION: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("avro.schema.version") + .description("The avro schema version to use for the schema registry") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build +} diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/KafkaStructuredStreamProviderService.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/KafkaStructuredStreamProviderService.scala index cc043336e..ec2b0519b 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/KafkaStructuredStreamProviderService.scala +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/KafkaStructuredStreamProviderService.scala @@ -1,3 +1,18 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ /** * Copyright (C) 2016 Hurence (support@hurence.com) * @@ -30,41 +45,46 @@ */ package com.hurence.logisland.stream.spark.structured.provider -import java.util -import java.util.Collections - import com.hurence.logisland.annotation.documentation.CapabilityDescription import com.hurence.logisland.annotation.lifecycle.OnEnabled import com.hurence.logisland.component.{InitializationException, PropertyDescriptor} import com.hurence.logisland.controller.{AbstractControllerService, ControllerServiceInitializationContext} import com.hurence.logisland.record.{FieldDictionary, FieldType, Record, StandardRecord} -import com.hurence.logisland.stream.StreamContext +import com.hurence.logisland.serializer.{NoopSerializer, RecordSerializer, SerializerProvider} import com.hurence.logisland.stream.StreamProperties._ +import com.hurence.logisland.stream.spark.structured.provider.KafkaProperties._ +import com.hurence.logisland.stream.spark.structured.provider.KafkaStructuredStreamProviderService.{OUTPUT_TOPICS, _} +import com.hurence.logisland.stream.spark.structured.provider.StructuredStreamProviderServiceWriter.OUTPUT_MODE import com.hurence.logisland.util.kafka.KafkaSink import com.hurence.logisland.util.spark.ControllerServiceLookupSink +import com.hurence.logisland.validator.{Configuration, StandardValidators, ValidationResult} import kafka.admin.AdminUtils import kafka.utils.ZkUtils import org.apache.kafka.common.security.JaasUtils import org.apache.spark.broadcast.Broadcast import org.apache.spark.sql.{Dataset, SparkSession} +import org.slf4j.LoggerFactory + +import java.util +import java.util.Collections /** * Compatible with kafka 0.10.0 or higher */ @CapabilityDescription("Provide a ways to use kafka as input or output in StructuredStream streams") -class KafkaStructuredStreamProviderService() extends AbstractControllerService with StructuredStreamProviderService { - - // private val logger = LoggerFactory.getLogger(this.getClass) +class KafkaStructuredStreamProviderService() extends AbstractControllerService + with StructuredStreamProviderServiceReader + with StructuredStreamProviderServiceWriter { + val logger = LoggerFactory.getLogger(this.getClass) - var appName = "" var kafkaSinkParams: Map[String, Object] = _ var kafkaParams: Map[String, Object] = _ // Define the Kafka parameters, broker list must be specified var inputTopics = Set[String]() + var inputTopicsPattern: String = "" var outputTopics = Set[String]() - var errorTopics = Set[String]() - var metricsTopics = Set[String]() + var outputTopicsField: String = null var topicAutocreate = true var topicDefaultPartitions = 3 var topicDefaultReplicationFactor = 1 @@ -74,8 +94,6 @@ class KafkaStructuredStreamProviderService() extends AbstractControllerService w var kafkaLingerMs = "5" var kafkaAcks = "0" var kafkaOffset = "latest" - var inputSerializerType = "" - var outputSerializerType = "" var securityProtocol = "" var saslKbServiceName = "" @@ -83,6 +101,97 @@ class KafkaStructuredStreamProviderService() extends AbstractControllerService w var failOnDataLoss = true var maxOffsetsPerTrigger: Option[Long] = None + var readValueSerializer: RecordSerializer = _ + var writeValueSerializer: RecordSerializer = _ + var writeKeySerializer: RecordSerializer = _ + var outputMode: String = _ + var subscribMod: String = _ + + /** + * Allows subclasses to perform their own validation on the already set + * properties. Since each property is validated as it is set this allows + * validation of groups of properties together. Default return is an empty + * set. + *

      + * This method will be called only when it has been determined that all + * property getAllFields are valid according to their corresponding + * PropertyDescriptor's validators. + * + * @return Collection of ValidationResult objects that will be added to any + * other validation findings - may be null + */ + override protected def customValidate(context: Configuration): util.Collection[ValidationResult] = { + val validationResults = new util.ArrayList[ValidationResult](super.customValidate(context)) + verifyPropsAreNotBothSetButAtLeastOne(context, validationResults, INPUT_TOPICS, INPUT_TOPIC_PATTERN) + verifyPropsAreNotBothSetButAtLeastOne(context, validationResults, OUTPUT_TOPICS, OUTPUT_TOPICS_FIELD) + return validationResults + } + + private def verifyPropsAreNotBothSetButAtLeastOne( + context: Configuration, + validationResults: util.ArrayList[ValidationResult], + prop1: PropertyDescriptor, + prop2: PropertyDescriptor + ) = { + /** + * Only one of both properties may be set. + */ + // Be sure not both are defined + if (context.getPropertyValue(prop1).isSet && + context.getPropertyValue(prop2).isSet) { + validationResults.add( + new ValidationResult.Builder() + .explanation(prop1.getName + " and " + prop2.getName + " " + + "properties are mutually exclusive.") + .valid(false) + .build + ) + } + // Be sure at least one is defined + if (!context.getPropertyValue(prop1).isSet && + !context.getPropertyValue(prop2).isSet) { + validationResults.add( + new ValidationResult.Builder() + .explanation("at least one of " + prop1.getName + " and " + prop2.getName + + " must be set.") + .valid(false) + .build + ) + } + } + + /** + * Allows subclasses to register which property descriptor objects are + * supported. + * + * @return PropertyDescriptor objects this processor currently supports + */ + override def getSupportedPropertyDescriptors() = { + val descriptors: util.List[PropertyDescriptor] = new util.ArrayList[PropertyDescriptor] + descriptors.add(INPUT_TOPICS) + descriptors.add(INPUT_TOPIC_PATTERN) + descriptors.add(INPUT_TOPICS_IGNORED) + descriptors.add(OUTPUT_TOPICS) + descriptors.add(OUTPUT_TOPICS_FIELD) + descriptors.add(AVRO_SCHEMA_URL) + descriptors.add(KAFKA_TOPIC_AUTOCREATE) + descriptors.add(KAFKA_TOPIC_DEFAULT_PARTITIONS) + descriptors.add(KAFKA_TOPIC_DEFAULT_REPLICATION_FACTOR) + descriptors.add(KAFKA_METADATA_BROKER_LIST) + descriptors.add(KAFKA_ZOOKEEPER_QUORUM) + descriptors.add(KAFKA_STARTING_OFFSETS) + descriptors.add(KAFKA_FAIL_ON_DATA_LOSS) + descriptors.add(KAFKA_MAX_OFFSETS_PER_TRIGGER) + descriptors.add(KAFKA_SECURITY_PROTOCOL) + descriptors.add(KAFKA_SASL_KERBEROS_SERVICE_NAME) + descriptors.add(READ_VALUE_SERIALIZER) + descriptors.add(AVRO_READ_VALUE_SCHEMA) + descriptors.add(WRITE_VALUE_SERIALIZER) + descriptors.add(AVRO_WRITE_VALUE_SCHEMA) + descriptors.add(WRITE_KEY_SERIALIZER) + descriptors.add(OUTPUT_MODE) + Collections.unmodifiableList(descriptors) + } @OnEnabled @throws[InitializationException] @@ -92,13 +201,50 @@ class KafkaStructuredStreamProviderService() extends AbstractControllerService w try { // Define the Kafka parameters, broker list must be specified - inputTopics = context.getPropertyValue(INPUT_TOPICS).asString.split(",").toSet - outputTopics = context.getPropertyValue(OUTPUT_TOPICS).asString.split(",").toSet - errorTopics = context.getPropertyValue(ERROR_TOPICS).asString.split(",").toSet - metricsTopics = DEFAULT_METRICS_TOPIC.getValue.split(",").toSet - inputSerializerType = context.getPropertyValue(INPUT_SERIALIZER).asString() - outputSerializerType = context.getPropertyValue(OUTPUT_SERIALIZER).asString() + if (context.getPropertyValue(INPUT_TOPICS).isSet) { + subscribMod = "subscribe" + if (context.getPropertyValue(INPUT_TOPICS_IGNORED).isSet) { + val ignoredTopics: Set[String] = context.getPropertyValue(INPUT_TOPICS_IGNORED) + .asString().split(",").toSet[String] + .map(_.trim) + val inputTopicsTmp = context.getPropertyValue(INPUT_TOPICS) + .asString.split(",").toSet[String] + .map(_.trim) + inputTopics = inputTopicsTmp.diff(ignoredTopics) + } else { + inputTopics = context.getPropertyValue(INPUT_TOPICS) + .asString.split(",").toSet[String] + .map(_.trim) + } + getLogger.info(s"final inputTopics conf is '${inputTopics}'") + } + + if (context.getPropertyValue(INPUT_TOPIC_PATTERN).isSet) { + subscribMod = "subscribePattern" + if (context.getPropertyValue(INPUT_TOPICS_IGNORED).isSet) { + val ignoredTopicsPattern: String = context.getPropertyValue(INPUT_TOPICS_IGNORED) + .asString().split(",").toSet[String] + .map(_.trim) + .mkString("(", "|", ")") + val topicPattern = context.getPropertyValue(INPUT_TOPIC_PATTERN).asString + inputTopicsPattern = s"^((?!${ignoredTopicsPattern}$$)${topicPattern})*$$" + } else { + inputTopicsPattern = context.getPropertyValue(INPUT_TOPIC_PATTERN).asString + } + getLogger.info(s"final inputTopicsPattern conf is '${inputTopicsPattern}'") + } + + if (context.getPropertyValue(OUTPUT_TOPICS).isSet) { + outputTopics = context.getPropertyValue(OUTPUT_TOPICS) + .asString.split(",").toSet[String] + .map(_.trim) + } + + if (context.getPropertyValue(OUTPUT_TOPICS_FIELD).isSet) { + outputTopicsField = context.getPropertyValue(OUTPUT_TOPICS_FIELD).asString + } + topicAutocreate = context.getPropertyValue(KAFKA_TOPIC_AUTOCREATE).asBoolean().booleanValue() topicDefaultPartitions = context.getPropertyValue(KAFKA_TOPIC_DEFAULT_PARTITIONS).asInteger().intValue() @@ -121,10 +267,31 @@ class KafkaStructuredStreamProviderService() extends AbstractControllerService w val zkUtils = ZkUtils.apply(zkQuorum, 10000, 10000, JaasUtils.isZkSecurityEnabled) createTopicsIfNeeded(zkUtils, inputTopics, topicDefaultPartitions, topicDefaultReplicationFactor) createTopicsIfNeeded(zkUtils, outputTopics, topicDefaultPartitions, topicDefaultReplicationFactor) - createTopicsIfNeeded(zkUtils, errorTopics, 3, 1) - createTopicsIfNeeded(zkUtils, metricsTopics, 1, 1) } + var inputSchema = "" + if (context.getPropertyValue(AVRO_SCHEMA_URL).isSet) { + val registryUrl = context.getPropertyValue(AVRO_SCHEMA_URL).asString + inputSchema = "{\"registryUrl\":\"" + registryUrl + "\"}" + logger.info("Using schema json " + inputSchema) + } else { + inputSchema = context.getPropertyValue(AVRO_READ_VALUE_SCHEMA).asString + } + + readValueSerializer = SerializerProvider.getSerializer( + context.getPropertyValue(READ_VALUE_SERIALIZER).asString, + inputSchema) + + writeValueSerializer = SerializerProvider.getSerializer( + context.getPropertyValue(WRITE_VALUE_SERIALIZER).asString, + context.getPropertyValue(AVRO_WRITE_VALUE_SCHEMA).asString) + + writeKeySerializer = SerializerProvider.getSerializer( + context.getPropertyValue(WRITE_KEY_SERIALIZER).asString, null) + + if (context.getPropertyValue(OUTPUT_MODE).isSet) { + outputMode = context.getPropertyValue(OUTPUT_MODE).asString() + } } catch { case e: Exception => @@ -137,14 +304,13 @@ class KafkaStructuredStreamProviderService() extends AbstractControllerService w * create a streaming DataFrame that represents data received * * @param spark - * @param streamContext * @return DataFrame currently loaded */ - override def read(spark: SparkSession, streamContext: StreamContext) = { - import spark.implicits._ + override def read(spark: SparkSession) = { implicit val recordEncoder = org.apache.spark.sql.Encoders.kryo[Record] + import spark.implicits._ - logger.info(s"starting Kafka direct stream on topics $inputTopics from $startingOffsets offsets, and maxOffsetsPerTrigger :$maxOffsetsPerTrigger") + getLogger.info(s"starting Kafka direct stream on topics $inputTopics from $startingOffsets offsets, and maxOffsetsPerTrigger :$maxOffsetsPerTrigger") var df = spark.readStream .format("kafka") .option("kafka.bootstrap.servers", brokerList) @@ -152,54 +318,29 @@ class KafkaStructuredStreamProviderService() extends AbstractControllerService w .option("kafka.sasl.kerberos.service.name", saslKbServiceName) .option("startingOffsets", startingOffsets) .option("failOnDataLoss", failOnDataLoss) - .option("subscribe", inputTopics.mkString(",")) + + subscribMod match { + case "subscribe" => df = df.option("subscribe", inputTopics.mkString(",")) + case "subscribePattern" => df = df.option("subscribePattern", inputTopicsPattern) +//TODO not supported yet case "assign" => df = df.option("assign", inputTopics.mkString(",")) + // assign json string {"topicA":[0,1],"topicB":[2,4]} Specific TopicPartitions to consume. Only one of "assign", "subscribe" or "subscribePattern" options can be specified for Kafka source. + } if (maxOffsetsPerTrigger.isDefined) { df = df.option("maxOffsetsPerTrigger", maxOffsetsPerTrigger.get) } - df.load() .selectExpr("CAST(key AS BINARY)", "CAST(value AS BINARY)") .as[(Array[Byte], Array[Byte])] - .map(r => { - new StandardRecord(inputTopics.head) - .setField(FieldDictionary.RECORD_KEY, FieldType.BYTES, r._1) - .setField(FieldDictionary.RECORD_VALUE, FieldType.BYTES, r._2) + .flatMap(r => { + readValueSerializer match { + case sr: NoopSerializer => Some(new StandardRecord("kafka") + .setField(FieldDictionary.RECORD_KEY, FieldType.BYTES, r._1) + .setField(FieldDictionary.RECORD_VALUE, FieldType.BYTES, r._2)) + case _ => SerializingTool.deserializeRecords(readValueSerializer, r._2) + } }) - - - } - - /** - * Allows subclasses to register which property descriptor objects are - * supported. - * - * @return PropertyDescriptor objects this processor currently supports - */ - override def getSupportedPropertyDescriptors() = { - val descriptors: util.List[PropertyDescriptor] = new util.ArrayList[PropertyDescriptor] - descriptors.add(ERROR_TOPICS) - descriptors.add(INPUT_TOPICS) - descriptors.add(OUTPUT_TOPICS) - descriptors.add(AVRO_INPUT_SCHEMA) - descriptors.add(AVRO_OUTPUT_SCHEMA) - descriptors.add(INPUT_SERIALIZER) - descriptors.add(OUTPUT_SERIALIZER) - descriptors.add(ERROR_SERIALIZER) - descriptors.add(KAFKA_TOPIC_AUTOCREATE) - descriptors.add(KAFKA_TOPIC_DEFAULT_PARTITIONS) - descriptors.add(KAFKA_TOPIC_DEFAULT_REPLICATION_FACTOR) - descriptors.add(KAFKA_METADATA_BROKER_LIST) - descriptors.add(KAFKA_ZOOKEEPER_QUORUM) - descriptors.add(KAFKA_STARTING_OFFSETS) - descriptors.add(KAFKA_FAIL_ON_DATA_LOSS) - descriptors.add(KAFKA_MAX_OFFSETS_PER_TRIGGER) - descriptors.add(WINDOW_DURATION) - descriptors.add(SLIDE_DURATION) - descriptors.add(KAFKA_SECURITY_PROTOCOL) - descriptors.add(KAFKA_SASL_KERBEROS_SERVICE_NAME) - Collections.unmodifiableList(descriptors) } /** @@ -220,7 +361,7 @@ class KafkaStructuredStreamProviderService() extends AbstractControllerService w if (!topic.equals(NONE_TOPIC) && !AdminUtils.topicExists(zkUtils, topic)) { AdminUtils.createTopic(zkUtils, topic, topicDefaultPartitions, topicDefaultReplicationFactor) Thread.sleep(1000) - logger.info(s"created topic $topic with" + + getLogger.info(s"created topic $topic with" + s" $topicDefaultPartitions partitions and" + s" $topicDefaultReplicationFactor replicas") } @@ -230,37 +371,120 @@ class KafkaStructuredStreamProviderService() extends AbstractControllerService w /** * create a streaming DataFrame that represents data received * - * @param streamContext * @return DataFrame currently loaded */ - override def write(df: Dataset[Record], controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink], streamContext: StreamContext) = { + override def write(df: Dataset[Record], controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink]) = { val sender = df.sparkSession.sparkContext.broadcast(KafkaSink(kafkaSinkParams)) - import df.sparkSession.implicits._ + implicit val recordEncoder = org.apache.spark.sql.Encoders.kryo[Record] - // Write key-value data from a DataFrame to a specific Kafka topic specified in an option - df.map(r => { - (r.getField(FieldDictionary.RECORD_KEY).asBytes(), r.getField(FieldDictionary.RECORD_VALUE).asBytes()) - }) - .as[(Array[Byte], Array[Byte])] - .toDF("key", "value") - .writeStream + val dataStreamWriter = if (outputTopicsField != null) { + df + .mapPartitions(records => { + records.map(record => { + val serializedRecord: Record = SerializingTool.serializeRecords(writeValueSerializer, writeKeySerializer, record) + serializedRecord.setStringField("topic", record.getField(outputTopicsField).asString()) + serializedRecord + }) + }) + // Write key-value data from a DataFrame to a specific Kafka topic dynamically in topic column + .map(r => { + (r.getField(FieldDictionary.RECORD_KEY).asBytes(), + r.getField(FieldDictionary.RECORD_VALUE).asBytes(), + r.getField("topic").asString()) + }) + .as[(Array[Byte], Array[Byte], String)] + .toDF("key", "value", "topic") + .writeStream + } else { + df + .mapPartitions(record => record.map(record => SerializingTool.serializeRecords(writeValueSerializer, writeKeySerializer, record))) + // Write key-value data from a DataFrame to a specific Kafka topic specified in an option + .map(r => { + (r.getField(FieldDictionary.RECORD_KEY).asBytes(), r.getField(FieldDictionary.RECORD_VALUE).asBytes()) + }) + .as[(Array[Byte], Array[Byte])] + .toDF("key", "value") + .writeStream + .option("topic", outputTopics.mkString(",")) + } + dataStreamWriter .format("kafka") .option("kafka.bootstrap.servers", brokerList) .option("kafka.security.protocol", securityProtocol) .option("kafka.sasl.kerberos.service.name", saslKbServiceName) - .option("topic", outputTopics.mkString(",")) - .option("checkpointLocation", "checkpoints") + dataStreamWriter } - private def getOrElse[T](record: Record, field: String, defaultValue: T): T = { - val value = record.getField(field) - if (value != null && value.isSet) { - return value.getRawValue.asInstanceOf[T] - } - defaultValue - } +} +object KafkaStructuredStreamProviderService { + + val OUTPUT_TOPICS: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.output.topics") + .description("Sets the output Kafka topic name (Comma separated list).") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .addValidator(StandardValidators.COMMA_SEPARATED_LIST_VALIDATOR) + .build + + val OUTPUT_TOPICS_FIELD: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.output.topics.field") + .description("Field name of records to use for sending in corresponding topic. " + + "Every Record must contain this field and it must be a valid topic name !") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build + + val INPUT_TOPICS_IGNORED: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("kafka.input.topics.ignored") + .description("Sets the input Kafka topic name to ignore (Comma separated list). " + + "Those topics will not be subscribed") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .addValidator(StandardValidators.COMMA_SEPARATED_LIST_VALIDATOR) + .build + + val READ_VALUE_SERIALIZER: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("read.value.serializer") + .description("the serializer to use to deserialize value of topic messages as record") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, EXTENDED_JSON_SERIALIZER, AVRO_SERIALIZER, BYTESARRAY_SERIALIZER, STRING_SERIALIZER, NO_SERIALIZER, KURA_PROTOCOL_BUFFER_SERIALIZER, CONFLUENT_SERIALIZER) + .defaultValue(NO_SERIALIZER.getValue) + .build + + val AVRO_READ_VALUE_SCHEMA: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("read.value.schema") + .description("the avro schema definition") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build + + val WRITE_VALUE_SERIALIZER: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("write.value.serializer") + .description("the serializer to use to serialize records into value topic messages") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, EXTENDED_JSON_SERIALIZER, AVRO_SERIALIZER, BYTESARRAY_SERIALIZER, STRING_SERIALIZER, NO_SERIALIZER, KURA_PROTOCOL_BUFFER_SERIALIZER) + .defaultValue(NO_SERIALIZER.getValue) + .build + + val AVRO_WRITE_VALUE_SCHEMA: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("write.value.schema") + .description("the avro schema definition") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build + + val WRITE_KEY_SERIALIZER: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("write.key.serializer") + .description("The key serializer to use") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, EXTENDED_JSON_SERIALIZER, AVRO_SERIALIZER, BYTESARRAY_SERIALIZER, STRING_SERIALIZER, NO_SERIALIZER, KURA_PROTOCOL_BUFFER_SERIALIZER) + .defaultValue(NO_SERIALIZER.getValue) + .build } diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/LocalFileStructuredStreamProviderService.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/LocalFileStructuredStreamProviderService.scala index feb83d33d..63065ec96 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/LocalFileStructuredStreamProviderService.scala +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/LocalFileStructuredStreamProviderService.scala @@ -30,6 +30,7 @@ */ package com.hurence.logisland.stream.spark.structured.provider +import java.io.ByteArrayInputStream import java.util import java.util.Collections @@ -38,20 +39,19 @@ import com.hurence.logisland.annotation.lifecycle.OnEnabled import com.hurence.logisland.component.{InitializationException, PropertyDescriptor} import com.hurence.logisland.controller.{AbstractControllerService, ControllerServiceInitializationContext} import com.hurence.logisland.record.{FieldDictionary, FieldType, Record, StandardRecord} -import com.hurence.logisland.stream.StreamContext -import com.hurence.logisland.util.spark.ControllerServiceLookupSink +import com.hurence.logisland.serializer.{NoopSerializer, RecordSerializer, SerializerProvider} +import com.hurence.logisland.stream.StreamProperties._ +import com.hurence.logisland.stream.spark.structured.provider.LocalFileStructuredStreamProviderService.{AVRO_READ_LINE_SCHEMA, READ_LINE_SERIALIZER} import com.hurence.logisland.validator.StandardValidators -import org.apache.spark.broadcast.Broadcast -import org.apache.spark.sql.streaming.DataStreamWriter -import org.apache.spark.sql.{Dataset, SparkSession} +import org.apache.spark.sql.SparkSession /** * You can look at spark documentation for detail on some options : * @author bailett */ @CapabilityDescription("Provide a way to read a local file as input in StructuredStream streams") -class LocalFileStructuredStreamProviderService extends AbstractControllerService with StructuredStreamProviderService { - +class LocalFileStructuredStreamProviderService extends AbstractControllerService + with StructuredStreamProviderServiceReader { val LOCAL_INPUT_PATH: PropertyDescriptor = new PropertyDescriptor.Builder() .name("local.input.path") @@ -87,6 +87,7 @@ class LocalFileStructuredStreamProviderService extends AbstractControllerService var maxFilesPerTrigger: Option[Long] = _ var latestFirst: Option[Boolean] = _ var fileNameOnly: Option[Boolean] = _ + var readValueSerializer: RecordSerializer = null @OnEnabled @throws[InitializationException] @@ -108,6 +109,9 @@ class LocalFileStructuredStreamProviderService extends AbstractControllerService } else { fileNameOnly = None } + readValueSerializer = SerializerProvider.getSerializer( + context.getPropertyValue(READ_LINE_SERIALIZER).asString, + context.getPropertyValue(AVRO_READ_LINE_SCHEMA).asString) } /** @@ -122,6 +126,8 @@ class LocalFileStructuredStreamProviderService extends AbstractControllerService descriptors.add(MAX_FILES_PER_TRIGGER) descriptors.add(LATEST_FIRST) descriptors.add(FILENAME_ONLY) + descriptors.add(READ_LINE_SERIALIZER) + descriptors.add(AVRO_READ_LINE_SCHEMA) Collections.unmodifiableList(descriptors) } @@ -129,10 +135,9 @@ class LocalFileStructuredStreamProviderService extends AbstractControllerService * create a streaming DataFrame that represents data received * * @param spark - * @param streamContext * @return DataFrame currently loaded */ - override def read(spark: SparkSession, streamContext: StreamContext) = { + override def read(spark: SparkSession) = { import spark.implicits._ implicit val recordEncoder = org.apache.spark.sql.Encoders.kryo[Record] @@ -149,19 +154,30 @@ class LocalFileStructuredStreamProviderService extends AbstractControllerService } dataStreamReader.load(path) .as[String] - .map(r => { - new StandardRecord("line") - .setField(FieldDictionary.RECORD_VALUE, FieldType.STRING, r) + .flatMap(line => { + readValueSerializer match { + case sr: NoopSerializer => Some(new StandardRecord("line") + .setField(FieldDictionary.RECORD_VALUE, FieldType.STRING, line)) + case _ => SerializingTool.deserializeRecords(readValueSerializer, line.getBytes()) + } }) } +} +object LocalFileStructuredStreamProviderService { + val READ_LINE_SERIALIZER: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("line.serializer") + .description("the serializer to use to deserialize lines of files as record") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, EXTENDED_JSON_SERIALIZER, AVRO_SERIALIZER, BYTESARRAY_SERIALIZER, STRING_SERIALIZER, NO_SERIALIZER, KURA_PROTOCOL_BUFFER_SERIALIZER) + .defaultValue(NO_SERIALIZER.getValue) + .build + + val AVRO_READ_LINE_SCHEMA: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("read.value.schema") + .description("the avro schema definition") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build - /** - * create a streaming DataFrame that represents data received - * - * @param streamContext - * @return DataFrame currently loaded - */ - override def write(df: Dataset[Record], controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink], streamContext: StreamContext): DataStreamWriter[_] = { - throw new IllegalArgumentException("LocalFileStructuredStreamProviderService class does not support write operation yet") - } } diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/MQTTStructuredStreamProviderService.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/MQTTStructuredStreamProviderService.scala index a0440517f..fdf801cdc 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/MQTTStructuredStreamProviderService.scala +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/MQTTStructuredStreamProviderService.scala @@ -31,6 +31,7 @@ package com.hurence.logisland.stream.spark.structured.provider +import java.io.{ByteArrayInputStream, ByteArrayOutputStream} import java.sql.Timestamp import java.util import java.util.Collections @@ -40,16 +41,20 @@ import com.hurence.logisland.annotation.lifecycle.OnEnabled import com.hurence.logisland.component.{InitializationException, PropertyDescriptor} import com.hurence.logisland.controller.{AbstractControllerService, ControllerServiceInitializationContext} import com.hurence.logisland.record.{FieldDictionary, FieldType, Record, StandardRecord} -import com.hurence.logisland.stream.StreamContext +import com.hurence.logisland.serializer.{NoopSerializer, RecordSerializer, SerializerProvider} import com.hurence.logisland.stream.StreamProperties._ +import com.hurence.logisland.stream.spark.structured.provider.MQTTStructuredStreamProviderService.{AVRO_READ_VALUE_SCHEMA, AVRO_WRITE_VALUE_SCHEMA, READ_VALUE_SERIALIZER, WRITE_KEY_SERIALIZER, WRITE_VALUE_SERIALIZER} +import com.hurence.logisland.stream.spark.structured.provider.MqttProperties.{MQTT_BROKER_URL, MQTT_CLEAN_SESSION, MQTT_CLIENTID, MQTT_CONNECTION_TIMEOUT, MQTT_KEEP_ALIVE, MQTT_PASSWORD, MQTT_PERSISTENCE, MQTT_QOS, MQTT_TOPIC, MQTT_USERNAME, MQTT_VERSION} import com.hurence.logisland.util.spark.ControllerServiceLookupSink +import com.hurence.logisland.validator.StandardValidators import org.apache.spark.broadcast.Broadcast -import org.apache.spark.sql.streaming.DataStreamWriter +import org.apache.spark.sql.streaming.StreamingQuery import org.apache.spark.sql.{Dataset, SparkSession} @CapabilityDescription("Provide a ways to use Mqtt a input or output in StructuredStream streams") -class MQTTStructuredStreamProviderService extends AbstractControllerService with StructuredStreamProviderService { - +class MQTTStructuredStreamProviderService extends AbstractControllerService + with StructuredStreamProviderServiceReader + with StructuredStreamProviderServiceWriter { var brokerUrl = "" var persistence = "" @@ -63,6 +68,10 @@ class MQTTStructuredStreamProviderService extends AbstractControllerService with var mqttVersion = "3.1.1" var topic = "" + var readValueSerializer: RecordSerializer = null + var writeValueSerializer: RecordSerializer = null + var writeKeySerializer: RecordSerializer = null + @OnEnabled @throws[InitializationException] override def init(context: ControllerServiceInitializationContext): Unit = { @@ -82,6 +91,16 @@ class MQTTStructuredStreamProviderService extends AbstractControllerService with keepAlive = context.getPropertyValue(MQTT_KEEP_ALIVE).asInteger().intValue() mqttVersion = context.getPropertyValue(MQTT_VERSION).asString topic = context.getPropertyValue(MQTT_TOPIC).asString + readValueSerializer = SerializerProvider.getSerializer( + context.getPropertyValue(READ_VALUE_SERIALIZER).asString, + context.getPropertyValue(AVRO_READ_VALUE_SCHEMA).asString) + + writeValueSerializer = SerializerProvider.getSerializer( + context.getPropertyValue(WRITE_VALUE_SERIALIZER).asString, + context.getPropertyValue(AVRO_WRITE_VALUE_SCHEMA).asString) + + writeKeySerializer = SerializerProvider.getSerializer( + context.getPropertyValue(WRITE_KEY_SERIALIZER).asString, null) } catch { case e: Exception => throw new InitializationException(e) @@ -108,6 +127,11 @@ class MQTTStructuredStreamProviderService extends AbstractControllerService with descriptors.add(MQTT_USERNAME) descriptors.add(MQTT_QOS) descriptors.add(MQTT_TOPIC) + descriptors.add(READ_VALUE_SERIALIZER) + descriptors.add(AVRO_READ_VALUE_SCHEMA) + descriptors.add(WRITE_VALUE_SERIALIZER) + descriptors.add(AVRO_WRITE_VALUE_SCHEMA) + descriptors.add(WRITE_KEY_SERIALIZER) Collections.unmodifiableList(descriptors) } @@ -115,10 +139,9 @@ class MQTTStructuredStreamProviderService extends AbstractControllerService with * create a streaming DataFrame that represents data received * * @param spark - * @param streamContext * @return DataFrame currently loaded */ - override def read(spark: SparkSession, streamContext: StreamContext) = { + override def read(spark: SparkSession) = { import spark.implicits._ implicit val recordEncoder = org.apache.spark.sql.Encoders.kryo[Record] @@ -137,27 +160,29 @@ class MQTTStructuredStreamProviderService extends AbstractControllerService with .option("mqttVersion", mqttVersion) .load(brokerUrl) .as[(String, Array[Byte], Timestamp)] - .map(r => { - new StandardRecord("kura_metric") - .setTime(r._3) + .flatMap(r => { + readValueSerializer match { + case sr: NoopSerializer => Some(new StandardRecord("kura_metric") + .setField(FieldDictionary.RECORD_KEY, FieldType.STRING, r._1) .setField(FieldDictionary.RECORD_VALUE, FieldType.BYTES, r._2) - .setField(FieldDictionary.RECORD_NAME, FieldType.STRING, r._1) - }) - + .setTime(r._3)) + case _ => SerializingTool.deserializeRecords(readValueSerializer, r._2) + } + }) } - /** * create a streaming DataFrame that represents data received * - * @param streamContext * @return DataFrame currently loaded */ - override def write(df: Dataset[Record], controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink], streamContext: StreamContext): DataStreamWriter[_] = { + override def write(df: Dataset[Record], controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink]) = { + implicit val recordEncoder = org.apache.spark.sql.Encoders.kryo[Record] + df.mapPartitions(record => record.map(record => SerializingTool.serializeRecords(writeValueSerializer, writeKeySerializer, record))) // Create DataFrame representing the stream of input lines from connection to mqtt server - df.writeStream + .writeStream .format("org.apache.bahir.sql.streaming.mqtt.MQTTStreamSourceProvider") .option("topic", topic) .option("persistence", persistence) @@ -169,6 +194,47 @@ class MQTTStructuredStreamProviderService extends AbstractControllerService with .option("connectionTimeout", connectionTimeout) .option("keepAlive", keepAlive) .option("mqttVersion", mqttVersion) - } } +object MQTTStructuredStreamProviderService { + val READ_VALUE_SERIALIZER: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("read.value.serializer") + .description("the serializer to use to deserialize value of topic messages as record") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, EXTENDED_JSON_SERIALIZER, AVRO_SERIALIZER, BYTESARRAY_SERIALIZER, STRING_SERIALIZER, NO_SERIALIZER, KURA_PROTOCOL_BUFFER_SERIALIZER) + .defaultValue(NO_SERIALIZER.getValue) + .build + + val AVRO_READ_VALUE_SCHEMA: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("read.value.schema") + .description("the avro schema definition") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build + + val WRITE_VALUE_SERIALIZER: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("write.value.serializer") + .description("the serializer to use to serialize records into value topic messages") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, EXTENDED_JSON_SERIALIZER, AVRO_SERIALIZER, BYTESARRAY_SERIALIZER, STRING_SERIALIZER, NO_SERIALIZER, KURA_PROTOCOL_BUFFER_SERIALIZER) + .defaultValue(NO_SERIALIZER.getValue) + .build + + val AVRO_WRITE_VALUE_SCHEMA: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("write.value.schema") + .description("the avro schema definition") + .required(false) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build + + val WRITE_KEY_SERIALIZER: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("write.key.serializer") + .description("The key serializer to use") + .required(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .allowableValues(KRYO_SERIALIZER, JSON_SERIALIZER, EXTENDED_JSON_SERIALIZER, AVRO_SERIALIZER, BYTESARRAY_SERIALIZER, STRING_SERIALIZER, NO_SERIALIZER, KURA_PROTOCOL_BUFFER_SERIALIZER) + .defaultValue(NO_SERIALIZER.getValue) + .build +} diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/MqttProperties.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/MqttProperties.scala new file mode 100644 index 000000000..636b43ecc --- /dev/null +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/MqttProperties.scala @@ -0,0 +1,110 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.stream.spark.structured.provider + +import com.hurence.logisland.component.{AllowableValue, PropertyDescriptor} +import com.hurence.logisland.stream.StreamProperties._ +import com.hurence.logisland.validator.StandardValidators + +object MqttProperties { + val MQTT_BROKER_URL: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("mqtt.broker.url") + .description("brokerUrl A url MqttClient connects to. Set this or path as the url of the Mqtt Server. e.g. tcp://localhost:1883") + .addValidator(StandardValidators.URL_VALIDATOR) + .defaultValue("tcp://localhost:1883") + .required(false) + .build + + val MQTT_PERSISTENCE: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("mqtt.persistence") + .description("persistence By default it is used for storing incoming messages on disk. " + + "If memory is provided as value for this option, then recovery on restart is not supported.") + .defaultValue("memory") + .required(false) + .build + + val MQTT_TOPIC: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("mqtt.topic") + .description("Topic MqttClient subscribes to.") + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .required(true) + .build + + val MQTT_CLIENTID: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("mqtt.client.id") + .description("clientID this client is associated. Provide the same value to recover a stopped client.") + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .required(true) + .build + + val MQTT_QOS: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("mqtt.qos") + .description(" QoS The maximum quality of service to subscribe each topic at.Messages published at a lower " + + "quality of service will be received at the published QoS.Messages published at a higher quality of " + + "service will be received using the QoS specified on the subscribe") + .addValidator(StandardValidators.INTEGER_VALIDATOR) + .defaultValue("0") + .required(false) + .build + + val MQTT_USERNAME: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("mqtt.username") + .description(" username Sets the user name to use for the connection to Mqtt Server. " + + "Do not set it, if server does not need this. Setting it empty will lead to errors.") + .required(false) + .build + + val MQTT_PASSWORD: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("mqtt.password") + .description("password Sets the password to use for the connection") + .required(false) + .build + + val MQTT_CLEAN_SESSION: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("mqtt.clean.session") + .description("cleanSession Setting it true starts a clean session, removes all checkpointed messages by " + + "a previous run of this source. This is set to false by default.") + .addValidator(StandardValidators.BOOLEAN_VALIDATOR) + .defaultValue("true") + .required(false) + .build + + val MQTT_CONNECTION_TIMEOUT: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("mqtt.connection.timeout") + .description("connectionTimeout Sets the connection timeout, a value of 0 is interpreted as " + + "wait until client connects. See MqttConnectOptions.setConnectionTimeout for more information") + .addValidator(StandardValidators.INTEGER_VALIDATOR) + .defaultValue("5000") + .required(false) + .build + + val MQTT_KEEP_ALIVE: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("mqtt.keep.alive") + .description("keepAlive Same as MqttConnectOptions.setKeepAliveInterval.") + .addValidator(StandardValidators.INTEGER_VALIDATOR) + .defaultValue("5000") + .required(false) + .build + + + val MQTT_VERSION: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("mqtt.version") + .description("mqttVersion Same as MqttConnectOptions.setMqttVersion") + .addValidator(StandardValidators.INTEGER_VALIDATOR) + .defaultValue("5000") + .required(false) + .build +} diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/RateStructuredStreamProviderService.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/RateStructuredStreamProviderService.scala deleted file mode 100644 index ebb36107c..000000000 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/RateStructuredStreamProviderService.scala +++ /dev/null @@ -1,202 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.stream.spark.structured.provider - -import java.io.{File, FileReader} -import java.util -import java.util.Collections - -import com.hurence.logisland.annotation.documentation.CapabilityDescription -import com.hurence.logisland.annotation.lifecycle.OnEnabled -import com.hurence.logisland.component.{InitializationException, PropertyDescriptor} -import com.hurence.logisland.controller.{AbstractControllerService, ControllerServiceInitializationContext} -import com.hurence.logisland.record.{FieldDictionary, FieldType, Record, StandardRecord} -import com.hurence.logisland.stream.StreamContext -import com.hurence.logisland.util.spark.ControllerServiceLookupSink -import com.hurence.logisland.validator.StandardValidators -import org.apache.commons.csv.CSVFormat -import org.apache.spark.broadcast.Broadcast -import org.apache.spark.sql.streaming.DataStreamWriter -import org.apache.spark.sql.{Dataset, SparkSession} - -import scala.collection.JavaConversions._ - -/** - * - * @author bailett - */ - -@CapabilityDescription("Generates data at the specified number of rows per second, each output row contains a timestamp and value. " + - "Where timestamp is a Timestamp type containing the time of message dispatch, and value is of Long type containing the message count, " + - "starting from 0 as the first row. This source is intended for testing and benchmarking. Used in StructuredStream streams.") -class RateStructuredStreamProviderService extends AbstractControllerService with StructuredStreamProviderService { - - - val LOCAL_FILE_INPUT_PATH: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("local.file.input.path") - .description("the location of the file to be loaded") - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .required(true) - .build - - val HAS_CSV_HEADER: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("has.csv.header") - .description("Is this a csv file with the first line as a header") - .addValidator(StandardValidators.BOOLEAN_VALIDATOR) - .required(false) - .defaultValue("true") - .build - - val CSV_DELIMITER: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("csv.delimiter") - .description("the delimiter") - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .required(false) - .defaultValue(",") - .build - - val LOCAL_FILE_OUTPUT_PATH: PropertyDescriptor = new PropertyDescriptor.Builder() - .name("local.file.output.path") - .description("the location of the file to be writen") - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .required(false) - .build - - - var recordSeq:Seq[Record] = _ - - @OnEnabled - @throws[InitializationException] - override def init(context: ControllerServiceInitializationContext): Unit = { - super.init(context) - this.synchronized { - try { - - val delimiter = context.getPropertyValue(CSV_DELIMITER).asString() - val path = context.getPropertyValue(LOCAL_FILE_INPUT_PATH).asString() - val f = new File(path) - - if (f.exists && !f.isDirectory) { - val in = new FileReader(path) - val csv = CSVFormat.DEFAULT.withDelimiter(delimiter.charAt(0)).withFirstRecordAsHeader - val records = csv.withHeader().withSkipHeaderRecord(false).parse(in) - recordSeq = records.map(record => { - val logislandRecord:Record = new StandardRecord() - .setField(FieldDictionary.RECORD_VALUE, FieldType.STRING, record.toString) - for (columnName <- record.toMap) { - logislandRecord.setField(columnName._1, FieldType.STRING, columnName._2) - } - logislandRecord - }).toSeq - }else{ - val resourcePath = classOf[RateStructuredStreamProviderService].getResource(path).getPath - val in = new FileReader(resourcePath) - val csv = CSVFormat.DEFAULT.withDelimiter(delimiter.charAt(0)).withFirstRecordAsHeader - val records = csv.withHeader().withSkipHeaderRecord(false).parse(in).getRecords - - recordSeq = records.map(record => { - val logislandRecord:Record = new StandardRecord() - .setField(FieldDictionary.RECORD_VALUE, FieldType.STRING, record.toString) - for (columnName <- record.toMap) { - logislandRecord.setField(columnName._1, FieldType.STRING, columnName._2) - } - logislandRecord - }).toSeq - } - - - - } catch { - case e: Exception => - throw new InitializationException(e) - } - } - } - - /** - * Allows subclasses to register which property descriptor objects are - * supported. - * - * @return PropertyDescriptor objects this processor currently supports - */ - override def getSupportedPropertyDescriptors() = { - val descriptors: util.List[PropertyDescriptor] = new util.ArrayList[PropertyDescriptor] - - descriptors.add(LOCAL_FILE_INPUT_PATH) - descriptors.add(LOCAL_FILE_OUTPUT_PATH) - descriptors.add(HAS_CSV_HEADER) - descriptors.add(CSV_DELIMITER) - Collections.unmodifiableList(descriptors) - } - - /** - * create a streaming DataFrame that represents data received - * - * @param spark - * @param streamContext - * @return DataFrame currently loaded - */ - override def read(spark: SparkSession, streamContext: StreamContext) = { - import spark.implicits._ - implicit val recordEncoder = org.apache.spark.sql.Encoders.kryo[Record] - - // val headers = records.iterator.next.toMap.keySet - - - - recordSeq.toDS() - } - - /** - * create a streaming DataFrame that represents data received - * - * @param streamContext - * @return DataFrame currently loaded - */ - override def write(df: Dataset[Record], controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink], streamContext: StreamContext): DataStreamWriter[_] = { - throw new IllegalArgumentException("RateStructuredStreamProviderService class does not support write operation"); - } -} diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/SerializingTool.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/SerializingTool.scala new file mode 100644 index 000000000..fb205251b --- /dev/null +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/SerializingTool.scala @@ -0,0 +1,70 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.stream.spark.structured.provider + +import java.io.{ByteArrayInputStream, ByteArrayOutputStream} + +import com.hurence.logisland.record.{FieldDictionary, FieldType, Record, StandardRecord} +import com.hurence.logisland.serializer.RecordSerializer +import org.slf4j.LoggerFactory + +object SerializingTool { + + private val logger = LoggerFactory.getLogger(SerializingTool.getClass) + + def deserializeRecords(serializer: RecordSerializer, bytes: Array[Byte]) = { + try { + val deserialized = doDeserialize(serializer, bytes) + Some(deserialized) + } catch { + case t: Throwable => + logger.error(s"exception while deserializing events ${t.getMessage} ! This means the event will be ignored !", t) + None + } + } + + def serializeRecords(valueSerializer: RecordSerializer, keySerializer: RecordSerializer, record: Record) = { + val ret = new StandardRecord() + .setField(FieldDictionary.RECORD_VALUE, FieldType.BYTES, doSerialize(valueSerializer, record)) + val fieldKey = record.getField(FieldDictionary.RECORD_KEY) + if (fieldKey != null) { + ret.setField(FieldDictionary.RECORD_KEY, FieldType.BYTES, doSerialize(keySerializer, new StandardRecord().setField(fieldKey))) + } else { + ret.setField(FieldDictionary.RECORD_KEY, FieldType.NULL, null) + } + ret + } + + private def doDeserialize(serializer: RecordSerializer, bytes: Array[Byte]): Record = { + val bais = new ByteArrayInputStream(bytes) + try { + serializer.deserialize(bais) + } finally { + bais.close() + } + } + + private def doSerialize(serializer: RecordSerializer, record: Record): Array[Byte] = { + val baos: ByteArrayOutputStream = new ByteArrayOutputStream + serializer.serialize(baos, record) + val bytes = baos.toByteArray + baos.close() + bytes + } + +} + + diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/StructuredStreamProviderService.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/StructuredStreamProviderService.scala deleted file mode 100644 index bcf01e085..000000000 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/StructuredStreamProviderService.scala +++ /dev/null @@ -1,398 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.stream.spark.structured.provider - -import java.io.{ByteArrayInputStream, ByteArrayOutputStream} -import java.util -import java.util.Date - -import com.hurence.logisland.controller.ControllerService -import com.hurence.logisland.record._ -import com.hurence.logisland.serializer.{JsonSerializer, NoopSerializer, RecordSerializer, SerializerProvider} -import com.hurence.logisland.stream.StreamContext -import com.hurence.logisland.stream.StreamProperties._ -import com.hurence.logisland.util.spark.{ControllerServiceLookupSink, ProcessorMetrics} -import org.apache.spark.broadcast.Broadcast -import org.apache.spark.groupon.metrics.UserMetricsSystem -import org.apache.spark.sql.streaming._ -import org.apache.spark.sql.Encoders -import org.apache.spark.sql.{Dataset, SparkSession} -import org.slf4j.LoggerFactory - -import scala.collection.JavaConversions._ -import scala.collection.JavaConverters._ - - -trait StructuredStreamProviderService extends ControllerService { - - val logger = LoggerFactory.getLogger(this.getClass) - - - /** - * create a streaming DataFrame that represents data received - * - * @param spark - * @param streamContext - * @return DataFrame currently loaded - */ - protected def read(spark: SparkSession, streamContext: StreamContext): Dataset[Record] - - /** - * create a streaming DataFrame that represents data received - * - * @param streamContext - * @return DataFrame currently loaded - */ - protected def write(df: Dataset[Record], controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink], streamContext: StreamContext): DataStreamWriter[_] - - /** - * - * - * @param spark - * @param streamContext - * @return - */ - def load(spark: SparkSession, controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink], streamContext: StreamContext): Dataset[Record] = { - - import spark.implicits._ - implicit val recordEncoder = org.apache.spark.sql.Encoders.kryo[Record] - - val df = read(spark, streamContext) - - /** - * create serializers - */ - val serializer = SerializerProvider.getSerializer( - streamContext.getPropertyValue(READ_TOPICS_SERIALIZER).asString, - streamContext.getPropertyValue(AVRO_INPUT_SCHEMA).asString) - - val keySerializer = SerializerProvider.getSerializer( - streamContext.getPropertyValue(READ_TOPICS_KEY_SERIALIZER).asString, - null) - - - // convert to logisland records - - val processingRecords: Dataset[Record] = df.flatMap(r => { - serializer match { - case sr: NoopSerializer => Some(r) - case _ => deserializeRecords(serializer, keySerializer, r) - } - }) - - - if (streamContext.getPropertyValue(GROUPBY).isSet) { - - val keys = streamContext.getPropertyValue(GROUPBY).asString() - val stateTimeoutDuration = streamContext.getPropertyValue(STATE_TIMEOUT_MS).asLong() - val chunkSize = streamContext.getPropertyValue(CHUNK_SIZE).asInteger() - - processingRecords - .filter(_.hasField(keys)) - .groupByKey(_.getField(keys).asString()) - .flatMapGroupsWithState(outputMode = OutputMode.Append, timeoutConf = GroupStateTimeout.ProcessingTimeTimeout())( - mappingFunction(controllerServiceLookupSink, streamContext, chunkSize, stateTimeoutDuration) - ) - - } else { - processingRecords.mapPartitions(iterator => { - executePipeline(controllerServiceLookupSink, streamContext, iterator) - }) - } - - - } - - val ALL_RECORDS = "all_records" - val CHUNK_CREATION_TS = "chunk_creation_ts" - - def mappingFunction(controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink], - streamContext: StreamContext, - chunkSize: Int, - timeOutDuration: Long) - (key: String, - value: Iterator[Record], - state: GroupState[Record]): Iterator[Record] = { - - - val currentTimestamp = new Date().getTime - val inputRecords = value.toList - val allRecords = if (state.exists) state.get.getField(ALL_RECORDS).getRawValue.asInstanceOf[List[Record]] ++ inputRecords else inputRecords - val recordChunks = allRecords.grouped(chunkSize).toList - - - if (state.hasTimedOut || (state.exists && (currentTimestamp - state.get.getField(CHUNK_CREATION_TS).asLong()) >= timeOutDuration)) { - state.remove() - // logger.debug("TIMEOUT key " + key + ", flushing " + allRecords.size + " records in " + recordChunks.size + "chunks") - recordChunks - .flatMap(subset => executePipeline(controllerServiceLookupSink, streamContext, subset.iterator)) - .iterator - } - else if (recordChunks.last.size == chunkSize) { - state.remove() - //logger.debug("REMOVE key " + key + ", flushing " + allRecords.size + " records in " + recordChunks.size + "chunks") - recordChunks - .flatMap(subset => executePipeline(controllerServiceLookupSink, streamContext, subset.iterator)) - .iterator - } - else if (!state.exists) { - - val newChunk = new StandardRecord("chunk_record") //Chunk(key, recordChunks.last) - newChunk.setObjectField(ALL_RECORDS, recordChunks.last) - newChunk.setStringField(FieldDictionary.RECORD_KEY, key) - newChunk.setLongField(CHUNK_CREATION_TS, new Date().getTime) - // logger.debug("CREATE key " + key + " new chunk with " + allRecords.size + " records") - - state.update(newChunk) - state.setTimeoutDuration(timeOutDuration) - - recordChunks - .slice(0, recordChunks.length - 1) - .flatMap(subset => executePipeline(controllerServiceLookupSink, streamContext, subset.iterator)) - .iterator - } - - - else { - val currentChunk = state.get - if (recordChunks.size == 1) { - currentChunk.setObjectField(ALL_RECORDS, allRecords) - state.update(currentChunk) - // logger.debug("UPDATE key " + key + ", allRecords " + allRecords.size + ", recordChunks " + recordChunks.size) - Iterator.empty - } else { - currentChunk.setObjectField(ALL_RECORDS, recordChunks.last) - //logger.debug("UPDATE key " + key + ", allRecords " + allRecords.size + ", recordChunks " + recordChunks.size) - - state.update(currentChunk) - state.setTimeoutDuration(timeOutDuration) - - recordChunks - .slice(0, recordChunks.length - 1) - .flatMap(subset => executePipeline(controllerServiceLookupSink, streamContext, subset.iterator)) - .iterator - } - - } - - - } - - private def executePipeline(controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink], streamContext: StreamContext, iterator: Iterator[Record]) - - = { - val controllerServiceLookup = controllerServiceLookupSink.value.getControllerServiceLookup() - - - // convert to logisland records - var processingRecords: util.Collection[Record] = iterator.toList - - val pipelineMetricPrefix = streamContext.getIdentifier + "." - // loop over processor chain - streamContext.getProcessContexts.foreach(processorContext => { - val startTime = System.currentTimeMillis() - val processor = processorContext.getProcessor - - val processorTimerContext = UserMetricsSystem.timer(pipelineMetricPrefix + - processorContext.getIdentifier + ".processing_time_ms").time() - - // injects controller service lookup into processor context - if (processor.hasControllerService) { - processorContext.setControllerServiceLookup(controllerServiceLookup) - } - - // processor setup (don't forget that) - if (!processor.isInitialized) - processor.init(processorContext) - - // do the actual processing - processingRecords = processor.process(processorContext, processingRecords) - - // compute metrics - ProcessorMetrics.computeMetrics( - pipelineMetricPrefix + processorContext.getIdentifier + ".", - processingRecords, - processingRecords, - 0, - processingRecords.size, - System.currentTimeMillis() - startTime) - - processorTimerContext.stop() - }) - - - processingRecords.asScala.iterator - } - - /** - * create a streaming DataFrame that represents data received - * - * @param streamContext - * @return DataFrame currently loaded - */ - def save(df: Dataset[Record], controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink], streamContext: StreamContext): StreamingQuery = { - - - implicit val recordEncoder = org.apache.spark.sql.Encoders.kryo[Record] - - // make sure controller service lookup won't be serialized !! - streamContext.setControllerServiceLookup(null) - - // create serializer - val serializer = SerializerProvider.getSerializer( - streamContext.getPropertyValue(WRITE_TOPICS_SERIALIZER).asString, - streamContext.getPropertyValue(AVRO_OUTPUT_SCHEMA).asString) - - // create serializer - val keySerializer = SerializerProvider.getSerializer( - streamContext.getPropertyValue(WRITE_TOPICS_KEY_SERIALIZER).asString, null) - - // do the parallel processing - val df2 = df.mapPartitions(record => record.map(record => serializeRecords(serializer, keySerializer, record))) - - write(df2, controllerServiceLookupSink, streamContext) - .queryName(streamContext.getIdentifier) - // .outputMode("update") - .option("checkpointLocation", "checkpoints/" + streamContext.getIdentifier) - .start() - // .processAllAvailable() - - } - - - protected def serializeRecords(valueSerializer: RecordSerializer, keySerializer: RecordSerializer, record: Record) - - = { - - try { - val ret = /*valueSerializer match { - case s: JsonSerializer => - new StandardRecord() - .setField(FieldDictionary.RECORD_VALUE, FieldType.STRING, doSerializeAsString(valueSerializer, record)) - case _ =>*/ - new StandardRecord() - .setField(FieldDictionary.RECORD_VALUE, FieldType.BYTES, doSerialize(valueSerializer, record)) - // } - val fieldKey = record.getField(FieldDictionary.RECORD_KEY) - if (fieldKey != null) { - ret.setField(FieldDictionary.RECORD_KEY, FieldType.BYTES, doSerialize(keySerializer, new StandardRecord().setField(fieldKey))) - } else { - ret.setField(FieldDictionary.RECORD_KEY, FieldType.NULL, null) - - } - ret - - } catch { - case t: Throwable => - logger.error(s"exception while serializing events ${ - t.getMessage - }") - null - } - - - } - - private def doSerializeAsString(serializer: RecordSerializer, record: Record): String - - = { - val baos: ByteArrayOutputStream = new ByteArrayOutputStream - serializer.serialize(baos, record) - val bytes = baos.toByteArray - baos.close() - new String(bytes) - - - } - - private def doSerialize(serializer: RecordSerializer, record: Record): Array[Byte] - - = { - val baos: ByteArrayOutputStream = new ByteArrayOutputStream - serializer.serialize(baos, record) - val bytes = baos.toByteArray - baos.close() - bytes - - - } - - private def doDeserialize(serializer: RecordSerializer, field: Field): Record - - = { - val f = field.getRawValue - val s = if (f.isInstanceOf[String]) f.asInstanceOf[String].getBytes else f; - val bais = new ByteArrayInputStream(s.asInstanceOf[Array[Byte]]) - try { - serializer.deserialize(bais) - } finally { - bais.close() - } - } - - protected def deserializeRecords(serializer: RecordSerializer, keySerializer: RecordSerializer, r: Record) - - = { - try { - val deserialized = doDeserialize(serializer, r.getField(FieldDictionary.RECORD_VALUE)) - // copy root record field - if (r.hasField(FieldDictionary.RECORD_NAME)) - deserialized.setField(r.getField(FieldDictionary.RECORD_NAME)) - - // TODO : handle key stuff - /* if (r.hasField(FieldDictionary.RECORD_KEY) && r.getField(FieldDictionary.RECORD_KEY).getRawValue != null) { - - try { - val deserializedKey = doDeserialize(keySerializer, r.getField(FieldDictionary.RECORD_KEY)) - if (deserializedKey.hasField(FieldDictionary.RECORD_VALUE) && deserializedKey.getField(FieldDictionary.RECORD_VALUE).getRawValue != null) { - val f = deserializedKey.getField(FieldDictionary.RECORD_VALUE) - deserialized.setField(FieldDictionary.RECORD_KEY, f.getType, f.getRawValue) - } - } catch { - case t: Throwable => logger.trace(s"Unable to serialize key for record $r with serializer $keySerializer") - } - }*/ - - Some(deserialized) - - } - - catch { - case t: Throwable => - logger.error(s"exception while deserializing events ${ - t.getMessage - }") - None - } - } - - -} diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/StructuredStreamProviderServiceReader.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/StructuredStreamProviderServiceReader.scala new file mode 100644 index 000000000..2c90ec0f3 --- /dev/null +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/StructuredStreamProviderServiceReader.scala @@ -0,0 +1,46 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.stream.spark.structured.provider + +import com.hurence.logisland.controller.ControllerService +import com.hurence.logisland.record._ +import org.apache.spark.sql.{Dataset, SparkSession} + + +trait StructuredStreamProviderServiceReader extends ControllerService { + + /** + * create a streaming DataFrame that represents data received + * + * @return DataFrame currently loaded + */ + def read(spark: SparkSession): Dataset[Record] +} diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/StructuredStreamProviderServiceWriter.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/StructuredStreamProviderServiceWriter.scala new file mode 100644 index 000000000..6392d43df --- /dev/null +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/stream/spark/structured/provider/StructuredStreamProviderServiceWriter.scala @@ -0,0 +1,64 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.stream.spark.structured.provider + +import com.hurence.logisland.component.PropertyDescriptor +import com.hurence.logisland.controller.ControllerService +import com.hurence.logisland.record._ +import com.hurence.logisland.util.spark.ControllerServiceLookupSink +import org.apache.spark.broadcast.Broadcast +import org.apache.spark.sql.Dataset +import org.apache.spark.sql.streaming._ + + +trait StructuredStreamProviderServiceWriter extends ControllerService { + + /** + * create a streaming DataFrame that represents data received + * + * @return DataFrame currently loaded + */ + def write(df: Dataset[Record], controllerServiceLookupSink: Broadcast[ControllerServiceLookupSink]): DataStreamWriter[_] +} + +object StructuredStreamProviderServiceWriter { + val APPEND_MODE = "append" + val COMPLETE_MODE = "complete" + val UPDATE_MODE = "update" + + val OUTPUT_MODE: PropertyDescriptor = new PropertyDescriptor.Builder() + .name("output.mode") + .description("output mode for the streaming sink. By default will use output mode by default of the sink (see sink doc)") + .defaultValue(UPDATE_MODE) + .allowableValues(APPEND_MODE, COMPLETE_MODE, UPDATE_MODE) + .required(false) + .build +} diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/util/spark/ControllerServiceLookupSink.scala b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/util/spark/ControllerServiceLookupSink.scala index 702900c60..3534b95b4 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/util/spark/ControllerServiceLookupSink.scala +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/main/scala/com/hurence/logisland/util/spark/ControllerServiceLookupSink.scala @@ -44,8 +44,6 @@ object ControllerServiceLookupSink { def apply(configs: util.Collection[ControllerServiceConfiguration]): ControllerServiceLookupSink = { val f = () => { new StandardControllerServiceLookup(configs) - - } new ControllerServiceLookupSink(f) } diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/connect/KafkaConnectTest.java b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/connect/KafkaConnectTest.java index 2ad335080..c28c80dc5 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/connect/KafkaConnectTest.java +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/connect/KafkaConnectTest.java @@ -19,7 +19,6 @@ import com.hurence.logisland.config.ConfigReader; import com.hurence.logisland.config.LogislandConfiguration; import com.hurence.logisland.engine.EngineContext; -import com.hurence.logisland.util.runner.TestRunner; import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; @@ -54,7 +53,7 @@ public void remoteTest() { LogislandConfiguration sessionConf = ConfigReader.loadConfig(configFile); // instantiate engine and all the processor from the config - engineInstance = ComponentFactory.getEngineContext(sessionConf.getEngine()); + engineInstance = ComponentFactory.buildAndSetUpEngineContext(sessionConf.getEngine()); assert engineInstance.isPresent(); assert engineInstance.get().isValid(); diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/engine/AbstractStreamProcessingIntegrationTest.java b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/engine/AbstractStreamProcessingIntegrationTest.java index 0fe57bd2a..7d0354168 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/engine/AbstractStreamProcessingIntegrationTest.java +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/engine/AbstractStreamProcessingIntegrationTest.java @@ -18,7 +18,7 @@ import com.hurence.logisland.record.Record; import com.hurence.logisland.serializer.KryoSerializer; import com.hurence.logisland.stream.StreamProperties; -import com.hurence.logisland.util.spark.SparkUtils; +import com.hurence.logisland.stream.spark.structured.provider.KafkaProperties; import kafka.admin.AdminUtils; import kafka.admin.RackAwareMode; import kafka.server.KafkaConfig; @@ -113,19 +113,19 @@ public void setUp() throws InterruptedException, IOException { kafkaServer = TestUtils.createServer(config, mock); // create topics - if (!AdminUtils.topicExists(zkUtils, StreamProperties.DEFAULT_ERRORS_TOPIC().getValue())) + if (!AdminUtils.topicExists(zkUtils, KafkaProperties.DEFAULT_ERRORS_TOPIC().getValue())) AdminUtils.createTopic(zkUtils, - StreamProperties.DEFAULT_ERRORS_TOPIC().getValue(), + KafkaProperties.DEFAULT_ERRORS_TOPIC().getValue(), 1, 1, new Properties(), RackAwareMode.Disabled$.MODULE$); - if (!AdminUtils.topicExists(zkUtils, StreamProperties.DEFAULT_RECORDS_TOPIC().getValue())) - AdminUtils.createTopic(zkUtils, StreamProperties.DEFAULT_RECORDS_TOPIC().getValue(), 1, 1, new Properties(), RackAwareMode.Disabled$.MODULE$); - if (!AdminUtils.topicExists(zkUtils, StreamProperties.DEFAULT_RAW_TOPIC().getValue())) - AdminUtils.createTopic(zkUtils, StreamProperties.DEFAULT_RAW_TOPIC().getValue(), 1, 1, new Properties(), RackAwareMode.Disabled$.MODULE$); - if (!AdminUtils.topicExists(zkUtils, StreamProperties.DEFAULT_METRICS_TOPIC().getValue())) - AdminUtils.createTopic(zkUtils, StreamProperties.DEFAULT_METRICS_TOPIC().getValue(), 1, 1, new Properties(), RackAwareMode.Disabled$.MODULE$); + if (!AdminUtils.topicExists(zkUtils, KafkaProperties.DEFAULT_RECORDS_TOPIC().getValue())) + AdminUtils.createTopic(zkUtils, KafkaProperties.DEFAULT_RECORDS_TOPIC().getValue(), 1, 1, new Properties(), RackAwareMode.Disabled$.MODULE$); + if (!AdminUtils.topicExists(zkUtils, KafkaProperties.DEFAULT_RAW_TOPIC().getValue())) + AdminUtils.createTopic(zkUtils, KafkaProperties.DEFAULT_RAW_TOPIC().getValue(), 1, 1, new Properties(), RackAwareMode.Disabled$.MODULE$); + if (!AdminUtils.topicExists(zkUtils, KafkaProperties.DEFAULT_METRICS_TOPIC().getValue())) + AdminUtils.createTopic(zkUtils, KafkaProperties.DEFAULT_METRICS_TOPIC().getValue(), 1, 1, new Properties(), RackAwareMode.Disabled$.MODULE$); // deleting zookeeper information to make sure the consumer starts from the beginning @@ -160,7 +160,7 @@ public void setUp() throws InterruptedException, IOException { @After public void tearDown() throws NoSuchFieldException, IllegalAccessException, InterruptedException { - engine.shutdown(engineContext); + engine.stop(engineContext); Thread.sleep(2000); if (kafkaServer != null) { @@ -170,14 +170,14 @@ public void tearDown() throws NoSuchFieldException, IllegalAccessException, Inte } if (zkUtils != null) { - if (AdminUtils.topicExists(zkUtils, StreamProperties.DEFAULT_ERRORS_TOPIC().getValue())) - AdminUtils.deleteTopic(zkUtils, StreamProperties.DEFAULT_ERRORS_TOPIC().getValue()); - if (AdminUtils.topicExists(zkUtils, StreamProperties.DEFAULT_RECORDS_TOPIC().getValue())) - AdminUtils.deleteTopic(zkUtils, StreamProperties.DEFAULT_RECORDS_TOPIC().getValue()); - if (AdminUtils.topicExists(zkUtils, StreamProperties.DEFAULT_RAW_TOPIC().getValue())) - AdminUtils.deleteTopic(zkUtils, StreamProperties.DEFAULT_RAW_TOPIC().getValue()); - if (AdminUtils.topicExists(zkUtils, StreamProperties.DEFAULT_METRICS_TOPIC().getValue())) - AdminUtils.deleteTopic(zkUtils, StreamProperties.DEFAULT_METRICS_TOPIC().getValue()); + if (AdminUtils.topicExists(zkUtils, KafkaProperties.DEFAULT_ERRORS_TOPIC().getValue())) + AdminUtils.deleteTopic(zkUtils, KafkaProperties.DEFAULT_ERRORS_TOPIC().getValue()); + if (AdminUtils.topicExists(zkUtils, KafkaProperties.DEFAULT_RECORDS_TOPIC().getValue())) + AdminUtils.deleteTopic(zkUtils, KafkaProperties.DEFAULT_RECORDS_TOPIC().getValue()); + if (AdminUtils.topicExists(zkUtils, KafkaProperties.DEFAULT_RAW_TOPIC().getValue())) + AdminUtils.deleteTopic(zkUtils, KafkaProperties.DEFAULT_RAW_TOPIC().getValue()); + if (AdminUtils.topicExists(zkUtils, KafkaProperties.DEFAULT_METRICS_TOPIC().getValue())) + AdminUtils.deleteTopic(zkUtils, KafkaProperties.DEFAULT_METRICS_TOPIC().getValue()); zkUtils.close(); } diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/engine/ProgrammaticStreamProcessingIntegrationTest.java b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/engine/ProgrammaticStreamProcessingIntegrationTest.java index fa1a74fcb..69b1c2b67 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/engine/ProgrammaticStreamProcessingIntegrationTest.java +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/engine/ProgrammaticStreamProcessingIntegrationTest.java @@ -22,11 +22,11 @@ import com.hurence.logisland.config.StreamConfiguration; import com.hurence.logisland.engine.spark.KafkaStreamProcessingEngine; import com.hurence.logisland.stream.StreamProperties; +import com.hurence.logisland.stream.spark.structured.provider.KafkaProperties; import com.hurence.logisland.util.runner.MockProcessor; import com.hurence.logisland.record.FieldType; import com.hurence.logisland.record.Record; import com.hurence.logisland.record.StandardRecord; -import com.hurence.logisland.stream.spark.AbstractKafkaRecordStream; import com.hurence.logisland.stream.spark.KafkaRecordStreamParallelProcessing; import org.junit.Ignore; import org.junit.Test; @@ -64,22 +64,22 @@ Optional getEngineContext() { conf.setConfiguration(properties); conf.addPipelineConfigurations(createStreamConfig()); - return ComponentFactory.getEngineContext(conf); + return ComponentFactory.buildAndSetUpEngineContext(conf); } private StreamConfiguration createStreamConfig() { Map properties = new HashMap<>(); - properties.put(StreamProperties.KAFKA_METADATA_BROKER_LIST().getName(), BROKERHOST + ":" + BROKERPORT); - properties.put(StreamProperties.KAFKA_ZOOKEEPER_QUORUM().getName(), ZKHOST + ":" + zkServer.port()); - properties.put(StreamProperties.KAFKA_TOPIC_DEFAULT_REPLICATION_FACTOR().getName(), "1"); - properties.put(StreamProperties.KAFKA_TOPIC_DEFAULT_PARTITIONS().getName(), "1"); - properties.put(StreamProperties.INPUT_SERIALIZER().getName(), StreamProperties.KRYO_SERIALIZER().getValue()); - properties.put(StreamProperties.OUTPUT_SERIALIZER().getName(), StreamProperties.KRYO_SERIALIZER().getValue()); - properties.put(StreamProperties.KAFKA_MANUAL_OFFSET_RESET().getName(), StreamProperties.LATEST_OFFSET().getValue()); - - properties.put(StreamProperties.INPUT_TOPICS().getName(), INPUT_TOPIC); - properties.put(StreamProperties.OUTPUT_TOPICS().getName(), OUTPUT_TOPIC); + properties.put(KafkaProperties.KAFKA_METADATA_BROKER_LIST().getName(), BROKERHOST + ":" + BROKERPORT); + properties.put(KafkaProperties.KAFKA_ZOOKEEPER_QUORUM().getName(), ZKHOST + ":" + zkServer.port()); + properties.put(KafkaProperties.KAFKA_TOPIC_DEFAULT_REPLICATION_FACTOR().getName(), "1"); + properties.put(KafkaProperties.KAFKA_TOPIC_DEFAULT_PARTITIONS().getName(), "1"); + properties.put(KafkaProperties.INPUT_SERIALIZER().getName(), StreamProperties.KRYO_SERIALIZER().getValue()); + properties.put(KafkaProperties.OUTPUT_SERIALIZER().getName(), StreamProperties.KRYO_SERIALIZER().getValue()); + properties.put(KafkaProperties.KAFKA_MANUAL_OFFSET_RESET().getName(), StreamProperties.LATEST_OFFSET().getValue()); + + properties.put(KafkaProperties.INPUT_TOPICS().getName(), INPUT_TOPIC); + properties.put(KafkaProperties.OUTPUT_TOPICS().getName(), OUTPUT_TOPIC); StreamConfiguration conf = new StreamConfiguration(); conf.setComponent(KafkaRecordStreamParallelProcessing.class.getName()); diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/engine/RecordStreamProcessingDebuggerTest.java b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/engine/RecordStreamProcessingDebuggerTest.java index 3e565afdd..d5be05473 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/engine/RecordStreamProcessingDebuggerTest.java +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/engine/RecordStreamProcessingDebuggerTest.java @@ -26,6 +26,7 @@ import com.hurence.logisland.stream.spark.KafkaRecordStreamHDFSBurner; import com.hurence.logisland.stream.spark.KafkaRecordStreamParallelProcessing; import com.hurence.logisland.stream.spark.KafkaRecordStreamSQLAggregator; +import com.hurence.logisland.stream.spark.structured.provider.KafkaProperties; import com.hurence.logisland.util.runner.MockProcessor; import org.junit.Ignore; import org.junit.Test; @@ -60,7 +61,7 @@ public void remoteTest() { try { // instanciate engine and all the processor from the config - Optional engineInstance = ComponentFactory.getEngineContext(engineConf); + Optional engineInstance = ComponentFactory.buildAndSetUpEngineContext(engineConf); assert engineInstance.isPresent(); assert engineInstance.get().isValid(); @@ -98,20 +99,20 @@ private StreamConfiguration getBurnerStreamConfiguration() { "sd-84190:6667,sd-84191:6667,sd-84192:6667,sd-84196:6667"); chainProperties.put(AbstractKafkaRecordStream.KAFKA_ZOOKEEPER_QUORUM().getName(), "sd-76387:2181,sd-84186:2181,sd-84189:2181");*/ - streamProperties.put(StreamProperties.KAFKA_METADATA_BROKER_LIST().getName(), + streamProperties.put(KafkaProperties.KAFKA_METADATA_BROKER_LIST().getName(), "sandbox:9092"); - streamProperties.put(StreamProperties.KAFKA_ZOOKEEPER_QUORUM().getName(), + streamProperties.put(KafkaProperties.KAFKA_ZOOKEEPER_QUORUM().getName(), "sandbox:2181"); - streamProperties.put(StreamProperties.INPUT_TOPICS().getName(), "logisland_events"); - streamProperties.put(StreamProperties.OUTPUT_TOPICS().getName(), "none"); - streamProperties.put(StreamProperties.INPUT_SERIALIZER().getName(), StreamProperties.KRYO_SERIALIZER().getValue()); - streamProperties.put(StreamProperties.OUTPUT_SERIALIZER().getName(), StreamProperties.NO_SERIALIZER().getValue()); - streamProperties.put(StreamProperties.KAFKA_TOPIC_DEFAULT_REPLICATION_FACTOR().getName(), "1"); - streamProperties.put(StreamProperties.KAFKA_TOPIC_DEFAULT_PARTITIONS().getName(), "2"); + streamProperties.put(KafkaProperties.INPUT_TOPICS().getName(), "logisland_events"); + streamProperties.put(KafkaProperties.OUTPUT_TOPICS().getName(), "none"); + streamProperties.put(KafkaProperties.INPUT_SERIALIZER().getName(), StreamProperties.KRYO_SERIALIZER().getValue()); + streamProperties.put(KafkaProperties.OUTPUT_SERIALIZER().getName(), StreamProperties.NO_SERIALIZER().getValue()); + streamProperties.put(KafkaProperties.KAFKA_TOPIC_DEFAULT_REPLICATION_FACTOR().getName(), "1"); + streamProperties.put(KafkaProperties.KAFKA_TOPIC_DEFAULT_PARTITIONS().getName(), "2"); - streamProperties.put(StreamProperties.OUTPUT_FOLDER_PATH().getName(), "data/logisland_events"); - streamProperties.put(StreamProperties.OUTPUT_FORMAT().getName(), "parquet"); - streamProperties.put(StreamProperties.RECORD_TYPE().getName(), "record"); + streamProperties.put(KafkaRecordStreamHDFSBurner.OUTPUT_FOLDER_PATH().getName(), "data/logisland_events"); + streamProperties.put(KafkaRecordStreamHDFSBurner.OUTPUT_FORMAT().getName(), "parquet"); + streamProperties.put(KafkaRecordStreamHDFSBurner.RECORD_TYPE().getName(), "record"); StreamConfiguration chainConf = new StreamConfiguration(); chainConf.setComponent(KafkaRecordStreamHDFSBurner.class.getName()); @@ -124,18 +125,18 @@ private StreamConfiguration getBurnerStreamConfiguration() { private StreamConfiguration getParallelStreamConfiguration() { Map streamProperties = new HashMap<>(); - streamProperties.put(StreamProperties.KAFKA_METADATA_BROKER_LIST().getName(), + streamProperties.put(KafkaProperties.KAFKA_METADATA_BROKER_LIST().getName(), "sandbox:9092"); - streamProperties.put(StreamProperties.KAFKA_ZOOKEEPER_QUORUM().getName(), + streamProperties.put(KafkaProperties.KAFKA_ZOOKEEPER_QUORUM().getName(), "sandbox:2181"); - streamProperties.put(StreamProperties.OUTPUT_TOPICS().getName(), "logisland_events"); - streamProperties.put(StreamProperties.INPUT_TOPICS().getName(), "logisland_raw"); - streamProperties.put(StreamProperties.ERROR_TOPICS().getName(), "logisland_errors"); - streamProperties.put(StreamProperties.INPUT_SERIALIZER().getName(), + streamProperties.put(KafkaProperties.OUTPUT_TOPICS().getName(), "logisland_events"); + streamProperties.put(KafkaProperties.INPUT_TOPICS().getName(), "logisland_raw"); + streamProperties.put(KafkaProperties.ERROR_TOPICS().getName(), "logisland_errors"); + streamProperties.put(KafkaProperties.INPUT_SERIALIZER().getName(), StreamProperties.NO_SERIALIZER().getValue()); - streamProperties.put(StreamProperties.OUTPUT_SERIALIZER().getName(), + streamProperties.put(KafkaProperties.OUTPUT_SERIALIZER().getName(), StreamProperties.JSON_SERIALIZER().getValue()); - streamProperties.put(StreamProperties.ERROR_SERIALIZER().getName(), + streamProperties.put(KafkaProperties.ERROR_SERIALIZER().getName(), StreamProperties.JSON_SERIALIZER().getValue()); streamProperties.put(StreamProperties.AVRO_OUTPUT_SCHEMA().getName(), @@ -157,8 +158,8 @@ private StreamConfiguration getParallelStreamConfiguration() { " { \"name\": \"identd\", \"type\": [\"string\",\"null\"] },\n" + " { \"name\": \"user\", \"type\": [\"string\",\"null\"] } ]}"); - streamProperties.put(StreamProperties.KAFKA_TOPIC_DEFAULT_REPLICATION_FACTOR().getName(), "1"); - streamProperties.put(StreamProperties.KAFKA_TOPIC_DEFAULT_PARTITIONS().getName(), "2"); + streamProperties.put(KafkaProperties.KAFKA_TOPIC_DEFAULT_REPLICATION_FACTOR().getName(), "1"); + streamProperties.put(KafkaProperties.KAFKA_TOPIC_DEFAULT_PARTITIONS().getName(), "2"); StreamConfiguration chainConf = new StreamConfiguration(); @@ -172,14 +173,14 @@ private StreamConfiguration getParallelStreamConfiguration() { private StreamConfiguration getDebuggerStreamConfiguration() { Map streamProperties = new HashMap<>(); - streamProperties.put(StreamProperties.KAFKA_METADATA_BROKER_LIST().getName(), "sandbox:9092"); - streamProperties.put(StreamProperties.KAFKA_ZOOKEEPER_QUORUM().getName(), "sandbox:2181"); - streamProperties.put(StreamProperties.INPUT_TOPICS().getName(), "logisland_raw"); - streamProperties.put(StreamProperties.OUTPUT_TOPICS().getName(), "logisland_events"); - streamProperties.put(StreamProperties.INPUT_SERIALIZER().getName(), StreamProperties.NO_SERIALIZER().getValue()); - streamProperties.put(StreamProperties.OUTPUT_SERIALIZER().getName(), StreamProperties.JSON_SERIALIZER().getValue()); - streamProperties.put(StreamProperties.KAFKA_TOPIC_DEFAULT_REPLICATION_FACTOR().getName(), "1"); - streamProperties.put(StreamProperties.KAFKA_TOPIC_DEFAULT_PARTITIONS().getName(), "4"); + streamProperties.put(KafkaProperties.KAFKA_METADATA_BROKER_LIST().getName(), "sandbox:9092"); + streamProperties.put(KafkaProperties.KAFKA_ZOOKEEPER_QUORUM().getName(), "sandbox:2181"); + streamProperties.put(KafkaProperties.INPUT_TOPICS().getName(), "logisland_raw"); + streamProperties.put(KafkaProperties.OUTPUT_TOPICS().getName(), "logisland_events"); + streamProperties.put(KafkaProperties.INPUT_SERIALIZER().getName(), StreamProperties.NO_SERIALIZER().getValue()); + streamProperties.put(KafkaProperties.OUTPUT_SERIALIZER().getName(), StreamProperties.JSON_SERIALIZER().getValue()); + streamProperties.put(KafkaProperties.KAFKA_TOPIC_DEFAULT_REPLICATION_FACTOR().getName(), "1"); + streamProperties.put(KafkaProperties.KAFKA_TOPIC_DEFAULT_PARTITIONS().getName(), "4"); StreamConfiguration chainConf = new StreamConfiguration(); @@ -193,21 +194,21 @@ private StreamConfiguration getDebuggerStreamConfiguration() { private StreamConfiguration getSQLStreamConfiguration() { Map streamProperties = new HashMap<>(); - streamProperties.put(StreamProperties.OUTPUT_RECORD_TYPE().getName(), "product_metric"); - streamProperties.put(StreamProperties.KAFKA_METADATA_BROKER_LIST().getName(), + streamProperties.put(KafkaRecordStreamSQLAggregator.OUTPUT_RECORD_TYPE().getName(), "product_metric"); + streamProperties.put(KafkaProperties.KAFKA_METADATA_BROKER_LIST().getName(), "sd-84190:6667,sd-84191:6667,sd-84192:6667,sd-84186:6667"); - streamProperties.put(StreamProperties.KAFKA_ZOOKEEPER_QUORUM().getName(), + streamProperties.put(KafkaProperties.KAFKA_ZOOKEEPER_QUORUM().getName(), "sd-76387:2181,sd-84186:2181,sd-84189:2181"); - streamProperties.put(StreamProperties.INPUT_TOPICS().getName(), "ffact_products"); - streamProperties.put(StreamProperties.OUTPUT_TOPICS().getName(), "ffact_metrics"); - streamProperties.put(StreamProperties.INPUT_SERIALIZER().getName(), StreamProperties.JSON_SERIALIZER().getValue()); + streamProperties.put(KafkaProperties.INPUT_TOPICS().getName(), "ffact_products"); + streamProperties.put(KafkaProperties.OUTPUT_TOPICS().getName(), "ffact_metrics"); + streamProperties.put(KafkaProperties.INPUT_SERIALIZER().getName(), StreamProperties.JSON_SERIALIZER().getValue()); - streamProperties.put(StreamProperties.OUTPUT_SERIALIZER().getName(), StreamProperties.JSON_SERIALIZER().getValue()); - streamProperties.put(StreamProperties.KAFKA_TOPIC_DEFAULT_REPLICATION_FACTOR().getName(), "1"); - streamProperties.put(StreamProperties.KAFKA_TOPIC_DEFAULT_PARTITIONS().getName(), "1"); + streamProperties.put(KafkaProperties.OUTPUT_SERIALIZER().getName(), StreamProperties.JSON_SERIALIZER().getValue()); + streamProperties.put(KafkaProperties.KAFKA_TOPIC_DEFAULT_REPLICATION_FACTOR().getName(), "1"); + streamProperties.put(KafkaProperties.KAFKA_TOPIC_DEFAULT_PARTITIONS().getName(), "1"); - streamProperties.put(StreamProperties.MAX_RESULTS_COUNT().getName(), "10"); - streamProperties.put(StreamProperties.SQL_QUERY().getName(), "SELECT count(*)/first(theoretical_cadence) AS product_trs, count(*) as product_count, factory, line, first(product_type) as product_type, first(theoretical_cadence) as theoretical_cadence, max(record_time) as record_time\n" + + streamProperties.put(KafkaRecordStreamSQLAggregator.MAX_RESULTS_COUNT().getName(), "10"); + streamProperties.put(KafkaRecordStreamSQLAggregator.SQL_QUERY().getName(), "SELECT count(*)/first(theoretical_cadence) AS product_trs, count(*) as product_count, factory, line, first(product_type) as product_type, first(theoretical_cadence) as theoretical_cadence, max(record_time) as record_time\n" + " FROM ffact_products\n" + " GROUP BY factory, line\n" + " LIMIT 20"); diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/engine/RemoteApiEngineTest.java b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/engine/RemoteApiEngineTest.java index 59291b45e..c727434a4 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/engine/RemoteApiEngineTest.java +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/engine/RemoteApiEngineTest.java @@ -18,18 +18,12 @@ import com.hurence.logisland.component.ComponentFactory; import com.hurence.logisland.config.ConfigReader; import com.hurence.logisland.config.LogislandConfiguration; -import com.hurence.logisland.util.spark.SparkUtils; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; import org.junit.Ignore; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Optional; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; public class RemoteApiEngineTest { @@ -52,7 +46,7 @@ public void remoteTest() { LogislandConfiguration sessionConf = ConfigReader.loadConfig(configFile); // instanciate engine and all the processor from the config - engineInstance = ComponentFactory.getEngineContext(sessionConf.getEngine()); + engineInstance = ComponentFactory.buildAndSetUpEngineContext(sessionConf.getEngine()); assert engineInstance.isPresent(); assert engineInstance.get().isValid(); diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/engine/SparkEngineConfTest.java b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/engine/SparkEngineConfTest.java index e1e75a0ad..efb9fa5ba 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/engine/SparkEngineConfTest.java +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/engine/SparkEngineConfTest.java @@ -152,14 +152,14 @@ public void somePropertiesConfigTest() { } private void testConfIsValid(EngineConfiguration engineConf) { - Optional engineInstance = ComponentFactory.getEngineContext(engineConf); + Optional engineInstance = ComponentFactory.buildAndSetUpEngineContext(engineConf); Assert.assertTrue(engineInstance.isPresent()); Assert.assertTrue(engineInstance.get().isValid()); engineInstance.get(); } private void testConfIsNotValid(EngineConfiguration engineConf) { - Optional engineInstance = ComponentFactory.getEngineContext(engineConf); + Optional engineInstance = ComponentFactory.buildAndSetUpEngineContext(engineConf); Assert.assertTrue(engineInstance.isPresent()); Assert.assertFalse(engineInstance.get().isValid()); engineInstance.get(); diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/engine/StreamDebuggerTest.java b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/engine/StreamDebuggerTest.java index a781e63aa..8b17bc171 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/engine/StreamDebuggerTest.java +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/engine/StreamDebuggerTest.java @@ -18,7 +18,6 @@ import com.hurence.logisland.component.ComponentFactory; import com.hurence.logisland.config.ConfigReader; import com.hurence.logisland.config.LogislandConfiguration; -import com.hurence.logisland.util.spark.SparkUtils; import org.junit.Ignore; import org.junit.Test; import org.slf4j.Logger; @@ -48,7 +47,7 @@ public void remoteTest() { LogislandConfiguration sessionConf = ConfigReader.loadConfig(configFile); // instanciate engine and all the processor from the config - engineInstance = ComponentFactory.getEngineContext(sessionConf.getEngine()); + engineInstance = ComponentFactory.buildAndSetUpEngineContext(sessionConf.getEngine()); assert engineInstance.isPresent(); assert engineInstance.get().isValid(); diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/stream/spark/structured/StructuredStreamTest.java b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/stream/spark/structured/StructuredStreamTest.java index b7fede78c..affebe072 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/stream/spark/structured/StructuredStreamTest.java +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/stream/spark/structured/StructuredStreamTest.java @@ -53,7 +53,7 @@ public void remoteTest() { LogislandConfiguration sessionConf = ConfigReader.loadConfig(configFile); // instantiate engine and all the processor from the config - engineInstance = ComponentFactory.getEngineContext(sessionConf.getEngine()); + engineInstance = ComponentFactory.buildAndSetUpEngineContext(sessionConf.getEngine()); assert engineInstance.isPresent(); assert engineInstance.get().isValid(); diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/stream/spark/structured/provider/AzureEventHubsStructuredStreamProviderServiceTest.java b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/stream/spark/structured/provider/AzureEventHubsStructuredStreamProviderServiceTest.java new file mode 100644 index 000000000..dfe749e5e --- /dev/null +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/stream/spark/structured/provider/AzureEventHubsStructuredStreamProviderServiceTest.java @@ -0,0 +1,326 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.stream.spark.structured.provider; + +import com.hurence.logisland.component.InitializationException; +import com.hurence.logisland.util.runner.TestRunner; +import com.hurence.logisland.util.runner.TestRunners; +import com.hurence.logisland.stream.StreamProperties; +import org.junit.jupiter.api.Test; + +import static org.junit.Assert.fail; + +public class AzureEventHubsStructuredStreamProviderServiceTest { + + @Test + public void testConfig() throws InitializationException { + + boolean error = false; + // Missing namespace + try { + error = false; + final AzureEventHubsStructuredStreamProviderService service = + new AzureEventHubsStructuredStreamProviderService(); + // Any processor will do it, we won't use it but we need a real processor to be instantiated + final TestRunner runner = TestRunners.newTestRunner("com.hurence.logisland.processor.datastore.BulkPut"); + runner.addControllerService("eventhubs_service", service); + runner.enableControllerService(service); + error = true; + fail("Namespace not defined: this should have failed"); + } catch (AssertionError e) { + if (error) { + fail(e.getMessage()); + } else { + System.out.println(e.getMessage()); + } + } + + // Namespace but missing read or write hub + try { + error = false; + final AzureEventHubsStructuredStreamProviderService service = + new AzureEventHubsStructuredStreamProviderService(); + final TestRunner runner = TestRunners.newTestRunner("com.hurence.logisland.processor.datastore.BulkPut"); + runner.addControllerService("eventhubs_service", service); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_NAMESPACE().getName(), "namespace"); + runner.enableControllerService(service); + error = true; + fail("Namespace defined but missing read or write hub: this should have failed"); + } catch (AssertionError e) { + if (error) { + fail(e.getMessage()); + } else { + System.out.println(e.getMessage()); + } + } + + /** + * READ EVENT HUB ONLY + */ + + // Namespace, read hub but missing sasKeyName + try { + error = false; + final AzureEventHubsStructuredStreamProviderService service = + new AzureEventHubsStructuredStreamProviderService(); + final TestRunner runner = TestRunners.newTestRunner("com.hurence.logisland.processor.datastore.BulkPut"); + runner.addControllerService("eventhubs_service", service); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_NAMESPACE().getName(), "namespace"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_EVENT_HUB().getName(), "read_hub"); + runner.enableControllerService(service); + error = true; + fail("Read hub defined but missing sasKeyName: this should have failed"); + } catch (AssertionError e) { + if (error) { + fail(e.getMessage()); + } else { + System.out.println(e.getMessage()); + } + } + + // Namespace, read hub, sasKeyName but missing sasKey + try { + error = false; + final AzureEventHubsStructuredStreamProviderService service = + new AzureEventHubsStructuredStreamProviderService(); + final TestRunner runner = TestRunners.newTestRunner("com.hurence.logisland.processor.datastore.BulkPut"); + runner.addControllerService("eventhubs_service", service); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_NAMESPACE().getName(), "namespace"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_EVENT_HUB().getName(), "read_hub"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_SAS_KEY_NAME().getName(), "read_sas_key_name"); + runner.enableControllerService(service); + error = true; + fail("Read hub defined, sasKeyName defined but missing sasKey: this should have failed"); + } catch (AssertionError e) { + if (error) { + fail(e.getMessage()); + } else { + System.out.println(e.getMessage()); + } + } + + // Namespace, read hub, sasKeyName and sasKey -> should be ok + try { + final AzureEventHubsStructuredStreamProviderService service = + new AzureEventHubsStructuredStreamProviderService(); + final TestRunner runner = TestRunners.newTestRunner("com.hurence.logisland.processor.datastore.BulkPut"); + runner.addControllerService("eventhubs_service", service); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_NAMESPACE().getName(), "namespace"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_EVENT_HUB().getName(), "read_hub"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_SAS_KEY_NAME().getName(), "read_sas_key_name"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_SAS_KEY().getName(), "read_sas_key"); + runner.enableControllerService(service); + error = true; + System.out.println("Read hub defined, sasKeyName, sasKey defined: ok"); + } catch (AssertionError e) { + fail("Read hub defined, sasKeyName, sasKey defined: this should have passed"); + } + + // Bad read position value + try { + error = false; + final AzureEventHubsStructuredStreamProviderService service = + new AzureEventHubsStructuredStreamProviderService(); + final TestRunner runner = TestRunners.newTestRunner("com.hurence.logisland.processor.datastore.BulkPut"); + runner.addControllerService("eventhubs_service", service); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_NAMESPACE().getName(), "namespace"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_EVENT_HUB().getName(), "read_hub"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_SAS_KEY_NAME().getName(), "read_sas_key_name"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_SAS_KEY().getName(), "read_sas_key"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_POSITION().getName(), "bad 0123456789 value"); + runner.enableControllerService(service); + error = true; + fail("Bad read position value: this should have failed"); + } catch (AssertionError e) { + if (error) { + fail(e.getMessage()); + } else { + System.out.println(e.getMessage()); + } + } + + // Bad read position type + try { + error = false; + final AzureEventHubsStructuredStreamProviderService service = + new AzureEventHubsStructuredStreamProviderService(); + final TestRunner runner = TestRunners.newTestRunner("com.hurence.logisland.processor.datastore.BulkPut"); + runner.addControllerService("eventhubs_service", service); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_NAMESPACE().getName(), "namespace"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_EVENT_HUB().getName(), "read_hub"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_SAS_KEY_NAME().getName(), "read_sas_key_name"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_SAS_KEY().getName(), "read_sas_key"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_POSITION_TYPE().getName(), "bad value"); + runner.enableControllerService(service); + error = true; + fail("Bad read position type value: this should have failed"); + } catch (AssertionError e) { + if (error) { + fail(e.getMessage()); + } else { + System.out.println(e.getMessage()); + } + } + + // Set all read properties + try { + final AzureEventHubsStructuredStreamProviderService service = + new AzureEventHubsStructuredStreamProviderService(); + final TestRunner runner = TestRunners.newTestRunner("com.hurence.logisland.processor.datastore.BulkPut"); + runner.addControllerService("eventhubs_service", service); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_NAMESPACE().getName(), "namespace"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_EVENT_HUB().getName(), "read_hub"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_SAS_KEY_NAME().getName(), "read_sas_key_name"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_SAS_KEY().getName(), "read_sas_key"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_POSITION_TYPE().getName(), "sequenceNumber"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_CONSUMER_GROUP().getName(), "consumerGroup"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_RECEIVER_TIMEOUT().getName(), "123"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_PREFETCH_COUNT().getName(), "456"); + runner.enableControllerService(service); + System.out.println("All read properties set: ok"); + } catch (AssertionError e) { + fail("All read properties set: this should have passed"); + } + + /** + * WRITE EVENT HUB ONLY + */ + + // Namespace, write hub but missing sasKeyName + try { + error = false; + final AzureEventHubsStructuredStreamProviderService service = + new AzureEventHubsStructuredStreamProviderService(); + final TestRunner runner = TestRunners.newTestRunner("com.hurence.logisland.processor.datastore.BulkPut"); + runner.addControllerService("eventhubs_service", service); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_NAMESPACE().getName(), "namespace"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_WRITE_EVENT_HUB().getName(), "write_hub"); + runner.enableControllerService(service); + error = true; + fail("Write hub defined but missing sasKeyName: this should have failed"); + } catch (AssertionError e) { + if (error) { + fail(e.getMessage()); + } else { + System.out.println(e.getMessage()); + } + } + + // Namespace, write hub, sasKeyName but missing sasKey + try { + error = false; + final AzureEventHubsStructuredStreamProviderService service = + new AzureEventHubsStructuredStreamProviderService(); + final TestRunner runner = TestRunners.newTestRunner("com.hurence.logisland.processor.datastore.BulkPut"); + runner.addControllerService("eventhubs_service", service); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_NAMESPACE().getName(), "namespace"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_WRITE_EVENT_HUB().getName(), "write_hub"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_WRITE_SAS_KEY_NAME().getName(), "write_sas_key_name"); + runner.enableControllerService(service); + error = true; + fail("Write hub defined, sasKeyName defined but missing sasKey: this should have failed"); + } catch (AssertionError e) { + if (error) { + fail(e.getMessage()); + } else { + System.out.println(e.getMessage()); + } + } + + // Namespace, write hub, sasKeyName and sasKey -> should be ok + try { + final AzureEventHubsStructuredStreamProviderService service = + new AzureEventHubsStructuredStreamProviderService(); + final TestRunner runner = TestRunners.newTestRunner("com.hurence.logisland.processor.datastore.BulkPut"); + runner.addControllerService("eventhubs_service", service); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_NAMESPACE().getName(), "namespace"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_WRITE_EVENT_HUB().getName(), "write_hub"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_WRITE_SAS_KEY_NAME().getName(), "write_sas_key_name"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_WRITE_SAS_KEY().getName(), "write_sas_key"); + runner.enableControllerService(service); + System.out.println("Write hub defined, sasKeyName, sasKey defined: ok"); + } catch (AssertionError e) { + fail("Write hub defined, sasKeyName, sasKey defined: this should have passed"); + } + + /** + * BOTH READ AND WRITE EVENT HUBS + */ + + // Both read and write hubs, minimum set of properties needed + try { + final AzureEventHubsStructuredStreamProviderService service = + new AzureEventHubsStructuredStreamProviderService(); + final TestRunner runner = TestRunners.newTestRunner("com.hurence.logisland.processor.datastore.BulkPut"); + runner.addControllerService("eventhubs_service", service); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_NAMESPACE().getName(), "namespace"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_EVENT_HUB().getName(), "read_hub"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_SAS_KEY_NAME().getName(), "read_sas_key_name"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_SAS_KEY().getName(), "read_sas_key"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_WRITE_EVENT_HUB().getName(), "write_hub"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_WRITE_SAS_KEY_NAME().getName(), "write_sas_key_name"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_WRITE_SAS_KEY().getName(), "write_sas_key"); + runner.enableControllerService(service); + System.out.println("Read and Write hub defined with their key properties defined: ok"); + } catch (AssertionError e) { + fail("Read and Write hub defined with their key properties defined: this should have passed"); + } + + // Bad read position value as long -> ok + try { + final AzureEventHubsStructuredStreamProviderService service = + new AzureEventHubsStructuredStreamProviderService(); + final TestRunner runner = TestRunners.newTestRunner("com.hurence.logisland.processor.datastore.BulkPut"); + runner.addControllerService("eventhubs_service", service); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_NAMESPACE().getName(), "namespace"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_EVENT_HUB().getName(), "read_hub"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_SAS_KEY_NAME().getName(), "read_sas_key_name"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_SAS_KEY().getName(), "read_sas_key"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_POSITION().getName(), "1234"); + runner.enableControllerService(service); + System.out.println("Read position is a long: ok"); + } catch (AssertionError e) { + fail("Read position as long should haven been ok"); + } + + // Set all possible read and write properties + try { + final AzureEventHubsStructuredStreamProviderService service = + new AzureEventHubsStructuredStreamProviderService(); + final TestRunner runner = TestRunners.newTestRunner("com.hurence.logisland.processor.datastore.BulkPut"); + runner.addControllerService("eventhubs_service", service); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_NAMESPACE().getName(), "namespace"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_MAX_EVENTS_PER_TRIGGER().getName(), "987"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_OPERATION_TIMEOUT().getName(), "654"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_THREAD_POOL_SIZE().getName(), "321"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_EVENT_HUB().getName(), "read_hub"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_SAS_KEY_NAME().getName(), "read_sas_key_name"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_SAS_KEY().getName(), "read_sas_key"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_POSITION().getName(), "8963"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_POSITION_TYPE().getName(), "offset"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_CONSUMER_GROUP().getName(), "consumerGroup"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_RECEIVER_TIMEOUT().getName(), "8436"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_READ_PREFETCH_COUNT().getName(), "4723"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_WRITE_EVENT_HUB().getName(), "write_hub"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_WRITE_SAS_KEY_NAME().getName(), "write_sas_key_name"); + runner.setProperty(service, AzureEventHubProperties.EVENTHUBS_WRITE_SAS_KEY().getName(), "write_sas_key"); + runner.enableControllerService(service); + System.out.println("All read and write properties set: ok"); + } catch (AssertionError e) { + fail("All read and write properties set: this should have passed"); + } + } +} diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/stream/spark/structured/provider/ElasticSearchStructuredStreamSinkProviderServiceTest.java b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/stream/spark/structured/provider/ElasticSearchStructuredStreamSinkProviderServiceTest.java new file mode 100644 index 000000000..69618442c --- /dev/null +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/stream/spark/structured/provider/ElasticSearchStructuredStreamSinkProviderServiceTest.java @@ -0,0 +1,48 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.stream.spark.structured.provider; + +import com.hurence.logisland.engine.EngineContext; +import com.hurence.logisland.utils.ConfJobHelper; +import org.junit.Ignore; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Optional; + +public class ElasticSearchStructuredStreamSinkProviderServiceTest { + private static Logger logger = LoggerFactory.getLogger(ElasticSearchStructuredStreamSinkProviderServiceTest.class); + + private static final String JOB_CONF_FILE = "/conf/structured-stream-es-sink.yml"; + + @Test + @Ignore + public void indexInLocalES() { + + logger.info("Starting StreamProcessingRunner"); + + Optional engineInstance = Optional.empty(); + try { + String configFile = ElasticSearchStructuredStreamSinkProviderServiceTest.class.getResource(JOB_CONF_FILE).getPath(); + ConfJobHelper confJob = new ConfJobHelper(configFile); + confJob.initJob(); + confJob.startThenAwaitTermination(); + } catch (Exception e) { + logger.error("Unable to launch runner : {}", e); + } + } +} \ No newline at end of file diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/stream/spark/structured/provider/KafkaStructuredStreamProviderServiceTest.java b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/stream/spark/structured/provider/KafkaStructuredStreamProviderServiceTest.java new file mode 100644 index 000000000..46cb18b79 --- /dev/null +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/stream/spark/structured/provider/KafkaStructuredStreamProviderServiceTest.java @@ -0,0 +1,41 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.stream.spark.structured.provider; + +import com.hurence.logisland.component.InitializationException; +import com.hurence.logisland.processor.DebugStream; +import com.hurence.logisland.util.runner.TestRunner; +import com.hurence.logisland.util.runner.TestRunners; +import org.junit.jupiter.api.Test; + +public class KafkaStructuredStreamProviderServiceTest { + + @Test + public void testConfig() throws InitializationException { + final KafkaStructuredStreamProviderService kafkaServiceOutput = new KafkaStructuredStreamProviderService(); + // Any processor will do it, we won't use it but we need a real processor to be instantiated + final TestRunner runner = TestRunners.newTestRunner(new DebugStream()); + runner.addControllerService("kafka_service_out", kafkaServiceOutput); + runner.assertNotValid(kafkaServiceOutput); + runner.setProperty(kafkaServiceOutput, KafkaProperties.INPUT_TOPICS(), "fake_topic"); + runner.assertNotValid(kafkaServiceOutput); + runner.setProperty(kafkaServiceOutput, KafkaStructuredStreamProviderService.OUTPUT_TOPICS_FIELD(), "topic"); + runner.assertValid(kafkaServiceOutput); + runner.setProperty(kafkaServiceOutput, KafkaProperties.KAFKA_TOPIC_AUTOCREATE(), "false"); + runner.enableControllerService(kafkaServiceOutput); + } + +} diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/stream/spark/structured/provider/LocalFileStructuredStreamProviderServiceTest.java b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/stream/spark/structured/provider/LocalFileStructuredStreamProviderServiceTest.java index ab19ea8d1..0a1eb59d1 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/stream/spark/structured/provider/LocalFileStructuredStreamProviderServiceTest.java +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/stream/spark/structured/provider/LocalFileStructuredStreamProviderServiceTest.java @@ -48,7 +48,6 @@ public class LocalFileStructuredStreamProviderServiceTest { private String JOB_CONF_FILE = "/conf/timeseries-structured-stream.yml"; - @Test @Ignore public void testLocalFileStructuredStreamProviderService() { diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/stream/spark/structured/provider/ProviderServiceAsReaderRunner.java b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/stream/spark/structured/provider/ProviderServiceAsReaderRunner.java index 1d6ae83c1..d57f61708 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/stream/spark/structured/provider/ProviderServiceAsReaderRunner.java +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/stream/spark/structured/provider/ProviderServiceAsReaderRunner.java @@ -36,23 +36,23 @@ public class ProviderServiceAsReaderRunner { private static Logger logger = LoggerFactory.getLogger(ProviderServiceAsReaderRunner.class); - private final StructuredStreamProviderService provider; + private final StructuredStreamProviderServiceReader provider; private final MockControllerServiceLookup serviceLookup; - public ProviderServiceAsReaderRunner(StructuredStreamProviderService provider) { + public ProviderServiceAsReaderRunner(StructuredStreamProviderServiceReader provider) { this.provider = provider; this.serviceLookup = new MockControllerServiceLookup(); } public void run() { - EngineContext engineContext = ComponentFactory.getEngineContext(getEngineConfiguration()).get(); + EngineContext engineContext = ComponentFactory.buildAndSetUpEngineContext(getEngineConfiguration()).get(); Assert.assertTrue(engineContext.isValid()); try { engineContext.getEngine().start(engineContext); engineContext.getEngine().awaitTermination(engineContext); } catch (Exception ex) { - engineContext.getEngine().shutdown(engineContext); + engineContext.getEngine().stop(engineContext); } } @@ -62,10 +62,8 @@ private EngineConfiguration getEngineConfiguration() { engineConfiguration.setDocumentation("Plain java engine"); engineConfiguration.setComponent(KafkaStreamProcessingEngine.class.getCanonicalName()); Map props = new HashMap<>(); - props.put(StreamProperties.READ_TOPICS_SERIALIZER().getName(), "none"); - props.put(StreamProperties.READ_STREAM_SERVICE_PROVIDER().getName(), "local_file_service"); - props.put(StreamProperties.WRITE_TOPICS_SERIALIZER().getName(), StreamProperties.JSON_SERIALIZER().getValue()); - props.put(StreamProperties.WRITE_STREAM_SERVICE_PROVIDER().getName(), "console_service"); + props.put(StructuredStream.READ_STREAM_SERVICE_PROVIDER().getName(), "local_file_service"); + props.put(StructuredStream.WRITE_STREAM_SERVICE_PROVIDER().getName(), "console_service"); StreamConfiguration streamConfiguration = testStructuredStreamStream(props); // streamConfiguration.addProcessorConfiguration(debugProcessorConfiguration(Collections.emptyMap())); engineConfiguration.addPipelineConfigurations(streamConfiguration); diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/utils/ConfJobHelper.java b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/utils/ConfJobHelper.java new file mode 100644 index 000000000..5de6e15a5 --- /dev/null +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/java/com/hurence/logisland/utils/ConfJobHelper.java @@ -0,0 +1,108 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.utils; + +import com.hurence.logisland.component.ComponentFactory; +import com.hurence.logisland.component.InitializationException; +import com.hurence.logisland.config.ConfigReader; +import com.hurence.logisland.config.ControllerServiceConfiguration; +import com.hurence.logisland.config.LogislandConfiguration; +import com.hurence.logisland.engine.EngineContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.Map; +import java.util.Optional; + +public class ConfJobHelper { + + private static Logger logger = LoggerFactory.getLogger(ConfJobHelper.class); + + private final LogislandConfiguration jobConfig; + private EngineContext engineContext; + + public ConfJobHelper(LogislandConfiguration jobConfig) { + this.jobConfig = jobConfig; + } + + public ConfJobHelper(String pathConfFile) throws IOException { + this(ConfigReader.loadConfig(pathConfFile)); + } + + public void modifyControllerServiceConf(String id, Map confToModify) { + ControllerServiceConfiguration service = jobConfig.getEngine().getControllerServiceConfigurations() + .stream() + .filter(c -> id.equals(c.getControllerService())) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("service with id " + id + " does not exist")); + service.getConfiguration().putAll(confToModify); + } + + public void initJob() throws InitializationException { + // instantiate engine and all the processor from the config + // this init the engine + Optional engineInstance = ComponentFactory.buildAndSetUpEngineContext(jobConfig.getEngine()); + if (!engineInstance.isPresent()) { + throw new IllegalArgumentException("engineInstance could not be instantiated"); + } + if (!engineInstance.get().isValid()) { + throw new IllegalArgumentException("engineInstance is not valid with input configuration !"); + } + engineContext = engineInstance.get(); + logger.info("Initialized Logisland job version {}", jobConfig.getVersion()); + logger.info(jobConfig.getDocumentation()); + } + + public void stopJob() { + engineContext.getEngine().stop(engineContext); + } + + public void softStop() { + engineContext.getEngine().softStop(engineContext); + } + + public void startJob() { + String engineName = engineContext.getEngine().getIdentifier(); + try { + logger.info("Init engine {}", engineName); + engineContext.getEngine().init(engineContext); + logger.info("Start engine {}", engineName); + engineContext.getEngine().start(engineContext); + engineContext.getEngine().awaitTermination(engineContext); + } catch (Exception e) { + logger.error("Something went bad while running the job {} : {}", engineName, e); + System.exit(-1); + } + } + + public void awaitTermination() { + String engineName = engineContext.getEngine().getIdentifier(); + try { + logger.info("Waiting termination of engine {}", engineName); + logger.info("Engine {} terminated", engineName); + System.exit(0); + } catch (Exception e) { + logger.error("Something went bad while running the job {} : {}", engineName, e); + System.exit(-1); + } + } + + public void startThenAwaitTermination() { + startJob(); + awaitTermination(); + } +} diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/conf/kafka-connect-stream.yml b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/conf/kafka-connect-stream.yml index 418a55bf9..7dfd7e527 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/conf/kafka-connect-stream.yml +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/conf/kafka-connect-stream.yml @@ -1,4 +1,4 @@ -version: 1.3.0 +version: 1.4.0 documentation: LogIsland future factory job engine: diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/conf/opencv.yml b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/conf/opencv.yml index 02fb70317..90c84de46 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/conf/opencv.yml +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/conf/opencv.yml @@ -1,4 +1,4 @@ -version: 1.3.0 +version: 1.4.0 documentation: LogIsland computer vision sample engine: diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/conf/remote-engine.yml b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/conf/remote-engine.yml index a38736522..83b4e042a 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/conf/remote-engine.yml +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/conf/remote-engine.yml @@ -1,4 +1,4 @@ -version: 1.3.0 +version: 1.4.0 documentation: LogIsland remote controlled. engine: diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/conf/structured-stream-es-sink.yml b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/conf/structured-stream-es-sink.yml new file mode 100644 index 000000000..d991dd158 --- /dev/null +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/conf/structured-stream-es-sink.yml @@ -0,0 +1,145 @@ +version: 1.4.0 +documentation: Test job +# Manual test for ES structured stream sink. Read some records from files on the +# local filesystem and inject them in a local ES (docker/system install...) +# +# To run the test, run the test method in +# ElasticSearchStructuredStreamSinkProviderServiceTest class +# +# WARNING: Do not forget to delete checkpoint dir content when restarting the +# test for the record files to be taken into account!!! + +engine: + component: com.hurence.logisland.engine.spark.KafkaStreamProcessingEngine + type: engine + documentation: "Test job for ES structured stream sink: read records from local files and push them in local docker ES" + configuration: + spark.app.name: TestESSink + spark.master: local[4] + spark.driver.memory: 1G + spark.driver.cores: 1 + spark.executor.memory: 1G + spark.executor.instances: 4 + spark.executor.cores: 2 + spark.task.maxFailures: 8 + spark.streaming.batchDuration: 2000 + spark.streaming.backpressure.enabled: false + spark.streaming.blockInterval: 500 + spark.streaming.kafka.maxRatePerPartition: 10000 + spark.streaming.timeout: -1 + spark.streaming.unpersist: false + spark.streaming.kafka.maxRetries: 3 + spark.streaming.ui.retainedBatches: 200 + spark.streaming.receiver.writeAheadLog.enable: false + spark.ui.port: 4040 + + controllerServiceConfigurations: + + - controllerService: local_file_service + component: com.hurence.logisland.stream.spark.structured.provider.LocalFileStructuredStreamProviderService + configuration: + local.input.path: src/test/resources/input/structured-stream-es-sink + line.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + # Current ExtendedJsonSerializer implementation does not support Avro + # Union type which prevents to declare input schema remoteHost_geo + # record sub fields like: + # { "name": "city", "type": ["null", "string"], "default": null } + # but instead, one must use: + # { "name": "city", "type": "string" } + # We must however let null values as possible in ES sink schema otherwise + # a missing field ends up with null value witch is not conform to the + # output schema + read.value.schema: > + { + "namespace": "logisland.test", + "type": "record", + "name": "WebEvent", + "fields": [ + { "name": "AgentName", "type": ["null", "string"], "default": null }, + { "name": "record_id", "type": ["null", "string"], "default": null }, + { "name": "record_time", "type": "long" }, + { "name": "remoteHost", "type": ["null", "string"], "default": null }, + { "name": "remoteHost_domain", "type": ["null", "string"], "default": null }, + { "name": "remoteHost_geo", "type": {"name": "remoteHost_geo", "type": "record", "fields":[ + { "name": "accuracy_radius", "type": "int" }, + { "name": "city", "type": "string" }, + { "name": "continent", "type": "string" }, + { "name": "continent_code", "type": "string" }, + { "name": "country", "type": "string" }, + { "name": "country_isocode", "type": "string" }, + { "name": "latitude", "type": "double" }, + { "name": "location", "type": "string" }, + { "name": "longitude", "type": "double" }, + { "name": "postalcode", "type": "string" }, + { "name": "subdivision_0", "type": "string" }, + { "name": "subdivision_1", "type": "string" }, + { "name": "subdivision_isocode_0", "type": "string" }, + { "name": "subdivision_isocode_1", "type": "string" }, + { "name": "time_zone", "type": "string" } + ]} + }, + { "name": "is_something", "type": "boolean" }, + { "name": "url", "type": ["null", "string"], "default": null } + ] + } + + - controllerService: elasticsearch_service_sink + component: com.hurence.logisland.stream.spark.structured.provider.ElasticSearchStructuredStreamSinkProviderService + configuration: + es.nodes: localhost:9200 + es.resource: webevents + es.mapping.id: record_id + debug: true + output.schema: > + { + "namespace": "logisland.test", + "type": "record", + "name": "WebEvent", + "fields": [ + { "name": "AgentName", "type": ["null", "string"], "default": null }, + { "name": "record_id", "type": ["null", "string"], "default": null }, + { "name": "record_time", "type": ["null", "long"], "default": null }, + { "name": "remoteHost", "type": ["null", "string"], "default": null }, + { "name": "remoteHost_domain", "type": ["null", "string"], "default": null }, + { "name": "remoteHost_geo", "type": {"name": "remoteHost_geo", "type": "record", "fields":[ + { "name": "accuracy_radius", "type": ["null", "int"], "default": null }, + { "name": "city", "type": ["null", "string"], "default": null }, + { "name": "continent", "type": ["null", "string"], "default": null }, + { "name": "continent_code", "type": ["null", "string"], "default": null }, + { "name": "country", "type": ["null", "string"], "default": null }, + { "name": "country_isocode", "type": ["null", "string"], "default": null }, + { "name": "latitude", "type": ["null", "double"], "default": null }, + { "name": "location", "type": ["null", "string"], "default": null }, + { "name": "longitude", "type": ["null", "double"], "default": null }, + { "name": "postalcode", "type": ["null", "string"], "default": null }, + { "name": "subdivision_0", "type": ["null", "string"], "default": null }, + { "name": "subdivision_1", "type": ["null", "string"], "default": null }, + { "name": "subdivision_isocode_0", "type": ["null", "string"], "default": null }, + { "name": "subdivision_isocode_1", "type": ["null", "string"], "default": null }, + { "name": "time_zone", "type": ["null", "string"], "default": null } + ]} + }, + { "name": "is_something", "type": ["null", "boolean"], "default": null }, + { "name": "url", "type": ["null", "string"], "default": null } + ] + } + + - controllerService: console_service + component: com.hurence.logisland.stream.spark.structured.provider.ConsoleStructuredStreamProviderService + + streamConfigurations: + + # Indexing stream + - stream: elasticsearch_sink_test + component: com.hurence.logisland.stream.spark.structured.StructuredStream + configuration: + read.stream.service.provider: local_file_service + write.stream.service.provider: elasticsearch_service_sink + #write.stream.service.provider: console_service + spark.base.checkpoint.path: /tmp/elasticsearch_service_sink_test + + processorConfigurations: + - processor: debug + component: com.hurence.logisland.processor.DebugStream + type: parser + documentation: dump records to stdout diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/conf/structured-stream.yml b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/conf/structured-stream.yml index 62c44e042..0434a673c 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/conf/structured-stream.yml +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/conf/structured-stream.yml @@ -1,4 +1,4 @@ -version: 1.3.0 +version: 1.4.0 documentation: LogIsland future factory job engine: diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/conf/timeseries-structured-stream.yml b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/conf/timeseries-structured-stream.yml index 2e46bad5d..bf94f27ea 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/conf/timeseries-structured-stream.yml +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/conf/timeseries-structured-stream.yml @@ -1,4 +1,4 @@ -version: 1.3.0 +version: 1.4.0 documentation: LogIsland future factory job engine: @@ -43,7 +43,7 @@ engine: streamConfigurations: - # This stream take all raw events as lines comming from local files + # This stream take all raw events as lines coming from local files # these lines are split into logisland records and sent into a kafka topic - stream: parsing_stream component: com.hurence.logisland.stream.spark.structured.StructuredStream diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/input/structured-stream-es-sink/records.json b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/input/structured-stream-es-sink/records.json new file mode 100644 index 000000000..8904444e3 --- /dev/null +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/logisland-engine-spark_2_common/src/test/resources/input/structured-stream-es-sink/records.json @@ -0,0 +1,3 @@ +{"AgentName":"Mozilla","record_id":"6b29806a-fb54-4904-8bc1-c53222c8801a","record_time":1631610045550,"remoteHost":"77.215.171.200","remoteHost_domain":"peugeot.fr","remoteHost_geo":{"continent":"Europe","country":"Denmark","city":"Aarhus V","country_isocode":"DK","latitude": 56.1663,"continent_code":"EU","time_zone":"Europe/Copenhagen","subdivision_isocode_0":"82","subdivision_0":"Central Jutland","postalcode":"8210","location":"56.1663,10.2006","longitude":10.2006,"accuracy_radius":100},"is_something":true,"url":"http://www.example.com"} +{"AgentName":"Chrome","record_id":"077ae035-1576-4f47-b94c-3ab2248bacec","record_time":1630162605007,"remoteHost":"143.107.176.138","remoteHost_domain":"renault.fr","remoteHost_geo":{"continent": "South America","country": "Brazil","city": "São Paulo","country_isocode": "BR","latitude": -23.63,"continent_code": "SA","accuracy_radius": 20,"time_zone": "America/Sao_Paulo","subdivision_isocode_0": "SP","subdivision_0": "Sao Paulo","postalcode": "01000","location": "-23.63,-46.6322","longitude": -46.6322,"subdivision_isocode_1": "SP 1","subdivision_1": "Sao Paulo 1"},"is_something":false,"url":"http://www.example.com/ping"} +{"AgentName":"Internet Explorer","record_id":"0:s_BGf7T6zNMp5HXK7CDL7PRv6_Gzm2kf10","record_time":1630162605045,"remoteHost":"181.210.85.142","remoteHost_domain":"citroen.fr","is_something":true,"url":"http://www.example.com/pong"} \ No newline at end of file diff --git a/logisland-core/logisland-engines/logisland-engine-spark_2_X/pom.xml b/logisland-core/logisland-engines/logisland-engine-spark_2_X/pom.xml index a1e55e432..19bd1df61 100644 --- a/logisland-core/logisland-engines/logisland-engine-spark_2_X/pom.xml +++ b/logisland-core/logisland-engines/logisland-engine-spark_2_X/pom.xml @@ -6,7 +6,7 @@ com.hurence.logisland logisland-engines - 1.3.0 + 1.4.0 pom @@ -22,6 +22,7 @@ logisland-engine-spark_2_common logisland-engine-spark_2_1 logisland-engine-spark_2_3 + logisland-engine-spark_2_4 diff --git a/logisland-core/logisland-engines/logisland-engine-vanilla/pom.xml b/logisland-core/logisland-engines/logisland-engine-vanilla/pom.xml index 608cff02f..91821cb30 100644 --- a/logisland-core/logisland-engines/logisland-engine-vanilla/pom.xml +++ b/logisland-core/logisland-engines/logisland-engine-vanilla/pom.xml @@ -22,7 +22,7 @@ logisland-engines com.hurence.logisland - 1.3.0 + 1.4.0 4.0.0 @@ -86,19 +86,19 @@ com.fasterxml.jackson.core jackson-databind - 2.9.8 + ${jackson.version} com.fasterxml.jackson.core jackson-core - 2.9.8 + ${jackson.version} com.fasterxml.jackson.core jackson-annotations - 2.9.8 + ${jackson.version} - - com.salesforce.kafka.test kafka-junit4 3.1.0 test - org.apache.kafka kafka_2.11 diff --git a/logisland-core/logisland-engines/logisland-engine-vanilla/src/main/java/com/hurence/logisland/engine/vanilla/PlainJavaEngine.java b/logisland-core/logisland-engines/logisland-engine-vanilla/src/main/java/com/hurence/logisland/engine/vanilla/PlainJavaEngine.java index 33588c0fe..5d907b9ab 100644 --- a/logisland-core/logisland-engines/logisland-engine-vanilla/src/main/java/com/hurence/logisland/engine/vanilla/PlainJavaEngine.java +++ b/logisland-core/logisland-engines/logisland-engine-vanilla/src/main/java/com/hurence/logisland/engine/vanilla/PlainJavaEngine.java @@ -16,6 +16,8 @@ package com.hurence.logisland.engine.vanilla; import com.hurence.logisland.component.PropertyDescriptor; +import com.hurence.logisland.config.ControllerServiceConfiguration; +import com.hurence.logisland.controller.ControllerServiceInitializationContext; import com.hurence.logisland.controller.ControllerServiceLookup; import com.hurence.logisland.controller.StandardControllerServiceLookup; import com.hurence.logisland.engine.AbstractProcessingEngine; @@ -25,6 +27,7 @@ import com.hurence.logisland.stream.StreamContext; import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.concurrent.CountDownLatch; @@ -63,7 +66,7 @@ public void start(EngineContext engineContext) { } countDownLatch = new CountDownLatch(engineContext.getStreamContexts().size()); Runtime.getRuntime().addShutdownHook(new Thread(()-> { - shutdown(engineContext); + stop(engineContext); })); logger.info("Started"); @@ -71,7 +74,7 @@ public void start(EngineContext engineContext) { } @Override - public void shutdown(EngineContext engineContext) { + public void stop(EngineContext engineContext) { logger.info("Stopping"); engineContext.getStreamContexts().forEach(streamContext -> { try { @@ -86,6 +89,11 @@ public void shutdown(EngineContext engineContext) { } + @Override + public void softStop(EngineContext engineContext) { + stop(engineContext); + } + @Override public void awaitTermination(EngineContext engineContext) { try { @@ -94,9 +102,4 @@ public void awaitTermination(EngineContext engineContext) { logger.warn("Interrupted while waiting"); } } - - @Override - public void reset(EngineContext engineContext) { - shutdown(engineContext); - } } diff --git a/logisland-core/logisland-engines/logisland-engine-vanilla/src/main/java/com/hurence/logisland/engine/vanilla/stream/amqp/AmqpClientPipelineStream.java b/logisland-core/logisland-engines/logisland-engine-vanilla/src/main/java/com/hurence/logisland/engine/vanilla/stream/amqp/AmqpClientPipelineStream.java index cd4f08ae3..c7044f5b2 100644 --- a/logisland-core/logisland-engines/logisland-engine-vanilla/src/main/java/com/hurence/logisland/engine/vanilla/stream/amqp/AmqpClientPipelineStream.java +++ b/logisland-core/logisland-engines/logisland-engine-vanilla/src/main/java/com/hurence/logisland/engine/vanilla/stream/amqp/AmqpClientPipelineStream.java @@ -95,13 +95,47 @@ public List getSupportedPropertyDescriptors() { ); } + @Override + public void init(ComponentContext context) { + try { + super.init(context); + vertx = Vertx.vertx(); + options = new ProtonClientOptions(); + protonClient = ProtonClient.create(vertx); + + streamContext = (StreamContext) context; + if (streamContext.getPropertyValue(StreamOptions.READ_TOPIC_SERIALIZER).asString().equals(StreamOptions.NO_SERIALIZER.getValue())) { + deserializer = null; + } else { + deserializer = buildSerializer(streamContext.getPropertyValue(StreamOptions.READ_TOPIC_SERIALIZER).asString(), + streamContext.getPropertyValue(StreamOptions.AVRO_INPUT_SCHEMA).asString()); + } + serializer = buildSerializer(streamContext.getPropertyValue(StreamOptions.WRITE_TOPIC_SERIALIZER).asString(), + streamContext.getPropertyValue(StreamOptions.AVRO_OUTPUT_SCHEMA).asString()); + + contentType = streamContext.getPropertyValue(StreamOptions.WRITE_TOPIC_CONTENT_TYPE).asString(); + + ControllerServiceLookup controllerServiceLookup = streamContext.getControllerServiceLookup(); + for (ProcessContext processContext : streamContext.getProcessContexts()) { + if (processContext.getProcessor().hasControllerService()) { + processContext.setControllerServiceLookup(controllerServiceLookup); + } + processContext.getProcessor().init(processContext); + } + } catch (InitializationException ie) { + throw new IllegalStateException("Unable to initialize processor pipeline", ie); + } + } + @Override public void start() { connectionControl = new ConnectionControl( streamContext.getPropertyValue(StreamOptions.CONNECTION_RECONNECT_MAX_DELAY).asLong(), streamContext.getPropertyValue(StreamOptions.CONNECTION_RECONNECT_INITIAL_DELAY).asLong(), streamContext.getPropertyValue(StreamOptions.CONNECTION_RECONNECT_BACKOFF).asDouble()); - + for (ProcessContext processContext : streamContext.getProcessContexts()) { + processContext.getProcessor().start(); + } try { setupConnection(); } catch (Throwable t) { @@ -217,6 +251,11 @@ record = deserializer.deserialize(new ByteArrayInputStream(extractBodyContent(me @Override public void stop() { + if (streamContext!=null && streamContext.getProcessContexts() != null) { + for (ProcessContext processContext : streamContext.getProcessContexts()) { + processContext.getProcessor().stop(); + } + } if (connectionControl != null) { connectionControl.setRunning(false); } @@ -247,37 +286,6 @@ public void stop() { super.stop(); } - @Override - public void init(ComponentContext context) { - try { - super.init(context); - vertx = Vertx.vertx(); - options = new ProtonClientOptions(); - protonClient = ProtonClient.create(vertx); - - streamContext = (StreamContext) context; - if (streamContext.getPropertyValue(StreamOptions.READ_TOPIC_SERIALIZER).asString().equals(StreamOptions.NO_SERIALIZER.getValue())) { - deserializer = null; - } else { - deserializer = buildSerializer(streamContext.getPropertyValue(StreamOptions.READ_TOPIC_SERIALIZER).asString(), - streamContext.getPropertyValue(StreamOptions.AVRO_INPUT_SCHEMA).asString()); - } - serializer = buildSerializer(streamContext.getPropertyValue(StreamOptions.WRITE_TOPIC_SERIALIZER).asString(), - streamContext.getPropertyValue(StreamOptions.AVRO_OUTPUT_SCHEMA).asString()); - - contentType = streamContext.getPropertyValue(StreamOptions.WRITE_TOPIC_CONTENT_TYPE).asString(); - - ControllerServiceLookup controllerServiceLookup = streamContext.getControllerServiceLookup(); - for (ProcessContext processContext : streamContext.getProcessContexts()) { - if (processContext.getProcessor().hasControllerService()) { - processContext.setControllerServiceLookup(controllerServiceLookup); - } - processContext.getProcessor().init(processContext); - } - } catch (InitializationException ie) { - throw new IllegalStateException("Unable to initialize processor pipeline", ie); - } - } private void handleConnectionFailure(boolean remoteClose) { diff --git a/logisland-core/logisland-engines/logisland-engine-vanilla/src/main/java/com/hurence/logisland/engine/vanilla/stream/kafka/LogislandPipelineProcessor.java b/logisland-core/logisland-engines/logisland-engine-vanilla/src/main/java/com/hurence/logisland/engine/vanilla/stream/kafka/LogislandPipelineProcessor.java index 408bc51b7..27c9be930 100644 --- a/logisland-core/logisland-engines/logisland-engine-vanilla/src/main/java/com/hurence/logisland/engine/vanilla/stream/kafka/LogislandPipelineProcessor.java +++ b/logisland-core/logisland-engines/logisland-engine-vanilla/src/main/java/com/hurence/logisland/engine/vanilla/stream/kafka/LogislandPipelineProcessor.java @@ -72,6 +72,7 @@ public void init(ProcessorContext context) { processContext.setControllerServiceLookup(controllerServiceLookup); } processContext.getProcessor().init(processContext); + processContext.getProcessor().start(); } //now init serializers if (streamContext.getPropertyValue(StreamProperties.READ_TOPICS_SERIALIZER).asString().equals(StreamProperties.NO_SERIALIZER.getValue())) { diff --git a/logisland-core/logisland-engines/logisland-engine-vanilla/src/test/java/com/hurence/logisland/engine/vanilla/PlainJavaEngineTest.java b/logisland-core/logisland-engines/logisland-engine-vanilla/src/test/java/com/hurence/logisland/engine/vanilla/PlainJavaEngineTest.java index 4428b16b3..ba8066de6 100644 --- a/logisland-core/logisland-engines/logisland-engine-vanilla/src/test/java/com/hurence/logisland/engine/vanilla/PlainJavaEngineTest.java +++ b/logisland-core/logisland-engines/logisland-engine-vanilla/src/test/java/com/hurence/logisland/engine/vanilla/PlainJavaEngineTest.java @@ -87,20 +87,20 @@ private StreamConfiguration emptyKafkaStream(Supplier> prope @Test public void testEmpty() { - EngineContext engineContext = ComponentFactory.getEngineContext(engineConfiguration()).get(); + EngineContext engineContext = ComponentFactory.buildAndSetUpEngineContext(engineConfiguration()).get(); engineContext.getEngine().start(engineContext); engineContext.getEngine().awaitTermination(engineContext); - engineContext.getEngine().shutdown(engineContext); + engineContext.getEngine().stop(engineContext); } @Test public void testWithDefaultKafkaStream() { EngineConfiguration engineConfiguration = engineConfiguration(); engineConfiguration.addPipelineConfigurations(emptyKafkaStream(defaultPropertySupplier())); - EngineContext engineContext = ComponentFactory.getEngineContext(engineConfiguration).get(); + EngineContext engineContext = ComponentFactory.buildAndSetUpEngineContext(engineConfiguration).get(); Assert.assertTrue(engineContext.isValid()); engineContext.getEngine().start(engineContext); - engineContext.getEngine().shutdown(engineContext); + engineContext.getEngine().stop(engineContext); engineContext.getEngine().awaitTermination(engineContext); } @@ -108,7 +108,7 @@ public void testWithDefaultKafkaStream() { public void testWithBadConfiguredKafkaStream() { EngineConfiguration engineConfiguration = engineConfiguration(); engineConfiguration.addPipelineConfigurations(emptyKafkaStream(defaultPropertySupplier(Collections.singletonMap("i.do.not.exist", "!")))); - EngineContext engineContext = ComponentFactory.getEngineContext(engineConfiguration).get(); + EngineContext engineContext = ComponentFactory.buildAndSetUpEngineContext(engineConfiguration).get(); Assert.assertFalse(engineContext.isValid()); } @@ -122,7 +122,7 @@ public void testCompletePipeline() { StreamConfiguration streamConfiguration = emptyKafkaStream(defaultPropertySupplier(props)); streamConfiguration.addProcessorConfiguration(processorConfiguration(Collections.emptyMap())); engineConfiguration.addPipelineConfigurations(streamConfiguration); - EngineContext engineContext = ComponentFactory.getEngineContext(engineConfiguration).get(); + EngineContext engineContext = ComponentFactory.buildAndSetUpEngineContext(engineConfiguration).get(); Assert.assertTrue(engineContext.isValid()); engineContext.getEngine().start(engineContext); sharedKafkaTestResource.getKafkaTestUtils().createTopic("topic.in", 1, (short) 1); @@ -141,7 +141,7 @@ public void testCompletePipeline() { Record tmp = recordSerializer.deserialize(new ByteArrayInputStream(cr.value())); Assert.assertEquals(new String(ir.getValue()), tmp.getField(FieldDictionary.RECORD_VALUE).asString()); } - engineContext.getEngine().shutdown(engineContext); + engineContext.getEngine().stop(engineContext); engineContext.getEngine().awaitTermination(engineContext); } diff --git a/logisland-core/logisland-engines/logisland-engine-vanilla/src/test/java/com/hurence/logisland/engine/vanilla/stream/amqp/AmqpClientPipelineStreamTest.java b/logisland-core/logisland-engines/logisland-engine-vanilla/src/test/java/com/hurence/logisland/engine/vanilla/stream/amqp/AmqpClientPipelineStreamTest.java index 057539be9..392794801 100644 --- a/logisland-core/logisland-engines/logisland-engine-vanilla/src/test/java/com/hurence/logisland/engine/vanilla/stream/amqp/AmqpClientPipelineStreamTest.java +++ b/logisland-core/logisland-engines/logisland-engine-vanilla/src/test/java/com/hurence/logisland/engine/vanilla/stream/amqp/AmqpClientPipelineStreamTest.java @@ -48,7 +48,6 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.LinkedTransferQueue; import java.util.concurrent.TransferQueue; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -222,13 +221,13 @@ private StreamConfiguration emptyStream(Supplier> propertySu public void testEmptyEngine() { EngineConfiguration engineConfiguration = engineConfiguration(); engineConfiguration.addPipelineConfigurations(emptyStream(defaultPropertySupplier())); - EngineContext context = ComponentFactory.getEngineContext(engineConfiguration).get(); + EngineContext context = ComponentFactory.buildAndSetUpEngineContext(engineConfiguration).get(); Assert.assertTrue(context.isValid()); context.getEngine().start(context); new Timer().schedule(new TimerTask() { @Override public void run() { - context.getEngine().shutdown(context); + context.getEngine().stop(context); } }, 2000); @@ -253,7 +252,7 @@ public void testFlowControl() { )); streamConfiguration.addProcessorConfiguration(modifyKeyProcessor("i_m_the_new_key")); engineConfiguration.addPipelineConfigurations(streamConfiguration); - EngineContext context = ComponentFactory.getEngineContext(engineConfiguration).get(); + EngineContext context = ComponentFactory.buildAndSetUpEngineContext(engineConfiguration).get(); Assert.assertTrue(context.isValid()); context.getEngine().start(context); vertx.runOnContext(v -> { @@ -274,7 +273,7 @@ public void testFlowControl() { if (inQueue.size() == 0) { vertx.cancelTimer(id); - context.getEngine().shutdown(context); + context.getEngine().stop(context); } }); diff --git a/logisland-core/logisland-engines/pom.xml b/logisland-core/logisland-engines/pom.xml index 6fee6a519..26b2bc365 100644 --- a/logisland-core/logisland-engines/pom.xml +++ b/logisland-core/logisland-engines/pom.xml @@ -6,7 +6,7 @@ com.hurence.logisland logisland-core - 1.3.0 + 1.4.0 pom diff --git a/logisland-core/logisland-framework/logisland-bootstrap/pom.xml b/logisland-core/logisland-framework/logisland-bootstrap/pom.xml index f9c36c923..9adf874aa 100644 --- a/logisland-core/logisland-framework/logisland-bootstrap/pom.xml +++ b/logisland-core/logisland-framework/logisland-bootstrap/pom.xml @@ -22,7 +22,7 @@ com.hurence.logisland logisland-framework - 1.3.0 + 1.4.0 logisland-bootstrap jar diff --git a/logisland-core/logisland-framework/logisland-bootstrap/src/main/java/com/hurence/logisland/runner/GlobalOptions.java b/logisland-core/logisland-framework/logisland-bootstrap/src/main/java/com/hurence/logisland/runner/GlobalOptions.java new file mode 100644 index 000000000..a9833806b --- /dev/null +++ b/logisland-core/logisland-framework/logisland-bootstrap/src/main/java/com/hurence/logisland/runner/GlobalOptions.java @@ -0,0 +1,28 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.runner; + +/** + * Holds command line options + */ +public class GlobalOptions { + + // Databricks mode + public static boolean databricks = false; + + // Path to checkpoint directory + public static String checkpointLocation = null; +} diff --git a/logisland-core/logisland-framework/logisland-bootstrap/src/main/java/com/hurence/logisland/runner/StreamProcessingRunner.java b/logisland-core/logisland-framework/logisland-bootstrap/src/main/java/com/hurence/logisland/runner/StreamProcessingRunner.java index 85f2795a3..e88ea1150 100644 --- a/logisland-core/logisland-framework/logisland-bootstrap/src/main/java/com/hurence/logisland/runner/StreamProcessingRunner.java +++ b/logisland-core/logisland-framework/logisland-bootstrap/src/main/java/com/hurence/logisland/runner/StreamProcessingRunner.java @@ -24,10 +24,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.nio.channels.IllegalChannelGroupException; +import java.lang.reflect.Method; import java.util.Optional; - public class StreamProcessingRunner { private static Logger logger = LoggerFactory.getLogger(StreamProcessingRunner.class); @@ -40,7 +39,7 @@ public class StreamProcessingRunner { */ public static void main(String[] args) { - logger.info("starting StreamProcessingRunner"); + logger.info("Starting StreamProcessingRunner"); ////////////////////////////////////////// // Commande lien management @@ -52,6 +51,7 @@ public static void main(String[] args) { Option help = new Option("help", helpMsg); options.addOption(help); + // Configuration file OptionBuilder.withArgName("conf"); OptionBuilder.withLongOpt("config-file"); OptionBuilder.isRequired(); @@ -60,6 +60,34 @@ public static void main(String[] args) { Option conf = OptionBuilder.create("conf"); options.addOption(conf); + // Databricks mode + OptionBuilder.withArgName("databricks"); + OptionBuilder.withLongOpt("databricks-mode"); + OptionBuilder.isRequired(false); + OptionBuilder.hasArg(false); + OptionBuilder.withDescription("Databricks mode (configuration is read from DBFS)"); + Option databricks = OptionBuilder.create("databricks"); + options.addOption(databricks); + + // Checkpoint directory + OptionBuilder.withArgName("chkploc"); + OptionBuilder.withLongOpt("checkpoint-location"); + OptionBuilder.isRequired(false); + OptionBuilder.hasArg(true); + OptionBuilder.withDescription("Checkpoint location used by some engines"); + Option checkpointLocation = OptionBuilder.create("chkploc"); + options.addOption(checkpointLocation); + + // Checkpoint directory + OptionBuilder.withArgName("strict"); + OptionBuilder.withLongOpt("strict-conf-check"); + OptionBuilder.isRequired(false); + OptionBuilder.hasArg(false); + OptionBuilder.withDescription("If set, no not allowed configuration will be tolerated. " + + "A full check of the conf will be done before running the job. " + + "This way your conf file will not work if it is not clean."); + Option checkConfOpt = OptionBuilder.create("strict"); + options.addOption(checkConfOpt); Optional engineInstance = Optional.empty(); try { @@ -70,36 +98,98 @@ public static void main(String[] args) { String configFile = line.getOptionValue("conf"); // load the YAML config - LogislandConfiguration sessionConf = ConfigReader.loadConfig(configFile); + LogislandConfiguration sessionConf; + + boolean databricksMode = line.hasOption("databricks"); + + if (!databricksMode) { + sessionConf = ConfigReader.loadConfig(configFile); + } else { + logger.info("Running in databricks mode"); + GlobalOptions.databricks = true; + sessionConf = loadConfigFromSharedFS(configFile); + } + logger.info("Configuration loaded"); + + // Get checkpoint location if any + boolean chkploc = line.hasOption("chkploc"); + if (databricksMode && !chkploc) { + logger.error("Databricks mode requires checkpoint location to be set"); + System.exit(-1); + } + GlobalOptions.checkpointLocation = line.getOptionValue("chkploc"); + logger.info("Using checkpoint location: " + GlobalOptions.checkpointLocation); + boolean strictCheckConf = line.hasOption("strict"); // instantiate engine and all the processor from the config - engineInstance = ComponentFactory.getEngineContext(sessionConf.getEngine()); + // This init the engine as well + engineInstance = ComponentFactory.buildAndSetUpEngineContext(sessionConf.getEngine()); if (!engineInstance.isPresent()) { throw new IllegalArgumentException("engineInstance could not be instantiated"); } - if (!engineInstance.get().isValid()) { + //At the moment strictCheckConf has no effect ! But we could imagine latter an usage. + if (!engineInstance.get().isValid(strictCheckConf)) { throw new IllegalArgumentException("engineInstance is not valid with input configuration !"); } - logger.info("starting Logisland session version {}", sessionConf.getVersion()); + logger.info("Starting Logisland session version {}", sessionConf.getVersion()); logger.info(sessionConf.getDocumentation()); } catch (Exception e) { - logger.error("unable to launch runner", e); + logger.error("Unable to launch runner", e); System.exit(-1); } String engineName = engineInstance.get().getEngine().getIdentifier(); try { // start the engine EngineContext engineContext = engineInstance.get(); - logger.info("start engine {}", engineName); + logger.info("Init engine {}", engineName); + engineInstance.get().getEngine().init(engineContext); + logger.info("Start engine {}", engineName); engineInstance.get().getEngine().start(engineContext); - logger.info("awaitTermination for engine {}", engineName); + logger.info("Waiting termination of engine {}", engineName); engineContext.getEngine().awaitTermination(engineContext); + logger.info("Engine {} terminated", engineName); System.exit(0); } catch (Exception e) { - logger.error("something went bad while running the job {} : {}", engineName, e); + logger.error("Something went bad while running the job {} : {}", engineName, e); System.exit(-1); } + } + + /** + * Loads the configuration from the shared filesystem + * @param configFile Configuration path to load. + * With databricks, no need to put the 'dbfs:' scheme: use /foo/logisland.yml instead of + * dbfs:/foo/logisland.yml + * @return The read configuration + */ + private static LogislandConfiguration loadConfigFromSharedFS(String configFile) { + // Load the spark config reader. This is only expected to work if a spark 2+ engine is being + // used and available in the classpath (which should be the case in the azure databricks environment) + Class sparkConfigReaderClass = null; + try { + sparkConfigReaderClass = Class.forName("com.hurence.logisland.util.spark.SparkConfigReader"); + } catch(Exception e) { + logger.error("Could not load the SparkConfigReader class", e); + System.exit(-1); + } + // Prepare to call the loadConfigFromSharedFS method + Method loadConfigFromSharedFSMethod = null; + try { + loadConfigFromSharedFSMethod = sparkConfigReaderClass.getMethod("loadConfigFromSharedFS", String.class); + } catch (Exception e) { + logger.error("Could not find method loadConfigFromSharedFS in SparkConfigReader class", e); + System.exit(-1); + } + // Call the loadConfigFromSharedFS method to read the configuration from the shared filesystem + LogislandConfiguration LogislandConfiguration = null; + try { + LogislandConfiguration = (LogislandConfiguration)loadConfigFromSharedFSMethod.invoke(null, configFile); + } catch(Exception e) { + logger.error("Could not load configuration from shared filesystem", e); + System.exit(-1); + } + return LogislandConfiguration; } } diff --git a/logisland-core/logisland-framework/logisland-maven-plugin/pom.xml b/logisland-core/logisland-framework/logisland-maven-plugin/pom.xml index ee42259fd..dd837846b 100644 --- a/logisland-core/logisland-framework/logisland-maven-plugin/pom.xml +++ b/logisland-core/logisland-framework/logisland-maven-plugin/pom.xml @@ -22,7 +22,7 @@ com.hurence.logisland logisland-framework - 1.3.0 + 1.4.0 logisland-maven-plugin maven-plugin diff --git a/logisland-core/logisland-framework/logisland-maven-plugin/src/main/java/com/hurence/logisland/maven/LogislandRepackagerMojo.java b/logisland-core/logisland-framework/logisland-maven-plugin/src/main/java/com/hurence/logisland/maven/LogislandRepackagerMojo.java index a14d885ca..796a86516 100644 --- a/logisland-core/logisland-framework/logisland-maven-plugin/src/main/java/com/hurence/logisland/maven/LogislandRepackagerMojo.java +++ b/logisland-core/logisland-framework/logisland-maven-plugin/src/main/java/com/hurence/logisland/maven/LogislandRepackagerMojo.java @@ -81,7 +81,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { .map(File::getName) .toArray(a -> new String[a]), exportedBaseClasses); - project.getArtifact().setFile(file); +// project.getArtifact().setFile(file); } catch (Exception e) { throw new MojoFailureException("Logisland repackager failed", e); } @@ -90,7 +90,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { } private File getTargetFile() { - return new File(project.getBuild().getDirectory(), project.getBuild().getFinalName() + "." + return new File(project.getBuild().getDirectory(), project.getBuild().getFinalName() + "-repackaged" + "." + this.project.getArtifact().getArtifactHandler().getExtension()); } } diff --git a/logisland-core/logisland-framework/logisland-plugin-support/pom.xml b/logisland-core/logisland-framework/logisland-plugin-support/pom.xml index 95992a2aa..5b150df16 100644 --- a/logisland-core/logisland-framework/logisland-plugin-support/pom.xml +++ b/logisland-core/logisland-framework/logisland-plugin-support/pom.xml @@ -22,7 +22,7 @@ com.hurence.logisland logisland-framework - 1.3.0 + 1.4.0 logisland-plugin-support jar diff --git a/logisland-core/logisland-framework/logisland-plugin-support/src/main/java/com/hurence/logisland/classloading/PluginLoader.java b/logisland-core/logisland-framework/logisland-plugin-support/src/main/java/com/hurence/logisland/classloading/PluginLoader.java index 70977b2f7..a778b321a 100644 --- a/logisland-core/logisland-framework/logisland-plugin-support/src/main/java/com/hurence/logisland/classloading/PluginLoader.java +++ b/logisland-core/logisland-framework/logisland-plugin-support/src/main/java/com/hurence/logisland/classloading/PluginLoader.java @@ -49,15 +49,20 @@ public class PluginLoader { static { JarFile.registerUrlProtocolHandler(); - scanAndRegisterPlugins(); + scanAndRegisterPlugins(null); } /** * Scan for plugins. */ - private static void scanAndRegisterPlugins() { + public static void scanAndRegisterPlugins(ClassLoader startClassLoader) { Set urls = new HashSet<>(); - ClassLoader cl = Thread.currentThread().getContextClassLoader(); + ClassLoader cl = null; + if (startClassLoader == null) { + cl = Thread.currentThread().getContextClassLoader(); + } else { + cl = startClassLoader; + } while (cl != null) { if (cl instanceof URLClassLoader) { urls.addAll(Arrays.asList(((URLClassLoader) cl).getURLs())); diff --git a/logisland-core/logisland-framework/logisland-plugin-support/src/main/java/com/hurence/logisland/classloading/serialization/AutoProxiedSerializablePlugin.java b/logisland-core/logisland-framework/logisland-plugin-support/src/main/java/com/hurence/logisland/classloading/serialization/AutoProxiedSerializablePlugin.java index 78895c93e..2b8eba2c9 100644 --- a/logisland-core/logisland-framework/logisland-plugin-support/src/main/java/com/hurence/logisland/classloading/serialization/AutoProxiedSerializablePlugin.java +++ b/logisland-core/logisland-framework/logisland-plugin-support/src/main/java/com/hurence/logisland/classloading/serialization/AutoProxiedSerializablePlugin.java @@ -17,6 +17,8 @@ import com.hurence.logisland.classloading.PluginLoader; import com.hurence.logisland.classloading.PluginProxy; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.ByteArrayInputStream; import java.io.InvalidObjectException; @@ -29,6 +31,9 @@ * @author amarziali */ public class AutoProxiedSerializablePlugin implements Serializable { + + private static final Logger logger = LoggerFactory.getLogger(PluginLoader.class); + private final String originalClassName; private final byte[] content; @@ -40,8 +45,33 @@ public AutoProxiedSerializablePlugin(String originalClassName, byte[] content) { Object readResolve() throws ObjectStreamException { try { return PluginProxy.create(new ClassLoaderAwareObjectInputStream(new ByteArrayInputStream(content), - PluginLoader.getRegistry().getOrDefault(originalClassName, Thread.currentThread().getContextClassLoader())).readObject()); + PluginLoader.getRegistry().getOrDefault(originalClassName, + Thread.currentThread().getContextClassLoader())).readObject()); } catch (Exception e) { + + if (e instanceof ClassNotFoundException) + { + logger.info("Could not create plugin proxy for " + originalClassName + ": forcing plugin registry load " + + "and retrying..."); + /** + * In databricks environment, on executors, the static code of PluginLoader is not called (as objects are + * sent through closures?) and the current thread context classloader is a repl.ExecutorClassLoader which + * is not a URLClassLoader and has not parent. Thus, in order to fill the plugin registry once for all + * (which is not yet filled and that is why we get a ClassNotFoundException here) for the executor VM, + * we force the scanAndRegisterPlugins call using the classloader of the current class, who will allow to + * find the logisland jars. Then we try to redo the plugin proxy creation that failed. + */ + PluginLoader.scanAndRegisterPlugins(AutoProxiedSerializablePlugin.class.getClassLoader()); + + try { + return PluginProxy.create(new ClassLoaderAwareObjectInputStream(new ByteArrayInputStream(content), + PluginLoader.getRegistry().getOrDefault(originalClassName, + Thread.currentThread().getContextClassLoader())).readObject()); + } catch (Exception ex) { + logger.error("Could create plugin proxy for " + originalClassName + " after having forced plugin " + + "registry loaded"); + } + } throw new InvalidObjectException("Unable to resolve plugin proxy class: " + e.getMessage()); } } diff --git a/logisland-core/logisland-framework/logisland-scripting/logisland-scripting-base/pom.xml b/logisland-core/logisland-framework/logisland-scripting/logisland-scripting-base/pom.xml index fa7f9e0da..1e84ba5f5 100644 --- a/logisland-core/logisland-framework/logisland-scripting/logisland-scripting-base/pom.xml +++ b/logisland-core/logisland-framework/logisland-scripting/logisland-scripting-base/pom.xml @@ -4,7 +4,7 @@ com.hurence.logisland logisland-scripting - 1.3.0 + 1.4.0 logisland-scripting-base diff --git a/logisland-core/logisland-framework/logisland-scripting/logisland-scripting-mvel/pom.xml b/logisland-core/logisland-framework/logisland-scripting/logisland-scripting-mvel/pom.xml index 0d28e285d..8ac7cfe40 100644 --- a/logisland-core/logisland-framework/logisland-scripting/logisland-scripting-mvel/pom.xml +++ b/logisland-core/logisland-framework/logisland-scripting/logisland-scripting-mvel/pom.xml @@ -4,7 +4,7 @@ com.hurence.logisland logisland-scripting - 1.3.0 + 1.4.0 logisland-scripting-mvel diff --git a/logisland-core/logisland-framework/logisland-scripting/pom.xml b/logisland-core/logisland-framework/logisland-scripting/pom.xml index a1d738dd6..d74afe33b 100644 --- a/logisland-core/logisland-framework/logisland-scripting/pom.xml +++ b/logisland-core/logisland-framework/logisland-scripting/pom.xml @@ -21,7 +21,7 @@ com.hurence.logisland logisland-framework - 1.3.0 + 1.4.0 logisland-scripting diff --git a/logisland-core/logisland-framework/logisland-utils/pom.xml b/logisland-core/logisland-framework/logisland-utils/pom.xml index 688b56fb4..572f10a40 100644 --- a/logisland-core/logisland-framework/logisland-utils/pom.xml +++ b/logisland-core/logisland-framework/logisland-utils/pom.xml @@ -22,10 +22,13 @@ com.hurence.logisland logisland-framework - 1.3.0 + 1.4.0 logisland-utils jar + + 3.2.4 + @@ -49,6 +52,7 @@ com.fasterxml.jackson.dataformat jackson-dataformat-yaml + ${jackson.version} commons-cli @@ -65,10 +69,12 @@ com.fasterxml.jackson.core jackson-databind + ${jackson.version} com.fasterxml.jackson.module jackson-module-jsonSchema + ${jackson.version} com.googlecode.json-simple @@ -102,6 +108,16 @@ commons-io commons-io + + io.confluent + kafka-avro-serializer + 6.1.3 + + + io.confluent + kafka-schema-registry-client + 6.1.3 + junit @@ -109,8 +125,17 @@ 4.13.1 compile + + + + + io.confluent + io.confluent + https://packages.confluent.io/maven/ + + @@ -124,11 +149,10 @@ - org.apache.maven.plugins maven-shade-plugin - 3.2.1 + ${maven-shade-plugin.version} package @@ -136,13 +160,19 @@ shade - true - + + + org.apache.avro + org.apache.avro.shaded.logisland + + org.apache.avro:avro + io.confluent + true *:* @@ -168,14 +198,6 @@ - - - org.apache.avro - logisland.repackaged.org.apache.avro - - - - diff --git a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/component/ComponentFactory.java b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/component/ComponentFactory.java index 1bfa1b3e7..0eb1391ae 100644 --- a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/component/ComponentFactory.java +++ b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/component/ComponentFactory.java @@ -16,9 +16,13 @@ package com.hurence.logisland.component; import com.hurence.logisland.classloading.PluginLoader; +import com.hurence.logisland.config.ControllerServiceConfiguration; import com.hurence.logisland.config.EngineConfiguration; import com.hurence.logisland.config.ProcessorConfiguration; import com.hurence.logisland.config.StreamConfiguration; +import com.hurence.logisland.controller.ControllerService; +import com.hurence.logisland.controller.ControllerServiceInitializationContext; +import com.hurence.logisland.controller.StandardControllerServiceContext; import com.hurence.logisland.engine.EngineContext; import com.hurence.logisland.engine.ProcessingEngine; import com.hurence.logisland.engine.StandardEngineContext; @@ -42,45 +46,37 @@ public final class ComponentFactory { private static final AtomicLong currentId = new AtomicLong(0); - public static Optional getEngineContext(EngineConfiguration configuration) { + public static Optional buildAndSetUpEngineContext(EngineConfiguration engineConfig) { try { - final ProcessingEngine engine = loadComponent(configuration.getComponent()); + final ProcessingEngine engine = loadComponent(engineConfig.getComponent()); final EngineContext engineContext = new StandardEngineContext(engine, Long.toString(currentId.incrementAndGet())); - + if (engine instanceof AbstractConfigurableComponent) { + ((AbstractConfigurableComponent) engine).setIdentifier(String.valueOf(currentId.get())); + } // instantiate each related pipelineContext - configuration.getStreamConfigurations().forEach(pipelineConfig -> { - Optional pipelineContext = getStreamContext(pipelineConfig); - pipelineContext.ifPresent(engineContext::addStreamContext); + engineConfig.getStreamConfigurations().forEach(streamConfig -> { + StreamContext streamContextOpt = buildAndSetUpStreamContext(streamConfig); + engineContext.addStreamContext(streamContextOpt); }); - configuration.getConfiguration() - .forEach((key, value) -> engineContext.setProperty(key, value)); - - // load all controller service initialization context - configuration.getControllerServiceConfigurations() - .forEach(controllerServiceConfiguration -> { - try { - loadComponent(controllerServiceConfiguration.getComponent()); - engineContext.addControllerServiceConfiguration(controllerServiceConfiguration); - - } catch (ClassNotFoundException e) { - throw new IllegalStateException("unable to instantiate service " + controllerServiceConfiguration.getControllerService() + - ". Please check that your configuration is correct and you installed all the required modules", e); - } - }); - - ((AbstractConfigurableComponent) engine).init(engineContext); + engineConfig.getControllerServiceConfigurations().forEach(controllerServiceConfiguration -> { + ControllerServiceInitializationContext serviceContext = buildAndSetUpServiceContext(controllerServiceConfiguration); + engineContext.addControllerServiceContext(serviceContext); + engineContext.addControllerServiceConfiguration(controllerServiceConfiguration); + }); - logger.info("created engine {} with id {}", configuration.getComponent(), currentId.get()); + engineConfig.getConfiguration() + .forEach((key, value) -> engineContext.setProperty(key, value)); + engineContext.getLogger().info("Engine is now configured"); + logger.info("created engine {} with id {}", engineConfig.getComponent(), currentId.get()); return Optional.of(engineContext); - - } catch (ClassNotFoundException | InitializationException e) { - throw new IllegalStateException("unable to instantiate engine " + configuration.getComponent(), e); + } catch (ClassNotFoundException e) { + throw new IllegalStateException("unable to instantiate engine " + engineConfig.getComponent(), e); } } @@ -90,47 +86,81 @@ public static Optional getEngineContext(EngineConfiguration confi * @param configuration * @return */ - private static Optional getStreamContext(StreamConfiguration configuration) { + public static StreamContext buildAndSetUpStreamContext(StreamConfiguration configuration) { try { final RecordStream recordStream = loadComponent(configuration.getComponent()); - final StreamContext instance = + final StreamContext streamContext = new StandardStreamContext(recordStream, configuration.getStream()); - + if (recordStream instanceof AbstractConfigurableComponent) { + ((AbstractConfigurableComponent) recordStream).setIdentifier(configuration.getStream()); + } // instantiate each related processor configuration.getProcessorConfigurations().forEach(processConfig -> { - Optional processorContext = getProcessContext(processConfig); - processorContext.ifPresent(instance::addProcessContext); + ProcessContext processorContext = buildAndSetUpProcessContext(processConfig); + streamContext.addProcessContext(processorContext); }); // set the config properties configuration.getConfiguration() - .entrySet().forEach(e -> instance.setProperty(e.getKey(), e.getValue())); + .entrySet().forEach(e -> streamContext.setProperty(e.getKey(), e.getValue())); + + streamContext.getLogger().info("Stream is now configured"); logger.info("created stream {} with id {}", configuration.getComponent(), configuration.getStream()); - return Optional.of(instance); + return streamContext; } catch (ClassNotFoundException e) { throw new IllegalStateException("unable to instantiate stream " + configuration.getStream() + ". Please check that your configuration is correct and you installed all the required modules", e); } } - //TODO this method should be made private in my opinion (but unfortunately some test class are using it) - public static Optional getProcessContext(ProcessorConfiguration configuration) { + + public static ProcessContext buildAndSetUpProcessContext(ProcessorConfiguration configuration) { try { + logger.info("Setting up processor {} with id {}", configuration.getComponent(), configuration.getProcessor()); final Processor processor = loadComponent(configuration.getComponent()); + if (processor instanceof AbstractConfigurableComponent) { + ((AbstractConfigurableComponent) processor).setIdentifier(configuration.getProcessor()); + } final ProcessContext processContext = new StandardProcessContext(processor, configuration.getProcessor()); - // set all properties configuration.getConfiguration() .entrySet().forEach(e -> processContext.setProperty(e.getKey(), e.getValue())); + processContext.getLogger().info("Processor is now configured"); logger.info("Created processor {} with id {}", configuration.getComponent(), configuration.getProcessor()); - return Optional.of(processContext); + return processContext; } catch (ClassNotFoundException e) { throw new IllegalStateException("unable to instantiate processor " + configuration.getProcessor() + ". Please check that your configuration is correct and you installed all the required modules", e); } + } + /** + * Instanciates a stream from of configuration + * + * @param serviceConfig + * @return + */ + public static ControllerServiceInitializationContext buildAndSetUpServiceContext(ControllerServiceConfiguration serviceConfig) { + try { + final ControllerService service = loadComponent(serviceConfig.getComponent()); + final ControllerServiceInitializationContext serviceContext = + new StandardControllerServiceContext(service, serviceConfig.getControllerService()); + if (service instanceof AbstractConfigurableComponent) { + ((AbstractConfigurableComponent) service).setIdentifier(serviceConfig.getControllerService()); + } + // set the config properties + serviceConfig.getConfiguration() + .entrySet().forEach(e -> serviceContext.setProperty(e.getKey(), e.getValue())); + + serviceContext.getLogger().info("Service is now configured"); + logger.info("created service {} with id {}", serviceConfig.getComponent(), serviceConfig.getControllerService()); + return serviceContext; + } catch (IllegalArgumentException | ClassNotFoundException e) { + throw new IllegalStateException("unable to instantiate service " + serviceConfig.getComponent() + + ". Please check that your configuration is correct and you installed all the required modules", e); + } } public static T loadComponent(String className) throws ClassNotFoundException { @@ -139,6 +169,7 @@ public static T loadComponent(String className) throws ClassNotFoundExceptio try { return (T) PluginLoader.loadPlugin(className); } catch (ClassNotFoundException cnfe) { + logger.warn("Class " + className + " not found in plugins: trying to load from current class loader"); return (T) Class.forName(className).newInstance(); } } catch (Exception e) { diff --git a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/config/ConfigReader.java b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/config/ConfigReader.java index eaff3a426..b2d6dce9e 100644 --- a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/config/ConfigReader.java +++ b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/config/ConfigReader.java @@ -15,7 +15,6 @@ */ package com.hurence.logisland.config; - import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; @@ -28,25 +27,23 @@ import java.nio.file.Files; import java.nio.file.Paths; - public class ConfigReader { - static String readFile(String path, Charset encoding) + private static String readFile(String path, Charset encoding) throws IOException { byte[] encoded = Files.readAllBytes(Paths.get(path)); return new String(encoded, encoding); } - /** - * Loads a YAML config file + * Loads a YAML config file (file located in the local file system) * * @param configFilePath the path of the config file * @return a LogislandSessionConfiguration * @throws Exception */ - public static LogislandConfiguration loadConfig(String configFilePath) throws Exception { + public static LogislandConfiguration loadConfig(String configFilePath) throws IOException { ObjectMapper mapper = new ObjectMapper(new YAMLFactory() .enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION)); @@ -66,7 +63,7 @@ public static LogislandConfiguration loadConfig(String configFilePath) throws Ex return logislandConf; } - private static void checkLogislandConf(LogislandConfiguration conf) throws IllegalArgumentException { + public static void checkLogislandConf(LogislandConfiguration conf) throws IllegalArgumentException { if (conf.getEngine().getComponent() == null || conf.getEngine().getComponent().isEmpty()) { throw new IllegalArgumentException("key 'component' is missing or empty for engine in configuration file"); } diff --git a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/controller/StandardControllerServiceLookup.java b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/controller/StandardControllerServiceLookup.java index 20a1448e4..5574cd158 100644 --- a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/controller/StandardControllerServiceLookup.java +++ b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/controller/StandardControllerServiceLookup.java @@ -26,7 +26,6 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicLong; import java.util.stream.Collectors; @@ -35,20 +34,13 @@ */ public class StandardControllerServiceLookup implements ControllerServiceLookup, Serializable { - private final Map controllerServiceMap = new ConcurrentHashMap<>(); - - private final Collection configurations; - private static final Logger logger = LoggerFactory.getLogger(StandardControllerServiceLookup.class); - - private static final AtomicLong currentId = new AtomicLong(0); + private final Map controllerServiceMap = new ConcurrentHashMap<>(); + private final Collection configurations; public StandardControllerServiceLookup(Collection configurations) { - this.configurations = configurations; - - } @Override @@ -62,8 +54,6 @@ public synchronized ControllerService getControllerService(String serviceIdentif .filter(conf -> serviceIdentifier.equals(conf.getControllerService())) .forEach(conf -> { try { - - ControllerService service = ComponentFactory.loadComponent(conf.getComponent()); logger.info("loading controller service {}", new Object[]{conf.getComponent()}); ControllerServiceInitializationContext context = new StandardControllerServiceContext(service, conf.getControllerService()); diff --git a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/error/ErrorUtils.java b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/error/ErrorUtils.java index 30d5eb440..52462216c 100644 --- a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/error/ErrorUtils.java +++ b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/error/ErrorUtils.java @@ -1,3 +1,18 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.hurence.logisland.error; import com.hurence.logisland.logging.ComponentLog; diff --git a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/serializer/AvroSerializer.java b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/serializer/AvroSerializer.java index 4389d75e7..d88f8234f 100644 --- a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/serializer/AvroSerializer.java +++ b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/serializer/AvroSerializer.java @@ -42,44 +42,51 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; +import java.io.*; import java.util.ArrayList; import java.util.List; import java.util.Map; public class AvroSerializer implements RecordSerializer { - private final Schema schema; + protected final String schemaStr; +// Schema seems to not be Serializable sometimes... + protected transient Schema schema; private Logger logger = LoggerFactory.getLogger(AvroSerializer.class); - public AvroSerializer(final Schema schema) { - this.schema = schema; - } - public AvroSerializer(final String strSchema) { - final Schema.Parser parser = new Schema.Parser(); - try { - schema = parser.parse(strSchema); - } catch (Exception e) { - throw new RecordSerializationException("unable to create serializer", e); - } + this.schemaStr = strSchema; } - public AvroSerializer(final InputStream inputStream) { - assert inputStream != null; - final Schema.Parser parser = new Schema.Parser(); - try { - schema = parser.parse(inputStream); - } catch (IOException e) { - throw new RecordSerializationException("unable to create serializer", e); + public AvroSerializer(final InputStream schema) throws IOException { + InputStreamReader isReader = new InputStreamReader(schema); + //Creating a BufferedReader object + BufferedReader reader = new BufferedReader(isReader); + StringBuffer sb = new StringBuffer(); + String str; + while((str = reader.readLine())!= null){ + sb.append(str); } + this.schemaStr = sb.toString(); } + + protected static final byte MAGIC_BYTE = 0x0; protected static final int idSize = 4; + private Schema getSchema() { + if (schema == null) { + final Schema.Parser parser = new Schema.Parser(); + try { + schema = parser.parse(schemaStr); + } catch (Exception e) { + throw new RecordSerializationException("unable to create serializer", e); + } + } + return schema; + } + @Override public void serialize(final OutputStream out, final Record record) throws RecordSerializationException { @@ -87,7 +94,7 @@ public void serialize(final OutputStream out, final Record record) throws Record /** * convert the logIsland Event to an Avro GenericRecord */ - GenericRecord eventRecord = new GenericData.Record(schema); + GenericRecord eventRecord = new GenericData.Record(getSchema()); for (Map.Entry entry : record.getFieldsEntrySet()) { // retrieve event field String key = entry.getKey(); @@ -101,7 +108,7 @@ public void serialize(final OutputStream out, final Record record) throws Record /** * */ - DatumWriter datumWriter = new GenericDatumWriter<>(schema); + DatumWriter datumWriter = new GenericDatumWriter<>(getSchema()); Encoder encoder = EncoderFactory.get().binaryEncoder(out, null); datumWriter.write(eventRecord, encoder); encoder.flush(); @@ -129,7 +136,7 @@ public static List copyArray(GenericData.Array avroArray, List datumReader = new GenericDatumReader<>(schema); + DatumReader datumReader = new GenericDatumReader<>(getSchema()); GenericRecord genericRecord = datumReader.read(null, decoder); Record record = new StandardRecord(genericRecord.get(FieldDictionary.RECORD_TYPE).toString()); diff --git a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/serializer/ConfluentSerializer.java b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/serializer/ConfluentSerializer.java new file mode 100644 index 000000000..e1f5edbf3 --- /dev/null +++ b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/serializer/ConfluentSerializer.java @@ -0,0 +1,420 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.hurence.logisland.serializer; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Properties; + +import com.hurence.logisland.record.Field; +import com.hurence.logisland.record.FieldType; +import com.hurence.logisland.record.Record; +import com.hurence.logisland.record.StandardRecord; + +import org.apache.avro.JsonProperties; +import org.apache.avro.Schema; +import org.apache.avro.generic.GenericData; +import org.apache.avro.generic.GenericRecord; +import org.apache.commons.io.IOUtils; +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import io.confluent.kafka.schemaregistry.ParsedSchema; +import io.confluent.kafka.schemaregistry.client.CachedSchemaRegistryClient; +import io.confluent.kafka.schemaregistry.client.MockSchemaRegistryClient; +import io.confluent.kafka.schemaregistry.client.SchemaRegistryClient; +import io.confluent.kafka.schemaregistry.client.rest.RestService; +import io.confluent.kafka.schemaregistry.client.rest.entities.SchemaReference; +import io.confluent.kafka.schemaregistry.client.rest.exceptions.RestClientException; +import io.confluent.kafka.serializers.AbstractKafkaSchemaSerDeConfig; +import io.confluent.kafka.serializers.KafkaAvroDeserializer; +import io.confluent.kafka.serializers.KafkaAvroSerializer; +import io.confluent.kafka.serializers.KafkaAvroSerializerConfig; + +public class ConfluentSerializer implements RecordSerializer { + + private Logger logger = LoggerFactory.getLogger(ConfluentSerializer.class); + protected String registryUrl; + protected String topicField = "topic"; + + protected transient SchemaRegistryClient schemaRegistryClient; + protected transient KafkaAvroDeserializer deserializer; + protected transient KafkaAvroSerializer serializer; + + public ConfluentSerializer(String schemaInfo) { + try { + JSONObject obj = new JSONObject(schemaInfo); + this.registryUrl = obj.getString("registryUrl"); + if (obj.has("topicField")) { + this.topicField = obj.getString("topicField"); + } + } catch (Exception e) { + logger.error("Error parsing ConfluentSerializer configuration", e); + throw new RuntimeException(e); + } + } + + public SchemaRegistryClient getSchemaRegistryClient() { + if (schemaRegistryClient == null) { + Properties defaultConfig = new Properties(); + defaultConfig.put(AbstractKafkaSchemaSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG, this.registryUrl); + defaultConfig.put(AbstractKafkaSchemaSerDeConfig.BASIC_AUTH_CREDENTIALS_SOURCE, AbstractKafkaSchemaSerDeConfig.BASIC_AUTH_CREDENTIALS_SOURCE_DEFAULT); + schemaRegistryClient = new CachedSchemaRegistryClient(new RestService(registryUrl), 10, new HashMap(defaultConfig)); + } + return schemaRegistryClient; + } + + public KafkaAvroSerializer getSerializer() { + if (serializer == null) { + Properties defaultConfig = new Properties(); + defaultConfig.put(AbstractKafkaSchemaSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG, this.registryUrl); + defaultConfig.put(KafkaAvroSerializerConfig.AUTO_REGISTER_SCHEMAS, KafkaAvroSerializerConfig.AUTO_REGISTER_SCHEMAS_DEFAULT); + serializer = new KafkaAvroSerializer(getSchemaRegistryClient(), new HashMap(defaultConfig)); + } + return serializer; + } + + public KafkaAvroDeserializer getDeserializer() { + if (deserializer == null) { + deserializer = new KafkaAvroDeserializer(getSchemaRegistryClient()); + } + return deserializer; + } + + // for unit test purposes + public ConfluentSerializer(MockSchemaRegistryClient schemaRegistryClientMock, final InputStream inputStream) { + assert inputStream != null; + final Schema.Parser parser = new Schema.Parser(); + try { + schemaRegistryClient = schemaRegistryClientMock; + registryUrl = "bogus"; + Schema schema = parser.parse(inputStream); + Optional parsedSchema = schemaRegistryClient.parseSchema(null, schema.toString(true), new LinkedList()); + getSchemaRegistryClient().register("logisland_events", parsedSchema.get()); + } catch (Exception e) { + logger.error("Error initalizing schema registry", e); + throw new RuntimeException(e); + } + } + + @Override + public void serialize(OutputStream objectDataOutput, Record record) throws RecordSerializationException { + if (record.hasField(topicField)) { + String topic = record.getField(topicField).asString(); + final Schema.Parser parser = new Schema.Parser(); + try { + Schema schema = parser.parse(getSchemaRegistryClient().getLatestSchemaMetadata(topic).getSchema()); + GenericRecord eventRecord = writeAvro(record, schema); + byte[] bytes = getSerializer().serialize(topic, eventRecord); + logger.trace(Arrays.toString(bytes)); + logger.trace(getSchemaId(bytes).toString()); + objectDataOutput.write(bytes); + } catch (SerializationException e1) { + e1.printStackTrace(); + } catch (IOException e1) { + e1.printStackTrace(); + } catch (RestClientException e1) { + e1.printStackTrace(); + } catch (Exception e1) { + logger.error(e1.getStackTrace().toString()); + e1.printStackTrace(); + } + } else { + throw new SerializationException("The serialize method has not been implemented since unknown topic"); + } + } + + @Override + public Record deserialize(InputStream objectDataInput) throws RecordSerializationException { + byte[] bytes = new byte[0]; + try { + bytes = IOUtils.toByteArray(objectDataInput); + } catch (IOException e) { + e.printStackTrace(); + } + logger.trace(Arrays.toString(bytes)); + logger.trace(getSchemaId(bytes).toString()); + GenericRecord genericRecord = (GenericRecord) getDeserializer().deserialize(null, bytes); + Record record = new StandardRecord("record"); + readAvro(record, genericRecord); + logger.trace(record.toString()); + return record; + } + + /** + * Get schemaId from bytes[] when serialize and deserialize + */ + private Integer getSchemaId(byte[] bytes) { + byte[] schemaId = new byte[4]; + System.arraycopy(bytes, 1, schemaId, 0, 4); + return new Integer(ByteBuffer.wrap(schemaId).getInt()); + } + + /** + * convert the logIsland Event to an Avro GenericRecord + */ + private GenericRecord writeAvro(final Record record, Schema schema) { + GenericRecord eventRecord = new GenericData.Record(schema); + for (Map.Entry entry : record.getFieldsEntrySet()) { + // retrieve event field + String key = entry.getKey(); + Field field = entry.getValue(); + Object value = field.getRawValue(); + + // dump event field as record attribute + eventRecord.put(key, value); + } + return eventRecord; + } + + /** + * Converts the AVRO GenericRecord to a logisland record. + * + * @param record the logisland record to fill. + * @param genericRecord the AVRO record to convert. + * + * @return a logisland record built from the specified AVRO record. + */ + private Record readAvro(final Record record, final GenericRecord genericRecord) { + return readAvro(record, new AvroRecord() { + @Override + public Schema getSchema() { + return genericRecord.getSchema(); + } + + @Override + public Object get(String fieldName) { + return genericRecord.get(fieldName); + } + }); + } + + private Record readAvro(final GenericData.Record avroRecord) { + return readAvro(new StandardRecord(avroRecord.getSchema().getName()), new AvroRecord() { + @Override + public Schema getSchema() { + return avroRecord.getSchema(); + } + + @Override + public Object get(String fieldName) { + return avroRecord.get(fieldName); + } + }); + } + + // This interface provides similar accesses to GenericData.Record and GenericRecord. + private interface AvroRecord { + Schema getSchema(); + + Object get(String fieldName); + } + + /** + * Returns {@code null} if the provided value is a reference to + * JsonProperties.NULL_VALUE; the same value is returned otherwise. + * + * @param fieldValue the value to check. + * + * @return {@code null} if the provided value is a reference to + * JsonProperties.NULL_VALUE; the same value otherwise. + */ + private Object handleJsonNull(Object fieldValue) { + if (fieldValue == JsonProperties.NULL_VALUE) { + fieldValue = null; + } + return fieldValue; + } + + /** + * Converts the AVRO record to a logisland record. + * + * @param record the logisland record to fill. + * @param avroRecord the AVRO record to convert. + * + * @return a logisland record built from the specified AVRO record. + */ + private Record readAvro(final Record record, final AvroRecord avroRecord) { + final Schema avroSchema = avroRecord.getSchema(); + for (final Schema.Field schemaField : avroSchema.getFields()) { + final String fieldName = schemaField.name(); + + Object fieldValue = avroRecord.get(fieldName); + if (fieldValue == null) { + fieldValue = schemaField.defaultVal(); + } + fieldValue = handleJsonNull(fieldValue); + + Schema.Type type = schemaField.schema().getType(); + + if (type == Schema.Type.UNION) { + // Handle optional value + for (final Schema subSchema : schemaField.schema().getTypes()) { + if (subSchema.getType() == Schema.Type.NULL) { + continue; + } + type = subSchema.getType(); + } + } + + switch (type) { + case ARRAY: + record.setField(fieldName, FieldType.ARRAY, + fieldValue != null ? readAvro((GenericData.Array) fieldValue) : null); + break; + + case RECORD: + record.setField(fieldName, FieldType.RECORD, + fieldValue != null ? readAvro((GenericData.Record) fieldValue) : null); + break; + + case BOOLEAN: + // Prevent simple type with the null value + if (fieldValue != null) { + record.setField(fieldName, FieldType.BOOLEAN, fieldValue); + } + break; + + case BYTES: + // Prevent simple type with the null value + if (fieldValue != null) { + record.setField(fieldName, FieldType.BYTES, fieldValue); + } + break; + + case DOUBLE: + // Prevent simple type with the null value + if (fieldValue != null) { + record.setField(fieldName, FieldType.DOUBLE, fieldValue); + } + break; + + case FLOAT: + // Prevent simple type with the null value + if (fieldValue != null) { + record.setField(fieldName, FieldType.FLOAT, fieldValue); + } + break; + + case INT: + // Prevent simple type with the null value + if (fieldValue != null) { + record.setField(fieldName, FieldType.INT, fieldValue); + } + break; + + case LONG: + // Prevent simple type with the null value + if (fieldValue != null) { + record.setField(fieldName, FieldType.LONG, fieldValue); + } + break; + + case STRING: + record.setField(fieldName, FieldType.STRING, fieldValue != null ? fieldValue.toString() : null); + break; + + case NULL: + record.setField(fieldName, FieldType.STRING, null); + break; + + case ENUM: + break; + case FIXED: + break; + case MAP: + break; + case UNION: + break; + default: + throw new UnsupportedOperationException("No support for AVRO type " + type); + + } + } + + return record; + } + + /** + * Returns a List instance of objects filled from the provided AVRO array. + * + * @param avroArray the AVRO array that contains the values to convert. + * + * @return a List instance of objects filled from the provided AVRO array. + */ + private List readAvro(final GenericData.Array avroArray) { + final Schema.Type type = avroArray.getSchema().getElementType().getType(); + + final List result = new ArrayList(avroArray.size()); + + for (Object item : avroArray) { + item = handleJsonNull(item); + Object value = null; + switch (type) { + case ARRAY: + value = item != null ? readAvro((GenericData.Array) item) : null; + break; + + case RECORD: + value = item != null ? readAvro((GenericData.Record) item) : null; + break; + + case BOOLEAN: + case BYTES: + case DOUBLE: + case FLOAT: + case INT: + case LONG: + // Prevent simple type with the null value + if (item == null) { + continue; + } + break; + + case STRING: + value = item != null ? item.toString() : null; + break; + + case NULL: + value = null; + break; + + case ENUM: + case FIXED: + case MAP: + case UNION: + + default: + throw new UnsupportedOperationException("No support for AVRO type " + type); + } + result.add(value); + } + + return result; + } + +} diff --git a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/serializer/ExtendedJsonSerializer.java b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/serializer/ExtendedJsonSerializer.java index 41e113a5b..1eab70551 100644 --- a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/serializer/ExtendedJsonSerializer.java +++ b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/serializer/ExtendedJsonSerializer.java @@ -24,9 +24,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; +import java.io.*; import java.lang.reflect.Array; import java.text.DateFormat; import java.text.ParseException; @@ -46,18 +44,31 @@ public class ExtendedJsonSerializer implements RecordSerializer { - private static Logger logger = LoggerFactory.getLogger(com.hurence.logisland.serializer.JsonSerializer.class); - - private final Schema schema; + private static Logger logger = LoggerFactory.getLogger(ExtendedJsonSerializer.class); + protected final String schemaStr; + // Schema seems to not be Serializable sometimes... + protected transient Schema schema; private transient volatile ObjectMapper mapper; - public ExtendedJsonSerializer(Schema schema) { - this.schema = schema; + public ExtendedJsonSerializer() { + schemaStr = null; } - public ExtendedJsonSerializer() { - this.schema = null; + public ExtendedJsonSerializer(final String strSchema) { + this.schemaStr = strSchema; + } + + private Schema getSchema() { + if (schema == null && schemaStr != null) { + final Schema.Parser parser = new Schema.Parser(); + try { + schema = parser.parse(schemaStr); + } catch (Exception e) { + throw new RecordSerializationException("unable to create serializer", e); + } + } + return schema; } public void doFilter(Map map, String name, Object value, Schema schema) { @@ -134,27 +145,15 @@ public void doFilter(Map map, String name, Object value, Schema public Map filterWithSchema(Map in) { Map ret = in; - if (schema != null) { + if (getSchema() != null) { ret = new LinkedHashMap<>(); - doFilter(ret, null, in, schema); + doFilter(ret, null, in, getSchema()); ret = (Map) ret.getOrDefault(null, Collections.emptyMap()); } return ret; } - public ExtendedJsonSerializer(String schemaString) { - if (schemaString != null) { - final Schema.Parser parser = new Schema.Parser().setValidate(false); - try { - schema = parser.parse(schemaString); - } catch (Exception e) { - throw new RecordSerializationException("unable to create serializer", e); - } - } else { - schema = null; - } - } @Override public void serialize(OutputStream out, Record record) throws RecordSerializationException { @@ -163,7 +162,6 @@ public void serialize(OutputStream out, Record record) throws RecordSerializatio } catch (IOException e) { logger.warn(e.toString()); } - } protected Map createJsonObject(Record record) { @@ -254,10 +252,8 @@ public Record deserialize(InputStream in) throws RecordSerializationException { } filterWithSchema(map).forEach((k, v) -> record.setField(doDeserializeField(k, v))); return record; - } catch (IOException e) { - logger.error(e.toString()); - throw new RecordSerializationException("unable to deserialize record"); + throw new RecordSerializationException("unable to deserialize record", e); } } diff --git a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/serializer/JsonSerializer.java b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/serializer/JsonSerializer.java index 8eac67d14..7dc5de296 100644 --- a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/serializer/JsonSerializer.java +++ b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/serializer/JsonSerializer.java @@ -164,7 +164,6 @@ protected EventDeserializer(Class t) { @Override public Record deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { - JsonToken t = jp.getCurrentToken(); String id = null; String type = null; @@ -188,7 +187,10 @@ public Record deserialize(JsonParser jp, DeserializationContext ctxt) throws IOE case VALUE_NUMBER_INT: try { fields.put(jp.getCurrentName(), new Field(jp.getCurrentName(), FieldType.INT, jp.getIntValue())); - } catch (JsonParseException ex) { + } catch (Exception ex) { + // May have JsonParseException or InputCoercionException (for instance for long instead of int) + // This also depends on jackson version. + // The simplest is to catch any exception, as not sure to be exhaustive and precise handling all // special case for creationDate (not a field) if (jp.getCurrentName() != null && jp.getCurrentName().equals("creationDate")) { @@ -208,7 +210,7 @@ public Record deserialize(JsonParser jp, DeserializationContext ctxt) throws IOE try { fields.put(jp.getCurrentName(), new Field(jp.getCurrentName(), FieldType.DOUBLE, jp.getDoubleValue())); - } catch (JsonParseException ex) { + } catch (Exception ex) { fields.put(jp.getCurrentName(), new Field(jp.getCurrentName(), FieldType.FLOAT, jp.getFloatValue())); } @@ -293,8 +295,7 @@ public Record deserialize(InputStream in) throws RecordSerializationException { try { return mapper.readValue(in, Record.class); } catch (IOException e) { - logger.error(e.toString()); - throw new RecordSerializationException("unable to deserialize record"); + throw new RecordSerializationException("unable to deserialize record", e); } } diff --git a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/serializer/SerializerProvider.java b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/serializer/SerializerProvider.java index ba5d7a5d1..3dbbd15b2 100644 --- a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/serializer/SerializerProvider.java +++ b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/serializer/SerializerProvider.java @@ -18,13 +18,13 @@ import com.hurence.logisland.logging.ComponentLog; import com.hurence.logisland.logging.LogLevel; import com.hurence.logisland.logging.StandardComponentLogger; -import org.apache.avro.Schema; public class SerializerProvider { private static ComponentLog logger = new StandardComponentLogger("serializerProvider", SerializerProvider.class); private static String AVRO_SERIALIZER = AvroSerializer.class.getName(); + private static String CONFLUENT_SERIALIZER = ConfluentSerializer.class.getName(); private static String JSON_SERIALIZER = JsonSerializer.class.getName(); private static String EXTENDED_JSON_SERIALIZER = ExtendedJsonSerializer.class.getName(); @@ -47,9 +47,9 @@ public static RecordSerializer getSerializer(final String inSerializerClass, fin try { if (inSerializerClass.equals(AVRO_SERIALIZER)) { - Schema.Parser parser = new Schema.Parser(); - Schema schema = parser.parse(schemaContent); - return new AvroSerializer(schema); + return new AvroSerializer(schemaContent); + } else if (inSerializerClass.equals(CONFLUENT_SERIALIZER)) { + return new ConfluentSerializer(schemaContent); } else if (inSerializerClass.equals(JSON_SERIALIZER)) { return new JsonSerializer(); } else if (inSerializerClass.equals(EXTENDED_JSON_SERIALIZER)) { diff --git a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/MockConfiguration.java b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/MockConfiguration.java new file mode 100644 index 000000000..e853a243d --- /dev/null +++ b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/MockConfiguration.java @@ -0,0 +1,32 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.hurence.logisland.util.runner; + + +import com.hurence.logisland.component.PropertyDescriptor; +import com.hurence.logisland.processor.StandardConfiguration; +import com.hurence.logisland.validator.Configuration; + +import java.util.Map; + +public class MockConfiguration extends StandardConfiguration implements Configuration { + + public MockConfiguration(final Map properties) { + super(properties); + } + +} diff --git a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/MockConfigurationContext.java b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/MockConfigurationContext.java deleted file mode 100644 index bbae66354..000000000 --- a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/MockConfigurationContext.java +++ /dev/null @@ -1,159 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hurence.logisland.util.runner; - - - -import com.hurence.logisland.component.PropertyDescriptor; -import com.hurence.logisland.component.PropertyValue; -import com.hurence.logisland.controller.ControllerService; -import com.hurence.logisland.controller.ControllerServiceInitializationContext; -import com.hurence.logisland.controller.ControllerServiceLookup; -import com.hurence.logisland.logging.ComponentLog; -import com.hurence.logisland.registry.VariableRegistry; -import com.hurence.logisland.validator.ValidationResult; - -import java.io.File; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -public class MockConfigurationContext implements ControllerServiceInitializationContext { - - private final Map properties; - private final ControllerServiceLookup serviceLookup; - private final ControllerService service; - private final VariableRegistry variableRegistry; - - public MockConfigurationContext(final Map properties, - final ControllerServiceLookup serviceLookup) { - this(null, properties, serviceLookup, VariableRegistry.EMPTY_REGISTRY); - } - - public MockConfigurationContext(final Map properties, - final ControllerServiceLookup serviceLookup, - final VariableRegistry variableRegistry) { - this(null, properties, serviceLookup, variableRegistry); - } - - public MockConfigurationContext(final ControllerService service, - final Map properties, - final ControllerServiceLookup serviceLookup, - final VariableRegistry variableRegistry) { - this.service = service; - this.properties = properties; - this.serviceLookup = serviceLookup; - this.variableRegistry = variableRegistry; - } - - - @Override - public PropertyValue getPropertyValue(PropertyDescriptor property) { - String value = properties.get(property); - if (value == null) { - value = getActualDescriptor(property).getDefaultValue(); - } - return new MockPropertyValue(value, serviceLookup, variableRegistry); - } - - @Override - public PropertyValue getPropertyValue(String propertyName) { - return null; - } - - @Override - public ValidationResult setProperty(String name, String value) { - return null; - } - - @Override - public PropertyValue newPropertyValue(String rawValue) { - return null; - } - - @Override - public String getIdentifier() { - return null; - } - - @Override - public ControllerServiceLookup getControllerServiceLookup() { - return this.serviceLookup; - } - - @Override - public ComponentLog getLogger() { - return null; - } - - public void setName(String name) { - - } - - @Override - public boolean removeProperty(String name) { - return false; - } - - @Override - public Map getProperties() { - return new HashMap<>(this.properties); - } - - public String getName() { - return null; - } - - @Override - public String getProperty(PropertyDescriptor property) { - return null; - } - - @Override - public boolean isValid() { - return false; - } - - @Override - public Collection getValidationErrors() { - return null; - } - - private PropertyDescriptor getActualDescriptor(final PropertyDescriptor property) { - if (service == null) { - return property; - } - - final PropertyDescriptor resolved = service.getPropertyDescriptor(property.getName()); - return resolved == null ? property : resolved; - } - - @Override - public String getKerberosServicePrincipal() { - return null; - } - - @Override - public File getKerberosServiceKeytab() { - return null; - } - - @Override - public File getKerberosConfigurationFile() { - return null; - } -} diff --git a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/MockControllerServiceInitializationContext.java b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/MockControllerServiceInitializationContext.java index aebc305e7..7b5581c7a 100644 --- a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/MockControllerServiceInitializationContext.java +++ b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/MockControllerServiceInitializationContext.java @@ -21,13 +21,11 @@ import com.hurence.logisland.component.StandardPropertyValue; import com.hurence.logisland.controller.ControllerService; import com.hurence.logisland.controller.ControllerServiceInitializationContext; -import com.hurence.logisland.controller.ControllerServiceLookup; import com.hurence.logisland.logging.ComponentLog; import com.hurence.logisland.logging.StandardComponentLogger; import com.hurence.logisland.registry.VariableRegistry; import com.hurence.logisland.validator.ValidationResult; -import java.io.File; import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -66,14 +64,13 @@ public boolean isValid() { } @Override - public Collection getValidationErrors() { - return null; + public boolean isValid(boolean strictCheck) { + return isValid(); } - @Override - public ControllerServiceLookup getControllerServiceLookup() { - return serviceLookup; + public Collection getValidationErrors() { + return null; } @Override @@ -81,22 +78,6 @@ public ComponentLog getLogger() { return logger; } - @Override - public String getKerberosServicePrincipal() { - return null; //this needs to be wired in. - } - - @Override - public File getKerberosServiceKeytab() { - return null; //this needs to be wired in. - } - - @Override - public File getKerberosConfigurationFile() { - return null; //this needs to be wired in. - } - - @Override public ValidationResult setProperty(final String propertyName, final String propertyValue) { PropertyDescriptor descriptor = controllerService.getPropertyDescriptor(propertyName); @@ -126,9 +107,9 @@ public PropertyValue getPropertyValue(final String propertyName) { if (descriptor == null) throw new IllegalArgumentException(String.format("there is no such property '{}' in service '{}'", propertyName, controllerService.getIdentifier())); if (properties.containsKey(descriptor)) { - return new MockPropertyValue(properties.get(descriptor), getControllerServiceLookup(), VariableRegistry.EMPTY_REGISTRY, descriptor); + return new MockPropertyValue(properties.get(descriptor), serviceLookup, VariableRegistry.EMPTY_REGISTRY, descriptor); } else { - return new MockPropertyValue(descriptor.getDefaultValue(), getControllerServiceLookup(), VariableRegistry.EMPTY_REGISTRY, descriptor); + return new MockPropertyValue(descriptor.getDefaultValue(), serviceLookup, VariableRegistry.EMPTY_REGISTRY, descriptor); } } @@ -142,4 +123,8 @@ public Map getProperties() { return properties; } + @Override + public ControllerService getService() { + return controllerService; + } } diff --git a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/MockProcessContext.java b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/MockProcessContext.java index f741eec29..b420acc16 100644 --- a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/MockProcessContext.java +++ b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/MockProcessContext.java @@ -22,7 +22,7 @@ import com.hurence.logisland.logging.StandardComponentLogger; import com.hurence.logisland.processor.ProcessContext; import com.hurence.logisland.processor.Processor; -import com.hurence.logisland.processor.StandardValidationContext; +import com.hurence.logisland.processor.StandardConfiguration; import com.hurence.logisland.registry.VariableRegistry; import com.hurence.logisland.validator.ValidationResult; @@ -198,7 +198,7 @@ public String getProperty(PropertyDescriptor property) { * non-null */ public Collection validate() { - return component.validate(new StandardValidationContext(properties)); + return component.validate(new StandardConfiguration(properties)); } public boolean isValid() { @@ -212,6 +212,11 @@ public boolean isValid() { return true; } + @Override + public boolean isValid(boolean strictCheck) { + return isValid(); + } + @Override public Collection getValidationErrors() { return validate(); diff --git a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/MockRecord.java b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/MockRecord.java index 98cb4a0da..620052bde 100644 --- a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/MockRecord.java +++ b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/MockRecord.java @@ -15,137 +15,139 @@ */ package com.hurence.logisland.util.runner; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - import com.hurence.logisland.record.FieldType; -import com.hurence.logisland.record.RecordUtils; -import org.junit.Assert; - import com.hurence.logisland.record.Record; import com.hurence.logisland.record.StandardRecord; +import org.junit.Assert; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + public class MockRecord extends StandardRecord { private static final long serialVersionUID = 7750544989597574120L; private static final float floatDelta = 0.000001f; private static final double doubleDelta = 0.000001d; private static Logger logger = LoggerFactory.getLogger(MockRecord.class); - - //private final Set assertedFields; public MockRecord(Record toClone) { super(toClone); - - // this.assertedFields = new HashSet<>(); } - public void assertFieldExists(final String fieldName) { + public MockRecord assertFieldExists(final String fieldName) { Assert.assertTrue("Field " + fieldName + " does not exist", hasField(fieldName)); - //assertedFields.add(fieldName); + return this; } - public void assertFieldNotExists(final String fieldName) { - Assert.assertFalse("Attribute " + fieldName + " not exists with value " + getField(fieldName), + public MockRecord assertFieldNotExists(final String fieldName) { + Assert.assertFalse("Attribute " + fieldName + " should not exists but got " + getField(fieldName), hasField(fieldName)); - //assertedFields.add(fieldName); + return this; } - public void assertFieldTypeEquals(final String fieldName, final FieldType type) { + public MockRecord assertFieldTypeEquals(final String fieldName, final FieldType type) { Assert.assertEquals(type, getField(fieldName).getType()); - //assertedFields.add(fieldName); + return this; } - public void assertFieldEquals(final String fieldName, final String expectedValue) { + public MockRecord assertFieldEquals(final String fieldName, final String expectedValue) { Assert.assertEquals(expectedValue, getField(fieldName).asString()); - //assertedFields.add(fieldName); + return this; } - public void assertFieldEquals(final String fieldName, final boolean expectedValue) { + public MockRecord assertFieldEquals(final String fieldName, final boolean expectedValue) { Assert.assertEquals(new Boolean(expectedValue), getField(fieldName).asBoolean()); - // assertedFields.add(fieldName); + return this; } - public void assertFieldEquals(final String fieldName, final int expectedValue) { + public MockRecord assertFieldEquals(final String fieldName, final int expectedValue) { Assert.assertEquals(expectedValue, getField(fieldName).asInteger().intValue()); - //assertedFields.add(fieldName); + return this; } - public void assertFieldEquals(final String fieldName, final long expectedValue) { + public MockRecord assertFieldEquals(final String fieldName, final long expectedValue) { Assert.assertEquals(expectedValue, getField(fieldName).asLong().longValue()); - //assertedFields.add(fieldName); + return this; } - public void assertFieldEquals(final String fieldName, final float expectedValue) { + public MockRecord assertFieldEquals(final String fieldName, final float expectedValue) { Assert.assertEquals(expectedValue, getField(fieldName).asFloat(), floatDelta); - //assertedFields.add(fieldName); + return this; } - public void assertFieldEquals(final String fieldName, final double expectedValue) { + public MockRecord assertFieldEquals(final String fieldName, final double expectedValue) { Assert.assertEquals(expectedValue, getField(fieldName).asDouble(), doubleDelta); - //assertedFields.add(fieldName); + return this; } - public void assertFieldEquals(final String fieldName, final byte[] expectedValue) { + public MockRecord assertFieldEquals(final String fieldName, final byte[] expectedValue) { Assert.assertEquals(expectedValue, getField(fieldName).getRawValue()); - // assertedFields.add(fieldName); + return this; } - public void assertFieldEquals(final String fieldName, final Record expectedValue) { + public MockRecord assertFieldEquals(final String fieldName, final Record expectedValue) { Record record = getField(fieldName).asRecord(); MockRecord mockRecord = new MockRecord(record); mockRecord.assertContentEqualsExceptTechnicalFields(expectedValue); + return this; } - public void assertFieldEquals(final String fieldName, final Map expectedValue) { + public MockRecord assertFieldEquals(final String fieldName, final Map expectedValue) { Assert.assertEquals(expectedValue, getField(fieldName).getRawValue()); + return this; } - public void assertFieldEquals(final String fieldName, final List expectedValue) { + public MockRecord assertFieldEquals(final String fieldName, final List expectedValue) { Assert.assertEquals(expectedValue, getField(fieldName).getRawValue()); + return this; } - public void assertNullField(final String fieldName) { + public MockRecord assertNullField(final String fieldName) { Assert.assertNull(getField(fieldName).getRawValue()); + return this; } - public void assertNotNullField(final String fieldName) { + public MockRecord assertNotNullField(final String fieldName) { Assert.assertNotNull(getField(fieldName).getRawValue()); + return this; } - public void assertFieldNotEquals(final String fieldName, final String expectedValue) { + public MockRecord assertFieldNotEquals(final String fieldName, final String expectedValue) { Assert.assertNotSame(expectedValue, getField(fieldName).asString()); - //assertedFields.add(fieldName); + return this; } - public void assertStringFieldStartWith(final String fieldName, final String expectedValue) { + public MockRecord assertStringFieldStartWith(final String fieldName, final String expectedValue) { Assert.assertNotNull(getField(fieldName).asString()); String msg = "'" + getField(fieldName).asString() +"' does not start by '" + expectedValue +"'"; Assert.assertTrue(msg, getField(fieldName).asString().startsWith(expectedValue)); + return this; } - public void assertStringFieldEndWith(final String fieldName, final String expectedValue) { + public MockRecord assertStringFieldEndWith(final String fieldName, final String expectedValue) { Assert.assertNotNull(getField(fieldName).asString()); String msg = "'" + getField(fieldName).asString() +"' does not end by '" + expectedValue +"'"; Assert.assertTrue(msg, getField(fieldName).asString().endsWith(expectedValue)); + return this; } - - public void assertRecordSizeEquals(final int size) { + public MockRecord assertRecordSizeEquals(final int size) { Assert.assertEquals(size, size()); + return this; } - public void assertAllFieldsAsserted(List ignoreFields) { + public MockRecord assertAllFieldsAsserted(List ignoreFields) { // get missing asserted fields Set fields = new HashSet<>(getAllFieldNames()); fields.removeAll(ignoreFields); //fields.removeAll(assertedFields); Assert.assertEquals("List of not asserted fields: " + fields, 0, fields.size()); + return this; } /** @@ -153,11 +155,12 @@ public void assertAllFieldsAsserted(List ignoreFields) { * * @param record to compare content against */ - public void assertContentEquals(final Record record) { + public MockRecord assertContentEquals(final Record record) { Assert.assertEquals(this, record); + return this; } - public void assertContentEqualsExceptTechnicalFields(final Record expected) { + public MockRecord assertContentEqualsExceptTechnicalFields(final Record expected) { Assert.assertEquals(expected.size(), this.size()); expected.getAllFields().forEach(field -> { if (this.isInternField(field)) return; @@ -169,6 +172,7 @@ public void assertContentEqualsExceptTechnicalFields(final Record expected) { logger.debug("testing field {}", field); Assert.assertEquals(field, expected.getField(field.getName())); }); + return this; } } diff --git a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/MockValidationContext.java b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/MockValidationContext.java deleted file mode 100644 index d195f825c..000000000 --- a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/MockValidationContext.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright (C) 2016 Hurence (support@hurence.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.hurence.logisland.util.runner; - - -import com.hurence.logisland.controller.ControllerService; -import com.hurence.logisland.controller.ControllerServiceLookup; -import com.hurence.logisland.processor.StandardValidationContext; -import com.hurence.logisland.registry.VariableRegistry; -import com.hurence.logisland.validator.ValidationContext; - - -public class MockValidationContext extends StandardValidationContext implements ValidationContext { - - final MockProcessContext context; - final VariableRegistry variableRegistry; - - public MockValidationContext(final MockProcessContext processContext, final VariableRegistry variableRegistry) { - super(processContext.getProperties()); - this.context = processContext; - this.variableRegistry = variableRegistry; - } - - @Override - public ValidationContext getControllerServiceValidationContext(final ControllerService controllerService) { - final MockProcessContext serviceProcessContext = new MockProcessContext(controllerService, context, variableRegistry); - - return new MockValidationContext(serviceProcessContext, variableRegistry); - } - - @Override - public ControllerServiceLookup getControllerServiceLookup() { - return this.context.getServiceLookup(); - } - -} diff --git a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/StandardProcessorTestRunner.java b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/StandardProcessorTestRunner.java index cc4f5d4e7..71fde0542 100644 --- a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/StandardProcessorTestRunner.java +++ b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/StandardProcessorTestRunner.java @@ -25,11 +25,11 @@ import com.hurence.logisland.controller.ControllerService; import com.hurence.logisland.processor.ProcessContext; import com.hurence.logisland.processor.Processor; -import com.hurence.logisland.processor.StandardValidationContext; +import com.hurence.logisland.processor.StandardConfiguration; import com.hurence.logisland.record.FieldDictionary; import com.hurence.logisland.record.Record; import com.hurence.logisland.record.RecordUtils; -import com.hurence.logisland.validator.ValidationContext; +import com.hurence.logisland.validator.Configuration; import com.hurence.logisland.validator.ValidationResult; import org.junit.Assert; import org.slf4j.Logger; @@ -109,12 +109,15 @@ public void assertNotValid() { @Override public void enqueue(final Record... records) { - Collections.addAll(inputRecordsQueue, records); + Record[] clonedRecords = Arrays.stream(records) + .map(MockRecord::new) + .toArray(Record[]::new); + Collections.addAll(inputRecordsQueue, clonedRecords); } @Override - public void enqueue(Collection records) { - inputRecordsQueue.addAll(records); + public void enqueue(Collection records) { + enqueue(records.stream().toArray(Record[]::new)); } @Override @@ -373,8 +376,8 @@ public ControllerService getControllerService(final String identifier) { @Override public void assertNotValid(final ControllerService service) { - final ValidationContext validationContext = new StandardValidationContext(this.getConfigOfService(service).getProperties()); - final Collection results = this.serviceLookup.getControllerService(service.getIdentifier()).validate(validationContext); + final Configuration configuration = new StandardConfiguration(this.getConfigOfService(service).getProperties()); + final Collection results = this.serviceLookup.getControllerService(service.getIdentifier()).validate(configuration); for (final ValidationResult result : results) { if (!result.isValid()) { @@ -386,8 +389,8 @@ public void assertNotValid(final ControllerService service) { @Override public void assertValid(final ControllerService service) { - final ValidationContext validationContext = new StandardValidationContext(this.getConfigOfService(service).getProperties()); - final Collection results = this.serviceLookup.getControllerService(service.getIdentifier()).validate(validationContext); + final Configuration configuration = new StandardConfiguration(this.getConfigOfService(service).getProperties()); + final Collection results = this.serviceLookup.getControllerService(service.getIdentifier()).validate(configuration); for (final ValidationResult result : results) { if (!result.isValid()) { diff --git a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/TestRunner.java b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/TestRunner.java index 32e19ed11..09d432b4b 100644 --- a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/TestRunner.java +++ b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/util/runner/TestRunner.java @@ -154,7 +154,9 @@ public interface TestRunner { /** - * Enqueues the given Records into the Processor's input queue + * Clone (to be able to compare input with output even with mutable that directly modify input records) + * then Enqueues the given Records into the Processor's input queue + * * * @param Records to enqueue */ @@ -162,15 +164,17 @@ public interface TestRunner { /** - * Enqueues the given Records into the Processor's input queue + * Clone (to be able to compare input with output even with mutable that directly modify input records) + * then Enqueues the given Records into the Processor's input queue * * @param records to enqueue */ - void enqueue(Collection records); + void enqueue(Collection records); /** - * Enqueues the given Records into the Processor's input queue + * Clone (to be able to compare input with output even with mutable that directly modify input records) + * then Enqueues the given Records into the Processor's input queue * * @param values to enqueue */ diff --git a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/validator/AvroRecordValidator.java b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/validator/AvroRecordValidator.java index a3becebf2..4b80251fb 100644 --- a/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/validator/AvroRecordValidator.java +++ b/logisland-core/logisland-framework/logisland-utils/src/main/java/com/hurence/logisland/validator/AvroRecordValidator.java @@ -32,14 +32,11 @@ public class AvroRecordValidator implements RecordValidator { private final AvroSerializer serializer; - public AvroRecordValidator(Schema schema) { - this.serializer = new AvroSerializer(schema); - } - public AvroRecordValidator(String strSchema) { this.serializer = new AvroSerializer(strSchema); } - public AvroRecordValidator(InputStream inputStream) { + + public AvroRecordValidator(InputStream inputStream) throws IOException { this.serializer = new AvroSerializer(inputStream); } diff --git a/logisland-core/logisland-framework/logisland-utils/src/test/java/com/hurence/logisland/config/ConfigLoaderTest.java b/logisland-core/logisland-framework/logisland-utils/src/test/java/com/hurence/logisland/config/ConfigLoaderTest.java index 576fa9d4c..aca5c981c 100644 --- a/logisland-core/logisland-framework/logisland-utils/src/test/java/com/hurence/logisland/config/ConfigLoaderTest.java +++ b/logisland-core/logisland-framework/logisland-utils/src/test/java/com/hurence/logisland/config/ConfigLoaderTest.java @@ -69,7 +69,7 @@ public void testLoadConfig() throws Exception { assertEquals(1, engineConf.getStreamConfigurations().get(0).getProcessorConfigurations().size()); assertEquals(0, engineConf.getControllerServiceConfigurations().size()); - Optional context = ComponentFactory.getEngineContext(engineConf); + Optional context = ComponentFactory.buildAndSetUpEngineContext(engineConf); assertTrue(context.isPresent()); @@ -105,13 +105,13 @@ public void testLoadConfig2() throws Exception { assertEquals(2, stream2.getProcessorConfigurations().size()); assertEquals(2, engineConf.getControllerServiceConfigurations().size()); - Optional context = ComponentFactory.getEngineContext(engineConf); - - assertTrue(context.isPresent()); - - assertEquals(2, context.get().getStreamContexts().size()); - - assertTrue(context.get().isValid()); +// Optional context = ComponentFactory.buildAndSetUpEngineContext(engineConf); +// +// assertTrue(context.isPresent()); +// +// assertEquals(2, context.get().getStreamContexts().size()); +// +// assertTrue(context.get().isValid()); } /** diff --git a/logisland-core/logisland-framework/logisland-utils/src/test/java/com/hurence/logisland/processor/MockProcessorTest.java b/logisland-core/logisland-framework/logisland-utils/src/test/java/com/hurence/logisland/processor/MockProcessorTest.java index 9fd93865e..0e0a31d5a 100644 --- a/logisland-core/logisland-framework/logisland-utils/src/test/java/com/hurence/logisland/processor/MockProcessorTest.java +++ b/logisland-core/logisland-framework/logisland-utils/src/test/java/com/hurence/logisland/processor/MockProcessorTest.java @@ -44,14 +44,13 @@ public void validateProcess() throws Exception { componentConfiguration.setType(ComponentType.PROCESSOR.toString()); componentConfiguration.setConfiguration(conf); - Optional context = ComponentFactory.getProcessContext(componentConfiguration); - assertTrue(context.isPresent()); - Processor processor = context.get().getProcessor(); + ProcessContext context = ComponentFactory.buildAndSetUpProcessContext(componentConfiguration); + Processor processor = context.getProcessor(); Record record = new StandardRecord("mock_record"); record.setId("record1"); record.setStringField("name", "tom"); - List records = new ArrayList<>(processor.process(context.get(), Collections.singleton(record))); + List records = new ArrayList<>(processor.process(context, Collections.singleton(record))); assertEquals(1, records.size()); assertTrue(records.get(0).hasField("message")); diff --git a/logisland-core/logisland-framework/logisland-utils/src/test/java/com/hurence/logisland/serializer/AvroSerializerTest.java b/logisland-core/logisland-framework/logisland-utils/src/test/java/com/hurence/logisland/serializer/AvroSerializerTest.java index dd343abcb..d8f52b252 100755 --- a/logisland-core/logisland-framework/logisland-utils/src/test/java/com/hurence/logisland/serializer/AvroSerializerTest.java +++ b/logisland-core/logisland-framework/logisland-utils/src/test/java/com/hurence/logisland/serializer/AvroSerializerTest.java @@ -62,6 +62,7 @@ public void avroSerde() throws IOException { record.setField("response_size", FieldType.INT, 452); record.setField("is_outside_office_hours", FieldType.BOOLEAN, false); record.setField("is_host_blacklisted", FieldType.BOOLEAN, false); + record.setField("topic", FieldType.STRING, "logisland_events"); record.setField("tags", FieldType.ARRAY, new ArrayList<>(Arrays.asList("spam", "filter", "mail"))); ByteArrayOutputStream baos = new ByteArrayOutputStream(); diff --git a/logisland-core/logisland-framework/logisland-utils/src/test/java/com/hurence/logisland/serializer/ConfluentSerializerTest.java b/logisland-core/logisland-framework/logisland-utils/src/test/java/com/hurence/logisland/serializer/ConfluentSerializerTest.java new file mode 100755 index 000000000..32d168067 --- /dev/null +++ b/logisland-core/logisland-framework/logisland-utils/src/test/java/com/hurence/logisland/serializer/ConfluentSerializerTest.java @@ -0,0 +1,75 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package com.hurence.logisland.serializer; + +import com.hurence.logisland.record.FieldType; +import com.hurence.logisland.record.Record; +import com.hurence.logisland.record.StandardRecord; +import io.confluent.kafka.schemaregistry.client.MockSchemaRegistryClient; +import org.junit.Test; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; + +import static org.junit.Assert.assertTrue; + +/** + * + * @author tom + */ +public class ConfluentSerializerTest { + + + @Test + public void avroSerde() throws IOException { + MockSchemaRegistryClient mockSchemaRegistryClient = new MockSchemaRegistryClient(); + final ConfluentSerializer serializer = new ConfluentSerializer(mockSchemaRegistryClient, ConfluentSerializerTest.class.getResourceAsStream("/schemas/event.avsc")); + + Record record = new StandardRecord("cisco"); + record.setId("firewall_record1"); + record.setField("method", FieldType.STRING, "GET"); + record.setField("ip_source", FieldType.STRING, "123.34.45.123"); + record.setField("ip_target", FieldType.STRING, "255.255.255.255"); + record.setField("url_scheme", FieldType.STRING, "http"); + record.setField("url_host", FieldType.STRING, "origin-www.20minutes.fr"); + record.setField("url_port", FieldType.STRING, "80"); + record.setField("url_path", FieldType.STRING, "/r15lgc-100KB.js"); + record.setField("request_size", FieldType.INT, 1399); + record.setField("response_size", FieldType.INT, 452); + record.setField("is_outside_office_hours", FieldType.BOOLEAN, false); + record.setField("is_host_blacklisted", FieldType.BOOLEAN, false); + record.setField("topic", FieldType.STRING, "logisland_events"); + record.setField("tags", FieldType.ARRAY, new ArrayList<>(Arrays.asList("spam", "filter", "mail"))); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + serializer.serialize(baos, record); + baos.close(); + + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + Record deserializedRecord = serializer.deserialize(bais); + + assertTrue(deserializedRecord.equals(record)); + + } + +} \ No newline at end of file diff --git a/logisland-core/logisland-framework/logisland-utils/src/test/resources/configuration-templatev2.yml b/logisland-core/logisland-framework/logisland-utils/src/test/resources/configuration-templatev2.yml index e4e45c16d..93ac5ed46 100644 --- a/logisland-core/logisland-framework/logisland-utils/src/test/resources/configuration-templatev2.yml +++ b/logisland-core/logisland-framework/logisland-utils/src/test/resources/configuration-templatev2.yml @@ -2,7 +2,7 @@ # Logisland configuration script tempate ######################################################################################################### -version: 1.3.0 +version: 1.4.0 documentation: LogIsland analytics main config file. Put here every engine or component config ######################################################################################################### diff --git a/logisland-core/logisland-framework/logisland-utils/src/test/resources/schemas/event.avsc b/logisland-core/logisland-framework/logisland-utils/src/test/resources/schemas/event.avsc index 360937e1c..ab43da4b4 100644 --- a/logisland-core/logisland-framework/logisland-utils/src/test/resources/schemas/event.avsc +++ b/logisland-core/logisland-framework/logisland-utils/src/test/resources/schemas/event.avsc @@ -8,7 +8,8 @@ { "name": "record_id", "type": "string" - }, { + }, + { "name": "record_type", "type": "string" }, @@ -60,6 +61,10 @@ "name": "is_host_blacklisted", "type": "boolean" }, + { + "name": "topic", + "type": "string" + }, { "name": "tags", "type": { diff --git a/logisland-core/logisland-framework/pom.xml b/logisland-core/logisland-framework/pom.xml index d7a57c976..36c966c67 100644 --- a/logisland-core/logisland-framework/pom.xml +++ b/logisland-core/logisland-framework/pom.xml @@ -22,7 +22,7 @@ com.hurence.logisland logisland-core - 1.3.0 + 1.4.0 logisland-framework diff --git a/logisland-core/pom.xml b/logisland-core/pom.xml index fc623dded..41307838e 100644 --- a/logisland-core/pom.xml +++ b/logisland-core/pom.xml @@ -6,7 +6,7 @@ com.hurence.logisland logisland - 1.3.0 + 1.4.0 pom @@ -27,7 +27,7 @@ org.apache.avro avro - 1.8.2 + 1.9.2 com.fasterxml.jackson.module diff --git a/logisland-docker/full-container/Dockerfile b/logisland-docker/full-container/Dockerfile index 7a49fb3e1..25a0582a5 100644 --- a/logisland-docker/full-container/Dockerfile +++ b/logisland-docker/full-container/Dockerfile @@ -1,18 +1,15 @@ -FROM hurence/spark:2.3.3 +FROM hurence/spark:2.4.0 LABEL maintainer="support@hurence.com" COPY ./opencv4/* /usr/local/share/java/opencv4/ -COPY ./logisland-*.tar.gz /tmp/ -RUN cd /tmp; \ - tar -xzf logisland-*.tar.gz; \ - rm -f /tmp/*.gz; \ - mv logisland-* /opt +ADD ./logisland-*.tar.gz /opt/ + RUN cd /opt && ln -s $(eval ls | grep logisland) logisland ENV LOGISLAND_HOME /opt/logisland ENV PATH $PATH:$LOGISLAND_HOME/bin WORKDIR $LOGISLAND_HOME/ # If you set this entry point integration test can not execute properly (never ending...) -#ENTRYPOINT ["tail", "-f", "bin/logisland.sh"] \ No newline at end of file +#ENTRYPOINT ["tail", "-f", "bin/logisland.sh"] diff --git a/logisland-docker/full-container/README.rst b/logisland-docker/full-container/README.rst index 757249a49..2108b3097 100644 --- a/logisland-docker/full-container/README.rst +++ b/logisland-docker/full-container/README.rst @@ -1,17 +1,10 @@ LogIsland docker files ====================== -Small standalone Hadoop distribution for development and testing purpose : +This repository contains a Docker file to build the official logisland Docker image with : -- Spark 1.6.2 -- Elasticsearch 2.3.3 -- Kibana 4.5.1 -- Kafka 0.9.0.1 -- Logisland 1.3.0 - - -This repository contains a Docker file to build a Docker image with Apache Spark, HBase, Flume & Zeppelin. -This Docker image depends on [centos 6.7](https://github.com/CentOS/CentOS-Dockerfiles) image. +- Spark 2.4.0 +- Logisland 1.4.0 Getting the docker image from repository ---------------------------------------- @@ -22,7 +15,6 @@ Pull the image from Docker Repository docker pull hurence/logisland - Build your own -------------- @@ -32,17 +24,15 @@ Building the image # build logisland mvn clean package - cp logisland-assembly/target/logisland-1.3.0-full-bin.tar.gz logisland-docker/full-container + cp logisland-assembly/target/logisland-1.4.0-full-bin.tar.gz logisland-docker/full-container -The archive is generated under dist directory, -you have to copy this file into your Dockerfile directory you can now issue +Once the full logisland archive is copied in the logisland docker image directory, directory you can now issue: .. code-block:: sh cd logisland-docker/full-container/ - docker build --rm -t hurence/logisland . - docker tag hurence/logisland:latest hurence/logisland:1.3.0 - + docker build --rm -t hurence/logisland . + docker tag hurence/logisland:latest hurence/logisland:1.4.0 Running the image ----------------- @@ -60,13 +50,13 @@ Running the image -p 4040-4060:4040-4060 \ --name logisland \ -h sandbox \ - hurence/logisland:1.3.0 bash + hurence/logisland:1.4.0 bash or .. code-block:: - docker run -d hurence/logisland:1.3.0 -d + docker run -d hurence/logisland:1.4.0 -d if you want to mount a directory from your host, add the following option : @@ -74,7 +64,6 @@ if you want to mount a directory from your host, add the following option : -v ~/projects/logisland/docker/mount/:/usr/local/logisland - Deploy the image to Docker hub ------------------------------ @@ -94,10 +83,6 @@ then login and push the latest image docker login docker push hurence/logisland - - - - Buil Opncv into a docker file alpine ------------------------------------ @@ -161,5 +146,4 @@ Buil Opncv into a docker file alpine rm -rf /opt/opencv-${OPENCV_VERSION} - mvn install:install-file -Dfile=/usr/local/share/java/opencv4/opencv-411.jar -DgroupId=opencv -DartifactId=opencv -Dversion=4.1.1 -Dpackaging=jar - + mvn install:install-file -Dfile=/usr/local/share/java/opencv4/opencv-411.jar -DgroupId=opencv -DartifactId=opencv -Dversion=4.1.1 -Dpackaging=jar \ No newline at end of file diff --git a/logisland-docker/logisland-job/Dockerfile b/logisland-docker/logisland-job/Dockerfile index d81715629..d629f4475 100644 --- a/logisland-docker/logisland-job/Dockerfile +++ b/logisland-docker/logisland-job/Dockerfile @@ -5,14 +5,11 @@ FROM anapsix/alpine-java:8_jdk_nashorn RUN apk add --update unzip wget curl docker jq coreutils procps vim LABEL maintainer="support@hurence.com" -COPY ./logisland-*.tar.gz /tmp/ -RUN cd /tmp; \ - tar -xzf logisland-*.tar.gz; \ - rm -f /tmp/*.gz; \ - mv logisland-* /opt +ADD ./logisland-*.tar.gz /opt/ + RUN cd /opt && ln -s $(eval ls | grep logisland) logisland ENV LOGISLAND_HOME /opt/logisland ENV PATH $PATH:$LOGISLAND_HOME/bin WORKDIR $LOGISLAND_HOME/ -ENTRYPOINT ["tail", "-f", "bin/logisland.sh"] \ No newline at end of file +ENTRYPOINT ["tail", "-f", "bin/logisland.sh"] diff --git a/logisland-docker/pom.xml b/logisland-docker/pom.xml index acf95988d..27edafb25 100644 --- a/logisland-docker/pom.xml +++ b/logisland-docker/pom.xml @@ -7,7 +7,7 @@ com.hurence.logisland logisland - 1.3.0 + 1.4.0 pom logisland-docker diff --git a/logisland-docker/spark8s/Dockerfile b/logisland-docker/spark8s/Dockerfile new file mode 100644 index 000000000..1793cbc94 --- /dev/null +++ b/logisland-docker/spark8s/Dockerfile @@ -0,0 +1,14 @@ +FROM gcr.io/spark-operator/spark:v2.4.5 + +LABEL maintainer="support@hurence.com" + +COPY logisland-docker/spark8s/opencv4/* /usr/local/share/java/opencv4/ + +ADD logisland-assembly/target/logisland-*-full-*.tar.gz /opt/ + +RUN cd /opt && ln -s $(eval ls | grep logisland) logisland +ENV LOGISLAND_HOME /opt/logisland +ENV PATH $PATH:$LOGISLAND_HOME/bin +WORKDIR $LOGISLAND_HOME/ + +COPY logisland-docker/spark8s/log4j* $LOGISLAND_HOME/conf/ diff --git a/logisland-docker/spark8s/log4j-debug.properties b/logisland-docker/spark8s/log4j-debug.properties new file mode 100755 index 000000000..81e57b44a --- /dev/null +++ b/logisland-docker/spark8s/log4j-debug.properties @@ -0,0 +1,54 @@ +# Root logger option +log4j.rootLogger=DEBUG,stdout,rolling + + + +# Direct log messages to a log file +log4j.appender.rolling=org.apache.log4j.RollingFileAppender +log4j.appender.rolling.DatePattern='.'yyyy-MM-dd +log4j.appender.rolling.layout=org.apache.log4j.PatternLayout +log4j.appender.rolling.layout.conversionPattern=[%d] %p %m (%c)%n +log4j.appender.rolling.maxFileSize=50MB +log4j.appender.rolling.maxBackupIndex=5 +log4j.appender.rolling.ImmediateFlush=true +#log4j.appender.rolling.file=${spark.yarn.app.container.log.dir}/spark.log +log4j.appender.rolling.encoding=UTF-8 + +# Direct log messages to stdout +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n + + +log4j.logger.kafka=ERROR, stdout +log4j.logger.org.apache.zookeeper=ERROR, stdout +log4j.logger.org.apache.kafka=ERROR, stdout +log4j.logger.org.I0Itec.zkclient=ERROR, stdout +log4j.additivity.kafka.server=false +log4j.additivity.kafka.consumer.ZookeeperConsumerConnector=false + + +# Log levels +log4j.logger.org.apache.spark=WARN +log4j.logger.org.apache.spark.scheduler=WARN +log4j.logger.org.apache.spark.history=WARN +log4j.logger.org.apache.spark.streaming=WARN +log4j.logger.org.spark-project.jetty=WARN +log4j.logger.org.eclipse.jetty.server=OFF +log4j.logger.org.apache.spark.deploy.yarn=DEBUG +log4j.logger.io.netty=WARN +log4j.logger.org.apache.hadoop.ipc.Client=WARN +log4j.logger.org.apache.hadoop=WARN +log4j.logger.org.apache.hadoop.ipc.ProtobufRpcEngine=WARN +log4j.logger.parquet.hadoop=WARN +log4j.logger.org.apache.kafka=ERROR +log4j.logger.kafka=WARN +log4j.logger.org.elasticsearch=WARN + +log4j.logger.com.hurence=TRACE +log4j.logger.org.jinterop=WARN + + + +# log4j.logger.org.apache.spark.deploy.yarn.Client=DEBUG diff --git a/logisland-docker/spark8s/log4j.properties b/logisland-docker/spark8s/log4j.properties new file mode 100755 index 000000000..ffaddcf2a --- /dev/null +++ b/logisland-docker/spark8s/log4j.properties @@ -0,0 +1,54 @@ +# Root logger option +log4j.rootLogger=INFO,stdout,rolling + + + +# Direct log messages to a log file +log4j.appender.rolling=org.apache.log4j.RollingFileAppender +log4j.appender.rolling.DatePattern='.'yyyy-MM-dd +log4j.appender.rolling.layout=org.apache.log4j.PatternLayout +log4j.appender.rolling.layout.conversionPattern=[%d] %p %m (%c)%n +log4j.appender.rolling.maxFileSize=50MB +log4j.appender.rolling.maxBackupIndex=5 +log4j.appender.rolling.ImmediateFlush=true +#log4j.appender.rolling.file=${spark.yarn.app.container.log.dir}/spark.log +log4j.appender.rolling.encoding=UTF-8 + +# Direct log messages to stdout +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n + + +log4j.logger.kafka=ERROR, stdout +log4j.logger.org.apache.zookeeper=ERROR, stdout +log4j.logger.org.apache.kafka=ERROR, stdout +log4j.logger.org.I0Itec.zkclient=ERROR, stdout +log4j.additivity.kafka.server=false +log4j.additivity.kafka.consumer.ZookeeperConsumerConnector=false + + +# Log levels +log4j.logger.org.apache.spark=WARN +log4j.logger.org.apache.spark.scheduler=WARN +log4j.logger.org.apache.spark.history=WARN +log4j.logger.org.apache.spark.streaming=WARN +log4j.logger.org.spark-project.jetty=WARN +log4j.logger.org.eclipse.jetty.server=OFF +log4j.logger.org.apache.spark.deploy.yarn=DEBUG +log4j.logger.io.netty=WARN +log4j.logger.org.apache.hadoop.ipc.Client=WARN +log4j.logger.org.apache.hadoop=WARN +log4j.logger.org.apache.hadoop.ipc.ProtobufRpcEngine=WARN +log4j.logger.parquet.hadoop=WARN +log4j.logger.org.apache.kafka=ERROR +log4j.logger.kafka=WARN +log4j.logger.org.elasticsearch=WARN + +log4j.logger.com.hurence=DEBUG +log4j.logger.org.jinterop=WARN + + + +# log4j.logger.org.apache.spark.deploy.yarn.Client=DEBUG diff --git a/logisland-docker/spark8s/opencv4/libopencv_java411.so b/logisland-docker/spark8s/opencv4/libopencv_java411.so new file mode 100755 index 000000000..a9cf4bde0 Binary files /dev/null and b/logisland-docker/spark8s/opencv4/libopencv_java411.so differ diff --git a/logisland-docker/spark8s/opencv4/opencv-411.jar b/logisland-docker/spark8s/opencv4/opencv-411.jar new file mode 100644 index 000000000..c34226ad1 Binary files /dev/null and b/logisland-docker/spark8s/opencv4/opencv-411.jar differ diff --git a/logisland-docker/src/integration-test/engine-spark_2_X/KafkaStreamProcessingEngine/KafkaRecordStreamHDFSBurner/logisland-config.yml b/logisland-docker/src/integration-test/engine-spark_2_X/KafkaStreamProcessingEngine/KafkaRecordStreamHDFSBurner/logisland-config.yml index af70e0676..25a522840 100644 --- a/logisland-docker/src/integration-test/engine-spark_2_X/KafkaStreamProcessingEngine/KafkaRecordStreamHDFSBurner/logisland-config.yml +++ b/logisland-docker/src/integration-test/engine-spark_2_X/KafkaStreamProcessingEngine/KafkaRecordStreamHDFSBurner/logisland-config.yml @@ -2,7 +2,7 @@ # Logisland configuration script template ######################################################################################################### -version: 1.3.0 +version: 1.4.0 documentation: LogIsland analytics main config file. Put here every engine or component config ######################################################################################################### diff --git a/logisland-docker/src/integration-test/engine-spark_2_X/KafkaStreamProcessingEngine/KafkaRecordStreamParallelProcessing/logisland-config.yml b/logisland-docker/src/integration-test/engine-spark_2_X/KafkaStreamProcessingEngine/KafkaRecordStreamParallelProcessing/logisland-config.yml index dcdae21a0..1db45fb15 100644 --- a/logisland-docker/src/integration-test/engine-spark_2_X/KafkaStreamProcessingEngine/KafkaRecordStreamParallelProcessing/logisland-config.yml +++ b/logisland-docker/src/integration-test/engine-spark_2_X/KafkaStreamProcessingEngine/KafkaRecordStreamParallelProcessing/logisland-config.yml @@ -2,7 +2,7 @@ # Logisland configuration script tempate ######################################################################################################### -version: 1.3.0 +version: 1.4.0 documentation: LogIsland integration test of KafkaStreamProcessingEngine config file. ######################################################################################################### diff --git a/logisland-docker/src/integration-test/engine-spark_2_X/KafkaStreamProcessingEngine/KafkaRecordStreamSQLAggregator/logisland-config.yml b/logisland-docker/src/integration-test/engine-spark_2_X/KafkaStreamProcessingEngine/KafkaRecordStreamSQLAggregator/logisland-config.yml index 2118dd898..7aa07fc7d 100644 --- a/logisland-docker/src/integration-test/engine-spark_2_X/KafkaStreamProcessingEngine/KafkaRecordStreamSQLAggregator/logisland-config.yml +++ b/logisland-docker/src/integration-test/engine-spark_2_X/KafkaStreamProcessingEngine/KafkaRecordStreamSQLAggregator/logisland-config.yml @@ -2,7 +2,7 @@ # Logisland configuration script template ######################################################################################################### -version: 1.3.0 +version: 1.4.0 documentation: LogIsland analytics main config file. Put here every engine or component config ######################################################################################################### diff --git a/logisland-docker/src/integration-test/engine-spark_2_X/KafkaStreamProcessingEngine/StructuredStream/logisland-config.yml b/logisland-docker/src/integration-test/engine-spark_2_X/KafkaStreamProcessingEngine/StructuredStream/logisland-config.yml index 24f7d761a..10a95a911 100644 --- a/logisland-docker/src/integration-test/engine-spark_2_X/KafkaStreamProcessingEngine/StructuredStream/logisland-config.yml +++ b/logisland-docker/src/integration-test/engine-spark_2_X/KafkaStreamProcessingEngine/StructuredStream/logisland-config.yml @@ -1,4 +1,4 @@ -version: 1.3.0 +version: 1.4.0 documentation: LogIsland Kafka Connect Integration engine: @@ -35,7 +35,7 @@ engine: controllerServiceConfigurations: # Our source service - - controllerService: kc_source_service + - controllerService: kafka_source_service component: com.hurence.logisland.stream.spark.provider.KafkaConnectStructuredSourceProviderService documentation: A kafka source connector provider reading from its own source and providing structured streaming to the underlying layer configuration: @@ -62,7 +62,7 @@ engine: kc.connector.offset.backing.store: memory # Kafka sink configuration - - controllerService: kafka_out_service + - controllerService: kafka_sink_service component: com.hurence.logisland.stream.spark.structured.provider.KafkaStructuredStreamProviderService configuration: kafka.output.topics: logisland_raw @@ -111,10 +111,10 @@ engine: configuration: read.topics.serializer: com.hurence.logisland.serializer.KryoSerializer read.topics.key.serializer: com.hurence.logisland.serializer.KryoSerializer - read.stream.service.provider: kc_source_service + read.stream.service.provider: kafka_source_service write.topics.serializer: com.hurence.logisland.serializer.KryoSerializer write.topics.key.serializer: com.hurence.logisland.serializer.KryoSerializer - write.stream.service.provider: kafka_out_service + write.stream.service.provider: kafka_sink_service processorConfigurations: - processor: flatten component: com.hurence.logisland.processor.FlatMap diff --git a/logisland-docker/src/it/resources/data/all-tutorials.yml b/logisland-docker/src/it/resources/data/all-tutorials.yml index 4c70be864..8cf482f18 100644 --- a/logisland-docker/src/it/resources/data/all-tutorials.yml +++ b/logisland-docker/src/it/resources/data/all-tutorials.yml @@ -2,7 +2,7 @@ # Logisland configuration script template ######################################################################################################### -version: 1.3.0 +version: 1.4.0 documentation: LogIsland analytics main config file. Put here every engine or component config ######################################################################################################### diff --git a/logisland-documentation/changes.rst b/logisland-documentation/changes.rst index a57f0c120..8d4f3e0e9 100644 --- a/logisland-documentation/changes.rst +++ b/logisland-documentation/changes.rst @@ -1,6 +1,15 @@ What's new in logisland ? ========================= +v1.4.0 +------ + +- support for Azure databricks deployment (see -databricks and -chkloc run options) +- support for Azure Event Hubs through new structured stream source/sink service +- support for Avro serialization in structured streams +- support for opendistro (using elasticsearch 7.X service, validated against OD 1.4.0 with security [ssl - user/password]) +- support for spark 2.4.0 through new logisland spark engine (warning: no support for 2.4.1 where scala needed version is 2.12, no more 2.11) +- added spark standalone experimental run mode (no documentation) v1.3.0 ------ diff --git a/logisland-documentation/pom.xml b/logisland-documentation/pom.xml index 8402ffaf6..28968f076 100644 --- a/logisland-documentation/pom.xml +++ b/logisland-documentation/pom.xml @@ -22,7 +22,7 @@ com.hurence.logisland logisland - 1.3.0 + 1.4.0 logisland-documentation @@ -42,13 +42,13 @@ THIS MODULE DOCUMENTATION DEPENDENCIES com.fasterxml.jackson.core jackson-core - 2.9.4 + ${jackson.version} true com.fasterxml.jackson.core jackson-databind - 2.9.4 + ${jackson.version} true @@ -98,18 +98,13 @@ THIS MODULE DOCUMENTATION DEPENDENCIES *********************************************************************************** *********************************************************************************** --> - - com.hurence.logisland - logisland-service-hbase_1_1_2-client - ${project.version} - true - com.hurence.logisland logisland-service-elasticsearch_6_6_2-client ${project.version} true + repackaged @@ -117,6 +112,7 @@ THIS MODULE DOCUMENTATION DEPENDENCIES logisland-service-elasticsearch_7_x-client ${project.version} true + repackaged @@ -124,24 +120,28 @@ THIS MODULE DOCUMENTATION DEPENDENCIES logisland-service-redis ${project.version} true + repackaged com.hurence.logisland logisland-service-mongodb-client ${project.version} true + repackaged com.hurence.logisland logisland-service-cassandra-client ${project.version} true + repackaged com.hurence.logisland logisland-service-influxdb-client ${project.version} true + repackaged @@ -149,30 +149,28 @@ THIS MODULE DOCUMENTATION DEPENDENCIES logisland-service-solr_6_6_2-client ${project.version} true + repackaged com.hurence.logisland logisland-service-solr_8-client ${project.version} true - - - com.hurence.logisland - logisland-service-solr_chronix_6_4_2-client - ${project.version} - true + repackaged com.hurence.logisland logisland-service-inmemory-cache ${project.version} true + repackaged com.hurence.logisland logisland-service-ip-to-geo-maxmind ${project.version} true + repackaged @@ -187,23 +185,19 @@ THIS MODULE DOCUMENTATION DEPENDENCIES *********************************************************************************** *********************************************************************************** --> - - com.hurence.logisland - logisland-processor-hbase - ${project.version} - true - com.hurence.logisland logisland-processor-elasticsearch ${project.version} true + repackaged com.hurence.logisland logisland-processor-common ${project.version} true + repackaged @@ -212,54 +206,63 @@ THIS MODULE DOCUMENTATION DEPENDENCIES logisland-processor-scripting ${project.version} true + repackaged com.hurence.logisland logisland-processor-useragent ${project.version} true + repackaged com.hurence.logisland logisland-processor-excel ${project.version} true + repackaged com.hurence.logisland logisland-processor-xml ${project.version} true + repackaged com.hurence.logisland logisland-processor-web-analytics ${project.version} true + repackaged com.hurence.logisland logisland-processor-querymatcher ${project.version} true + repackaged com.hurence.logisland logisland-processor-cyber-security ${project.version} true + repackaged com.hurence.logisland logisland-processor-enrichment ${project.version} true + repackaged com.hurence.logisland logisland-processor-outlier-detection ${project.version} true + repackaged @@ -305,8 +308,10 @@ THIS MODULE DOCUMENTATION DEPENDENCIES cglib:cglib-nodep org.springframework.boot:spring-boot-loader + + com.hurence.logisland:logisland-plugin-support - com.hurence.logisland:logisland-processor-common + com.hurence.logisland:logisland-utils com.hurence.logisland.documentation.DocGenerator -d @@ -520,6 +525,11 @@ THIS MODULE DOCUMENTATION DEPENDENCIES logisland-engine-spark_2_3 ${project.version} + + com.hurence.logisland + logisland-engine-spark_2_4 + ${project.version} + org.apache.spark spark-network-common_${scala.binary.version} diff --git a/logisland-documentation/rest-api.rst b/logisland-documentation/rest-api.rst index 9f2a7ea12..7c7ce9d0c 100644 --- a/logisland-documentation/rest-api.rst +++ b/logisland-documentation/rest-api.rst @@ -133,7 +133,7 @@ On logisland side, the following will happen: In any case the stream is never stopped. -Type: :ref:`Versioned ` extended :ref:`inline ` +Type: :ref:`Versioned ` extended :ref:`inline ` **Example:** @@ -364,9 +364,9 @@ Body A streaming pipeline. -:ref:`Versioned ` extended :ref:`inline ` +:ref:`Versioned ` extended :ref:`inline ` -.. _i_ae1.3.015667b75409cb3251ba13c032: +.. _i_ae1.4.015667b75409cb3251ba13c032: **Inline schema:** @@ -577,9 +577,9 @@ DataFlow Model Structure A streaming pipeline. -:ref:`Versioned ` extended :ref:`inline ` +:ref:`Versioned ` extended :ref:`inline ` -.. _i_ae1.3.015667b75409cb3251ba13c032: +.. _i_ae1.4.015667b75409cb3251ba13c032: **Inline schema:** @@ -594,7 +594,7 @@ A streaming pipeline. services | No | array of :ref:`Component ` | | | The service controllers. streams | No | array of :ref:`Component ` extended :ref:`inline ` | | | The engine properties. -.. _d_0752e439d11d3f0d4f6b437e63ea7248: +.. _d_0752e439d11.4.0d4f6b437e63ea7248: Pipeline Model Structure ------------------------ diff --git a/logisland-documentation/src/main/java/com/hurence/logisland/documentation/DocGeneratorUtils.java b/logisland-documentation/src/main/java/com/hurence/logisland/documentation/DocGeneratorUtils.java index 328202203..7e42073d2 100644 --- a/logisland-documentation/src/main/java/com/hurence/logisland/documentation/DocGeneratorUtils.java +++ b/logisland-documentation/src/main/java/com/hurence/logisland/documentation/DocGeneratorUtils.java @@ -1,12 +1,12 @@ /** * Copyright (C) 2016 Hurence (support@hurence.com) - *

      + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - *

      - * http://www.apache.org/licenses/LICENSE-2.0 - *

      + * + * 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. diff --git a/logisland-documentation/src/main/java/com/hurence/logisland/documentation/yaml/YamlPrintWriter.java b/logisland-documentation/src/main/java/com/hurence/logisland/documentation/yaml/YamlPrintWriter.java index 0518a8835..1e049177d 100644 --- a/logisland-documentation/src/main/java/com/hurence/logisland/documentation/yaml/YamlPrintWriter.java +++ b/logisland-documentation/src/main/java/com/hurence/logisland/documentation/yaml/YamlPrintWriter.java @@ -1,12 +1,12 @@ /** * Copyright (C) 2016 Hurence (support@hurence.com) - *

      + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - *

      - * http://www.apache.org/licenses/LICENSE-2.0 - *

      + * + * 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. diff --git a/logisland-documentation/tutorials/enrich-apache-logs.rst b/logisland-documentation/tutorials/enrich-apache-logs.rst index 18a3f0c45..ceded6b24 100644 --- a/logisland-documentation/tutorials/enrich-apache-logs.rst +++ b/logisland-documentation/tutorials/enrich-apache-logs.rst @@ -354,7 +354,7 @@ The logs are now loaded into elasticSearch, in the following form : "identd": "-", "record_id": "4ca6a8b5-1a60-421e-9ae9-6c30330e497e", "record_raw_value": "83.149.9.216 - - [17/May/2015:10:05:43 +0000] \"GET /presentations/logstash-monitorama-2013/images/kibana-dashboard3.png HTTP/1.1\" 200 171717 \"http://semicomplete.com/presentations/logstash-monitorama-2013/\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"", - "record_time": 1431857143000, + "record_time": 14318571.4.00, "record_type": "apache_log", "src_ip": "83.149.9.216", "user": "-" diff --git a/logisland-documentation/tutorials/index-apache-logs-mongo.rst b/logisland-documentation/tutorials/index-apache-logs-mongo.rst index d9b2bd9c9..850e3d77e 100644 --- a/logisland-documentation/tutorials/index-apache-logs-mongo.rst +++ b/logisland-documentation/tutorials/index-apache-logs-mongo.rst @@ -283,8 +283,8 @@ With mongo you can directly use the shell: .. code-block:: sh > db.apache.find() -{ "_id" : "507adf3e-3162-4ff0-843a-253e01a6df69", "src_ip" : "129.94.144.152", "record_id" : "507adf3e-3162-4ff0-843a-253e01a6df69", "http_method" : "GET", "record_value" : "129.94.144.152 - - [01/Jul/1995:00:00:17 -0400] \"GET /images/ksclogo-medium.gif HTTP/1.0\" 304 0", "http_query" : "/images/ksclogo-medium.gif", "bytes_out" : "0", "identd" : "-", "http_version" : "HTTP/1.0", "http_status" : "304", "record_time" : NumberLong("804571.1.3.0"), "user" : "-", "record_type" : "apache_log" } -{ "_id" : "c44a9d09-52b9-4ada-8126-39c70c90fdd3", "src_ip" : "ppp-mia-30.shadow.net", "record_id" : "c44a9d09-52b9-4ada-8126-39c70c90fdd3", "http_method" : "GET", "record_value" : "ppp-mia-30.shadow.net - - [01/Jul/1995:00:00:27 -0400] \"GET / HTTP/1.0\" 200 7074", "http_query" : "/", "bytes_out" : "7074", "identd" : "-", "http_version" : "HTTP/1.0", "http_status" : "200", "record_time" : NumberLong("804571.3.000"), "user" : "-", "record_type" : "apache_log" } +{ "_id" : "507adf3e-3162-4ff0-843a-253e01a6df69", "src_ip" : "129.94.144.152", "record_id" : "507adf3e-3162-4ff0-843a-253e01a6df69", "http_method" : "GET", "record_value" : "129.94.144.152 - - [01/Jul/1995:00:00:17 -0400] \"GET /images/ksclogo-medium.gif HTTP/1.0\" 304 0", "http_query" : "/images/ksclogo-medium.gif", "bytes_out" : "0", "identd" : "-", "http_version" : "HTTP/1.0", "http_status" : "304", "record_time" : NumberLong("804571.1.4.0"), "user" : "-", "record_type" : "apache_log" } +{ "_id" : "c44a9d09-52b9-4ada-8126-39c70c90fdd3", "src_ip" : "ppp-mia-30.shadow.net", "record_id" : "c44a9d09-52b9-4ada-8126-39c70c90fdd3", "http_method" : "GET", "record_value" : "ppp-mia-30.shadow.net - - [01/Jul/1995:00:00:27 -0400] \"GET / HTTP/1.0\" 200 7074", "http_query" : "/", "bytes_out" : "7074", "identd" : "-", "http_version" : "HTTP/1.0", "http_status" : "200", "record_time" : NumberLong("804571.4.000"), "user" : "-", "record_type" : "apache_log" } ... diff --git a/logisland-documentation/tutorials/index-jdbc-messages.rst b/logisland-documentation/tutorials/index-jdbc-messages.rst index 7bead4f2e..b476357ee 100644 --- a/logisland-documentation/tutorials/index-jdbc-messages.rst +++ b/logisland-documentation/tutorials/index-jdbc-messages.rst @@ -162,7 +162,7 @@ it should be something like the following 18/09/04 12:47:33 INFO DebugStream: { "id" : "f7690b71-f339-4a84-8bd9-a0beb9ba5f92", "type" : "kafka_connect", - "creationDate" : 1536065253831, + "creationDate" : 1.4.065253831, "fields" : { "record_id" : "f7690b71-f339-4a84-8bd9-a0beb9ba5f92", "RECORD_TIME" : 0, @@ -172,7 +172,7 @@ it should be something like the following "HTTP_QUERY" : "/images/KSC-logosmall.gif", "HTTP_VERSION" : "HTTP/1.0 ", "USER" : "-", - "record_time" : 1536065253831, + "record_time" : 1.4.065253831, "record_type" : "kafka_connect", "HTTP_METHOD" : "GET", "BYTES_OUT" : 1204 diff --git a/logisland-documentation/tutorials/indexing-bro-events.rst b/logisland-documentation/tutorials/indexing-bro-events.rst index ad5ae80b4..b74849ab4 100644 --- a/logisland-documentation/tutorials/indexing-bro-events.rst +++ b/logisland-documentation/tutorials/indexing-bro-events.rst @@ -677,7 +677,7 @@ In the response, you should see a notice event like this: "src" : "172.16.238.1", "sub" : "Sampled servers: 172.16.238.136, 172.16.238.136, 172.16.238.136, 172.16.238.136, 172.16.238.136", "suppress_for" : 3600.0, - "ts" : 1.320435875879278E9 + "ts" : 1.4.0435875879278E9 } } diff --git a/logisland-documentation/tutorials/integrate-kafka-connect.rst b/logisland-documentation/tutorials/integrate-kafka-connect.rst index d43d0ef70..8b2ad0c15 100644 --- a/logisland-documentation/tutorials/integrate-kafka-connect.rst +++ b/logisland-documentation/tutorials/integrate-kafka-connect.rst @@ -239,7 +239,7 @@ Since we put a *DebugStream* processor, messages produced by our source connecto 18/04/06 11:17:06 INFO DebugStream: { "id" : "9b17a9ac-97c4-44ef-9168-d298e8c53d42", "type" : "kafka_connect", - "creationDate" : 1.3.006216376, + "creationDate" : 1.4.006216376, "fields" : { "record_id" : "9b17a9ac-97c4-44ef-9168-d298e8c53d42", "firstName" : "London", @@ -250,7 +250,7 @@ Since we put a *DebugStream* processor, messages produced by our source connecto }, "middleName" : "Anna", "dateOfBirth" : 836179200000, - "record_time" : 1.3.006216376, + "record_time" : 1.4.006216376, "record_type" : "kafka_connect", "email" : "londonmarks@fake.com" } diff --git a/logisland-documentation/user/components/common-processors.rst b/logisland-documentation/user/components/common-processors.rst index 0f4247ffa..b9b2f5e7a 100644 --- a/logisland-documentation/user/components/common-processors.rst +++ b/logisland-documentation/user/components/common-processors.rst @@ -6,1804 +6,3 @@ Common-processors Find below the list. - ----------- - -.. _com.hurence.logisland.processor.alerting.ComputeTags: - -ComputeTags ------------ -Compute tag cross from given formulas. - -- each dynamic property will return a new record according to the formula definition -- the record name will be set to the property name -- the record time will be set to the current timestamp - -a threshold_cross has the following properties : count, sum, avg, time, duration, value - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.alerting.ComputeTags - -Tags -____ -record, fields, Add - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "max.cpu.time", "maximum CPU time in milliseconds allowed for script execution.", "", "100", "false", "false" - "max.memory", "maximum memory in Bytes which JS executor thread can allocate", "", "51200", "false", "false" - "allow.no.brace", "Force, to check if all blocks are enclosed with curly braces \"\"{}\"\". - - .. raw:: html - -

      - - Explanation: all loops (for, do-while, while, and if-else, and functions - - should use braces, because poison_pill() function will be inserted after - - each open brace \"\"{\"\", to ensure interruption checking. Otherwise simple - - code like: - -

      -
      -       while(true) while(true) {
      -
      -         // do nothing
      -
      -       }
      -
      -     
      - - or even: - -
      -
      -       while(true)
      -
      -     
      - - cause unbreakable loop, which force this sandbox to use {@link Thread#stop()} - - which make JVM unstable. - -

      - -

      - - Properly writen code (even in bad intention) like: - -

      -
      -       while(true) { while(true) {
      -
      -         // do nothing
      -
      -       }}
      -
      -     
      - - will be changed into: - -
      -
      -       while(true) {poison_pill(); 
      -
      -         while(true) {poison_pill();
      -
      -           // do nothing
      -
      -         }
      -
      -       }
      -
      -     
      - - which finish nicely when interrupted. - -

      - - For legacy code, this check can be turned off, but with no guarantee, the - - JS thread will gracefully finish when interrupted. - -

      ", "", "false", "false", "false" - "max.prepared.statements", "The size of prepared statements LRU cache. If 0, this is disabled. - - .. raw:: html - -

      - - Each statements when setMaxCPUTime(long) is set is prepared to - - quit itself when time exceeded. To execute only once this procedure per - - statement set this value. - -

      - -

      - - When setMaxCPUTime(long) is set 0, this value is ignored. - -

      - - ", "", "30", "false", "false" - "**datastore.client.service**", "The instance of the Controller Service to use for accessing datastore.", "", "null", "false", "false" - "datastore.cache.collection", "The collection where to find cached objects", "", "test", "false", "false" - "js.cache.service", "The cache service to be used to store already sanitized JS expressions. If not specified a in-memory unlimited hash map will be used.", "", "null", "false", "false" - "output.record.type", "the type of the output record", "", "event", "false", "false" - -Dynamic Properties -__________________ -Dynamic Properties allow the user to specify both the name and value of a property. - -.. csv-table:: dynamic-properties - :header: "Name","Value","Description","Allowable Values","Default Value","EL" - :widths: 20,20,40,40,20,10 - :escape: \ - - "field to add", "a default value", "Add a field to the record with the default value", "", "null", false - -Extra informations -__________________ -.. include:: ./details/common-processors/ComputeTags-Detail.rst ----------- - -.. _com.hurence.logisland.processor.datastore.EnrichRecords: - -EnrichRecords -------------- -Enrich input records with content indexed in datastore using multiget queries. -Each incoming record must be possibly enriched with information stored in datastore. -The plugin properties are : - -- es.index (String) : Name of the datastore index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. -- record.key (String) : Name of the field in the input record containing the id to lookup document in elastic search. This field is mandatory. -- es.key (String) : Name of the datastore key on which the multiget query will be performed. This field is mandatory. -- includes (ArrayList) : List of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. -- excludes (ArrayList) : List of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. - -Each outcoming record holds at least the input record plus potentially one or more fields coming from of one datastore document. - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.datastore.EnrichRecords - -Tags -____ -datastore, enricher - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "**datastore.client.service**", "The instance of the Controller Service to use for accessing datastore.", "", "null", "false", "false" - "record.key", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" - "includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" - "excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" - "type.name", "The typle of record to look for", "", "null", "false", "**true**" - "collection.name", "The name of the collection to look for", "", "null", "false", "**true**" - -Extra informations -__________________ -.. include:: ./details/common-processors/EnrichRecords-Detail.rst ----------- - -.. _com.hurence.logisland.processor.DebugStream: - -DebugStream ------------ -This is a processor that logs incoming records - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.DebugStream - -Tags -____ -record, debug - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "**event.serializer**", "the way to serialize event", "json (serialize events as json blocs), string (serialize events as toString() blocs)", "json", "false", "false" - -Extra informations -__________________ -.. include:: ./details/common-processors/DebugStream-Detail.rst ----------- - -.. _com.hurence.logisland.processor.RecordsCounter: - -RecordsCounter --------------- -This is a processor that logs incoming records - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.RecordsCounter - -Tags -____ -record, debug - -Properties -__________ -This component has no required or optional properties. - -Extra informations -__________________ -.. include:: ./details/common-processors/DebugStream-Detail.rst ----------- - -.. _com.hurence.logisland.processor.datastore.BulkPut: - -BulkPut -------- -Indexes the content of a Record in a Datastore using bulk processor - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.datastore.BulkPut - -Tags -____ -datastore, record, put, bulk - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "**datastore.client.service**", "The instance of the Controller Service to use for accessing datastore.", "", "null", "false", "false" - "**default.collection**", "The name of the collection/index/table to insert into", "", "null", "false", "**true**" - "default.type", "The type of this document (required by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" - "**timebased.collection**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" - "date.format", "simple date format for date suffix. default : yyyy.MM.dd", "", "yyyy.MM.dd", "false", "false" - "collection.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "**true**" - "type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" - -Extra informations -__________________ -.. include:: ./details/common-processors/BulkPut-Detail.rst ----------- - -.. _com.hurence.logisland.processor.datastore.MultiGet: - -MultiGet --------- -Retrieves a content from datastore using datastore multiget queries. -Each incoming record contains information regarding the datastore multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : - - - collection (String) : name of the datastore collection on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. - - type (String) : name of the datastore type on which the multiget query will be performed. This field is not mandatory. - - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. - - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. - - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. - -Each outcoming record holds data of one datastore retrieved document. This data is stored in these fields : - - - collection (same field name as the incoming record) : name of the datastore collection. - - type (same field name as the incoming record) : name of the datastore type. - - id (same field name as the incoming record) : retrieved document id. - - a list of String fields containing : - - - field name : the retrieved field name - - field value : the retrieved field value - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.datastore.MultiGet - -Tags -____ -datastore, get, multiget - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "**datastore.client.service**", "The instance of the Controller Service to use for accessing datastore.", "", "null", "false", "false" - "**collection.field**", "the name of the incoming records field containing es collection name to use in multiget query. ", "", "null", "false", "false" - "**type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" - "**ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" - "**includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" - "**excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" - -Extra informations -__________________ -.. include:: ./details/common-processors/MultiGet-Detail.rst ----------- - -.. _com.hurence.logisland.processor.AddFields: - -AddFields ---------- -Add one or more field to records - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.AddFields - -Tags -____ -record, fields, Add - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" - -Dynamic Properties -__________________ -Dynamic Properties allow the user to specify both the name and value of a property. - -.. csv-table:: dynamic-properties - :header: "Name","Value","Description","Allowable Values","Default Value","EL" - :widths: 20,20,40,40,20,10 - :escape: \ - - "Name of the field to add", "Value of the field to add", "Add a field to the record with the specified value. Expression language can be used.You can not add a field that end with '.type' as this suffix is used to specify the type of fields to add", "", "null", **true** - "Name of the field to add with the suffix '.field.type'", "Type of the field to add", "Add a field to the record with the specified type. These properties are only used if a correspondant property without the suffix '.field.type' is already defined. If this property is not defined, default type for adding fields is String.You can only use Logisland predefined type fields.", "NULL, STRING, INT, LONG, ARRAY, FLOAT, DOUBLE, BYTES, RECORD, MAP, ENUM, BOOLEAN, UNION, DATETIME, OBJECT", "STRING", false - "Name of the field to add with the suffix '.field.name'", "Name of the field to add using expression language", "Add a field to the record with the specified name (which is evaluated using expression language). These properties are only used if a correspondant property without the suffix '.field.name' is already defined. If this property is not defined, the name of the field to add is the key of the first dynamic property (which is the main and only required dynamic property).", "", "null", **true** - -Extra informations -__________________ -.. include:: ./details/common-processors/AddFields-Detail.rst ----------- - -.. _com.hurence.logisland.processor.ApplyRegexp: - -ApplyRegexp ------------ -This processor is used to create a new set of fields from one field (using regexp). - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.ApplyRegexp - -Tags -____ -parser, regex, log, record - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" - -Dynamic Properties -__________________ -Dynamic Properties allow the user to specify both the name and value of a property. - -.. csv-table:: dynamic-properties - :header: "Name","Value","Description","Allowable Values","Default Value","EL" - :widths: 20,20,40,40,20,10 - :escape: \ - - "alternative regex & mapping", "another regex that could match", "This processor is used to create a new set of fields from one field (using regexp).", "", "null", **true** - -Extra informations -__________________ -.. include:: ./details/common-processors/ApplyRegexp-Detail.rst -See Also: -_________ -`com.hurence.logisland.processor.ApplyRegexp`_ - ----------- - -.. _com.hurence.logisland.processor.ExpandMapFields: - -ExpandMapFields ---------------- -Expands the content of a MAP field to the root. - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.ExpandMapFields - -Tags -____ -record, fields, Expand, Map - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "**fields.to.expand**", "Comma separated list of fields of type map that will be expanded to the root", "", "null", "false", "false" - "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" - -Extra informations -__________________ -.. include:: ./details/common-processors/ExpandMapFields-Detail.rst ----------- - -.. _com.hurence.logisland.processor.FlatMap: - -FlatMap -------- -Converts each field records into a single flatten record... - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.FlatMap - -Tags -____ -record, fields, flatmap, flatten - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "keep.root.record", "do we add the original record in", "", "true", "false", "false" - "copy.root.record.fields", "do we copy the original record fields into the flattened records", "", "true", "false", "false" - "leaf.record.type", "the new type for the flattened records if present", "", "", "false", "false" - "concat.fields", "comma separated list of fields to apply concatenation ex : $rootField/$leaffield", "", "null", "false", "false" - "concat.separator", "returns $rootField/$leaf/field", "", "/", "false", "false" - "include.position", "do we add the original record position in", "", "true", "false", "false" - -Extra informations -__________________ -.. include:: ./details/common-processors/FlatMap-Detail.rst ----------- - -.. _com.hurence.logisland.processor.GenerateRandomRecord: - -GenerateRandomRecord --------------------- -This is a processor that make random records given an Avro schema - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.GenerateRandomRecord - -Tags -____ -record, avro, generator - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "**avro.output.schema**", "the avro schema definition for the output serialization", "", "null", "false", "false" - "**min.events.count**", "the minimum number of generated events each run", "", "10", "false", "false" - "**max.events.count**", "the maximum number of generated events each run", "", "200", "false", "false" - -Extra informations -__________________ -.. include:: ./details/common-processors/GenerateRandomRecord-Detail.rst ----------- - -.. _com.hurence.logisland.processor.ModifyId: - -ModifyId --------- -modify id of records or generate it following defined rules - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.ModifyId - -Tags -____ -record, id, idempotent, generate, modify - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "**id.generation.strategy**", "the strategy to generate new Id", "randomUuid (generate a randomUid using java library), hashFields (generate a hash from fields), fromFields (generate a string from java pattern and fields), typetimehash (generate a concatenation of type, time and a hash from fields (as for generate_hash strategy))", "randomUuid", "false", "false" - "**fields.to.hash**", "the comma separated list of field names (e.g. : 'policyid,date_raw'", "", "record_value", "false", "false" - "**hash.charset**", "the charset to use to hash id string (e.g. 'UTF-8')", "", "UTF-8", "false", "false" - "**hash.algorithm**", "the algorithme to use to hash id string (e.g. 'SHA-256'", "SHA-384, SHA-224, SHA-256, MD2, SHA, SHA-512, MD5", "SHA-256", "false", "false" - "java.formatter.string", "the format to use to build id string (e.g. '%4$2s %3$2s %2$2s %1$2s' (see java Formatter)", "", "null", "false", "false" - "**language.tag**", "the language to use to format numbers in string", "aa, ab, ae, af, ak, am, an, ar, as, av, ay, az, ba, be, bg, bh, bi, bm, bn, bo, br, bs, ca, ce, ch, co, cr, cs, cu, cv, cy, da, de, dv, dz, ee, el, en, eo, es, et, eu, fa, ff, fi, fj, fo, fr, fy, ga, gd, gl, gn, gu, gv, ha, he, hi, ho, hr, ht, hu, hy, hz, ia, id, ie, ig, ii, ik, in, io, is, it, iu, iw, ja, ji, jv, ka, kg, ki, kj, kk, kl, km, kn, ko, kr, ks, ku, kv, kw, ky, la, lb, lg, li, ln, lo, lt, lu, lv, mg, mh, mi, mk, ml, mn, mo, mr, ms, mt, my, na, nb, nd, ne, ng, nl, nn, no, nr, nv, ny, oc, oj, om, or, os, pa, pi, pl, ps, pt, qu, rm, rn, ro, ru, rw, sa, sc, sd, se, sg, si, sk, sl, sm, sn, so, sq, sr, ss, st, su, sv, sw, ta, te, tg, th, ti, tk, tl, tn, to, tr, ts, tt, tw, ty, ug, uk, ur, uz, ve, vi, vo, wa, wo, xh, yi, yo, za, zh, zu", "en", "false", "false" - -Extra informations -__________________ -.. include:: ./details/common-processors/ModifyId-Detail.rst ----------- - -.. _com.hurence.logisland.processor.NormalizeFields: - -NormalizeFields ---------------- -Changes the name of a field according to a provided name mapping... - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.NormalizeFields - -Tags -____ -record, fields, normalizer - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "**conflict.resolution.policy**", "what to do when a field with the same name already exists ?", "do_nothing (leave record as it was), overwrite_existing (if field already exist), keep_only_old_field (keep only old field and delete the other), keep_both_fields (creates an alias for the new field)", "do_nothing", "false", "false" - -Dynamic Properties -__________________ -Dynamic Properties allow the user to specify both the name and value of a property. - -.. csv-table:: dynamic-properties - :header: "Name","Value","Description","Allowable Values","Default Value","EL" - :widths: 20,20,40,40,20,10 - :escape: \ - - "alternative mapping", "a comma separated list of possible field name", "when a field has a name contained in the list it will be renamed with this property field name", "", "null", **true** - -Extra informations -__________________ -.. include:: ./details/common-processors/NormalizeFields-Detail.rst ----------- - -.. _com.hurence.logisland.processor.SelectDistinctRecords: - -SelectDistinctRecords ---------------------- -Keep only distinct records based on a given field - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.SelectDistinctRecords - -Tags -____ -record, fields, remove, delete - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "**field.name**", "the field to distinct records", "", "record_id", "false", "false" - -Extra informations -__________________ -.. include:: ./details/common-processors/SelectDistinctRecords-Detail.rst ----------- - -.. _com.hurence.logisland.processor.EvaluateJsonPath: - -EvaluateJsonPath ----------------- -Evaluates one or more JsonPath expressions against the content of a FlowFile. The results of those expressions are assigned to Records Fields depending on configuration of the Processor. JsonPaths are entered by adding user-defined properties; the name of the property maps to the Field Name into which the result will be placed. The value of the property must be a valid JsonPath expression. A Return Type of 'auto-detect' will make a determination based off the configured destination. If the JsonPath evaluates to a JSON array or JSON object and the Return Type is set to 'scalar' the Record will be routed to error. A Return Type of JSON can return scalar values if the provided JsonPath evaluates to the specified value. If the expression matches nothing, Fields will be created with empty strings as the value - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.EvaluateJsonPath - -Tags -____ -JSON, evaluate, JsonPath - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "**return.type**", "Indicates the desired return type of the JSON Path expressions. Selecting 'auto-detect' will set the return type to 'json' or 'scalar' ", "json, scalar", "scalar", "false", "false" - "**path.not.found.behavior**", "Indicates how to handle missing JSON path expressions. Selecting 'warn' will generate a warning when a JSON path expression is not found.", "warn, ignore", "ignore", "false", "false" - "**Null Value Representation**", "Indicates the desired representation of JSON Path expressions resulting in a null value.", "empty string, the string 'null'", "empty string", "false", "false" - "**json.input.field.name**", "the name of the field containing the json string", "", "record_value", "false", "false" - -Dynamic Properties -__________________ -Dynamic Properties allow the user to specify both the name and value of a property. - -.. csv-table:: dynamic-properties - :header: "Name","Value","Description","Allowable Values","Default Value","EL" - :widths: 20,20,40,40,20,10 - :escape: \ - - "A Record field", "A JsonPath expression", "will be set to any JSON objects that match the JsonPath. ", "", "null", false - -Extra informations -__________________ -.. include:: ./details/common-processors/EvaluateJsonPath-Detail.rst ----------- - -.. _com.hurence.logisland.processor.ParseProperties: - -ParseProperties ---------------- -Parse a field made of key=value fields separated by spaces -a string like "a=1 b=2 c=3" will add a,b & c fields, respectively with values 1,2 & 3 to the current Record - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.ParseProperties - -Tags -____ -record, properties, parser - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "**properties.field**", "the field containing the properties to split and treat", "", "null", "false", "false" - -Extra informations -__________________ -.. include:: ./details/common-processors/ParseProperties-Detail.rst ----------- - -.. _com.hurence.logisland.processor.SplitField: - -SplitField ----------- -This processor is used to create a new set of fields from one field (using split). - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.SplitField - -Tags -____ -parser, split, log, record - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" - "split.limit", "Specify the maximum number of split to allow", "", "10", "false", "false" - "split.counter.enable", "Enable the counter of items returned by the split", "", "false", "false", "false" - "split.counter.suffix", "Enable the counter of items returned by the split", "", "Counter", "false", "false" - -Dynamic Properties -__________________ -Dynamic Properties allow the user to specify both the name and value of a property. - -.. csv-table:: dynamic-properties - :header: "Name","Value","Description","Allowable Values","Default Value","EL" - :widths: 20,20,40,40,20,10 - :escape: \ - - "alternative split field", "another split that could match", "This processor is used to create a new set of fields from one field (using split).", "", "null", **true** - -Extra informations -__________________ -.. include:: ./details/common-processors/SplitField-Detail.rst -See Also: -_________ -`com.hurence.logisland.processor.SplitField`_ - ----------- - -.. _com.hurence.logisland.processor.SplitText: - -SplitText ---------- -This is a processor that is used to split a String into fields according to a given Record mapping - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.SplitText - -Tags -____ -parser, regex, log, record - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "**value.regex**", "the regex to match for the message value", "", "null", "false", "false" - "**value.fields**", "a comma separated list of fields corresponding to matching groups for the message value", "", "null", "false", "false" - "key.regex", "the regex to match for the message key", "", ".*", "false", "false" - "key.fields", "a comma separated list of fields corresponding to matching groups for the message key", "", "record_key", "false", "false" - "record.type", "default type of record", "", "record", "false", "false" - "keep.raw.content", "do we add the initial raw content ?", "", "true", "false", "false" - "timezone.record.time", "what is the time zone of the string formatted date for 'record_time' field.", "", "UTC", "false", "false" - -Dynamic Properties -__________________ -Dynamic Properties allow the user to specify both the name and value of a property. - -.. csv-table:: dynamic-properties - :header: "Name","Value","Description","Allowable Values","Default Value","EL" - :widths: 20,20,40,40,20,10 - :escape: \ - - "alternative regex & mapping", "another regex that could match", "this regex will be tried if the main one has not matched. It must be in the form alt.value.regex.1 and alt.value.fields.1", "", "null", **true** - -Extra informations -__________________ -.. include:: ./details/common-processors/SplitText-Detail.rst -See Also: -_________ -`com.hurence.logisland.processor.SplitTextMultiline`_ - ----------- - -.. _com.hurence.logisland.processor.SplitTextMultiline: - -SplitTextMultiline ------------------- -No description provided. - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.SplitTextMultiline - -Tags -____ -None. - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "**regex**", "the regex to match", "", "null", "false", "false" - "**fields**", "a comma separated list of fields corresponding to matching groups", "", "null", "false", "false" - "**event.type**", "the type of event", "", "null", "false", "false" - -Extra informations -__________________ -.. include:: ./details/common-processors/SplitTextMultiline-Detail.rst ----------- - -.. _com.hurence.logisland.processor.SplitTextWithProperties: - -SplitTextWithProperties ------------------------ -This is a processor that is used to split a String into fields according to a given Record mapping - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.SplitTextWithProperties - -Tags -____ -parser, regex, log, record - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "**value.regex**", "the regex to match for the message value", "", "null", "false", "false" - "**value.fields**", "a comma separated list of fields corresponding to matching groups for the message value", "", "null", "false", "false" - "key.regex", "the regex to match for the message key", "", ".*", "false", "false" - "key.fields", "a comma separated list of fields corresponding to matching groups for the message key", "", "record_key", "false", "false" - "record.type", "default type of record", "", "record", "false", "false" - "keep.raw.content", "do we add the initial raw content ?", "", "true", "false", "false" - "**properties.field**", "the field containing the properties to split and treat", "", "properties", "false", "false" - -Dynamic Properties -__________________ -Dynamic Properties allow the user to specify both the name and value of a property. - -.. csv-table:: dynamic-properties - :header: "Name","Value","Description","Allowable Values","Default Value","EL" - :widths: 20,20,40,40,20,10 - :escape: \ - - "alternative regex & mapping", "another regex that could match", "this regex will be tried if the main one has not matched. It must be in the form alt.value.regex.1 and alt.value.fields.1", "", "null", **true** - -Extra informations -__________________ -.. include:: ./details/common-processors/SplitTextWithProperties-Detail.rst -See Also: -_________ -`com.hurence.logisland.processor.SplitTextMultiline`_ - ----------- - -.. _com.hurence.logisland.processor.ComputeAggsProcessor: - -ComputeAggsProcessor --------------------- -Enable to compute some common aggregations on all records or on array fields of records - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.ComputeAggsProcessor - -Tags -____ -record, fields, agg, aggregation, metric, stat - -Properties -__________ -This component has no required or optional properties. - -Extra informations -__________________ -.. include:: ./details/common-processors/ComputeAggsProcessor-Detail.rst ----------- - -.. _com.hurence.logisland.processor.ConvertFieldsType: - -ConvertFieldsType ------------------ -Converts a field value into the given type. does nothing if conversion is not possible - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.ConvertFieldsType - -Tags -____ -type, fields, update, convert - -Properties -__________ -This component has no required or optional properties. - -Dynamic Properties -__________________ -Dynamic Properties allow the user to specify both the name and value of a property. - -.. csv-table:: dynamic-properties - :header: "Name","Value","Description","Allowable Values","Default Value","EL" - :widths: 20,20,40,40,20,10 - :escape: \ - - "field", "the new type", "convert field value into new type", "", "null", **true** - -Extra informations -__________________ -.. include:: ./details/common-processors/ConvertFieldsType-Detail.rst ----------- - -.. _com.hurence.logisland.processor.ConvertSimpleDateFormatFields: - -ConvertSimpleDateFormatFields ------------------------------ -Convert one or more field representing a date into a Unix Epoch Time (time in milliseconds since &st January 1970, 00:00:00 GMT)... - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.ConvertSimpleDateFormatFields - -Tags -____ -record, fields, add, date, conversion, convert - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" - "**input.date.format**", "Simple date format representation of the input field to convert", "", "null", "false", "false" - "**timezone**", "Specify the timezone (default is CET)", "", "CET", "false", "false" - -Dynamic Properties -__________________ -Dynamic Properties allow the user to specify both the name and value of a property. - -.. csv-table:: dynamic-properties - :header: "Name","Value","Description","Allowable Values","Default Value","EL" - :widths: 20,20,40,40,20,10 - :escape: \ - - "field name to add", "value to convert into Epoch timestamp using given input.date.format", "Add a field to the record with the name, converting value using java SimpleDateFormat", "", "null", **true** - -Extra informations -__________________ -.. include:: ./details/common-processors/ConvertSimpleDateFormatFields-Detail.rst ----------- - -.. _com.hurence.logisland.processor.DecodeBase64: - -DecodeBase64 ------------- -Decodes fields to base64. The fields should be of type string - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.DecodeBase64 - -Tags -____ -decode, base64 - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "**source.fields**", "a comma separated list of fields corresponding to the fields to decode. Please note than the fields should be of type string", "", "null", "false", "false" - "**destination.fields**", "a comma separated list of fields corresponding to the decoded content according to the fields provided as input. Those fields will be of type bytes", "", "null", "false", "false" - -Extra informations -__________________ -.. include:: ./details/common-processors/DecodeBase64-Detail.rst ----------- - -.. _com.hurence.logisland.processor.EncodeBase64: - -EncodeBase64 ------------- -Encodes fields to base64. The fields should be of type array of bytes - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.EncodeBase64 - -Tags -____ -encode, base64 - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "**source.fields**", "a comma separated list of fields corresponding to the fields to encode. Please note than the fields should be of type bytes", "", "null", "false", "false" - "**destination.fields**", "a comma separated list of fields corresponding to the encoded content according to the fields provided as input. Those fields will be of type string", "", "null", "false", "false" - -Extra informations -__________________ -.. include:: ./details/common-processors/EncodeBase64-Detail.rst ----------- - -.. _com.hurence.logisland.processor.EncryptField: - -EncryptField ------------- -This is a processor that is used to encrypt or decrypt one or many fields of any type of a given Record mapping - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.EncryptField - -Tags -____ -None. - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "**mode**", "Specifies whether the content should be encrypted or decrypted", "Encrypt, Decrypt", "Encrypt", "false", "false" - "**algorithm**", "Specifies the algorithm that the cipher will use to encrypt/decrypt", "AES, AES/CBC/PKCS5Padding, AES/ECB/PKCS5Padding, AES/ECB/NoPadding, AES/CBC/NoPadding, DES, DES/CBC/PKCS5Padding, DES/ECB/PKCS5Padding, DES/CBC/NoPadding, DES/ECB/NoPadding, DESede, DESede/CBC/PKCS5Padding, DESede/ECB/PKCS5Padding, DESede/CBC/NoPadding, DESede/ECB/NoPadding, RSA/ECB/PKCS1Padding, RSA/ECB/OAEPWithSHA-1AndMGF1Padding, RSA/ECB/OAEPWithSHA-256AndMGF1Padding, RSA", "AES", "false", "false" - "key", "Specifies the key to use (getByte on string will be used) by the Cipher (If the algorithm use one). See javadoc for more info", "", "azerty1234567890", "false", "false" - "iv", "Specifies the byte array to use as iv (getByte on string will be used) by the Cipher (If the algorithm use one). See javadoc for more info", "", "null", "false", "false" - "key.file", "Specifies the key file to use as public or private key by the Cipher (If the algorithm use one). See javadoc for more info\"", "", "null", "false", "false" - "**charset**", "the charset encoding to use (e.g. 'UTF-8'). It is used for encryption/decryption on type String to convert to or from bytes.", "", "UTF-8", "false", "false" - -Dynamic Properties -__________________ -Dynamic Properties allow the user to specify both the name and value of a property. - -.. csv-table:: dynamic-properties - :header: "Name","Value","Description","Allowable Values","Default Value","EL" - :widths: 20,20,40,40,20,10 - :escape: \ - - "field to encrypt", "a default value", "encrypt the field value", "", "null", **true** - -Extra informations -__________________ -.. include:: ./details/common-processors/EncryptField-Detail.rst ----------- - -.. _com.hurence.logisland.processor.FilterRecords: - -FilterRecords -------------- -Keep only records based on a given field value or/and based on custom methods returning a boolean (or something that can be casted into a boolean). - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.FilterRecords - -Tags -____ -record, fields, remove, delete - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "field.name", "the field name", "", "null", "false", "false" - "field.value", "the field value to keep", "", "null", "false", "false" - "logic", "the logic to use between the different filter criterias (methods).", "AND, OR", "OR", "false", "false" - "keep.errors", "If you want to keep records that got exception while evaluating a custom method or not.", "", "true", "false", "false" - -Dynamic Properties -__________________ -Dynamic Properties allow the user to specify both the name and value of a property. - -.. csv-table:: dynamic-properties - :header: "Name","Value","Description","Allowable Values","Default Value","EL" - :widths: 20,20,40,40,20,10 - :escape: \ - - "Name of the method to add (the name is just for documentation purpose)", "an expression returning a boolean or an object that can be cast into a boolean that will be used to filter out records", "an expression returning a boolean or an object that can be cast into a boolean that will be used to filter out records", "", "null", **true** - -Extra informations -__________________ -.. include:: ./details/common-processors/FilterRecords-Detail.rst ----------- - -.. _com.hurence.logisland.processor.MergeRecordProcessor: - -MergeRecordProcessor --------------------- -Merge contents of several records into less records. - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.MergeRecordProcessor - -Tags -____ -record, fields, merge, content, reduce - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "group.by.field", "The fields to use to group records to aggregate into one. There will be one record in output by different value of the field", "", "", "false", "false" - "sort.by.field", "The fields to use to sort records before before aggregating into one. For example if you want to order time series value points.", "", "", "false", "false" - "sort.reverse", "If records should be reverse sorted (if they are sorted)", "", "false", "false", "false" - "default.strategy", "The default strategy to use for merging records", "take_first (will take value of first record), array (will aggregate values into one array)", "take_first", "false", "false" - -Extra informations -__________________ -.. include:: ./details/common-processors/MergeRecordProcessor-Detail.rst ----------- - -.. _com.hurence.logisland.processor.parser.ParseGitlabLog: - -ParseGitlabLog --------------- -The Gitlab logs processor is the Logisland entry point to get and process `Gitlab `_ logs. This allows for instance to monitor activities in your Gitlab server. The expected input of this processor are records from the production_json.log log file of Gitlab which contains JSON records. You can for instance use the `kafkacat `_ command to inject those logs into kafka and thus Logisland. - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.parser.ParseGitlabLog - -Tags -____ -logs, gitlab - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" - -Extra informations -__________________ -.. include:: ./details/ParseGitlabLog-Detail.rst ----------- - -.. _com.hurence.logisland.processor.RemoveFields: - -RemoveFields ------------- -Removes a list of fields defined by a comma separated list of field names or keeps only fields defined by a comma separated list of field names. - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.RemoveFields - -Tags -____ -record, fields, remove, delete, keep - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "fields.to.remove", "A comma separated list of field names to remove (e.g. 'policyid,date_raw'). Usage of this property is mutually exclusive with the fields.to.keep property. In any case the technical logisland fields record_id, record_time and record_type are not removed even if specified in the list to remove.", "", "null", "false", "false" - "fields.to.keep", "A comma separated list of field names to keep (e.g. 'policyid,date_raw'. All other fields will be removed. Usage of this property is mutually exclusive with the PropertyDescriptor[fields.to.remove] property. In any case the technical logisland fields record_id, record_time and record_type are not removed even if not specified in the list to keep.", "", "null", "false", "false" - -Extra informations -__________________ -.. include:: ./details/common-processors/RemoveFields-Detail.rst ----------- - -.. _com.hurence.logisland.processor.SendMail: - -SendMail --------- -The SendMail processor is aimed at sending an email (like for instance an alert email) from an incoming record. There are three ways an incoming record can generate an email according to the special fields it must embed. Here is a list of the record fields that generate a mail and how they work: - -- **mail_text**: this is the simplest way for generating a mail. If present, this field means to use its content (value) as the payload of the mail to send. The mail is sent in text format if there is only this special field in the record. Otherwise, used with either mail_html or mail_use_template, the content of mail_text is the aletrnative text to the HTML mail that is generated. - -- **mail_html**: this field specifies that the mail should be sent as HTML and the value of the field is mail payload. If mail_text is also present, its value is used as the alternative text for the mail. mail_html cannot be used with mail_use_template: only one of those two fields should be present in the record. - -- **mail_use_template**: If present, this field specifies that the mail should be sent as HTML and the HTML content is to be generated from the template in the processor configuration key **html.template**. The template can contain parameters which must also be present in the record as fields. See documentation of html.template for further explanations. mail_use_template cannot be used with mail_html: only one of those two fields should be present in the record. - - If **allow_overwrite** configuration key is true, any mail.* (dot format) configuration key may be overwritten with a matching field in the record of the form mail_* (underscore format). For instance if allow_overwrite is true and mail.to is set to config_address@domain.com, a record generating a mail with a mail_to field set to record_address@domain.com will send a mail to record_address@domain.com. - - Apart from error records (when he is unable to process the incoming record or to send the mail), this processor is not expected to produce any output records. - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.SendMail - -Tags -____ -smtp, email, e-mail, mail, mailer, sendmail, message, alert, html - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "debug", "Enable debug. If enabled, debug information are written to stdout.", "", "false", "false", "false" - "**smtp.server**", "FQDN, hostname or IP address of the SMTP server to use.", "", "null", "false", "false" - "smtp.port", "TCP port number of the SMTP server to use.", "", "25", "false", "false" - "smtp.security.username", "SMTP username.", "", "null", "false", "false" - "smtp.security.password", "SMTP password.", "", "null", "false", "false" - "smtp.security.ssl", "Use SSL under SMTP or not (SMTPS). Default is false.", "", "false", "false", "false" - "**mail.from.address**", "Valid mail sender email address.", "", "null", "false", "false" - "mail.from.name", "Mail sender name.", "", "null", "false", "false" - "**mail.bounce.address**", "Valid bounce email address (where error mail is sent if the mail is refused by the recipient server).", "", "null", "false", "false" - "mail.replyto.address", "Reply to email address.", "", "null", "false", "false" - "mail.subject", "Mail subject.", "", "[LOGISLAND] Automatic email", "false", "false" - "mail.to", "Comma separated list of email recipients. If not set, the record must have a mail_to field and allow_overwrite configuration key should be true.", "", "null", "false", "false" - "allow_overwrite", "If true, allows to overwrite processor configuration with special record fields (mail_to, mail_from_address, mail_from_name, mail_bounce_address, mail_replyto_address, mail_subject). If false, special record fields are ignored and only processor configuration keys are used.", "", "true", "false", "false" - "html.template", "HTML template to use. It is used when the incoming record contains a mail_use_template field. The template may contain some parameters. The parameter format in the template is of the form ${xxx}. For instance ${param_user} in the template means that a field named param_user must be present in the record and its value will replace the ${param_user} string in the HTML template when the mail will be sent. If some parameters are declared in the template, everyone of them must be present in the record as fields, otherwise the record will generate an error record. If an incoming record contains a mail_use_template field, a template must be present in the configuration and the HTML mail format will be used. If the record also contains a mail_text field, its content will be used as an alternative text message to be used in the mail reader program of the recipient if it does not supports HTML.", "", "null", "false", "false" - -Extra informations -__________________ -.. include:: ./details/common-processors/SendMail-Detail.rst ----------- - -.. _com.hurence.logisland.processor.SetJsonAsFields: - -SetJsonAsFields ---------------- -The SetJsonAsFields processor reads the content of a string field containing a json string and sets each json attribute as a field of the current record. Note that this could be achieved with the EvaluateJsonPath processor, but this implies to declare each json first level attribute in the configuration and also to know by advance every one of them. Whereas for this simple case, the SetJsonAsFields processor does not require such a configuration and will work with any incoming json, regardless of the list of first level attributes. - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.SetJsonAsFields - -Tags -____ -json - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "debug", "Enable debug. If enabled, debug information are written to stdout.", "", "false", "false", "false" - "**json.field**", "Field name of the string field that contains the json document to parse.", "", "record_value", "false", "false" - "**keep.json.field**", "Keep the original json field or not. Default is false so default is to remove the json field.", "", "false", "false", "false" - "**overwrite.existing.field**", "Overwrite an existing record field or not. Default is true so default is to remove the conflicting field.", "", "true", "false", "false" - "**omit.null.attributes**", "Omit json attributes with null values. Default is false so to set them as null record fields", "", "false", "false", "false" - "**omit.empty.string.attributes**", "Omit json attributes with empty string values. Default is false so to set them as empty string record fields", "", "false", "false", "false" - -Extra informations -__________________ -.. include:: ./details/common-processors/SetJsonAsFields-Detail.rst ----------- - -.. _com.hurence.logisland.processor.SplitRecord: - -SplitRecord ------------ -This processor is used to create a new set of records from one record. - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.SplitRecord - -Tags -____ -None. - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "keep.parent.record", "Specify if the parent record should exist", "", "false", "false", "false" - "keep.parent.record_time", "Specify whether to use the processing_time as record_time or not", "", "true", "false", "false" - "keep.parent.record_type", "Specify whether to use the dynamic property name as record_type or not", "", "false", "false", "false" - -Dynamic Properties -__________________ -Dynamic Properties allow the user to specify both the name and value of a property. - -.. csv-table:: dynamic-properties - :header: "Name","Value","Description","Allowable Values","Default Value","EL" - :widths: 20,20,40,40,20,10 - :escape: \ - - "new record name", "fields to have", "the new record", "", "null", **true** - -Extra informations -__________________ -No additional information is provided - ----------- - -.. _com.hurence.logisland.processor.alerting.CheckAlerts: - -CheckAlerts ------------ -Add one or more records representing alerts. Using a datastore. - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.alerting.CheckAlerts - -Tags -____ -record, alerting, thresholds, opc, tag - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "max.cpu.time", "maximum CPU time in milliseconds allowed for script execution.", "", "100", "false", "false" - "max.memory", "maximum memory in Bytes which JS executor thread can allocate", "", "51200", "false", "false" - "allow.no.brace", "Force, to check if all blocks are enclosed with curly braces \"\"{}\"\". - - .. raw:: html - -

      - - Explanation: all loops (for, do-while, while, and if-else, and functions - - should use braces, because poison_pill() function will be inserted after - - each open brace \"\"{\"\", to ensure interruption checking. Otherwise simple - - code like: - -

      -
      -       while(true) while(true) {
      -
      -         // do nothing
      -
      -       }
      -
      -     
      - - or even: - -
      -
      -       while(true)
      -
      -     
      - - cause unbreakable loop, which force this sandbox to use {@link Thread#stop()} - - which make JVM unstable. - -

      - -

      - - Properly writen code (even in bad intention) like: - -

      -
      -       while(true) { while(true) {
      -
      -         // do nothing
      -
      -       }}
      -
      -     
      - - will be changed into: - -
      -
      -       while(true) {poison_pill(); 
      -
      -         while(true) {poison_pill();
      -
      -           // do nothing
      -
      -         }
      -
      -       }
      -
      -     
      - - which finish nicely when interrupted. - -

      - - For legacy code, this check can be turned off, but with no guarantee, the - - JS thread will gracefully finish when interrupted. - -

      ", "", "false", "false", "false" - "max.prepared.statements", "The size of prepared statements LRU cache. If 0, this is disabled. - - .. raw:: html - -

      - - Each statements when setMaxCPUTime(long) is set is prepared to - - quit itself when time exceeded. To execute only once this procedure per - - statement set this value. - -

      - -

      - - When setMaxCPUTime(long) is set 0, this value is ignored. - -

      - - ", "", "30", "false", "false" - "**datastore.client.service**", "The instance of the Controller Service to use for accessing datastore.", "", "null", "false", "false" - "datastore.cache.collection", "The collection where to find cached objects", "", "test", "false", "false" - "js.cache.service", "The cache service to be used to store already sanitized JS expressions. If not specified a in-memory unlimited hash map will be used.", "", "null", "false", "false" - "output.record.type", "the type of the output record", "", "event", "false", "false" - "profile.activation.condition", "A javascript expression that activates this alerting profile when true", "", "0==0", "false", "false" - "alert.criticity", "from 0 to ...", "", "0", "false", "false" - -Dynamic Properties -__________________ -Dynamic Properties allow the user to specify both the name and value of a property. - -.. csv-table:: dynamic-properties - :header: "Name","Value","Description","Allowable Values","Default Value","EL" - :widths: 20,20,40,40,20,10 - :escape: \ - - "field to add", "a default value", "Add a field to the record with the default value", "", "null", false - -Extra informations -__________________ -.. include:: ./details/common-processors/CheckAlerts-Detail.rst ----------- - -.. _com.hurence.logisland.processor.alerting.CheckThresholds: - -CheckThresholds ---------------- -Compute threshold cross from given formulas. - -- each dynamic property will return a new record according to the formula definition -- the record name will be set to the property name -- the record time will be set to the current timestamp - - -Module -______ -com.hurence.logisland:logisland-processor-common:1.3.0 - -Class -_____ -com.hurence.logisland.processor.alerting.CheckThresholds - -Tags -____ -record, threshold, tag, alerting - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "max.cpu.time", "maximum CPU time in milliseconds allowed for script execution.", "", "100", "false", "false" - "max.memory", "maximum memory in Bytes which JS executor thread can allocate", "", "51200", "false", "false" - "allow.no.brace", "Force, to check if all blocks are enclosed with curly braces \"\"{}\"\". - - .. raw:: html - -

      - - Explanation: all loops (for, do-while, while, and if-else, and functions - - should use braces, because poison_pill() function will be inserted after - - each open brace \"\"{\"\", to ensure interruption checking. Otherwise simple - - code like: - -

      -
      -       while(true) while(true) {
      -
      -         // do nothing
      -
      -       }
      -
      -     
      - - or even: - -
      -
      -       while(true)
      -
      -     
      - - cause unbreakable loop, which force this sandbox to use {@link Thread#stop()} - - which make JVM unstable. - -

      - -

      - - Properly writen code (even in bad intention) like: - -

      -
      -       while(true) { while(true) {
      -
      -         // do nothing
      -
      -       }}
      -
      -     
      - - will be changed into: - -
      -
      -       while(true) {poison_pill(); 
      -
      -         while(true) {poison_pill();
      -
      -           // do nothing
      -
      -         }
      -
      -       }
      -
      -     
      - - which finish nicely when interrupted. - -

      - - For legacy code, this check can be turned off, but with no guarantee, the - - JS thread will gracefully finish when interrupted. - -

      ", "", "false", "false", "false" - "max.prepared.statements", "The size of prepared statements LRU cache. If 0, this is disabled. - - .. raw:: html - -

      - - Each statements when setMaxCPUTime(long) is set is prepared to - - quit itself when time exceeded. To execute only once this procedure per - - statement set this value. - -

      - -

      - - When setMaxCPUTime(long) is set 0, this value is ignored. - -

      - - ", "", "30", "false", "false" - "**datastore.client.service**", "The instance of the Controller Service to use for accessing datastore.", "", "null", "false", "false" - "datastore.cache.collection", "The collection where to find cached objects", "", "test", "false", "false" - "js.cache.service", "The cache service to be used to store already sanitized JS expressions. If not specified a in-memory unlimited hash map will be used.", "", "null", "false", "false" - "output.record.type", "the type of the output record", "", "event", "false", "false" - "record.ttl", "How long (in ms) do the record will remain in cache", "", "30000", "false", "false" - "min.update.time.ms", "The minimum amount of time (in ms) that we expect between two consecutive update of the same threshold record", "", "200", "false", "false" - -Dynamic Properties -__________________ -Dynamic Properties allow the user to specify both the name and value of a property. - -.. csv-table:: dynamic-properties - :header: "Name","Value","Description","Allowable Values","Default Value","EL" - :widths: 20,20,40,40,20,10 - :escape: \ - - "field to add", "a default value", "Add a field to the record with the default value", "", "null", false - -Extra informations -__________________ -.. include:: ./details/common-processors/CheckThresholds-Detail.rst \ No newline at end of file diff --git a/logisland-documentation/user/components/components.yaml b/logisland-documentation/user/components/components.yaml index 8caedd66a..cc43962dc 100644 --- a/logisland-documentation/user/components/components.yaml +++ b/logisland-documentation/user/components/components.yaml @@ -10,274 +10,69 @@ categories: - analytics - timeseries extensions: - - name: ComputeTags - description: > - Compute tag cross from given formulas. - - - each dynamic property will return a new record according to the formula definition - - the record name will be set to the property name - - the record time will be set to the current timestamp - - a threshold_cross has the following properties : count, sum, avg, time, duration, value - category: enrichment - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.alerting.ComputeTags - tags: [record, fields, Add] - - name: EnrichRecords - description: > - Enrich input records with content indexed in datastore using multiget queries. - Each incoming record must be possibly enriched with information stored in datastore. - The plugin properties are : - - - es.index (String) : Name of the datastore index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. - - record.key (String) : Name of the field in the input record containing the id to lookup document in elastic search. This field is mandatory. - - es.key (String) : Name of the datastore key on which the multiget query will be performed. This field is mandatory. - - includes (ArrayList) : List of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. - - excludes (ArrayList) : List of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. - - Each outcoming record holds at least the input record plus potentially one or more fields coming from of one datastore document. + - name: ParseUserAgent + description: The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. category: enrichment - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.datastore.EnrichRecords - tags: [datastore, enricher] - - name: DebugStream - description: This is a processor that logs incoming records - category: utils - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.DebugStream - tags: [record, debug] - - name: RecordsCounter - description: This is a processor that logs incoming records - category: utils - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.RecordsCounter - tags: [record, debug] - - name: BulkPut - description: Indexes the content of a Record in a Datastore using bulk processor - category: datastore - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.datastore.BulkPut - tags: [datastore, record, put, bulk] - - name: MultiGet + module: com.hurence.logisland:logisland-processor-useragent:1.4.0 + class: com.hurence.logisland.processor.useragent.ParseUserAgent + tags: [User-Agent, clickstream, DMP] + - name: CalculWebSession description: > - Retrieves a content from datastore using datastore multiget queries. - Each incoming record contains information regarding the datastore multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : - - - collection (String) : name of the datastore collection on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. - - type (String) : name of the datastore type on which the multiget query will be performed. This field is not mandatory. - - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. - - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. - - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + This processor creates web-sessions based on incoming web-events. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: - Each outcoming record holds data of one datastore retrieved document. This data is stored in these fields : + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. - - collection (same field name as the incoming record) : name of the datastore collection. - - type (same field name as the incoming record) : name of the datastore type. - - id (same field name as the incoming record) : retrieved document id. - - a list of String fields containing : + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- And web sessions are passed to the next processor. - - field name : the retrieved field name - - field value : the retrieved field value - category: datastore - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.datastore.MultiGet - tags: [datastore, get, multiget] - - name: AddFields - description: Add one or more field to records - category: processing - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.AddFields - tags: [record, fields, Add] - - name: ApplyRegexp - description: This processor is used to create a new set of fields from one field (using regexp). - category: processing - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.ApplyRegexp - tags: [parser, regex, log, record] - - name: ExpandMapFields - description: Expands the content of a MAP field to the root. - category: processing - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.ExpandMapFields - tags: [record, fields, Expand, Map] - - name: FlatMap - description: Converts each field records into a single flatten record... - category: processing - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.FlatMap - tags: [record, fields, flatmap, flatten] - - name: GenerateRandomRecord - description: This is a processor that make random records given an Avro schema - category: processing - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.GenerateRandomRecord - tags: [record, avro, generator] - - name: ModifyId - description: modify id of records or generate it following defined rules - category: processing - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.ModifyId - tags: [record, id, idempotent, generate, modify] - - name: NormalizeFields - description: Changes the name of a field according to a provided name mapping... - category: processing - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.NormalizeFields - tags: [record, fields, normalizer] - - name: SelectDistinctRecords - description: Keep only distinct records based on a given field - category: processing - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.SelectDistinctRecords - tags: [record, fields, remove, delete] - - name: EvaluateJsonPath - description: Evaluates one or more JsonPath expressions against the content of a FlowFile. The results of those expressions are assigned to Records Fields depending on configuration of the Processor. JsonPaths are entered by adding user-defined properties; the name of the property maps to the Field Name into which the result will be placed. The value of the property must be a valid JsonPath expression. A Return Type of 'auto-detect' will make a determination based off the configured destination. If the JsonPath evaluates to a JSON array or JSON object and the Return Type is set to 'scalar' the Record will be routed to error. A Return Type of JSON can return scalar values if the provided JsonPath evaluates to the specified value. If the expression matches nothing, Fields will be created with empty strings as the value - category: parsing - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.EvaluateJsonPath - tags: [JSON, evaluate, JsonPath] - - name: ParseProperties - description: > - Parse a field made of key=value fields separated by spaces - a string like "a=1 b=2 c=3" will add a,b & c fields, respectively with values 1,2 & 3 to the current Record - category: parsing - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.ParseProperties - tags: [record, properties, parser] - - name: SplitField - description: This processor is used to create a new set of fields from one field (using split). - category: parsing - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.SplitField - tags: [parser, split, log, record] - - name: SplitText - description: This is a processor that is used to split a String into fields according to a given Record mapping - category: parsing - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.SplitText - tags: [parser, regex, log, record] - - name: SplitTextMultiline - description: No description provided. - category: parsing - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.SplitTextMultiline - - name: SplitTextWithProperties - description: This is a processor that is used to split a String into fields according to a given Record mapping - category: parsing - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.SplitTextWithProperties - tags: [parser, regex, log, record] - - name: ComputeAggsProcessor - description: Enable to compute some common aggregations on all records or on array fields of records - category: misc - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.ComputeAggsProcessor - tags: [record, fields, agg, aggregation, metric, stat] - - name: ConvertFieldsType - description: Converts a field value into the given type. does nothing if conversion is not possible - category: misc - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.ConvertFieldsType - tags: [type, fields, update, convert] - - name: ConvertSimpleDateFormatFields - description: Convert one or more field representing a date into a Unix Epoch Time (time in milliseconds since &st January 1970, 00:00:00 GMT)... - category: misc - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.ConvertSimpleDateFormatFields - tags: [record, fields, add, date, conversion, convert] - - name: DecodeBase64 - description: Decodes fields to base64. The fields should be of type string - category: misc - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.DecodeBase64 - tags: [decode, base64] - - name: EncodeBase64 - description: Encodes fields to base64. The fields should be of type array of bytes - category: misc - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.EncodeBase64 - tags: [encode, base64] - - name: EncryptField - description: This is a processor that is used to encrypt or decrypt one or many fields of any type of a given Record mapping - category: misc - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.EncryptField - - name: FilterRecords - description: Keep only records based on a given field value or/and based on custom methods returning a boolean (or something that can be casted into a boolean). - category: misc - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.FilterRecords - tags: [record, fields, remove, delete] - - name: MergeRecordProcessor - description: Merge contents of several records into less records. - category: misc - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.MergeRecordProcessor - tags: [record, fields, merge, content, reduce] - - name: ParseGitlabLog - description: The Gitlab logs processor is the Logisland entry point to get and process `Gitlab `_ logs. This allows for instance to monitor activities in your Gitlab server. The expected input of this processor are records from the production_json.log log file of Gitlab which contains JSON records. You can for instance use the `kafkacat `_ command to inject those logs into kafka and thus Logisland. - category: misc - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.parser.ParseGitlabLog - tags: [logs, gitlab] - - name: RemoveFields - description: Removes a list of fields defined by a comma separated list of field names or keeps only fields defined by a comma separated list of field names. - category: misc - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.RemoveFields - tags: [record, fields, remove, delete, keep] - - name: SendMail + WebSession information are: + - first and last visited page + - first and last timestamp of processed event + - total number of processed events + - the userId + - a boolean denoting if the web-session is still active or not + - an integer denoting the duration of the web-sessions + - optional fields that may be retrieved from the processed events + category: analytics + module: com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + class: com.hurence.logisland.processor.webanalytics.CalculWebSession + tags: [analytics, web, session] + - name: IncrementalWebSession description: > - The SendMail processor is aimed at sending an email (like for instance an alert email) from an incoming record. There are three ways an incoming record can generate an email according to the special fields it must embed. Here is a list of the record fields that generate a mail and how they work: - - - **mail_text**: this is the simplest way for generating a mail. If present, this field means to use its content (value) as the payload of the mail to send. The mail is sent in text format if there is only this special field in the record. Otherwise, used with either mail_html or mail_use_template, the content of mail_text is the aletrnative text to the HTML mail that is generated. - - - **mail_html**: this field specifies that the mail should be sent as HTML and the value of the field is mail payload. If mail_text is also present, its value is used as the alternative text for the mail. mail_html cannot be used with mail_use_template: only one of those two fields should be present in the record. + This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: - - **mail_use_template**: If present, this field specifies that the mail should be sent as HTML and the HTML content is to be generated from the template in the processor configuration key **html.template**. The template can contain parameters which must also be present in the record as fields. See documentation of html.template for further explanations. mail_use_template cannot be used with mail_html: only one of those two fields should be present in the record. + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. - If **allow_overwrite** configuration key is true, any mail.* (dot format) configuration key may be overwritten with a matching field in the record of the form mail_* (underscore format). For instance if allow_overwrite is true and mail.to is set to config_address@domain.com, a record generating a mail with a mail_to field set to record_address@domain.com will send a mail to record_address@domain.com. + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. - Apart from error records (when he is unable to process the incoming record or to send the mail), this processor is not expected to produce any output records. - category: misc - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.SendMail - tags: [smtp, email, e-mail, mail, mailer, sendmail, message, alert, html] - - name: SetJsonAsFields - description: The SetJsonAsFields processor reads the content of a string field containing a json string and sets each json attribute as a field of the current record. Note that this could be achieved with the EvaluateJsonPath processor, but this implies to declare each json first level attribute in the configuration and also to know by advance every one of them. Whereas for this simple case, the SetJsonAsFields processor does not require such a configuration and will work with any incoming json, regardless of the list of first level attributes. - category: misc - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.SetJsonAsFields - tags: [json] - - name: SplitRecord - description: This processor is used to create a new set of records from one record. - category: misc - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.SplitRecord - - name: CheckAlerts - description: Add one or more records representing alerts. Using a datastore. - category: alerting - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.alerting.CheckAlerts - tags: [record, alerting, thresholds, opc, tag] - - name: CheckThresholds - description: > - Compute threshold cross from given formulas. - - - each dynamic property will return a new record according to the formula definition - - the record name will be set to the property name - - the record time will be set to the current timestamp - category: alerting - module: com.hurence.logisland:logisland-processor-common:1.3.0 - class: com.hurence.logisland.processor.alerting.CheckThresholds - tags: [record, threshold, tag, alerting] - - name: ParseUserAgent - description: The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. - category: enrichment - module: com.hurence.logisland:logisland-processor-useragent:1.3.0 - class: com.hurence.logisland.processor.useragent.ParseUserAgent - tags: [User-Agent, clickstream, DMP] - - name: IncrementalWebSession + WebSession information are: + - first and last visited page + - first and last timestamp of processed event + - total number of processed events + - the userId + - a boolean denoting if the web-session is still active or not + - an integer denoting the duration of the web-sessions + - optional fields that may be retrieved from the processed events + category: analytics + module: com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + class: com.hurence.logisland.processor.webanalytics.IncrementalWebSession + tags: [analytics, web, session] + - name: IncrementalWebSessionOld description: > This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. Firstly, web-events are grouped by their session identifier and processed in chronological order. @@ -303,8 +98,8 @@ extensions: - an integer denoting the duration of the web-sessions - optional fields that may be retrieved from the processed events category: analytics - module: com.hurence.logisland:logisland-processor-web-analytics:1.3.0 - class: com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + module: com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + class: com.hurence.logisland.processor.webanalytics.IncrementalWebSessionOld tags: [analytics, web, session] - name: SetSourceOfTraffic description: > @@ -314,43 +109,37 @@ extensions: To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) , the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). - By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property + By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. category: analytics - module: com.hurence.logisland:logisland-processor-web-analytics:1.3.0 - class: com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + module: com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + class: com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic tags: [session, traffic, source, web, analytics] - name: IpToFqdn description: Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. category: enrichment - module: com.hurence.logisland:logisland-processor-enrichment:1.3.0 + module: com.hurence.logisland:logisland-processor-enrichment:1.4.0 class: com.hurence.logisland.processor.enrichment.IpToFqdn tags: [dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich] - name: IpToGeo description: Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. category: enrichment - module: com.hurence.logisland:logisland-processor-enrichment:1.3.0 + module: com.hurence.logisland:logisland-processor-enrichment:1.4.0 class: com.hurence.logisland.processor.enrichment.IpToGeo tags: [geo, enrich, ip] - name: ParseNetworkPacket description: The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. category: security - module: com.hurence.logisland:logisland-processor-cyber-security:1.3.0 + module: com.hurence.logisland:logisland-processor-cyber-security:1.4.0 class: com.hurence.logisland.processor.networkpacket.ParseNetworkPacket tags: [PCap, security, IDS, NIDS] - name: BulkAddElasticsearch description: Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor category: datastore - module: com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 + module: com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 class: com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch tags: [elasticsearch] - - name: FetchHBaseRow - description: Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. - category: datastore - module: com.hurence.logisland:logisland-processor-hbase:1.3.0 - class: com.hurence.logisland.processor.hbase.FetchHBaseRow - tags: [hbase, scan, fetch, get, enrich] - name: MultiGetElasticsearch description: > Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. @@ -372,19 +161,13 @@ extensions: * field name : the retrieved field name * field value : the retrieved field value category: datastore - module: com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 + module: com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 class: com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch tags: [elasticsearch] - - name: PutHBaseCell - description: Adds the Contents of a Record to HBase as the value of a single cell - category: datastore - module: com.hurence.logisland:logisland-processor-hbase:1.3.0 - class: com.hurence.logisland.processor.hbase.PutHBaseCell - tags: [hadoop, hbase] - name: EvaluateXPath description: Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. category: parsing - module: com.hurence.logisland:logisland-processor-xml:1.3.0 + module: com.hurence.logisland:logisland-processor-xml:1.4.0 class: com.hurence.logisland.processor.xml.EvaluateXPath tags: [XML, evaluate, XPath] - name: ConsolidateSession @@ -393,8 +176,8 @@ extensions: "fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) category: misc - module: com.hurence.logisland:logisland-processor-web-analytics:1.3.0 - class: com.hurence.logisland.processor.webAnalytics.ConsolidateSession + module: com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + class: com.hurence.logisland.processor.webanalytics.ConsolidateSession tags: [analytics, web, session] - name: DetectOutliers description: > @@ -415,7 +198,7 @@ extensions: This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. category: misc - module: com.hurence.logisland:logisland-processor-outlier-detection:1.3.0 + module: com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 class: com.hurence.logisland.processor.DetectOutliers tags: [analytic, outlier, record, iot, timeseries] - name: EnrichRecordsElasticsearch @@ -424,13 +207,13 @@ extensions: Each incoming record must be possibly enriched with information stored in elasticsearch. Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. category: misc - module: com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 + module: com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 class: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch tags: [elasticsearch] - name: ExcelExtract description: Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. category: misc - module: com.hurence.logisland:logisland-processor-excel:1.3.0 + module: com.hurence.logisland:logisland-processor-excel:1.4.0 class: com.hurence.logisland.processor.excel.ExcelExtract tags: [excel, processor, poi] - name: MatchIP @@ -455,7 +238,7 @@ extensions: don't forget to set numeric fields property to handle correctly numeric ranges queries category: misc - module: com.hurence.logisland:logisland-processor-querymatcher:1.3.0 + module: com.hurence.logisland:logisland-processor-querymatcher:1.4.0 class: com.hurence.logisland.processor.MatchIP tags: [analytic, percolator, record, record, query, lucene] - name: MatchQuery @@ -480,7 +263,7 @@ extensions: don't forget to set numeric fields property to handle correctly numeric ranges queries category: misc - module: com.hurence.logisland:logisland-processor-querymatcher:1.3.0 + module: com.hurence.logisland:logisland-processor-querymatcher:1.4.0 class: com.hurence.logisland.processor.MatchQuery tags: [analytic, percolator, record, record, query, lucene] - name: ParseBroEvent @@ -577,7 +360,7 @@ extensions: "ts": 1487596886.953917 category: misc - module: com.hurence.logisland:logisland-processor-cyber-security:1.3.0 + module: com.hurence.logisland:logisland-processor-cyber-security:1.4.0 class: com.hurence.logisland.processor.bro.ParseBroEvent tags: [bro, security, IDS, NIDS] - name: ParseNetflowEvent @@ -592,7 +375,7 @@ extensions: Netflow are sent to kafka in order to be processed by logisland. In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. category: misc - module: com.hurence.logisland:logisland-processor-cyber-security:1.3.0 + module: com.hurence.logisland:logisland-processor-cyber-security:1.4.0 class: com.hurence.logisland.processor.netflow.ParseNetflowEvent tags: [netflow, security] - name: RunPython @@ -603,86 +386,101 @@ extensions: This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. category: misc - module: com.hurence.logisland:logisland-processor-scripting:1.3.0 + module: com.hurence.logisland:logisland-processor-scripting:1.4.0 class: com.hurence.logisland.processor.scripting.python.RunPython tags: [scripting, python] + - name: URIDecoder + description: > + Decode one or more field containing an URI with possibly special chars encoded + ... + category: misc + module: com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + class: com.hurence.logisland.processor.webanalytics.URIDecoder + tags: [record, fields, Decode] + - name: URLCleaner + description: > + Remove some or all query parameters from one or more field containing an uri which should be preferably encoded. + If the uri is not encoded the behaviour is not defined in case the decoded uri contains '#', '?', '=', '&' which were encoded. + Indeed this processor assumes that the start of query part of the uri start at the first '?' then end at the first '#' or at the end of the uri as + specified by rfc3986 available at https://tools.ietf.org/html/rfc3986#section-3.4. + We assume as well that key value pairs are separed by '=', and are separed by '&': exemple 'param1=value1¶m2=value2'. + The processor can remove also parameters that have only a name and no value. The character used to separate the key and the value '=' is configurable. + The character used to separate two parameters '&' is also configurable. + category: misc + module: com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + class: com.hurence.logisland.processor.webanalytics.URLCleaner + tags: [record, fields, url, params, param, remove, keep, query, uri, parameter, clean, decoded, raw] - name: URLDecoder description: > Decode one or more field containing an URL with possibly special chars encoded ... category: misc - module: com.hurence.logisland:logisland-processor-web-analytics:1.3.0 - class: com.hurence.logisland.processor.webAnalytics.URLDecoder + module: com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + class: com.hurence.logisland.processor.webanalytics.URLDecoder tags: [record, fields, Decode] - name: MaxmindIpToGeoService description: Implementation of the IP 2 GEO Service using maxmind lite db file category: enrichment - module: com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.3.0 + module: com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 class: com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService tags: [ip, service, geo, maxmind] - name: CSVKeyValueCacheService description: A cache that store csv lines as records loaded from a file category: datastore - module: com.hurence.logisland:logisland-service-inmemory-cache:1.3.0 + module: com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 class: com.hurence.logisland.service.cache.CSVKeyValueCacheService tags: [csv, service, cache] - name: CassandraControllerService description: Provides a controller service that for the moment only allows to bulkput records into cassandra. category: datastore - module: com.hurence.logisland:logisland-service-cassandra-client:1.3.0 + module: com.hurence.logisland:logisland-service-cassandra-client:1.4.0 class: com.hurence.logisland.service.cassandra.CassandraControllerService tags: [cassandra, service] - name: Elasticsearch_6_6_2_ClientService description: Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. category: datastore - module: com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.3.0 + module: com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 class: com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService tags: [elasticsearch, client] - - name: HBase_1_1_2_ClientService - description: Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. - category: datastore - module: com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.3.0 - class: com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService - tags: [hbase, client] - name: InfluxDBControllerService description: Provides a controller service that for the moment only allows to bulkput records into influxdb. category: datastore - module: com.hurence.logisland:logisland-service-influxdb-client:1.3.0 + module: com.hurence.logisland:logisland-service-influxdb-client:1.4.0 class: com.hurence.logisland.service.influxdb.InfluxDBControllerService tags: [influxdb, service, time series] - name: LRUKeyValueCacheService description: A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap category: datastore - module: com.hurence.logisland:logisland-service-inmemory-cache:1.3.0 + module: com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 class: com.hurence.logisland.service.cache.LRUKeyValueCacheService tags: [cache, service, key, value, pair, LRU] - name: MongoDBControllerService description: Provides a controller service that wraps most of the functionality of the MongoDB driver. category: datastore - module: com.hurence.logisland:logisland-service-mongodb-client:1.3.0 + module: com.hurence.logisland:logisland-service-mongodb-client:1.4.0 class: com.hurence.logisland.service.mongodb.MongoDBControllerService tags: [mongo, mongodb, service] - name: RedisKeyValueCacheService description: A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap category: datastore - module: com.hurence.logisland:logisland-service-redis:1.3.0 + module: com.hurence.logisland:logisland-service-redis:1.4.0 class: com.hurence.logisland.redis.service.RedisKeyValueCacheService tags: [cache, service, key, value, pair, redis] - name: Solr_6_6_2_ClientService description: Implementation of ElasticsearchClientService for Solr 5.5.5. category: datastore - module: com.hurence.logisland:logisland-service-solr_6_6_2-client:1.3.0 + module: com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 class: com.hurence.logisland.service.solr.Solr_6_6_2_ClientService tags: [solr, client] - name: Elasticsearch_7_x_ClientService description: Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. category: misc - module: com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.3.0 + module: com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 class: com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService tags: [elasticsearch, client] - name: Solr8ClientService description: Implementation of SolrClientService for Solr 8 category: misc - module: com.hurence.logisland:logisland-service-solr_8-client:1.3.0 + module: com.hurence.logisland:logisland-service-solr_8-client:1.4.0 class: com.hurence.logisland.service.solr.Solr8ClientService tags: [solr, client] diff --git a/logisland-documentation/user/components/other-processors.rst b/logisland-documentation/user/components/other-processors.rst index d30d54830..500d4e31b 100644 --- a/logisland-documentation/user/components/other-processors.rst +++ b/logisland-documentation/user/components/other-processors.rst @@ -17,7 +17,7 @@ The user-agent processor allows to decompose User-Agent value from an HTTP heade Module ______ -com.hurence.logisland:logisland-processor-useragent:1.3.0 +com.hurence.logisland:logisland-processor-useragent:1.4.0 Class _____ @@ -58,7 +58,7 @@ Indexes the content of a Record in Elasticsearch using elasticsearch's bulk proc Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -99,7 +99,7 @@ The ConsolidateSession processor is the Logisland entry point to get and process Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ @@ -162,7 +162,7 @@ This becomes a data filter which can be attached to a timeseries data stream wit Module ______ -com.hurence.logisland:logisland-processor-outlier-detection:1.3.0 +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 Class _____ @@ -226,7 +226,7 @@ Each outcoming record holds at least the input record plus potentially one or mo Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -265,7 +265,7 @@ Evaluates one or more XPaths against the content of a record. The results of tho Module ______ -com.hurence.logisland:logisland-processor-xml:1.3.0 +com.hurence.logisland:logisland-processor-xml:1.4.0 Class _____ @@ -312,7 +312,7 @@ Consumes a Microsoft Excel document and converts each worksheet's line to a stru Module ______ -com.hurence.logisland:logisland-processor-excel:1.3.0 +com.hurence.logisland:logisland-processor-excel:1.4.0 Class _____ @@ -351,7 +351,7 @@ Fetches a row from an HBase table. The Destination property controls whether the Module ______ -com.hurence.logisland:logisland-processor-hbase:1.3.0 +com.hurence.logisland:logisland-processor-hbase:1.4.0 Class _____ @@ -415,7 +415,7 @@ WebSession information are: Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ @@ -472,7 +472,7 @@ Translates an IP address into a FQDN (Fully Qualified Domain Name). An input fie Module ______ -com.hurence.logisland:logisland-processor-enrichment:1.3.0 +com.hurence.logisland:logisland-processor-enrichment:1.4.0 Class _____ @@ -512,7 +512,7 @@ Looks up geolocation information for an IP address. The attribute that contains Module ______ -com.hurence.logisland:logisland-processor-enrichment:1.3.0 +com.hurence.logisland:logisland-processor-enrichment:1.4.0 Class _____ @@ -571,7 +571,7 @@ Please read the `Lucene syntax guide will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst + +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.3.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.3.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.3.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.3.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.3.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.3.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.3.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.3.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.3.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.3.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.3.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.3.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.3.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.3.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.3.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.3.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.3.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.3.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webAnalytics.IncrementalWebSession`_ + +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webAnalytics.IncrementalWebSession`_ + +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webAnalytics.IncrementalWebSession`_ + +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.prefix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webAnalytics.IncrementalWebSession`_ + +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.prefix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webAnalytics.IncrementalWebSession`_ + +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.prefix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webAnalytics.IncrementalWebSession`_ + +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.prefix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webAnalytics.IncrementalWebSession`_ + +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.prefix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webAnalytics.IncrementalWebSession`_ + +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.prefix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webAnalytics.IncrementalWebSession`_ + +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.prefix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webAnalytics.IncrementalWebSession`_ + +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.prefix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webAnalytics.IncrementalWebSession`_ + +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.prefix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webAnalytics.IncrementalWebSession`_ + +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webAnalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webAnalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "fields to decode", "a default value", "Decode one or more fields from the record ", "", "null", false + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + "number.of.future.session.when.event.from.past", "The number of session it will look for when searching session of last events", "", "1", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.prefix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webanalytics.IncrementalWebSession`_ + +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URIDecoder: + +URIDecoder +---------- +Decode one or more field containing an URI with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URIDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLCleaner: + +URLCleaner +---------- +Remove some or all query parameters from one or more field containing an uri which should be preferably encoded. +If the uri is not encoded the behaviour is not defined in case the decoded uri contains '#', '?', '=', '&' which were encoded. +Indeed this processor assumes that the start of query part of the uri start at the first '?' then end at the first '#' or at the end of the uri as +specified by rfc3986 available at https://tools.ietf.org/html/rfc3986#section-3.4. +We assume as well that key value pairs are separed by '=', and are separed by '&': exemple 'param1=value1¶m2=value2'. +The processor can remove also parameters that have only a name and no value. The character used to separate the key and the value '=' is configurable. +The character used to separate two parameters '&' is also configurable. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLCleaner + +Tags +____ +record, fields, url, params, param, remove, keep, query, uri, parameter, clean, decoded, raw + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**url.fields**", "List of fields (URL) to decode and optionnaly the output field for the url modified. Syntax should be ,,...,. So fields name can not contain ',' nor ':'", "", "null", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + "url.keep.params", "List of param names to keep in the input url (others will be removed). Can not be given at the same time as url.remove.params or url.remove.all", "", "null", "false", "false" + "url.remove.params", "List of param names to remove from the input url (others will be kept). Can not be given at the same time as url.keep.params or url.remove.all", "", "null", "false", "false" + "url.remove.all", "Remove all params if true.", "", "null", "false", "false" + "parameter.separator", "the character to use to separate the parameters in the query part of the uris", "", "&", "false", "false" + "key.value.separator", "the character to use to separate the parameter name from the parameter value in the query part of the uris", "", "=", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + "number.of.future.session.when.event.from.past", "The number of session it will look for when searching session of last events", "", "1", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.prefix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webanalytics.IncrementalWebSession`_ + +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URIDecoder: + +URIDecoder +---------- +Decode one or more field containing an URI with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URIDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLCleaner: + +URLCleaner +---------- +Remove some or all query parameters from one or more field containing an uri which should be preferably encoded. +If the uri is not encoded the behaviour is not defined in case the decoded uri contains '#', '?', '=', '&' which were encoded. +Indeed this processor assumes that the start of query part of the uri start at the first '?' then end at the first '#' or at the end of the uri as +specified by rfc3986 available at https://tools.ietf.org/html/rfc3986#section-3.4. +We assume as well that key value pairs are separed by '=', and are separed by '&': exemple 'param1=value1¶m2=value2'. +The processor can remove also parameters that have only a name and no value. The character used to separate the key and the value '=' is configurable. +The character used to separate two parameters '&' is also configurable. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLCleaner + +Tags +____ +record, fields, url, params, param, remove, keep, query, uri, parameter, clean, decoded, raw + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**url.fields**", "List of fields (URL) to decode and optionnaly the output field for the url modified. Syntax should be ,,...,. So fields name can not contain ',' nor ':'", "", "null", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + "url.keep.params", "List of param names to keep in the input url (others will be removed). Can not be given at the same time as url.remove.params or url.remove.all", "", "null", "false", "false" + "url.remove.params", "List of param names to remove from the input url (others will be kept). Can not be given at the same time as url.keep.params or url.remove.all", "", "null", "false", "false" + "url.remove.all", "Remove all params if true.", "", "null", "false", "false" + "parameter.separator", "the character to use to separate the parameters in the query part of the uris", "", "&", "false", "false" + "key.value.separator", "the character to use to separate the parameter name from the parameter value in the query part of the uris", "", "=", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + "number.of.future.session.when.event.from.past", "The number of session it will look for when searching session of last events", "", "1", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.prefix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webanalytics.IncrementalWebSession`_ + +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URIDecoder: + +URIDecoder +---------- +Decode one or more field containing an URI with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URIDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLCleaner: + +URLCleaner +---------- +Remove some or all query parameters from one or more field containing an uri which should be preferably encoded. +If the uri is not encoded the behaviour is not defined in case the decoded uri contains '#', '?', '=', '&' which were encoded. +Indeed this processor assumes that the start of query part of the uri start at the first '?' then end at the first '#' or at the end of the uri as +specified by rfc3986 available at https://tools.ietf.org/html/rfc3986#section-3.4. +We assume as well that key value pairs are separed by '=', and are separed by '&': exemple 'param1=value1¶m2=value2'. +The processor can remove also parameters that have only a name and no value. The character used to separate the key and the value '=' is configurable. +The character used to separate two parameters '&' is also configurable. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLCleaner + +Tags +____ +record, fields, url, params, param, remove, keep, query, uri, parameter, clean, decoded, raw + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**url.fields**", "List of fields (URL) to decode and optionnaly the output field for the url modified. Syntax should be ,,...,. So fields name can not contain ',' nor ':'", "", "null", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + "url.keep.params", "List of param names to keep in the input url (others will be removed). Can not be given at the same time as url.remove.params or url.remove.all", "", "null", "false", "false" + "url.remove.params", "List of param names to remove from the input url (others will be kept). Can not be given at the same time as url.keep.params or url.remove.all", "", "null", "false", "false" + "url.remove.all", "Remove all params if true.", "", "null", "false", "false" + "parameter.separator", "the character to use to separate the parameters in the query part of the uris", "", "&", "false", "false" + "key.value.separator", "the character to use to separate the parameter name from the parameter value in the query part of the uris", "", "=", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + "number.of.future.session.when.event.from.past", "The number of session it will look for when searching session of last events", "", "1", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.prefix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webanalytics.IncrementalWebSession`_ + +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URIDecoder: + +URIDecoder +---------- +Decode one or more field containing an URI with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URIDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLCleaner: + +URLCleaner +---------- +Remove some or all query parameters from one or more field containing an uri which should be preferably encoded. +If the uri is not encoded the behaviour is not defined in case the decoded uri contains '#', '?', '=', '&' which were encoded. +Indeed this processor assumes that the start of query part of the uri start at the first '?' then end at the first '#' or at the end of the uri as +specified by rfc3986 available at https://tools.ietf.org/html/rfc3986#section-3.4. +We assume as well that key value pairs are separed by '=', and are separed by '&': exemple 'param1=value1¶m2=value2'. +The processor can remove also parameters that have only a name and no value. The character used to separate the key and the value '=' is configurable. +The character used to separate two parameters '&' is also configurable. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLCleaner + +Tags +____ +record, fields, url, params, param, remove, keep, query, uri, parameter, clean, decoded, raw + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**url.fields**", "List of fields (URL) to decode and optionnaly the output field for the url modified. Syntax should be ,,...,. So fields name can not contain ',' nor ':'", "", "null", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + "url.keep.params", "List of param names to keep in the input url (others will be removed). Can not be given at the same time as url.remove.params or url.remove.all", "", "null", "false", "false" + "url.remove.params", "List of param names to remove from the input url (others will be kept). Can not be given at the same time as url.keep.params or url.remove.all", "", "null", "false", "false" + "url.remove.all", "Remove all params if true.", "", "null", "false", "false" + "parameter.separator", "the character to use to separate the parameters in the query part of the uris", "", "&", "false", "false" + "key.value.separator", "the character to use to separate the parameter name from the parameter value in the query part of the uris", "", "=", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + "number.of.future.session.when.event.from.past", "The number of session it will look for when searching session of last events", "", "1", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.prefix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webanalytics.IncrementalWebSession`_ + +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URIDecoder: + +URIDecoder +---------- +Decode one or more field containing an URI with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URIDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLCleaner: + +URLCleaner +---------- +Remove some or all query parameters from one or more field containing an uri which should be preferably encoded. +If the uri is not encoded the behaviour is not defined in case the decoded uri contains '#', '?', '=', '&' which were encoded. +Indeed this processor assumes that the start of query part of the uri start at the first '?' then end at the first '#' or at the end of the uri as +specified by rfc3986 available at https://tools.ietf.org/html/rfc3986#section-3.4. +We assume as well that key value pairs are separed by '=', and are separed by '&': exemple 'param1=value1¶m2=value2'. +The processor can remove also parameters that have only a name and no value. The character used to separate the key and the value '=' is configurable. +The character used to separate two parameters '&' is also configurable. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLCleaner + +Tags +____ +record, fields, url, params, param, remove, keep, query, uri, parameter, clean, decoded, raw + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**url.fields**", "List of fields (URL) to decode and optionnaly the output field for the url modified. Syntax should be ,,...,. So fields name can not contain ',' nor ':'", "", "null", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + "url.keep.params", "List of param names to keep in the input url (others will be removed). Can not be given at the same time as url.remove.params or url.remove.all", "", "null", "false", "false" + "url.remove.params", "List of param names to remove from the input url (others will be kept). Can not be given at the same time as url.keep.params or url.remove.all", "", "null", "false", "false" + "url.remove.all", "Remove all params if true.", "", "null", "false", "false" + "parameter.separator", "the character to use to separate the parameters in the query part of the uris", "", "&", "false", "false" + "key.value.separator", "the character to use to separate the parameter name from the parameter value in the query part of the uris", "", "=", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + "number.of.future.session.when.event.from.past", "The number of session it will look for when searching session of last events", "", "1", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.prefix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webanalytics.IncrementalWebSession`_ + +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URIDecoder: + +URIDecoder +---------- +Decode one or more field containing an URI with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URIDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLCleaner: + +URLCleaner +---------- +Remove some or all query parameters from one or more field containing an uri which should be preferably encoded. +If the uri is not encoded the behaviour is not defined in case the decoded uri contains '#', '?', '=', '&' which were encoded. +Indeed this processor assumes that the start of query part of the uri start at the first '?' then end at the first '#' or at the end of the uri as +specified by rfc3986 available at https://tools.ietf.org/html/rfc3986#section-3.4. +We assume as well that key value pairs are separed by '=', and are separed by '&': exemple 'param1=value1¶m2=value2'. +The processor can remove also parameters that have only a name and no value. The character used to separate the key and the value '=' is configurable. +The character used to separate two parameters '&' is also configurable. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLCleaner + +Tags +____ +record, fields, url, params, param, remove, keep, query, uri, parameter, clean, decoded, raw + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**url.fields**", "List of fields (URL) to decode and optionnaly the output field for the url modified. Syntax should be ,,...,. So fields name can not contain ',' nor ':'", "", "null", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + "url.keep.params", "List of param names to keep in the input url (others will be removed). Can not be given at the same time as url.remove.params or url.remove.all", "", "null", "false", "false" + "url.remove.params", "List of param names to remove from the input url (others will be kept). Can not be given at the same time as url.keep.params or url.remove.all", "", "null", "false", "false" + "url.remove.all", "Remove all params if true.", "", "null", "false", "false" + "parameter.separator", "the character to use to separate the parameters in the query part of the uris", "", "&", "false", "false" + "key.value.separator", "the character to use to separate the parameter name from the parameter value in the query part of the uris", "", "=", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + "number.of.future.session.when.event.from.past", "The number of session it will look for when searching session of last events", "", "1", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.prefix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webanalytics.IncrementalWebSession`_ + +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URIDecoder: + +URIDecoder +---------- +Decode one or more field containing an URI with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URIDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLCleaner: + +URLCleaner +---------- +Remove some or all query parameters from one or more field containing an uri which should be preferably encoded. +If the uri is not encoded the behaviour is not defined in case the decoded uri contains '#', '?', '=', '&' which were encoded. +Indeed this processor assumes that the start of query part of the uri start at the first '?' then end at the first '#' or at the end of the uri as +specified by rfc3986 available at https://tools.ietf.org/html/rfc3986#section-3.4. +We assume as well that key value pairs are separed by '=', and are separed by '&': exemple 'param1=value1¶m2=value2'. +The processor can remove also parameters that have only a name and no value. The character used to separate the key and the value '=' is configurable. +The character used to separate two parameters '&' is also configurable. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLCleaner + +Tags +____ +record, fields, url, params, param, remove, keep, query, uri, parameter, clean, decoded, raw + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**url.fields**", "List of fields (URL) to decode and optionnaly the output field for the url modified. Syntax should be ,,...,. So fields name can not contain ',' nor ':'", "", "null", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + "url.keep.params", "List of param names to keep in the input url (others will be removed). Can not be given at the same time as url.remove.params or url.remove.all", "", "null", "false", "false" + "url.remove.params", "List of param names to remove from the input url (others will be kept). Can not be given at the same time as url.keep.params or url.remove.all", "", "null", "false", "false" + "url.remove.all", "Remove all params if true.", "", "null", "false", "false" + "parameter.separator", "the character to use to separate the parameters in the query part of the uris", "", "&", "false", "false" + "key.value.separator", "the character to use to separate the parameter name from the parameter value in the query part of the uris", "", "=", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 + +Class +_____ +com.hurence.logisland.processor.useragent.ParseUserAgent + +Tags +____ +User-Agent, clickstream, DMP + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "cache.enabled", "Enable caching. Caching to avoid to redo the same computation for many identical User-Agent strings.", "", "true", "false", "false" + "cache.size", "Set the size of the cache.", "", "1000", "false", "false" + "**useragent.field**", "Must contain the name of the field that contains the User-Agent value in the incoming record.", "", "null", "false", "false" + "useragent.keep", "Defines if the field that contained the User-Agent must be kept or not in the resulting records.", "", "true", "false", "false" + "confidence.enabled", "Enable confidence reporting. Each field will report a confidence attribute with a value comprised between 0 and 10000.", "", "false", "false", "false" + "ambiguity.enabled", "Enable ambiguity reporting. Reports a count of ambiguities.", "", "false", "false", "false" + "fields", "Defines the fields to be returned.", "", "DeviceClass, DeviceName, DeviceBrand, DeviceCpu, DeviceFirmwareVersion, DeviceVersion, OperatingSystemClass, OperatingSystemName, OperatingSystemVersion, OperatingSystemNameVersion, OperatingSystemVersionBuild, LayoutEngineClass, LayoutEngineName, LayoutEngineVersion, LayoutEngineVersionMajor, LayoutEngineNameVersion, LayoutEngineNameVersionMajor, LayoutEngineBuild, AgentClass, AgentName, AgentVersion, AgentVersionMajor, AgentNameVersion, AgentNameVersionMajor, AgentBuild, AgentLanguage, AgentLanguageCode, AgentInformationEmail, AgentInformationUrl, AgentSecurity, AgentUuid, FacebookCarrier, FacebookDeviceClass, FacebookDeviceName, FacebookDeviceVersion, FacebookFBOP, FacebookFBSS, FacebookOperatingSystemName, FacebookOperatingSystemVersion, Anonymized, HackerAttackVector, HackerToolkit, KoboAffiliate, KoboPlatformId, IECompatibilityVersion, IECompatibilityVersionMajor, IECompatibilityNameVersion, IECompatibilityNameVersionMajor, __SyntaxError__, Carrier, GSAInstallationID, WebviewAppName, WebviewAppNameVersionMajor, WebviewAppVersion, WebviewAppVersionMajor", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseUserAgent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.CalculWebSession: + +CalculWebSession +---------------- +This processor creates web-sessions based on incoming web-events. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.CalculWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + "number.of.future.session.when.event.from.past", "The number of session it will look for when searching session of last events", "", "1", "false", "false" + +Extra informations +__________________ +.. include:: ./details/CalculWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.IncrementalWebSession: + +IncrementalWebSession +--------------------- +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + "number.of.future.session.when.event.from.past", "The number of session it will look for when searching session of last events", "", "1", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic: + +SetSourceOfTraffic +------------------ +Compute the source of traffic of a web session. Users arrive at a website or application through a variety of sources, +including advertising/paying campaigns, search engines, social networks, referring sites or direct access. +When analysing user experience on a webshop, it is crucial to collect, process, and report the campaign and traffic-source data. +To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available +i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) +, the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property +with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an +Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic + +Tags +____ +session, traffic, source, web, analytics + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "referer.field", "Name of the field containing the referer value in the session", "", "referer", "false", "false" + "first.visited.page.field", "Name of the field containing the first visited page in the session", "", "firstVisitedPage", "false", "false" + "utm_source.field", "Name of the field containing the utm_source value in the session", "", "utm_source", "false", "false" + "utm_medium.field", "Name of the field containing the utm_medium value in the session", "", "utm_medium", "false", "false" + "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" + "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" + "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" + "source_of_traffic.prefix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" + "cache.validity.timeout", "Timeout validity (in seconds) of an entry in the cache.", "", "0", "false", "false" + "debug", "If true, an additional debug field is added. If the source info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the source fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + "**es.index**", "Name of the ES index containing the list of search engines and social network. ", "", "null", "false", "false" + "es.type", "Name of the ES type to use.", "", "default", "false", "false" + "es.search_engine.field", "Name of the ES field used to specify that the domain is a search engine.", "", "search_engine", "false", "false" + "es.social_network.field", "Name of the ES field used to specify that the domain is a social network.", "", "social_network", "false", "false" + +Extra informations +__________________ +.. include:: ./details/SetSourceOfTraffic-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToFqdn: + +IpToFqdn +-------- +Translates an IP address into a FQDN (Fully Qualified Domain Name). An input field from the record has the IP as value. An new field is created and its value is the FQDN matching the IP address. The resolution mechanism is based on the underlying operating system. The resolution request may take some time, specially if the IP address cannot be translated into a FQDN. For these reasons this processor relies on the logisland cache service so that once a resolution occurs or not, the result is put into the cache. That way, the real request for the same IP is not re-triggered during a certain period of time, until the cache entry expires. This timeout is configurable but by default a request for the same IP is not triggered before 24 hours to let the time to the underlying DNS system to be potentially updated. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToFqdn + +Tags +____ +dns, ip, fqdn, domain, address, fqhn, reverse, resolution, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**fqdn.field**", "The field that will contain the full qualified domain name corresponding to the ip address.", "", "null", "false", "false" + "overwrite.fqdn.field", "If the field should be overwritten when it already exists.", "", "false", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "cache.max.time", "The amount of time, in seconds, for which a cached FQDN value is valid in the cache service. After this delay, the next new request to translate the same IP into FQDN will trigger a new reverse DNS request and the result will overwrite the entry in the cache. This allows two things: if the IP was not resolved into a FQDN, this will get a chance to obtain a FQDN if the DNS system has been updated, if the IP is resolved into a FQDN, this will allow to be more accurate if the DNS system has been updated. A value of 0 seconds disables this expiration mechanism. The default value is 84600 seconds, which corresponds to new requests triggered every day if a record with the same IP passes every day in the processor.", "", "84600", "false", "false" + "resolution.timeout", "The amount of time, in milliseconds, to wait at most for the resolution to occur. This avoids to block the stream for too much time. Default value is 1000ms. If the delay expires and no resolution could occur before, the FQDN field is not created. A special value of 0 disables the logisland timeout and the resolution request may last for many seconds if the IP cannot be translated into a FQDN by the underlying operating system. In any case, whether the timeout occurs in logisland of in the operating system, the fact that a timeout occurs is kept in the cache system so that a resolution request for the same IP will not occur before the cache entry expires.", "", "1000", "false", "false" + "debug", "If true, some additional debug fields are added. If the FQDN field is named X, a debug field named X_os_resolution_time_ms contains the resolution time in ms (using the operating system, not the cache). This field is added whether the resolution occurs or time is out. A debug field named X_os_resolution_timeout contains a boolean value to indicate if the timeout occurred. Finally, a debug field named X_from_cache contains a boolean value to indicate the origin of the FQDN field. The default value for this property is false (debug is disabled.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToFqdn-Detail.rst +---------- + +.. _com.hurence.logisland.processor.enrichment.IpToGeo: + +IpToGeo +------- +Looks up geolocation information for an IP address. The attribute that contains the IP address to lookup must be provided in the **ip.address.field** property. By default, the geo information are put in a hierarchical structure. That is, if the name of the IP field is 'X', then the the geo attributes added by enrichment are added under a father field named X_geo. "_geo" is the default hierarchical suffix that may be changed with the **geo.hierarchical.suffix** property. If one wants to put the geo fields at the same level as the IP field, then the **geo.hierarchical** property should be set to false and then the geo attributes are created at the same level as him with the naming pattern X_geo_. "_geo_" is the default flat suffix but this may be changed with the **geo.flat.suffix** property. The IpToGeo processor requires a reference to an Ip to Geo service. This must be defined in the **iptogeo.service** property. The added geo fields are dependant on the underlying Ip to Geo service. The **geo.fields** property must contain the list of geo fields that should be created if data is available for the IP to resolve. This property defaults to "*" which means to add every available fields. If one only wants a subset of the fields, one must define a comma separated list of fields as a value for the **geo.fields** property. The list of the available geo fields is in the description of the **geo.fields** property. + +Module +______ +com.hurence.logisland:logisland-processor-enrichment:1.4.0 + +Class +_____ +com.hurence.logisland.processor.enrichment.IpToGeo + +Tags +____ +geo, enrich, ip + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**ip.address.field**", "The name of the field containing the ip address to use.", "", "null", "false", "false" + "**iptogeo.service**", "The reference to the IP to Geo service to use.", "", "null", "false", "false" + "geo.fields", "Comma separated list of geo information fields to add to the record. Defaults to '*', which means to include all available fields. If a list of fields is specified and the data is not available, the geo field is not created. The geo fields are dependant on the underlying defined Ip to Geo service. The currently only supported type of Ip to Geo service is the Maxmind Ip to Geo service. This means that the currently supported list of geo fields is the following:**continent**: the identified continent for this IP address. **continent_code**: the identified continent code for this IP address. **city**: the identified city for this IP address. **latitude**: the identified latitude for this IP address. **longitude**: the identified longitude for this IP address. **location**: the identified location for this IP address, defined as Geo-point expressed as a string with the format: 'latitude,longitude'. **accuracy_radius**: the approximate accuracy radius, in kilometers, around the latitude and longitude for the location. **time_zone**: the identified time zone for this IP address. **subdivision_N**: the identified subdivision for this IP address. N is a one-up number at the end of the attribute name, starting with 0. **subdivision_isocode_N**: the iso code matching the identified subdivision_N. **country**: the identified country for this IP address. **country_isocode**: the iso code for the identified country for this IP address. **postalcode**: the identified postal code for this IP address. **lookup_micros**: the number of microseconds that the geo lookup took. The Ip to Geo service must have the lookup_micros property enabled in order to have this field available.", "", "*", "false", "false" + "geo.hierarchical", "Should the additional geo information fields be added under a hierarchical father field or not.", "", "true", "false", "false" + "geo.hierarchical.suffix", "Suffix to use for the field holding geo information. If geo.hierarchical is true, then use this suffix appended to the IP field name to define the father field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo", "false", "false" + "geo.flat.suffix", "Suffix to use for geo information fields when they are flat. If geo.hierarchical is false, then use this suffix appended to the IP field name but before the geo field name. This may be used for instance to distinguish between geo fields with various locales using many Ip to Geo service instances.", "", "_geo_", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "debug", "If true, an additional debug field is added. If the geo info fields prefix is X, a debug field named X_from_cache contains a boolean value to indicate the origin of the geo fields. The default value for this property is false (debug is disabled).", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IpToGeo-Detail.rst +---------- + +.. _com.hurence.logisland.processor.networkpacket.ParseNetworkPacket: + +ParseNetworkPacket +------------------ +The ParseNetworkPacket processor is the LogIsland entry point to parse network packets captured either off-the-wire (stream mode) or in pcap format (batch mode). In batch mode, the processor decodes the bytes of the incoming pcap record, where a Global header followed by a sequence of [packet header, packet data] pairs are stored. Then, each incoming pcap event is parsed into n packet records. The fields of packet headers are then extracted and made available in dedicated record fields. See the `Capturing Network packets tutorial `_ for an example of usage of this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.networkpacket.ParseNetworkPacket + +Tags +____ +PCap, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug.", "", "false", "false", "false" + "**flow.mode**", "Flow Mode. Indicate whether packets are provided in batch mode (via pcap files) or in stream mode (without headers). Allowed values are batch and stream.", "batch, stream", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch: + +BulkAddElasticsearch +-------------------- +Indexes the content of a Record in Elasticsearch using elasticsearch's bulk processor + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**default.index**", "The name of the index to insert into", "", "null", "false", "**true**" + "**default.type**", "The type of this document (used by Elasticsearch for indexing and searching)", "", "null", "false", "**true**" + "**timebased.index**", "do we add a date suffix", "no (no date added to default index), today (today's date added to default index), yesterday (yesterday's date added to default index)", "no", "false", "false" + "es.index.field", "the name of the event field containing es index name => will override index value if set", "", "null", "false", "false" + "es.type.field", "the name of the event field containing es doc type => will override type value if set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/BulkAddElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: + +FetchHBaseRow +------------- +Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.FetchHBaseRow + +Tags +____ +hbase, scan, fetch, get, enrich + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" + "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" + "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/FetchHBaseRow-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: + +MultiGetElasticsearch +--------------------- +Retrieves a content indexed in elasticsearch using elasticsearch multiget queries. +Each incoming record contains information regarding the elasticsearch multiget query that will be performed. This information is stored in record fields whose names are configured in the plugin properties (see below) : + + - index (String) : name of the elasticsearch index on which the multiget query will be performed. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - type (String) : name of the elasticsearch type on which the multiget query will be performed. This field is not mandatory. + - ids (String) : comma separated list of document ids to fetch. This field is mandatory and should not be empty, otherwise an error output record is sent for this specific incoming record. + - includes (String) : comma separated list of patterns to filter in (include) fields to retrieve. Supports wildcards. This field is not mandatory. + - excludes (String) : comma separated list of patterns to filter out (exclude) fields to retrieve. Supports wildcards. This field is not mandatory. + +Each outcoming record holds data of one elasticsearch retrieved document. This data is stored in these fields : + + - index (same field name as the incoming record) : name of the elasticsearch index. + - type (same field name as the incoming record) : name of the elasticsearch type. + - id (same field name as the incoming record) : retrieved document id. + - a list of String fields containing : + + * field name : the retrieved field name + * field value : the retrieved field value + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**es.index.field**", "the name of the incoming records field containing es index name to use in multiget query. ", "", "null", "false", "false" + "**es.type.field**", "the name of the incoming records field containing es type name to use in multiget query", "", "null", "false", "false" + "**es.ids.field**", "the name of the incoming records field containing es document Ids to use in multiget query", "", "null", "false", "false" + "**es.includes.field**", "the name of the incoming records field containing es includes to use in multiget query", "", "null", "false", "false" + "**es.excludes.field**", "the name of the incoming records field containing es excludes to use in multiget query", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/MultiGetElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.hbase.PutHBaseCell: + +PutHBaseCell +------------ +Adds the Contents of a Record to HBase as the value of a single cell + +Module +______ +com.hurence.logisland:logisland-processor-hbase:1.4.0 + +Class +_____ +com.hurence.logisland.processor.hbase.PutHBaseCell + +Tags +____ +hadoop, hbase + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" + "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" + "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" + "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" + "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" + "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" + "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" + "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" + "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" + "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" + "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" + "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/PutHBaseCell-Detail.rst +---------- + +.. _com.hurence.logisland.processor.xml.EvaluateXPath: + +EvaluateXPath +------------- +Evaluates one or more XPaths against the content of a record. The results of those XPaths are assigned to new attributes in the records, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed. The value of the property must be a valid XPath expression. If the expression matches nothing, no attributes is added. + +Module +______ +com.hurence.logisland:logisland-processor-xml:1.4.0 + +Class +_____ +com.hurence.logisland.processor.xml.EvaluateXPath + +Tags +____ +XML, evaluate, XPath + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**source**", "Indicates the attribute containing the xml data to evaluate xpath against.", "", "null", "false", "false" + "**validate_dtd**", "Specifies whether or not the XML content should be validated against the DTD.", "true, false", "true", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "An attribute", "An XPath expression", " the attribute is set to the result of the XPath Expression.", "", "null", false + +Extra informations +__________________ +.. include:: ./details/EvaluateXPath-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.ConsolidateSession: + +ConsolidateSession +------------------ +The ConsolidateSession processor is the Logisland entry point to get and process events from the Web Analytics.As an example here is an incoming event from the Web Analytics: + +"fields": [{ "name": "timestamp", "type": "long" },{ "name": "remoteHost", "type": "string"},{ "name": "record_type", "type": ["null", "string"], "default": null },{ "name": "record_id", "type": ["null", "string"], "default": null },{ "name": "location", "type": ["null", "string"], "default": null },{ "name": "hitType", "type": ["null", "string"], "default": null },{ "name": "eventCategory", "type": ["null", "string"], "default": null },{ "name": "eventAction", "type": ["null", "string"], "default": null },{ "name": "eventLabel", "type": ["null", "string"], "default": null },{ "name": "localPath", "type": ["null", "string"], "default": null },{ "name": "q", "type": ["null", "string"], "default": null },{ "name": "n", "type": ["null", "int"], "default": null },{ "name": "referer", "type": ["null", "string"], "default": null },{ "name": "viewportPixelWidth", "type": ["null", "int"], "default": null },{ "name": "viewportPixelHeight", "type": ["null", "int"], "default": null },{ "name": "screenPixelWidth", "type": ["null", "int"], "default": null },{ "name": "screenPixelHeight", "type": ["null", "int"], "default": null },{ "name": "partyId", "type": ["null", "string"], "default": null },{ "name": "sessionId", "type": ["null", "string"], "default": null },{ "name": "pageViewId", "type": ["null", "string"], "default": null },{ "name": "is_newSession", "type": ["null", "boolean"],"default": null },{ "name": "userAgentString", "type": ["null", "string"], "default": null },{ "name": "pageType", "type": ["null", "string"], "default": null },{ "name": "UserId", "type": ["null", "string"], "default": null },{ "name": "B2Bunit", "type": ["null", "string"], "default": null },{ "name": "pointOfService", "type": ["null", "string"], "default": null },{ "name": "companyID", "type": ["null", "string"], "default": null },{ "name": "GroupCode", "type": ["null", "string"], "default": null },{ "name": "userRoles", "type": ["null", "string"], "default": null },{ "name": "is_PunchOut", "type": ["null", "string"], "default": null }]The ConsolidateSession processor groups the records by sessions and compute the duration between now and the last received event. If the distance from the last event is beyond a given threshold (by default 30mn), then the session is considered closed.The ConsolidateSession is building an aggregated session object for each active session.This aggregated object includes: - The actual session duration. - A boolean representing wether the session is considered active or closed. Note: it is possible to ressurect a session if for instance an event arrives after a session has been marked closed. - User related infos: userId, B2Bunit code, groupCode, userRoles, companyId - First visited page: URL - Last visited page: URL The properties to configure the processor are: - sessionid.field: Property name containing the session identifier (default: sessionId). - timestamp.field: Property name containing the timestamp of the event (default: timestamp). - session.timeout: Timeframe of inactivity (in seconds) after which a session is considered closed (default: 30mn). - visitedpage.field: Property name containing the page visited by the customer (default: location). - fields.to.return: List of fields to return in the aggregated object. (default: N/A) + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.ConsolidateSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "null", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webanalytics.IncrementalWebSession`_ + +---------- + +.. _com.hurence.logisland.processor.DetectOutliers: + +DetectOutliers +-------------- +Outlier Analysis: A Hybrid Approach + +In order to function at scale, a two-phase approach is taken + +For every data point + +- Detect outlier candidates using a robust estimator of variability (e.g. median absolute deviation) that uses distributional sketching (e.g. Q-trees) +- Gather a biased sample (biased by recency) +- Extremely deterministic in space and cheap in computation + +For every outlier candidate + +- Use traditional, more computationally complex approaches to outlier analysis (e.g. Robust PCA) on the biased sample +- Expensive computationally, but run infrequently + +This becomes a data filter which can be attached to a timeseries data stream within a distributed computational framework (i.e. Storm, Spark, Flink, NiFi) to detect outliers. + +Module +______ +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 + +Class +_____ +com.hurence.logisland.processor.DetectOutliers + +Tags +____ +analytic, outlier, record, iot, timeseries + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**value.field**", "the numeric field to get the value", "", "record_value", "false", "false" + "**time.field**", "the numeric field to get the value", "", "record_time", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "**rotation.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**rotation.policy.amount**", "...", "", "100", "false", "false" + "**rotation.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "**chunking.policy.type**", "...", "by_amount, by_time, never", "by_amount", "false", "false" + "**chunking.policy.amount**", "...", "", "100", "false", "false" + "**chunking.policy.unit**", "...", "milliseconds, seconds, hours, days, months, years, points", "points", "false", "false" + "sketchy.outlier.algorithm", "...", "SKETCHY_MOVING_MAD", "SKETCHY_MOVING_MAD", "false", "false" + "batch.outlier.algorithm", "...", "RAD", "RAD", "false", "false" + "global.statistics.min", "minimum value", "", "null", "false", "false" + "global.statistics.max", "maximum value", "", "null", "false", "false" + "global.statistics.mean", "mean value", "", "null", "false", "false" + "global.statistics.stddev", "standard deviation value", "", "null", "false", "false" + "**zscore.cutoffs.normal**", "zscoreCutoffs level for normal outlier", "", "0.000000000000001", "false", "false" + "**zscore.cutoffs.moderate**", "zscoreCutoffs level for moderate outlier", "", "1.5", "false", "false" + "**zscore.cutoffs.severe**", "zscoreCutoffs level for severe outlier", "", "10.0", "false", "false" + "zscore.cutoffs.notEnoughData", "zscoreCutoffs level for notEnoughData outlier", "", "100", "false", "false" + "smooth", "do smoothing ?", "", "false", "false", "false" + "decay", "the decay", "", "0.1", "false", "false" + "**min.amount.to.predict**", "minAmountToPredict", "", "100", "false", "false" + "min_zscore_percentile", "minZscorePercentile", "", "50.0", "false", "false" + "reservoir_size", "the size of points reservoir", "", "100", "false", "false" + "rpca.force.diff", "No Description Provided.", "", "null", "false", "false" + "rpca.lpenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.min.records", "No Description Provided.", "", "null", "false", "false" + "rpca.spenalty", "No Description Provided.", "", "null", "false", "false" + "rpca.threshold", "No Description Provided.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/DetectOutliers-Detail.rst +---------- + +.. _com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch: + +EnrichRecordsElasticsearch +-------------------------- +Enrich input records with content indexed in elasticsearch using multiget queries. +Each incoming record must be possibly enriched with information stored in elasticsearch. +Each outcoming record holds at least the input record plus potentially one or more fields coming from of one elasticsearch document. + +Module +______ +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 + +Class +_____ +com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + +Tags +____ +elasticsearch + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" + "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" + "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + +Extra informations +__________________ +.. include:: ./details/EnrichRecordsElasticsearch-Detail.rst +---------- + +.. _com.hurence.logisland.processor.excel.ExcelExtract: + +ExcelExtract +------------ +Consumes a Microsoft Excel document and converts each worksheet's line to a structured record. The processor is assuming to receive raw excel file as input record. + +Module +______ +com.hurence.logisland:logisland-processor-excel:1.4.0 + +Class +_____ +com.hurence.logisland.processor.excel.ExcelExtract + +Tags +____ +excel, processor, poi + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "sheets", "Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. You can specify regular expressions. Any sheets not specified in this value will be ignored.", "", "", "false", "false" + "skip.columns", "Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.", "", "", "false", "false" + "field.names", "The comma separated list representing the names of columns of extracted cells. Order matters! You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + "skip.rows", "The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.", "", "0", "false", "false" + "record.type", "Default type of record", "", "excel_record", "false", "false" + "field.row.header", "If set, field names mapping will be extracted from the specified row number. You should use either field.names either field.row.header but not both together.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ExcelExtract-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchIP: + +MatchIP +------- +IP address Query matching (using `Luwak )`_ + +You can use this processor to handle custom events matching IP address (CIDR) +The record sent from a matching an IP address record is tagged appropriately. + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchIP + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchIP-Detail.rst +---------- + +.. _com.hurence.logisland.processor.MatchQuery: + +MatchQuery +---------- +Query matching based on `Luwak `_ + +you can use this processor to handle custom events defined by lucene queries +a new record is added to output each time a registered query is matched + +A query is expressed as a lucene query against a field like for example: + +.. code:: + + message:'bad exception' + error_count:[10 TO *] + bytes_out:5000 + user_name:tom* + +Please read the `Lucene syntax guide `_ for supported operations + +.. warning:: + + don't forget to set numeric fields property to handle correctly numeric ranges queries + +Module +______ +com.hurence.logisland:logisland-processor-querymatcher:1.4.0 + +Class +_____ +com.hurence.logisland.processor.MatchQuery + +Tags +____ +analytic, percolator, record, record, query, lucene + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "numeric.fields", "a comma separated string of numeric field to be matched", "", "null", "false", "false" + "output.record.type", "the output type of the record", "", "alert_match", "false", "false" + "record.type.updatePolicy", "Record type update policy", "", "overwrite", "false", "false" + "policy.onmatch", "the policy applied to match events: 'first' (default value) match events are tagged with the name and value of the first query that matched;'all' match events are tagged with all names and values of the queries that matched.", "", "first", "false", "false" + "policy.onmiss", "the policy applied to miss events: 'discard' (default value) drop events that did not match any query;'forward' include also events that did not match any query.", "", "discard", "false", "false" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "query", "some Lucene query", "generate a new record when this query is matched", "", "null", **true** + +Extra informations +__________________ +.. include:: ./details/MatchQuery-Detail.rst +---------- + +.. _com.hurence.logisland.processor.bro.ParseBroEvent: + +ParseBroEvent +------------- +The ParseBroEvent processor is the Logisland entry point to get and process `Bro `_ events. The `Bro-Kafka plugin `_ should be used and configured in order to have Bro events sent to Kafka. See the `Bro/Logisland tutorial `_ for an example of usage for this processor. The ParseBroEvent processor does some minor pre-processing on incoming Bro events from the Bro-Kafka plugin to adapt them to Logisland. + +Basically the events coming from the Bro-Kafka plugin are JSON documents with a first level field indicating the type of the event. The ParseBroEvent processor takes the incoming JSON document, sets the event type in a record_type field and sets the original sub-fields of the JSON event as first level fields in the record. Also any dot in a field name is transformed into an underscore. Thus, for instance, the field id.orig_h becomes id_orig_h. The next processors in the stream can then process the Bro events generated by this ParseBroEvent processor. + +As an example here is an incoming event from Bro: + +{ + + "conn": { + + "id.resp_p": 9092, + + "resp_pkts": 0, + + "resp_ip_bytes": 0, + + "local_orig": true, + + "orig_ip_bytes": 0, + + "orig_pkts": 0, + + "missed_bytes": 0, + + "history": "Cc", + + "tunnel_parents": [], + + "id.orig_p": 56762, + + "local_resp": true, + + "uid": "Ct3Ms01I3Yc6pmMZx7", + + "conn_state": "OTH", + + "id.orig_h": "172.17.0.2", + + "proto": "tcp", + + "id.resp_h": "172.17.0.3", + + "ts": 1487596886.953917 + + } + + } + +It gets processed and transformed into the following Logisland record by the ParseBroEvent processor: + +"@timestamp": "2017-02-20T13:36:32Z" + +"record_id": "6361f80a-c5c9-4a16-9045-4bb51736333d" + +"record_time": 1487597792782 + +"record_type": "conn" + +"id_resp_p": 9092 + +"resp_pkts": 0 + +"resp_ip_bytes": 0 + +"local_orig": true + +"orig_ip_bytes": 0 + +"orig_pkts": 0 + +"missed_bytes": 0 + +"history": "Cc" + +"tunnel_parents": [] + +"id_orig_p": 56762 + +"local_resp": true + +"uid": "Ct3Ms01I3Yc6pmMZx7" + +"conn_state": "OTH" + +"id_orig_h": "172.17.0.2" + +"proto": "tcp" + +"id_resp_h": "172.17.0.3" + +"ts": 1487596886.953917 + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.bro.ParseBroEvent + +Tags +____ +bro, security, IDS, NIDS + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseBroEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.netflow.ParseNetflowEvent: + +ParseNetflowEvent +----------------- +The `Netflow V5 `_ processor is the Logisland entry point to process Netflow (V5) events. NetFlow is a feature introduced on Cisco routers that provides the ability to collect IP network traffic.We can distinguish 2 components: + + - Flow exporter: aggregates packets into flows and exports flow records (binary format) towards one or more flow collectors + + - Flow collector: responsible for reception, storage and pre-processing of flow data received from a flow exporter + +The collected data are then available for analysis purpose (intrusion detection, traffic analysis...) +Netflow are sent to kafka in order to be processed by logisland. +In the tutorial we will simulate Netflow traffic using `nfgen `_. this traffic will be sent to port 2055. The we rely on nifi to listen of that port for incoming netflow (V5) traffic and send them to a kafka topic. The Netflow processor could thus treat these events and generate corresponding logisland records. The following processors in the stream can then process the Netflow records generated by this processor. + +Module +______ +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 + +Class +_____ +com.hurence.logisland.processor.netflow.ParseNetflowEvent + +Tags +____ +netflow, security + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, the original JSON string is embedded in the record_value field of the record.", "", "false", "false", "false" + "output.record.type", "the output type of the record", "", "netflowevent", "false", "false" + "enrich.record", "Enrich data. If enabledthe netflow record is enriched with inferred data", "", "false", "false", "false" + +Extra informations +__________________ +.. include:: ./details/ParseNetflowEvent-Detail.rst +---------- + +.. _com.hurence.logisland.processor.scripting.python.RunPython: + +RunPython +--------- + !!!! WARNING !!!! + +The RunPython processor is currently an experimental feature : it is delivered as is, with the current set of features and is subject to modifications in API or anything else in further logisland releases without warnings. There is no tutorial yet. If you want to play with this processor, use the python-processing.yml example and send the apache logs of the index apache logs tutorial. The debug stream processor at the end of the stream should output events in stderr file of the executors from the spark console. + +This processor allows to implement and run a processor written in python. This can be done in 2 ways. Either directly defining the process method code in the **script.code.process** configuration property or poiting to an external python module script file in the **script.path** configuration property. Directly defining methods is called the inline mode whereas using a script file is called the file mode. Both ways are mutually exclusive. Whether using the inline of file mode, your python code may depend on some python dependencies. If the set of python dependencies already delivered with the Logisland framework is not sufficient, you can use the **dependencies.path** configuration property to give their location. Currently only the nltk python library is delivered with Logisland. + +Module +______ +com.hurence.logisland:logisland-processor-scripting:1.4.0 + +Class +_____ +com.hurence.logisland.processor.scripting.python.RunPython + +Tags +____ +scripting, python + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "script.code.imports", "For inline mode only. This is the python code that should hold the import statements if required.", "", "null", "false", "false" + "script.code.init", "The python code to be called when the processor is initialized. This is the python equivalent of the init method code for a java processor. This is not mandatory but can only be used if **script.code.process** is defined (inline mode).", "", "null", "false", "false" + "script.code.process", "The python code to be called to process the records. This is the pyhton equivalent of the process method code for a java processor. For inline mode, this is the only minimum required configuration property. Using this property, you may also optionally define the **script.code.init** and **script.code.imports** properties.", "", "null", "false", "false" + "script.path", "The path to the user's python processor script. Use this property for file mode. Your python code must be in a python file with the following constraints: let's say your pyhton script is named MyProcessor.py. Then MyProcessor.py is a module file that must contain a class named MyProcessor which must inherits from the Logisland delivered class named AbstractProcessor. You can then define your code in the process method and in the other traditional methods (init...) as you would do in java in a class inheriting from the AbstractProcessor java class.", "", "null", "false", "false" + "dependencies.path", "The path to the additional dependencies for the user's python code, whether using inline or file mode. This is optional as your code may not have additional dependencies. If you defined **script.path** (so using file mode) and if **dependencies.path** is not defined, Logisland will scan a potential directory named **dependencies** in the same directory where the script file resides and if it exists, any python code located there will be loaded as dependency as needed.", "", "null", "false", "false" + "logisland.dependencies.path", "The path to the directory containing the python dependencies shipped with logisland. You should not have to tune this parameter.", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/RunPython-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URIDecoder: + +URIDecoder +---------- +Decode one or more field containing an URI with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URIDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLCleaner: + +URLCleaner +---------- +Remove some or all query parameters from one or more field containing an uri which should be preferably encoded. +If the uri is not encoded the behaviour is not defined in case the decoded uri contains '#', '?', '=', '&' which were encoded. +Indeed this processor assumes that the start of query part of the uri start at the first '?' then end at the first '#' or at the end of the uri as +specified by rfc3986 available at https://tools.ietf.org/html/rfc3986#section-3.4. +We assume as well that key value pairs are separed by '=', and are separed by '&': exemple 'param1=value1¶m2=value2'. +The processor can remove also parameters that have only a name and no value. The character used to separate the key and the value '=' is configurable. +The character used to separate two parameters '&' is also configurable. + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLCleaner + +Tags +____ +record, fields, url, params, param, remove, keep, query, uri, parameter, clean, decoded, raw + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**url.fields**", "List of fields (URL) to decode and optionnaly the output field for the url modified. Syntax should be ,,...,. So fields name can not contain ',' nor ':'", "", "null", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + "url.keep.params", "List of param names to keep in the input url (others will be removed). Can not be given at the same time as url.remove.params or url.remove.all", "", "null", "false", "false" + "url.remove.params", "List of param names to remove from the input url (others will be kept). Can not be given at the same time as url.keep.params or url.remove.all", "", "null", "false", "false" + "url.remove.all", "Remove all params if true.", "", "null", "false", "false" + "parameter.separator", "the character to use to separate the parameters in the query part of the uris", "", "&", "false", "false" + "key.value.separator", "the character to use to separate the parameter name from the parameter value in the query part of the uris", "", "=", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.useragent.ParseUserAgent: + +ParseUserAgent +-------------- +The user-agent processor allows to decompose User-Agent value from an HTTP header into several attributes of interest. There is no standard format for User-Agent strings, hence it is not easily possible to use regexp to handle them. This processor rely on the `YAUAA library `_ to do the heavy work. + +Module +______ +com.hurence.logisland:logisland-processor-useragent:1.4.0 Class _____ @@ -1173,7 +58162,92 @@ __________________ .. include:: ./details/ParseUserAgent-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: +.. _com.hurence.logisland.processor.webanalytics.CalculWebSession: + +CalculWebSession +---------------- +This processor creates web-sessions based on incoming web-events. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.CalculWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + "number.of.future.session.when.event.from.past", "The number of session it will look for when searching session of last events", "", "1", "false", "false" + +Extra informations +__________________ +.. include:: ./details/CalculWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.IncrementalWebSession: IncrementalWebSession --------------------- @@ -1205,11 +58279,11 @@ WebSession information are: Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.IncrementalWebSession +com.hurence.logisland.processor.webanalytics.IncrementalWebSession Tags ____ @@ -1225,11 +58299,12 @@ In the list below, the names of required properties appear in **bold**. Any othe :escape: \ "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" - "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" - "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" @@ -1246,15 +58321,20 @@ In the list below, the names of required properties appear in **bold**. Any othe "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" - "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + "number.of.future.session.when.event.from.past", "The number of session it will look for when searching session of last events", "", "1", "false", "false" Extra informations __________________ .. include:: ./details/IncrementalWebSession-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: +.. _com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic: SetSourceOfTraffic ------------------ @@ -1264,17 +58344,17 @@ When analysing user experience on a webshop, it is crucial to collect, process, To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) , the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). -By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic +com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic Tags ____ @@ -1296,7 +58376,7 @@ In the list below, the names of required properties appear in **bold**. Any othe "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" - "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.prefix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" @@ -1320,7 +58400,7 @@ Translates an IP address into a FQDN (Fully Qualified Domain Name). An input fie Module ______ -com.hurence.logisland:logisland-processor-enrichment:1.3.0 +com.hurence.logisland:logisland-processor-enrichment:1.4.0 Class _____ @@ -1360,7 +58440,7 @@ Looks up geolocation information for an IP address. The attribute that contains Module ______ -com.hurence.logisland:logisland-processor-enrichment:1.3.0 +com.hurence.logisland:logisland-processor-enrichment:1.4.0 Class _____ @@ -1401,7 +58481,7 @@ The ParseNetworkPacket processor is the LogIsland entry point to parse network p Module ______ -com.hurence.logisland:logisland-processor-cyber-security:1.3.0 +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 Class _____ @@ -1437,7 +58517,7 @@ Indexes the content of a Record in Elasticsearch using elasticsearch's bulk proc Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -1476,7 +58556,7 @@ Fetches a row from an HBase table. The Destination property controls whether the Module ______ -com.hurence.logisland:logisland-processor-hbase:1.3.0 +com.hurence.logisland:logisland-processor-hbase:1.4.0 Class _____ @@ -1533,7 +58613,7 @@ Each outcoming record holds data of one elasticsearch retrieved document. This d Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -1572,7 +58652,7 @@ Adds the Contents of a Record to HBase as the value of a single cell Module ______ -com.hurence.logisland:logisland-processor-hbase:1.3.0 +com.hurence.logisland:logisland-processor-hbase:1.4.0 Class _____ @@ -1617,7 +58697,7 @@ Evaluates one or more XPaths against the content of a record. The results of tho Module ______ -com.hurence.logisland:logisland-processor-xml:1.3.0 +com.hurence.logisland:logisland-processor-xml:1.4.0 Class _____ @@ -1656,7 +58736,7 @@ __________________ .. include:: ./details/EvaluateXPath-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: +.. _com.hurence.logisland.processor.webanalytics.ConsolidateSession: ConsolidateSession ------------------ @@ -1666,11 +58746,11 @@ The ConsolidateSession processor is the Logisland entry point to get and process Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.ConsolidateSession +com.hurence.logisland.processor.webanalytics.ConsolidateSession Tags ____ @@ -1704,6 +58784,10 @@ In the list below, the names of required properties appear in **bold**. Any othe Extra informations __________________ .. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webanalytics.IncrementalWebSession`_ + ---------- .. _com.hurence.logisland.processor.DetectOutliers: @@ -1729,7 +58813,7 @@ This becomes a data filter which can be attached to a timeseries data stream wit Module ______ -com.hurence.logisland:logisland-processor-outlier-detection:1.3.0 +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 Class _____ @@ -1793,7 +58877,7 @@ Each outcoming record holds at least the input record plus potentially one or mo Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -1832,7 +58916,7 @@ Consumes a Microsoft Excel document and converts each worksheet's line to a stru Module ______ -com.hurence.logisland:logisland-processor-excel:1.3.0 +com.hurence.logisland:logisland-processor-excel:1.4.0 Class _____ @@ -1889,7 +58973,7 @@ Please read the `Lucene syntax guide ,,...,. So fields name can not contain ',' nor ':'", "", "null", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + "url.keep.params", "List of param names to keep in the input url (others will be removed). Can not be given at the same time as url.remove.params or url.remove.all", "", "null", "false", "false" + "url.remove.params", "List of param names to remove from the input url (others will be kept). Can not be given at the same time as url.keep.params or url.remove.all", "", "null", "false", "false" + "url.remove.all", "Remove all params if true.", "", "null", "false", "false" + "parameter.separator", "the character to use to separate the parameters in the query part of the uris", "", "&", "false", "false" + "key.value.separator", "the character to use to separate the parameter name from the parameter value in the query part of the uris", "", "=", "false", "false" Extra informations __________________ .. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLDecoder + +Tags +____ +record, fields, Decode +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst ---------- .. _com.hurence.logisland.processor.useragent.ParseUserAgent: @@ -2264,7 +59417,7 @@ The user-agent processor allows to decompose User-Agent value from an HTTP heade Module ______ -com.hurence.logisland:logisland-processor-useragent:1.3.0 +com.hurence.logisland:logisland-processor-useragent:1.4.0 Class _____ @@ -2297,7 +59450,89 @@ __________________ .. include:: ./details/ParseUserAgent-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: +.. _com.hurence.logisland.processor.webanalytics.CalculWebSession: + +CalculWebSession +---------------- +This processor creates web-sessions based on incoming web-events. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.CalculWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + +Extra informations +__________________ +.. include:: ./details/CalculWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.IncrementalWebSession: IncrementalWebSession --------------------- @@ -2329,11 +59564,11 @@ WebSession information are: Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.IncrementalWebSession +com.hurence.logisland.processor.webanalytics.IncrementalWebSession Tags ____ @@ -2349,11 +59584,12 @@ In the list below, the names of required properties appear in **bold**. Any othe :escape: \ "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" - "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" - "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" @@ -2370,15 +59606,20 @@ In the list below, the names of required properties appear in **bold**. Any othe "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" - "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + "number.of.future.session.when.event.from.past", "The number of session it will look for when searching session of last events", "", "1", "false", "false" Extra informations __________________ .. include:: ./details/IncrementalWebSession-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: +.. _com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic: SetSourceOfTraffic ------------------ @@ -2388,17 +59629,17 @@ When analysing user experience on a webshop, it is crucial to collect, process, To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) , the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). -By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic +com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic Tags ____ @@ -2420,7 +59661,7 @@ In the list below, the names of required properties appear in **bold**. Any othe "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" - "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" @@ -2444,7 +59685,7 @@ Translates an IP address into a FQDN (Fully Qualified Domain Name). An input fie Module ______ -com.hurence.logisland:logisland-processor-enrichment:1.3.0 +com.hurence.logisland:logisland-processor-enrichment:1.4.0 Class _____ @@ -2484,7 +59725,7 @@ Looks up geolocation information for an IP address. The attribute that contains Module ______ -com.hurence.logisland:logisland-processor-enrichment:1.3.0 +com.hurence.logisland:logisland-processor-enrichment:1.4.0 Class _____ @@ -2525,7 +59766,7 @@ The ParseNetworkPacket processor is the LogIsland entry point to parse network p Module ______ -com.hurence.logisland:logisland-processor-cyber-security:1.3.0 +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 Class _____ @@ -2561,7 +59802,7 @@ Indexes the content of a Record in Elasticsearch using elasticsearch's bulk proc Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -2600,7 +59841,7 @@ Fetches a row from an HBase table. The Destination property controls whether the Module ______ -com.hurence.logisland:logisland-processor-hbase:1.3.0 +com.hurence.logisland:logisland-processor-hbase:1.4.0 Class _____ @@ -2657,7 +59898,7 @@ Each outcoming record holds data of one elasticsearch retrieved document. This d Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -2696,7 +59937,7 @@ Adds the Contents of a Record to HBase as the value of a single cell Module ______ -com.hurence.logisland:logisland-processor-hbase:1.3.0 +com.hurence.logisland:logisland-processor-hbase:1.4.0 Class _____ @@ -2741,7 +59982,7 @@ Evaluates one or more XPaths against the content of a record. The results of tho Module ______ -com.hurence.logisland:logisland-processor-xml:1.3.0 +com.hurence.logisland:logisland-processor-xml:1.4.0 Class _____ @@ -2780,7 +60021,7 @@ __________________ .. include:: ./details/EvaluateXPath-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: +.. _com.hurence.logisland.processor.webanalytics.ConsolidateSession: ConsolidateSession ------------------ @@ -2790,11 +60031,11 @@ The ConsolidateSession processor is the Logisland entry point to get and process Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.ConsolidateSession +com.hurence.logisland.processor.webanalytics.ConsolidateSession Tags ____ @@ -2828,6 +60069,10 @@ In the list below, the names of required properties appear in **bold**. Any othe Extra informations __________________ .. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webanalytics.IncrementalWebSession`_ + ---------- .. _com.hurence.logisland.processor.DetectOutliers: @@ -2853,7 +60098,7 @@ This becomes a data filter which can be attached to a timeseries data stream wit Module ______ -com.hurence.logisland:logisland-processor-outlier-detection:1.3.0 +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 Class _____ @@ -2917,7 +60162,7 @@ Each outcoming record holds at least the input record plus potentially one or mo Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -2956,7 +60201,7 @@ Consumes a Microsoft Excel document and converts each worksheet's line to a stru Module ______ -com.hurence.logisland:logisland-processor-excel:1.3.0 +com.hurence.logisland:logisland-processor-excel:1.4.0 Class _____ @@ -3013,7 +60258,7 @@ Please read the `Lucene syntax guide ,,...,. So fields name can not contain ',' nor ':'", "", "null", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + "url.keep.params", "List of param names to keep in the input url (others will be removed). Can not be given at the same time as url.remove.params or url.remove.all", "", "null", "false", "false" + "url.remove.params", "List of param names to remove from the input url (others will be kept). Can not be given at the same time as url.keep.params or url.remove.all", "", "null", "false", "false" + "url.remove.all", "Remove all params if true.", "", "null", "false", "false" + "parameter.separator", "the character to use to separate the parameters in the query part of the uris", "", "&", "false", "false" + "key.value.separator", "the character to use to separate the parameter name from the parameter value in the query part of the uris", "", "=", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" Extra informations __________________ @@ -3387,7 +60702,7 @@ The user-agent processor allows to decompose User-Agent value from an HTTP heade Module ______ -com.hurence.logisland:logisland-processor-useragent:1.3.0 +com.hurence.logisland:logisland-processor-useragent:1.4.0 Class _____ @@ -3420,7 +60735,89 @@ __________________ .. include:: ./details/ParseUserAgent-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: +.. _com.hurence.logisland.processor.webanalytics.CalculWebSession: + +CalculWebSession +---------------- +This processor creates web-sessions based on incoming web-events. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.CalculWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + +Extra informations +__________________ +.. include:: ./details/CalculWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.IncrementalWebSession: IncrementalWebSession --------------------- @@ -3452,11 +60849,11 @@ WebSession information are: Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.IncrementalWebSession +com.hurence.logisland.processor.webanalytics.IncrementalWebSession Tags ____ @@ -3472,11 +60869,12 @@ In the list below, the names of required properties appear in **bold**. Any othe :escape: \ "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" - "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" - "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" @@ -3493,15 +60891,20 @@ In the list below, the names of required properties appear in **bold**. Any othe "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" - "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + "number.of.future.session.when.event.from.past", "The number of session it will look for when searching session of last events", "", "1", "false", "false" Extra informations __________________ .. include:: ./details/IncrementalWebSession-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: +.. _com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic: SetSourceOfTraffic ------------------ @@ -3511,17 +60914,17 @@ When analysing user experience on a webshop, it is crucial to collect, process, To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) , the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). -By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic +com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic Tags ____ @@ -3543,7 +60946,7 @@ In the list below, the names of required properties appear in **bold**. Any othe "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" - "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" @@ -3567,7 +60970,7 @@ Translates an IP address into a FQDN (Fully Qualified Domain Name). An input fie Module ______ -com.hurence.logisland:logisland-processor-enrichment:1.3.0 +com.hurence.logisland:logisland-processor-enrichment:1.4.0 Class _____ @@ -3607,7 +61010,7 @@ Looks up geolocation information for an IP address. The attribute that contains Module ______ -com.hurence.logisland:logisland-processor-enrichment:1.3.0 +com.hurence.logisland:logisland-processor-enrichment:1.4.0 Class _____ @@ -3648,7 +61051,7 @@ The ParseNetworkPacket processor is the LogIsland entry point to parse network p Module ______ -com.hurence.logisland:logisland-processor-cyber-security:1.3.0 +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 Class _____ @@ -3684,7 +61087,7 @@ Indexes the content of a Record in Elasticsearch using elasticsearch's bulk proc Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -3723,7 +61126,7 @@ Fetches a row from an HBase table. The Destination property controls whether the Module ______ -com.hurence.logisland:logisland-processor-hbase:1.3.0 +com.hurence.logisland:logisland-processor-hbase:1.4.0 Class _____ @@ -3780,7 +61183,7 @@ Each outcoming record holds data of one elasticsearch retrieved document. This d Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -3819,7 +61222,7 @@ Adds the Contents of a Record to HBase as the value of a single cell Module ______ -com.hurence.logisland:logisland-processor-hbase:1.3.0 +com.hurence.logisland:logisland-processor-hbase:1.4.0 Class _____ @@ -3864,7 +61267,7 @@ Evaluates one or more XPaths against the content of a record. The results of tho Module ______ -com.hurence.logisland:logisland-processor-xml:1.3.0 +com.hurence.logisland:logisland-processor-xml:1.4.0 Class _____ @@ -3903,7 +61306,7 @@ __________________ .. include:: ./details/EvaluateXPath-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: +.. _com.hurence.logisland.processor.webanalytics.ConsolidateSession: ConsolidateSession ------------------ @@ -3913,11 +61316,11 @@ The ConsolidateSession processor is the Logisland entry point to get and process Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.ConsolidateSession +com.hurence.logisland.processor.webanalytics.ConsolidateSession Tags ____ @@ -3951,6 +61354,10 @@ In the list below, the names of required properties appear in **bold**. Any othe Extra informations __________________ .. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webanalytics.IncrementalWebSession`_ + ---------- .. _com.hurence.logisland.processor.DetectOutliers: @@ -3976,7 +61383,7 @@ This becomes a data filter which can be attached to a timeseries data stream wit Module ______ -com.hurence.logisland:logisland-processor-outlier-detection:1.3.0 +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 Class _____ @@ -4040,7 +61447,7 @@ Each outcoming record holds at least the input record plus potentially one or mo Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -4079,7 +61486,7 @@ Consumes a Microsoft Excel document and converts each worksheet's line to a stru Module ______ -com.hurence.logisland:logisland-processor-excel:1.3.0 +com.hurence.logisland:logisland-processor-excel:1.4.0 Class _____ @@ -4136,7 +61543,7 @@ Please read the `Lucene syntax guide ,,...,. So fields name can not contain ',' nor ':'", "", "null", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + "url.keep.params", "List of param names to keep in the input url (others will be removed). Can not be given at the same time as url.remove.params or url.remove.all", "", "null", "false", "false" + "url.remove.params", "List of param names to remove from the input url (others will be kept). Can not be given at the same time as url.keep.params or url.remove.all", "", "null", "false", "false" + "url.remove.all", "Remove all params if true.", "", "null", "false", "false" + "parameter.separator", "the character to use to separate the parameters in the query part of the uris", "", "&", "false", "false" + "key.value.separator", "the character to use to separate the parameter name from the parameter value in the query part of the uris", "", "=", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" Extra informations __________________ @@ -4510,7 +61987,7 @@ The user-agent processor allows to decompose User-Agent value from an HTTP heade Module ______ -com.hurence.logisland:logisland-processor-useragent:1.3.0 +com.hurence.logisland:logisland-processor-useragent:1.4.0 Class _____ @@ -4543,7 +62020,89 @@ __________________ .. include:: ./details/ParseUserAgent-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: +.. _com.hurence.logisland.processor.webanalytics.CalculWebSession: + +CalculWebSession +---------------- +This processor creates web-sessions based on incoming web-events. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.CalculWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + +Extra informations +__________________ +.. include:: ./details/CalculWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.IncrementalWebSession: IncrementalWebSession --------------------- @@ -4575,11 +62134,11 @@ WebSession information are: Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.IncrementalWebSession +com.hurence.logisland.processor.webanalytics.IncrementalWebSession Tags ____ @@ -4595,11 +62154,12 @@ In the list below, the names of required properties appear in **bold**. Any othe :escape: \ "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" - "**es.session.index.field**", "Name of the field in the record defining the ES index containing the web session documents.", "", "null", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" - "**es.mapping.event.to.session.index.name**", "Name of the ES index containing the mapping of web session documents.", "", "null", "false", "false" "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" @@ -4616,15 +62176,20 @@ In the list below, the names of required properties appear in **bold**. Any othe "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" - "source_of_traffic.suffix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + "number.of.future.session.when.event.from.past", "The number of session it will look for when searching session of last events", "", "1", "false", "false" Extra informations __________________ .. include:: ./details/IncrementalWebSession-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: +.. _com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic: SetSourceOfTraffic ------------------ @@ -4634,17 +62199,17 @@ When analysing user experience on a webshop, it is crucial to collect, process, To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) , the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). -By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic +com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic Tags ____ @@ -4666,7 +62231,7 @@ In the list below, the names of required properties appear in **bold**. Any othe "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" - "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" @@ -4690,7 +62255,7 @@ Translates an IP address into a FQDN (Fully Qualified Domain Name). An input fie Module ______ -com.hurence.logisland:logisland-processor-enrichment:1.3.0 +com.hurence.logisland:logisland-processor-enrichment:1.4.0 Class _____ @@ -4730,7 +62295,7 @@ Looks up geolocation information for an IP address. The attribute that contains Module ______ -com.hurence.logisland:logisland-processor-enrichment:1.3.0 +com.hurence.logisland:logisland-processor-enrichment:1.4.0 Class _____ @@ -4771,7 +62336,7 @@ The ParseNetworkPacket processor is the LogIsland entry point to parse network p Module ______ -com.hurence.logisland:logisland-processor-cyber-security:1.3.0 +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 Class _____ @@ -4807,7 +62372,7 @@ Indexes the content of a Record in Elasticsearch using elasticsearch's bulk proc Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -4846,7 +62411,7 @@ Fetches a row from an HBase table. The Destination property controls whether the Module ______ -com.hurence.logisland:logisland-processor-hbase:1.3.0 +com.hurence.logisland:logisland-processor-hbase:1.4.0 Class _____ @@ -4903,7 +62468,7 @@ Each outcoming record holds data of one elasticsearch retrieved document. This d Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -4942,7 +62507,7 @@ Adds the Contents of a Record to HBase as the value of a single cell Module ______ -com.hurence.logisland:logisland-processor-hbase:1.3.0 +com.hurence.logisland:logisland-processor-hbase:1.4.0 Class _____ @@ -4987,7 +62552,7 @@ Evaluates one or more XPaths against the content of a record. The results of tho Module ______ -com.hurence.logisland:logisland-processor-xml:1.3.0 +com.hurence.logisland:logisland-processor-xml:1.4.0 Class _____ @@ -5026,7 +62591,7 @@ __________________ .. include:: ./details/EvaluateXPath-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: +.. _com.hurence.logisland.processor.webanalytics.ConsolidateSession: ConsolidateSession ------------------ @@ -5036,11 +62601,11 @@ The ConsolidateSession processor is the Logisland entry point to get and process Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.ConsolidateSession +com.hurence.logisland.processor.webanalytics.ConsolidateSession Tags ____ @@ -5074,6 +62639,10 @@ In the list below, the names of required properties appear in **bold**. Any othe Extra informations __________________ .. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webanalytics.IncrementalWebSession`_ + ---------- .. _com.hurence.logisland.processor.DetectOutliers: @@ -5099,7 +62668,7 @@ This becomes a data filter which can be attached to a timeseries data stream wit Module ______ -com.hurence.logisland:logisland-processor-outlier-detection:1.3.0 +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 Class _____ @@ -5163,7 +62732,7 @@ Each outcoming record holds at least the input record plus potentially one or mo Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -5202,7 +62771,7 @@ Consumes a Microsoft Excel document and converts each worksheet's line to a stru Module ______ -com.hurence.logisland:logisland-processor-excel:1.3.0 +com.hurence.logisland:logisland-processor-excel:1.4.0 Class _____ @@ -5259,7 +62828,7 @@ Please read the `Lucene syntax guide ,,...,. So fields name can not contain ',' nor ':'", "", "null", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + "url.keep.params", "List of param names to keep in the input url (others will be removed). Can not be given at the same time as url.remove.params or url.remove.all", "", "null", "false", "false" + "url.remove.params", "List of param names to remove from the input url (others will be kept). Can not be given at the same time as url.keep.params or url.remove.all", "", "null", "false", "false" + "url.remove.all", "Remove all params if true.", "", "null", "false", "false" + "parameter.separator", "the character to use to separate the parameters in the query part of the uris", "", "&", "false", "false" + "key.value.separator", "the character to use to separate the parameter name from the parameter value in the query part of the uris", "", "=", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" Extra informations __________________ @@ -5633,7 +63272,7 @@ The user-agent processor allows to decompose User-Agent value from an HTTP heade Module ______ -com.hurence.logisland:logisland-processor-useragent:1.3.0 +com.hurence.logisland:logisland-processor-useragent:1.4.0 Class _____ @@ -5666,7 +63305,89 @@ __________________ .. include:: ./details/ParseUserAgent-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: +.. _com.hurence.logisland.processor.webanalytics.CalculWebSession: + +CalculWebSession +---------------- +This processor creates web-sessions based on incoming web-events. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.CalculWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Asia/Qostanay, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, America/Nuuk, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + +Extra informations +__________________ +.. include:: ./details/CalculWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.IncrementalWebSession: IncrementalWebSession --------------------- @@ -5698,11 +63419,98 @@ WebSession information are: Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.IncrementalWebSession +com.hurence.logisland.processor.webanalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Asia/Qostanay, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, America/Nuuk, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + "number.of.future.session.when.event.from.past", "The number of session it will look for when searching session of last events", "", "1", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.IncrementalWebSessionOld: + +IncrementalWebSessionOld +------------------------ +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.IncrementalWebSessionOld Tags ____ @@ -5747,7 +63555,7 @@ __________________ .. include:: ./details/IncrementalWebSession-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: +.. _com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic: SetSourceOfTraffic ------------------ @@ -5757,17 +63565,17 @@ When analysing user experience on a webshop, it is crucial to collect, process, To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) , the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). -By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic +com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic Tags ____ @@ -5789,7 +63597,7 @@ In the list below, the names of required properties appear in **bold**. Any othe "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" - "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" @@ -5813,7 +63621,7 @@ Translates an IP address into a FQDN (Fully Qualified Domain Name). An input fie Module ______ -com.hurence.logisland:logisland-processor-enrichment:1.3.0 +com.hurence.logisland:logisland-processor-enrichment:1.4.0 Class _____ @@ -5853,7 +63661,7 @@ Looks up geolocation information for an IP address. The attribute that contains Module ______ -com.hurence.logisland:logisland-processor-enrichment:1.3.0 +com.hurence.logisland:logisland-processor-enrichment:1.4.0 Class _____ @@ -5894,7 +63702,7 @@ The ParseNetworkPacket processor is the LogIsland entry point to parse network p Module ______ -com.hurence.logisland:logisland-processor-cyber-security:1.3.0 +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 Class _____ @@ -5930,7 +63738,7 @@ Indexes the content of a Record in Elasticsearch using elasticsearch's bulk proc Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -5969,7 +63777,7 @@ Fetches a row from an HBase table. The Destination property controls whether the Module ______ -com.hurence.logisland:logisland-processor-hbase:1.3.0 +com.hurence.logisland:logisland-processor-hbase:1.4.0 Class _____ @@ -6026,7 +63834,7 @@ Each outcoming record holds data of one elasticsearch retrieved document. This d Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -6065,7 +63873,7 @@ Adds the Contents of a Record to HBase as the value of a single cell Module ______ -com.hurence.logisland:logisland-processor-hbase:1.3.0 +com.hurence.logisland:logisland-processor-hbase:1.4.0 Class _____ @@ -6110,7 +63918,7 @@ Evaluates one or more XPaths against the content of a record. The results of tho Module ______ -com.hurence.logisland:logisland-processor-xml:1.3.0 +com.hurence.logisland:logisland-processor-xml:1.4.0 Class _____ @@ -6149,7 +63957,7 @@ __________________ .. include:: ./details/EvaluateXPath-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: +.. _com.hurence.logisland.processor.webanalytics.ConsolidateSession: ConsolidateSession ------------------ @@ -6159,11 +63967,11 @@ The ConsolidateSession processor is the Logisland entry point to get and process Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.ConsolidateSession +com.hurence.logisland.processor.webanalytics.ConsolidateSession Tags ____ @@ -6197,6 +64005,10 @@ In the list below, the names of required properties appear in **bold**. Any othe Extra informations __________________ .. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webanalytics.IncrementalWebSession`_ + ---------- .. _com.hurence.logisland.processor.DetectOutliers: @@ -6222,7 +64034,7 @@ This becomes a data filter which can be attached to a timeseries data stream wit Module ______ -com.hurence.logisland:logisland-processor-outlier-detection:1.3.0 +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 Class _____ @@ -6286,7 +64098,7 @@ Each outcoming record holds at least the input record plus potentially one or mo Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -6325,7 +64137,7 @@ Consumes a Microsoft Excel document and converts each worksheet's line to a stru Module ______ -com.hurence.logisland:logisland-processor-excel:1.3.0 +com.hurence.logisland:logisland-processor-excel:1.4.0 Class _____ @@ -6382,7 +64194,7 @@ Please read the `Lucene syntax guide ,,...,. So fields name can not contain ',' nor ':'", "", "null", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + "url.keep.params", "List of param names to keep in the input url (others will be removed). Can not be given at the same time as url.remove.params or url.remove.all", "", "null", "false", "false" + "url.remove.params", "List of param names to remove from the input url (others will be kept). Can not be given at the same time as url.keep.params or url.remove.all", "", "null", "false", "false" + "url.remove.all", "Remove all params if true.", "", "null", "false", "false" + "parameter.separator", "the character to use to separate the parameters in the query part of the uris", "", "&", "false", "false" + "key.value.separator", "the character to use to separate the parameter name from the parameter value in the query part of the uris", "", "=", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" Extra informations __________________ @@ -6756,7 +64638,7 @@ The user-agent processor allows to decompose User-Agent value from an HTTP heade Module ______ -com.hurence.logisland:logisland-processor-useragent:1.3.0 +com.hurence.logisland:logisland-processor-useragent:1.4.0 Class _____ @@ -6789,7 +64671,90 @@ __________________ .. include:: ./details/ParseUserAgent-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: +.. _com.hurence.logisland.processor.webanalytics.CalculWebSession: + +CalculWebSession +---------------- +This processor creates web-sessions based on incoming web-events. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.CalculWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSinglePageVisit.out.field", "the name of the field stating whether the session is single page visit or not => will override default value if set", "", "is_single_page_visit", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Asia/Qostanay, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + +Extra informations +__________________ +.. include:: ./details/CalculWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.IncrementalWebSession: IncrementalWebSession --------------------- @@ -6821,11 +64786,105 @@ WebSession information are: Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.IncrementalWebSession +com.hurence.logisland.processor.webanalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "**isSinglePageVisit.out.field**", "the name of the field stating whether the session is single page visit or not => will override default value if set", "", "is_single_page_visit", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Asia/Qostanay, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + "number.of.future.session.when.event.from.past", "The number of session it will look for when searching session of last events", "", "1", "false", "false" + "**processing.mode**", "If fastMode is true the processor will not do refresh on es indices which will improve performance but + + The result may be not exact as we are not sure to query the events up to date.", "FAST, MODERATE, SLOW", "FAST", "false", "false" + "es.refresh.wait.time.ms", "If fastMode is true the processor will not do refresh on es indices which will improve performance but + + The result may be not exact as we are not sure to query the events up to date.", "", "100000", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.IncrementalWebSessionOld: + +IncrementalWebSessionOld +------------------------ +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.IncrementalWebSessionOld Tags ____ @@ -6870,7 +64929,7 @@ __________________ .. include:: ./details/IncrementalWebSession-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: +.. _com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic: SetSourceOfTraffic ------------------ @@ -6880,17 +64939,17 @@ When analysing user experience on a webshop, it is crucial to collect, process, To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) , the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). -By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic +com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic Tags ____ @@ -6912,7 +64971,7 @@ In the list below, the names of required properties appear in **bold**. Any othe "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" - "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" @@ -6936,7 +64995,7 @@ Translates an IP address into a FQDN (Fully Qualified Domain Name). An input fie Module ______ -com.hurence.logisland:logisland-processor-enrichment:1.3.0 +com.hurence.logisland:logisland-processor-enrichment:1.4.0 Class _____ @@ -6976,7 +65035,7 @@ Looks up geolocation information for an IP address. The attribute that contains Module ______ -com.hurence.logisland:logisland-processor-enrichment:1.3.0 +com.hurence.logisland:logisland-processor-enrichment:1.4.0 Class _____ @@ -7017,7 +65076,7 @@ The ParseNetworkPacket processor is the LogIsland entry point to parse network p Module ______ -com.hurence.logisland:logisland-processor-cyber-security:1.3.0 +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 Class _____ @@ -7053,7 +65112,7 @@ Indexes the content of a Record in Elasticsearch using elasticsearch's bulk proc Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -7092,7 +65151,7 @@ Fetches a row from an HBase table. The Destination property controls whether the Module ______ -com.hurence.logisland:logisland-processor-hbase:1.3.0 +com.hurence.logisland:logisland-processor-hbase:1.4.0 Class _____ @@ -7149,7 +65208,7 @@ Each outcoming record holds data of one elasticsearch retrieved document. This d Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -7188,7 +65247,7 @@ Adds the Contents of a Record to HBase as the value of a single cell Module ______ -com.hurence.logisland:logisland-processor-hbase:1.3.0 +com.hurence.logisland:logisland-processor-hbase:1.4.0 Class _____ @@ -7233,7 +65292,7 @@ Evaluates one or more XPaths against the content of a record. The results of tho Module ______ -com.hurence.logisland:logisland-processor-xml:1.3.0 +com.hurence.logisland:logisland-processor-xml:1.4.0 Class _____ @@ -7272,7 +65331,7 @@ __________________ .. include:: ./details/EvaluateXPath-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: +.. _com.hurence.logisland.processor.webanalytics.ConsolidateSession: ConsolidateSession ------------------ @@ -7282,11 +65341,11 @@ The ConsolidateSession processor is the Logisland entry point to get and process Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.ConsolidateSession +com.hurence.logisland.processor.webanalytics.ConsolidateSession Tags ____ @@ -7320,6 +65379,10 @@ In the list below, the names of required properties appear in **bold**. Any othe Extra informations __________________ .. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webanalytics.IncrementalWebSession`_ + ---------- .. _com.hurence.logisland.processor.DetectOutliers: @@ -7345,7 +65408,7 @@ This becomes a data filter which can be attached to a timeseries data stream wit Module ______ -com.hurence.logisland:logisland-processor-outlier-detection:1.3.0 +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 Class _____ @@ -7409,7 +65472,7 @@ Each outcoming record holds at least the input record plus potentially one or mo Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -7431,9 +65494,10 @@ In the list below, the names of required properties appear in **bold**. Any othe "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" - "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "_doc", "false", "**true**" "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + "cache.service", "The instance of the Cache Service to use (optional).", "", "null", "false", "false" Extra informations __________________ @@ -7448,7 +65512,7 @@ Consumes a Microsoft Excel document and converts each worksheet's line to a stru Module ______ -com.hurence.logisland:logisland-processor-excel:1.3.0 +com.hurence.logisland:logisland-processor-excel:1.4.0 Class _____ @@ -7505,7 +65569,7 @@ Please read the `Lucene syntax guide ,,...,. So fields name can not contain ',' nor ':'", "", "null", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + "url.keep.params", "List of param names to keep in the input url (others will be removed). Can not be given at the same time as url.remove.params or url.remove.all", "", "null", "false", "false" + "url.remove.params", "List of param names to remove from the input url (others will be kept). Can not be given at the same time as url.keep.params or url.remove.all", "", "null", "false", "false" + "url.remove.all", "Remove all params if true.", "", "null", "false", "false" + "parameter.separator", "the character to use to separate the parameters in the query part of the uris", "", "&", "false", "false" + "key.value.separator", "the character to use to separate the parameter name from the parameter value in the query part of the uris", "", "=", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" Extra informations __________________ @@ -7879,7 +66013,7 @@ The user-agent processor allows to decompose User-Agent value from an HTTP heade Module ______ -com.hurence.logisland:logisland-processor-useragent:1.3.0 +com.hurence.logisland:logisland-processor-useragent:1.4.0 Class _____ @@ -7912,7 +66046,90 @@ __________________ .. include:: ./details/ParseUserAgent-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: +.. _com.hurence.logisland.processor.webanalytics.CalculWebSession: + +CalculWebSession +---------------- +This processor creates web-sessions based on incoming web-events. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.CalculWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSinglePageVisit.out.field", "the name of the field stating whether the session is single page visit or not => will override default value if set", "", "is_single_page_visit", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Asia/Qostanay, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + +Extra informations +__________________ +.. include:: ./details/CalculWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.IncrementalWebSession: IncrementalWebSession --------------------- @@ -7944,11 +66161,105 @@ WebSession information are: Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.IncrementalWebSession +com.hurence.logisland.processor.webanalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "**isSinglePageVisit.out.field**", "the name of the field stating whether the session is single page visit or not => will override default value if set", "", "is_single_page_visit", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Asia/Qostanay, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + "number.of.future.session.when.event.from.past", "The number of session it will look for when searching session of last events", "", "1", "false", "false" + "**processing.mode**", "If fastMode is true the processor will not do refresh on es indices which will improve performance but + + The result may be not exact as we are not sure to query the events up to date.", "FAST, MODERATE, SLOW", "FAST", "false", "false" + "es.refresh.wait.time.ms", "If fastMode is true the processor will not do refresh on es indices which will improve performance but + + The result may be not exact as we are not sure to query the events up to date.", "", "100000", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.IncrementalWebSessionOld: + +IncrementalWebSessionOld +------------------------ +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.IncrementalWebSessionOld Tags ____ @@ -7993,7 +66304,7 @@ __________________ .. include:: ./details/IncrementalWebSession-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: +.. _com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic: SetSourceOfTraffic ------------------ @@ -8003,17 +66314,17 @@ When analysing user experience on a webshop, it is crucial to collect, process, To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) , the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). -By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic +com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic Tags ____ @@ -8035,7 +66346,7 @@ In the list below, the names of required properties appear in **bold**. Any othe "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" - "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" @@ -8059,7 +66370,7 @@ Translates an IP address into a FQDN (Fully Qualified Domain Name). An input fie Module ______ -com.hurence.logisland:logisland-processor-enrichment:1.3.0 +com.hurence.logisland:logisland-processor-enrichment:1.4.0 Class _____ @@ -8099,7 +66410,7 @@ Looks up geolocation information for an IP address. The attribute that contains Module ______ -com.hurence.logisland:logisland-processor-enrichment:1.3.0 +com.hurence.logisland:logisland-processor-enrichment:1.4.0 Class _____ @@ -8140,7 +66451,7 @@ The ParseNetworkPacket processor is the LogIsland entry point to parse network p Module ______ -com.hurence.logisland:logisland-processor-cyber-security:1.3.0 +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 Class _____ @@ -8176,7 +66487,7 @@ Indexes the content of a Record in Elasticsearch using elasticsearch's bulk proc Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -8207,46 +66518,6 @@ __________________ .. include:: ./details/BulkAddElasticsearch-Detail.rst ---------- -.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: - -FetchHBaseRow -------------- -Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. - -Module -______ -com.hurence.logisland:logisland-processor-hbase:1.3.0 - -Class -_____ -com.hurence.logisland.processor.hbase.FetchHBaseRow - -Tags -____ -hbase, scan, fetch, get, enrich - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" - "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" - "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" - "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" - "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" - "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" - "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" - -Extra informations -__________________ -.. include:: ./details/FetchHBaseRow-Detail.rst ----------- - .. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: MultiGetElasticsearch @@ -8272,7 +66543,7 @@ Each outcoming record holds data of one elasticsearch retrieved document. This d Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -8303,51 +66574,6 @@ __________________ .. include:: ./details/MultiGetElasticsearch-Detail.rst ---------- -.. _com.hurence.logisland.processor.hbase.PutHBaseCell: - -PutHBaseCell ------------- -Adds the Contents of a Record to HBase as the value of a single cell - -Module -______ -com.hurence.logisland:logisland-processor-hbase:1.3.0 - -Class -_____ -com.hurence.logisland.processor.hbase.PutHBaseCell - -Tags -____ -hadoop, hbase - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" - "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" - "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" - "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" - "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" - "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" - "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" - "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" - "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" - "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" - "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" - "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" - -Extra informations -__________________ -.. include:: ./details/PutHBaseCell-Detail.rst ----------- - .. _com.hurence.logisland.processor.xml.EvaluateXPath: EvaluateXPath @@ -8356,7 +66582,7 @@ Evaluates one or more XPaths against the content of a record. The results of tho Module ______ -com.hurence.logisland:logisland-processor-xml:1.3.0 +com.hurence.logisland:logisland-processor-xml:1.4.0 Class _____ @@ -8395,7 +66621,7 @@ __________________ .. include:: ./details/EvaluateXPath-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: +.. _com.hurence.logisland.processor.webanalytics.ConsolidateSession: ConsolidateSession ------------------ @@ -8405,11 +66631,11 @@ The ConsolidateSession processor is the Logisland entry point to get and process Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.ConsolidateSession +com.hurence.logisland.processor.webanalytics.ConsolidateSession Tags ____ @@ -8443,6 +66669,10 @@ In the list below, the names of required properties appear in **bold**. Any othe Extra informations __________________ .. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webanalytics.IncrementalWebSession`_ + ---------- .. _com.hurence.logisland.processor.DetectOutliers: @@ -8468,7 +66698,7 @@ This becomes a data filter which can be attached to a timeseries data stream wit Module ______ -com.hurence.logisland:logisland-processor-outlier-detection:1.3.0 +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 Class _____ @@ -8532,7 +66762,7 @@ Each outcoming record holds at least the input record plus potentially one or mo Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -8554,9 +66784,10 @@ In the list below, the names of required properties appear in **bold**. Any othe "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" - "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "_doc", "false", "**true**" "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + "cache.service", "The instance of the Cache Service to use (optional).", "", "null", "false", "false" Extra informations __________________ @@ -8571,7 +66802,7 @@ Consumes a Microsoft Excel document and converts each worksheet's line to a stru Module ______ -com.hurence.logisland:logisland-processor-excel:1.3.0 +com.hurence.logisland:logisland-processor-excel:1.4.0 Class _____ @@ -8628,7 +66859,7 @@ Please read the `Lucene syntax guide ,,...,. So fields name can not contain ',' nor ':'", "", "null", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + "url.keep.params", "List of param names to keep in the input url (others will be removed). Can not be given at the same time as url.remove.params or url.remove.all", "", "null", "false", "false" + "url.remove.params", "List of param names to remove from the input url (others will be kept). Can not be given at the same time as url.keep.params or url.remove.all", "", "null", "false", "false" + "url.remove.all", "Remove all params if true.", "", "null", "false", "false" + "parameter.separator", "the character to use to separate the parameters in the query part of the uris", "", "&", "false", "false" + "key.value.separator", "the character to use to separate the parameter name from the parameter value in the query part of the uris", "", "=", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" Extra informations __________________ @@ -9002,7 +67303,7 @@ The user-agent processor allows to decompose User-Agent value from an HTTP heade Module ______ -com.hurence.logisland:logisland-processor-useragent:1.3.0 +com.hurence.logisland:logisland-processor-useragent:1.4.0 Class _____ @@ -9035,7 +67336,90 @@ __________________ .. include:: ./details/ParseUserAgent-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: +.. _com.hurence.logisland.processor.webanalytics.CalculWebSession: + +CalculWebSession +---------------- +This processor creates web-sessions based on incoming web-events. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.CalculWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSinglePageVisit.out.field", "the name of the field stating whether the session is single page visit or not => will override default value if set", "", "is_single_page_visit", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Asia/Qostanay, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + +Extra informations +__________________ +.. include:: ./details/CalculWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.IncrementalWebSession: IncrementalWebSession --------------------- @@ -9067,11 +67451,105 @@ WebSession information are: Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.IncrementalWebSession +com.hurence.logisland.processor.webanalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "**isSinglePageVisit.out.field**", "the name of the field stating whether the session is single page visit or not => will override default value if set", "", "is_single_page_visit", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Asia/Qostanay, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + "number.of.future.session.when.event.from.past", "The number of session it will look for when searching session of last events", "", "1", "false", "false" + "**processing.mode**", "If fastMode is true the processor will not do refresh on es indices which will improve performance but + + The result may be not exact as we are not sure to query the events up to date.", "FAST, MODERATE, SLOW", "FAST", "false", "false" + "es.refresh.wait.time.ms", "If fastMode is true the processor will not do refresh on es indices which will improve performance but + + The result may be not exact as we are not sure to query the events up to date.", "", "100000", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.IncrementalWebSessionOld: + +IncrementalWebSessionOld +------------------------ +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.IncrementalWebSessionOld Tags ____ @@ -9116,7 +67594,7 @@ __________________ .. include:: ./details/IncrementalWebSession-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: +.. _com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic: SetSourceOfTraffic ------------------ @@ -9126,17 +67604,17 @@ When analysing user experience on a webshop, it is crucial to collect, process, To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) , the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). -By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic +com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic Tags ____ @@ -9158,7 +67636,7 @@ In the list below, the names of required properties appear in **bold**. Any othe "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" - "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" @@ -9182,7 +67660,7 @@ Translates an IP address into a FQDN (Fully Qualified Domain Name). An input fie Module ______ -com.hurence.logisland:logisland-processor-enrichment:1.3.0 +com.hurence.logisland:logisland-processor-enrichment:1.4.0 Class _____ @@ -9222,7 +67700,7 @@ Looks up geolocation information for an IP address. The attribute that contains Module ______ -com.hurence.logisland:logisland-processor-enrichment:1.3.0 +com.hurence.logisland:logisland-processor-enrichment:1.4.0 Class _____ @@ -9263,7 +67741,7 @@ The ParseNetworkPacket processor is the LogIsland entry point to parse network p Module ______ -com.hurence.logisland:logisland-processor-cyber-security:1.3.0 +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 Class _____ @@ -9299,7 +67777,7 @@ Indexes the content of a Record in Elasticsearch using elasticsearch's bulk proc Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -9330,46 +67808,6 @@ __________________ .. include:: ./details/BulkAddElasticsearch-Detail.rst ---------- -.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: - -FetchHBaseRow -------------- -Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. - -Module -______ -com.hurence.logisland:logisland-processor-hbase:1.3.0 - -Class -_____ -com.hurence.logisland.processor.hbase.FetchHBaseRow - -Tags -____ -hbase, scan, fetch, get, enrich - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" - "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" - "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" - "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" - "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" - "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" - "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" - -Extra informations -__________________ -.. include:: ./details/FetchHBaseRow-Detail.rst ----------- - .. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: MultiGetElasticsearch @@ -9395,7 +67833,7 @@ Each outcoming record holds data of one elasticsearch retrieved document. This d Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -9426,51 +67864,6 @@ __________________ .. include:: ./details/MultiGetElasticsearch-Detail.rst ---------- -.. _com.hurence.logisland.processor.hbase.PutHBaseCell: - -PutHBaseCell ------------- -Adds the Contents of a Record to HBase as the value of a single cell - -Module -______ -com.hurence.logisland:logisland-processor-hbase:1.3.0 - -Class -_____ -com.hurence.logisland.processor.hbase.PutHBaseCell - -Tags -____ -hadoop, hbase - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" - "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" - "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" - "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" - "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" - "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" - "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" - "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" - "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" - "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" - "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" - "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" - -Extra informations -__________________ -.. include:: ./details/PutHBaseCell-Detail.rst ----------- - .. _com.hurence.logisland.processor.xml.EvaluateXPath: EvaluateXPath @@ -9479,7 +67872,7 @@ Evaluates one or more XPaths against the content of a record. The results of tho Module ______ -com.hurence.logisland:logisland-processor-xml:1.3.0 +com.hurence.logisland:logisland-processor-xml:1.4.0 Class _____ @@ -9518,7 +67911,7 @@ __________________ .. include:: ./details/EvaluateXPath-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: +.. _com.hurence.logisland.processor.webanalytics.ConsolidateSession: ConsolidateSession ------------------ @@ -9528,11 +67921,11 @@ The ConsolidateSession processor is the Logisland entry point to get and process Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.ConsolidateSession +com.hurence.logisland.processor.webanalytics.ConsolidateSession Tags ____ @@ -9566,6 +67959,10 @@ In the list below, the names of required properties appear in **bold**. Any othe Extra informations __________________ .. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webanalytics.IncrementalWebSession`_ + ---------- .. _com.hurence.logisland.processor.DetectOutliers: @@ -9591,7 +67988,7 @@ This becomes a data filter which can be attached to a timeseries data stream wit Module ______ -com.hurence.logisland:logisland-processor-outlier-detection:1.3.0 +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 Class _____ @@ -9655,7 +68052,7 @@ Each outcoming record holds at least the input record plus potentially one or mo Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -9677,9 +68074,10 @@ In the list below, the names of required properties appear in **bold**. Any othe "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" - "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "_doc", "false", "**true**" "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + "cache.service", "The instance of the Cache Service to use (optional).", "", "null", "false", "false" Extra informations __________________ @@ -9694,7 +68092,7 @@ Consumes a Microsoft Excel document and converts each worksheet's line to a stru Module ______ -com.hurence.logisland:logisland-processor-excel:1.3.0 +com.hurence.logisland:logisland-processor-excel:1.4.0 Class _____ @@ -9751,7 +68149,7 @@ Please read the `Lucene syntax guide ,,...,. So fields name can not contain ',' nor ':'", "", "null", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + "url.keep.params", "List of param names to keep in the input url (others will be removed). Can not be given at the same time as url.remove.params or url.remove.all", "", "null", "false", "false" + "url.remove.params", "List of param names to remove from the input url (others will be kept). Can not be given at the same time as url.keep.params or url.remove.all", "", "null", "false", "false" + "url.remove.all", "Remove all params if true.", "", "null", "false", "false" + "parameter.separator", "the character to use to separate the parameters in the query part of the uris", "", "&", "false", "false" + "key.value.separator", "the character to use to separate the parameter name from the parameter value in the query part of the uris", "", "=", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" Extra informations __________________ @@ -10125,7 +68593,7 @@ The user-agent processor allows to decompose User-Agent value from an HTTP heade Module ______ -com.hurence.logisland:logisland-processor-useragent:1.3.0 +com.hurence.logisland:logisland-processor-useragent:1.4.0 Class _____ @@ -10158,7 +68626,90 @@ __________________ .. include:: ./details/ParseUserAgent-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.IncrementalWebSession: +.. _com.hurence.logisland.processor.webanalytics.CalculWebSession: + +CalculWebSession +---------------- +This processor creates web-sessions based on incoming web-events. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.CalculWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "isSinglePageVisit.out.field", "the name of the field stating whether the session is single page visit or not => will override default value if set", "", "is_single_page_visit", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Asia/Qostanay, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + +Extra informations +__________________ +.. include:: ./details/CalculWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.IncrementalWebSession: IncrementalWebSession --------------------- @@ -10190,11 +68741,105 @@ WebSession information are: Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.IncrementalWebSession +com.hurence.logisland.processor.webanalytics.IncrementalWebSession + +Tags +____ +analytics, web, session + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "debug", "Enable debug. If enabled, debug information are logged.", "", "false", "false", "false" + "**es.session.index.prefix**", "Prefix of the indices containing the web session documents.", "", "null", "false", "false" + "**es.session.index.suffix.date**", "suffix to add to prefix for web session indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.session.type.name**", "Name of the ES type of web session documents.", "", "null", "false", "false" + "**es.event.index.prefix**", "Prefix of the index containing the web event documents.", "", "null", "false", "false" + "**es.event.index.suffix.date**", "suffix to add to prefix for web event indices. It should be valid date format [yyyy.MM].", "", "null", "false", "false" + "**es.event.type.name**", "Name of the ES type of web event documents.", "", "null", "false", "false" + "sessionid.field", "the name of the field containing the session id => will override default value if set", "", "sessionId", "false", "false" + "timestamp.field", "the name of the field containing the timestamp => will override default value if set", "", "h2kTimestamp", "false", "false" + "visitedpage.field", "the name of the field containing the visited page => will override default value if set", "", "location", "false", "false" + "userid.field", "the name of the field containing the userId => will override default value if set", "", "userId", "false", "false" + "fields.to.return", "the list of fields to return", "", "null", "false", "false" + "firstVisitedPage.out.field", "the name of the field containing the first visited page => will override default value if set", "", "firstVisitedPage", "false", "false" + "lastVisitedPage.out.field", "the name of the field containing the last visited page => will override default value if set", "", "lastVisitedPage", "false", "false" + "**isSinglePageVisit.out.field**", "the name of the field stating whether the session is single page visit or not => will override default value if set", "", "is_single_page_visit", "false", "false" + "isSessionActive.out.field", "the name of the field stating whether the session is active or not => will override default value if set", "", "is_sessionActive", "false", "false" + "sessionDuration.out.field", "the name of the field containing the session duration => will override default value if set", "", "sessionDuration", "false", "false" + "sessionInactivityDuration.out.field", "the name of the field containing the session inactivity duration => will override default value if set", "", "sessionInactivityDuration", "false", "false" + "session.timeout", "session timeout in sec", "", "1800", "false", "false" + "eventsCounter.out.field", "the name of the field containing the session duration => will override default value if set", "", "eventsCounter", "false", "false" + "firstEventDateTime.out.field", "the name of the field containing the date of the first event => will override default value if set", "", "firstEventDateTime", "false", "false" + "lastEventDateTime.out.field", "the name of the field containing the date of the last event => will override default value if set", "", "lastEventDateTime", "false", "false" + "newSessionReason.out.field", "the name of the field containing the reason why a new session was created => will override default value if set", "", "reasonForNewSession", "false", "false" + "transactionIds.out.field", "the name of the field containing all transactionIds => will override default value if set", "", "transactionIds", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic_", "false", "false" + "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" + "**cache.service**", "The name of the cache service to use.", "", "null", "false", "false" + "es.index.suffix.timezone", "The timezone to use to aprse timestamp into string date (for index names). See es.event.index.suffix.date and es.session.index.suffix.date. By default the system timezone is used. Supported by current system is : [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Asia/Qostanay, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]", "", "null", "false", "false" + "record.es.index.output.field.name", "The field name where index name to store record will be stored", "", "es_index", "false", "false" + "record.es.type.output.field.name", "The field name where type name to store record will be stored", "", "es_type", "false", "false" + "number.of.future.session.when.event.from.past", "The number of session it will look for when searching session of last events", "", "1", "false", "false" + "**processing.mode**", "If fastMode is true the processor will not do refresh on es indices which will improve performance but + + The result may be not exact as we are not sure to query the events up to date.", "FAST, MODERATE, SLOW", "FAST", "false", "false" + "es.refresh.wait.time.ms", "If fastMode is true the processor will not do refresh on es indices which will improve performance but + + The result may be not exact as we are not sure to query the events up to date.", "", "100000", "false", "false" + +Extra informations +__________________ +.. include:: ./details/IncrementalWebSession-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.IncrementalWebSessionOld: + +IncrementalWebSessionOld +------------------------ +This processor creates and updates web-sessions based on incoming web-events. Note that both web-sessions and web-events are stored in elasticsearch. + Firstly, web-events are grouped by their session identifier and processed in chronological order. + Then each web-session associated to each group is retrieved from elasticsearch. + In case none exists yet then a new web session is created based on the first web event. + The following fields of the newly created web session are set based on the associated web event: session identifier, first timestamp, first visited page. Secondly, once created, or retrieved, the web session is updated by the remaining web-events. + Updates have impacts on fields of the web session such as event counter, last visited page, session duration, ... + Before updates are actually applied, checks are performed to detect rules that would trigger the creation of a new session: + + the duration between the web session and the web event must not exceed the specified time-out, + the web session and the web event must have timestamps within the same day (at midnight a new web session is created), + source of traffic (campaign, ...) must be the same on the web session and the web event. + + When a breaking rule is detected, a new web session is created with a new session identifier where as remaining web-events still have the original session identifier. The new session identifier is the original session suffixed with the character '#' followed with an incremented counter. This new session identifier is also set on the remaining web-events. + Finally when all web events were applied, all web events -potentially modified with a new session identifier- are save in elasticsearch. And web sessions are passed to the next processor. + +WebSession information are: +- first and last visited page +- first and last timestamp of processed event +- total number of processed events +- the userId +- a boolean denoting if the web-session is still active or not +- an integer denoting the duration of the web-sessions +- optional fields that may be retrieved from the processed events + + + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.IncrementalWebSessionOld Tags ____ @@ -10239,7 +68884,7 @@ __________________ .. include:: ./details/IncrementalWebSession-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic: +.. _com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic: SetSourceOfTraffic ------------------ @@ -10249,17 +68894,17 @@ When analysing user experience on a webshop, it is crucial to collect, process, To compute the source of traffic of a web session, the user has to provide the utm_* related properties if available i-e: **utm_source.field**, **utm_medium.field**, **utm_campaign.field**, **utm_content.field**, **utm_term.field**) , the referer (**referer.field** property) and the first visited page of the session (**first.visited.page.field** property). -By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.suffix** property +By default the source of traffic information are placed in a flat structure (specified by the **source_of_traffic.prefix** property with a default value of source_of_traffic). To work properly the SetSourceOfTraffic processor needs to have access to an Elasticsearch index containing a list of the most popular search engines and social networks. The ES index (specified by the **es.index** property) should be structured such that the _id of an ES document MUST be the name of the domain. If the domain is a search engine, the related ES doc MUST have a boolean field (default being search_engine) specified by the property **es.search_engine.field** with a value set to true. If the domain is a social network , the related ES doc MUST have a boolean field (default being social_network) specified by the property **es.social_network.field** with a value set to true. Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic +com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic Tags ____ @@ -10281,7 +68926,7 @@ In the list below, the names of required properties appear in **bold**. Any othe "utm_campaign.field", "Name of the field containing the utm_campaign value in the session", "", "utm_campaign", "false", "false" "utm_content.field", "Name of the field containing the utm_content value in the session", "", "utm_content", "false", "false" "utm_term.field", "Name of the field containing the utm_term value in the session", "", "utm_term", "false", "false" - "source_of_traffic.suffix", "Suffix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" + "source_of_traffic.prefix", "Prefix for the source of the traffic related fields", "", "source_of_traffic", "false", "false" "source_of_traffic.hierarchical", "Should the additional source of trafic information fields be added under a hierarchical father field or not.", "", "false", "false", "false" "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" "**cache.service**", "Name of the cache service to use.", "", "null", "false", "false" @@ -10305,7 +68950,7 @@ Translates an IP address into a FQDN (Fully Qualified Domain Name). An input fie Module ______ -com.hurence.logisland:logisland-processor-enrichment:1.3.0 +com.hurence.logisland:logisland-processor-enrichment:1.4.0 Class _____ @@ -10345,7 +68990,7 @@ Looks up geolocation information for an IP address. The attribute that contains Module ______ -com.hurence.logisland:logisland-processor-enrichment:1.3.0 +com.hurence.logisland:logisland-processor-enrichment:1.4.0 Class _____ @@ -10386,7 +69031,7 @@ The ParseNetworkPacket processor is the LogIsland entry point to parse network p Module ______ -com.hurence.logisland:logisland-processor-cyber-security:1.3.0 +com.hurence.logisland:logisland-processor-cyber-security:1.4.0 Class _____ @@ -10422,7 +69067,7 @@ Indexes the content of a Record in Elasticsearch using elasticsearch's bulk proc Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -10453,46 +69098,6 @@ __________________ .. include:: ./details/BulkAddElasticsearch-Detail.rst ---------- -.. _com.hurence.logisland.processor.hbase.FetchHBaseRow: - -FetchHBaseRow -------------- -Fetches a row from an HBase table. The Destination property controls whether the cells are added as flow file attributes, or the row is written to the flow file content as JSON. This processor may be used to fetch a fixed row on a interval by specifying the table and row id directly in the processor, or it may be used to dynamically fetch rows by referencing the table and row id from incoming flow files. - -Module -______ -com.hurence.logisland:logisland-processor-hbase:1.3.0 - -Class -_____ -com.hurence.logisland.processor.hbase.FetchHBaseRow - -Tags -____ -hbase, scan, fetch, get, enrich - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" - "**table.name.field**", "The field containing the name of the HBase Table to fetch from.", "", "null", "false", "**true**" - "**row.identifier.field**", "The field containing the identifier of the row to fetch.", "", "null", "false", "**true**" - "columns.field", "The field containing an optional comma-separated list of \"\":\"\" pairs to fetch. To return all columns for a given family, leave off the qualifier such as \"\",\"\".", "", "null", "false", "**true**" - "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" - "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" - "table.name.default", "The table to use if table name field is not set", "", "null", "false", "false" - -Extra informations -__________________ -.. include:: ./details/FetchHBaseRow-Detail.rst ----------- - .. _com.hurence.logisland.processor.elasticsearch.MultiGetElasticsearch: MultiGetElasticsearch @@ -10518,7 +69123,7 @@ Each outcoming record holds data of one elasticsearch retrieved document. This d Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -10549,51 +69154,6 @@ __________________ .. include:: ./details/MultiGetElasticsearch-Detail.rst ---------- -.. _com.hurence.logisland.processor.hbase.PutHBaseCell: - -PutHBaseCell ------------- -Adds the Contents of a Record to HBase as the value of a single cell - -Module -______ -com.hurence.logisland:logisland-processor-hbase:1.3.0 - -Class -_____ -com.hurence.logisland.processor.hbase.PutHBaseCell - -Tags -____ -hadoop, hbase - -Properties -__________ -In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . - -.. csv-table:: allowable-values - :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" - :widths: 20,60,30,20,10,10 - :escape: \ - - "**hbase.client.service**", "The instance of the Controller Service to use for accessing HBase.", "", "null", "false", "false" - "**table.name.field**", "The field containing the name of the HBase Table to put data into", "", "null", "false", "**true**" - "row.identifier.field", "Specifies field containing the Row ID to use when inserting data into HBase", "", "null", "false", "**true**" - "row.identifier.encoding.strategy", "Specifies the data type of Row ID used when inserting data into HBase. The default behavior is to convert the row id to a UTF-8 byte array. Choosing Binary will convert a binary formatted string to the correct byte[] representation. The Binary option should be used if you are using Binary row keys in HBase", "String (Stores the value of row id as a UTF-8 String.), Binary (Stores the value of the rows id as a binary byte array. It expects that the row id is a binary formatted string.)", "String", "false", "false" - "**column.family.field**", "The field containing the Column Family to use when inserting data into HBase", "", "null", "false", "**true**" - "**column.qualifier.field**", "The field containing the Column Qualifier to use when inserting data into HBase", "", "null", "false", "**true**" - "**batch.size**", "The maximum number of Records to process in a single execution. The Records will be grouped by table, and a single Put per table will be performed.", "", "25", "false", "false" - "record.schema", "the avro schema definition for the Avro serialization", "", "null", "false", "false" - "record.serializer", "the serializer needed to i/o the record in the HBase row", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), none (send events as bytes)", "com.hurence.logisland.serializer.KryoSerializer", "false", "false" - "table.name.default", "The table table to use if table name field is not set", "", "null", "false", "false" - "column.family.default", "The column family to use if column family field is not set", "", "null", "false", "false" - "column.qualifier.default", "The column qualifier to use if column qualifier field is not set", "", "null", "false", "false" - -Extra informations -__________________ -.. include:: ./details/PutHBaseCell-Detail.rst ----------- - .. _com.hurence.logisland.processor.xml.EvaluateXPath: EvaluateXPath @@ -10602,7 +69162,7 @@ Evaluates one or more XPaths against the content of a record. The results of tho Module ______ -com.hurence.logisland:logisland-processor-xml:1.3.0 +com.hurence.logisland:logisland-processor-xml:1.4.0 Class _____ @@ -10641,7 +69201,7 @@ __________________ .. include:: ./details/EvaluateXPath-Detail.rst ---------- -.. _com.hurence.logisland.processor.webAnalytics.ConsolidateSession: +.. _com.hurence.logisland.processor.webanalytics.ConsolidateSession: ConsolidateSession ------------------ @@ -10651,11 +69211,11 @@ The ConsolidateSession processor is the Logisland entry point to get and process Module ______ -com.hurence.logisland:logisland-processor-web-analytics:1.3.0 +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 Class _____ -com.hurence.logisland.processor.webAnalytics.ConsolidateSession +com.hurence.logisland.processor.webanalytics.ConsolidateSession Tags ____ @@ -10689,6 +69249,10 @@ In the list below, the names of required properties appear in **bold**. Any othe Extra informations __________________ .. include:: ./details/ConsolidateSession-Detail.rst +See Also: +_________ +`com.hurence.logisland.processor.webanalytics.IncrementalWebSession`_ + ---------- .. _com.hurence.logisland.processor.DetectOutliers: @@ -10714,7 +69278,7 @@ This becomes a data filter which can be attached to a timeseries data stream wit Module ______ -com.hurence.logisland:logisland-processor-outlier-detection:1.3.0 +com.hurence.logisland:logisland-processor-outlier-detection:1.4.0 Class _____ @@ -10778,7 +69342,7 @@ Each outcoming record holds at least the input record plus potentially one or mo Module ______ -com.hurence.logisland:logisland-processor-elasticsearch:1.3.0 +com.hurence.logisland:logisland-processor-elasticsearch:1.4.0 Class _____ @@ -10800,9 +69364,10 @@ In the list below, the names of required properties appear in **bold**. Any othe "**elasticsearch.client.service**", "The instance of the Controller Service to use for accessing Elasticsearch.", "", "null", "false", "false" "**record.key**", "The name of field in the input record containing the document id to use in ES multiget query", "", "null", "false", "**true**" "**es.index**", "The name of the ES index to use in multiget query. ", "", "null", "false", "**true**" - "es.type", "The name of the ES type to use in multiget query.", "", "default", "false", "**true**" + "es.type", "The name of the ES type to use in multiget query.", "", "_doc", "false", "**true**" "es.includes.field", "The name of the ES fields to include in the record.", "", "*", "false", "**true**" "es.excludes.field", "The name of the ES fields to exclude.", "", "N/A", "false", "false" + "cache.service", "The instance of the Cache Service to use (optional).", "", "null", "false", "false" Extra informations __________________ @@ -10817,7 +69382,7 @@ Consumes a Microsoft Excel document and converts each worksheet's line to a stru Module ______ -com.hurence.logisland:logisland-processor-excel:1.3.0 +com.hurence.logisland:logisland-processor-excel:1.4.0 Class _____ @@ -10874,7 +69439,7 @@ Please read the `Lucene syntax guide ,,...,. So fields name can not contain ',' nor ':'", "", "null", "false", "false" + "conflict.resolution.policy", "What to do when a field with the same name already exists ?", "overwrite_existing (if field already exist), keep_only_old_field (keep only old field)", "keep_only_old_field", "false", "false" + "url.keep.params", "List of param names to keep in the input url (others will be removed). Can not be given at the same time as url.remove.params or url.remove.all", "", "null", "false", "false" + "url.remove.params", "List of param names to remove from the input url (others will be kept). Can not be given at the same time as url.keep.params or url.remove.all", "", "null", "false", "false" + "url.remove.all", "Remove all params if true.", "", "null", "false", "false" + "parameter.separator", "the character to use to separate the parameters in the query part of the uris", "", "&", "false", "false" + "key.value.separator", "the character to use to separate the parameter name from the parameter value in the query part of the uris", "", "=", "false", "false" + +Extra informations +__________________ +.. include:: ./details/URLDecoder-Detail.rst +---------- + +.. _com.hurence.logisland.processor.webanalytics.URLDecoder: + +URLDecoder +---------- +Decode one or more field containing an URL with possibly special chars encoded +... + +Module +______ +com.hurence.logisland:logisland-processor-web-analytics:1.4.0 + +Class +_____ +com.hurence.logisland.processor.webanalytics.URLDecoder + +Tags +____ +record, fields, Decode + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**decode.fields**", "List of fields (URL) to decode", "", "null", "false", "false" + "charset", "Charset to use to decode the URL", "", "UTF-8", "false", "false" Extra informations __________________ diff --git a/logisland-documentation/user/components/services.rst b/logisland-documentation/user/components/services.rst index d95e8fe1c..30b5025be 100644 --- a/logisland-documentation/user/components/services.rst +++ b/logisland-documentation/user/components/services.rst @@ -17,7 +17,7 @@ A cache that store csv lines as records loaded from a file Module ______ -com.hurence.logisland:logisland-service-inmemory-cache:1.3.0 +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 Class _____ @@ -59,7 +59,7 @@ Provides a controller service that for the moment only allows to bulkput records Module ______ -com.hurence.logisland:logisland-service-cassandra-client:1.3.0 +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 Class _____ @@ -101,7 +101,7 @@ Implementation of ElasticsearchClientService for Elasticsearch 2.4.0. Module ______ -com.hurence.logisland:logisland-service-elasticsearch_2_4_0-client:1.3.0 +com.hurence.logisland:logisland-service-elasticsearch_2_4_0-client:1.4.0 Class _____ @@ -151,7 +151,7 @@ Implementation of ElasticsearchClientService for Elasticsearch 5.4.0. Module ______ -com.hurence.logisland:logisland-service-elasticsearch_5_4_0-client:1.3.0 +com.hurence.logisland:logisland-service-elasticsearch_5_4_0-client:1.4.0 Class _____ @@ -201,7 +201,7 @@ Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. Module ______ -com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.3.0 +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 Class _____ @@ -250,7 +250,7 @@ Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that al Module ______ -com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.3.0 +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 Class _____ @@ -299,7 +299,7 @@ Implementation of HBaseClientService for HBase 1.1.2. This service can be config Module ______ -com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.3.0 +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 Class _____ @@ -350,7 +350,7 @@ Provides a controller service that for the moment only allows to bulkput records Module ______ -com.hurence.logisland:logisland-service-influxdb-client:1.3.0 +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 Class _____ @@ -396,7 +396,7 @@ A controller service for caching data by key value pair with LRU (last recently Module ______ -com.hurence.logisland:logisland-service-inmemory-cache:1.3.0 +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 Class _____ @@ -431,7 +431,7 @@ Implementation of the IP 2 GEO Service using maxmind lite db file Module ______ -com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.3.0 +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 Class _____ @@ -469,7 +469,7 @@ Provides a controller service that wraps most of the functionality of the MongoD Module ______ -com.hurence.logisland:logisland-service-mongodb-client:1.3.0 +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 Class _____ @@ -512,7 +512,7 @@ A controller service for caching records by key value pair with LRU (last recent Module ______ -com.hurence.logisland:logisland-service-redis:1.3.0 +com.hurence.logisland:logisland-service-redis:1.4.0 Class _____ @@ -566,7 +566,7 @@ Implementation of SolrClientService for Solr 8 Module ______ -com.hurence.logisland:logisland-service-solr_8-client:1.3.0 +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 Class _____ @@ -608,7 +608,7 @@ Implementation of ChronixClientService for Solr 6 4 2 Module ______ -com.hurence.logisland:logisland-service-solr_chronix_6_4_2-client:1.3.0 +com.hurence.logisland:logisland-service-solr_chronix_6_4_2-client:1.4.0 Class _____ @@ -648,7 +648,7 @@ Implementation of ElasticsearchClientService for Solr 5.5.5. Module ______ -com.hurence.logisland:logisland-service-solr_6_6_2-client:1.3.0 +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 Class _____ @@ -690,7 +690,7 @@ Implementation of ChronixClientService for Solr 8 Module ______ -com.hurence.logisland:logisland-service-solr_chronix_8-client:1.3.0 +com.hurence.logisland:logisland-service-solr_chronix_8-client:1.4.0 Class _____ @@ -730,7 +730,7 @@ Implementation of the IP 2 GEO Service using maxmind lite db file Module ______ -com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.3.0 +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 Class _____ @@ -768,7 +768,7 @@ A cache that store csv lines as records loaded from a file Module ______ -com.hurence.logisland:logisland-service-inmemory-cache:1.3.0 +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 Class _____ @@ -810,7 +810,7 @@ Provides a controller service that for the moment only allows to bulkput records Module ______ -com.hurence.logisland:logisland-service-cassandra-client:1.3.0 +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 Class _____ @@ -852,7 +852,7 @@ Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. Module ______ -com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.3.0 +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 Class _____ @@ -901,7 +901,7 @@ Implementation of HBaseClientService for HBase 1.1.2. This service can be config Module ______ -com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.3.0 +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 Class _____ @@ -952,7 +952,7 @@ Provides a controller service that for the moment only allows to bulkput records Module ______ -com.hurence.logisland:logisland-service-influxdb-client:1.3.0 +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 Class _____ @@ -998,7 +998,7 @@ A controller service for caching data by key value pair with LRU (last recently Module ______ -com.hurence.logisland:logisland-service-inmemory-cache:1.3.0 +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 Class _____ @@ -1033,7 +1033,7 @@ Provides a controller service that wraps most of the functionality of the MongoD Module ______ -com.hurence.logisland:logisland-service-mongodb-client:1.3.0 +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 Class _____ @@ -1076,7 +1076,7 @@ A controller service for caching records by key value pair with LRU (last recent Module ______ -com.hurence.logisland:logisland-service-redis:1.3.0 +com.hurence.logisland:logisland-service-redis:1.4.0 Class _____ @@ -1130,7 +1130,7 @@ Implementation of ElasticsearchClientService for Solr 5.5.5. Module ______ -com.hurence.logisland:logisland-service-solr_6_6_2-client:1.3.0 +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 Class _____ @@ -1172,7 +1172,7 @@ Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that al Module ______ -com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.3.0 +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 Class _____ @@ -1221,7 +1221,7 @@ Implementation of SolrClientService for Solr 8 Module ______ -com.hurence.logisland:logisland-service-solr_8-client:1.3.0 +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 Class _____ @@ -1263,7 +1263,7 @@ Implementation of the IP 2 GEO Service using maxmind lite db file Module ______ -com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.3.0 +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 Class _____ @@ -1301,7 +1301,7 @@ A cache that store csv lines as records loaded from a file Module ______ -com.hurence.logisland:logisland-service-inmemory-cache:1.3.0 +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 Class _____ @@ -1343,7 +1343,7 @@ Provides a controller service that for the moment only allows to bulkput records Module ______ -com.hurence.logisland:logisland-service-cassandra-client:1.3.0 +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 Class _____ @@ -1385,7 +1385,7 @@ Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. Module ______ -com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.3.0 +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 Class _____ @@ -1434,7 +1434,7 @@ Implementation of HBaseClientService for HBase 1.1.2. This service can be config Module ______ -com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.3.0 +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 Class _____ @@ -1485,7 +1485,7 @@ Provides a controller service that for the moment only allows to bulkput records Module ______ -com.hurence.logisland:logisland-service-influxdb-client:1.3.0 +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 Class _____ @@ -1531,7 +1531,7 @@ A controller service for caching data by key value pair with LRU (last recently Module ______ -com.hurence.logisland:logisland-service-inmemory-cache:1.3.0 +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 Class _____ @@ -1566,7 +1566,7 @@ Provides a controller service that wraps most of the functionality of the MongoD Module ______ -com.hurence.logisland:logisland-service-mongodb-client:1.3.0 +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 Class _____ @@ -1609,7 +1609,7 @@ A controller service for caching records by key value pair with LRU (last recent Module ______ -com.hurence.logisland:logisland-service-redis:1.3.0 +com.hurence.logisland:logisland-service-redis:1.4.0 Class _____ @@ -1663,7 +1663,7 @@ Implementation of ElasticsearchClientService for Solr 5.5.5. Module ______ -com.hurence.logisland:logisland-service-solr_6_6_2-client:1.3.0 +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 Class _____ @@ -1705,7 +1705,7 @@ Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that al Module ______ -com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.3.0 +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 Class _____ @@ -1754,7 +1754,7 @@ Implementation of SolrClientService for Solr 8 Module ______ -com.hurence.logisland:logisland-service-solr_8-client:1.3.0 +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 Class _____ @@ -1796,7 +1796,7 @@ Implementation of the IP 2 GEO Service using maxmind lite db file Module ______ -com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.3.0 +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 Class _____ @@ -1834,7 +1834,7 @@ A cache that store csv lines as records loaded from a file Module ______ -com.hurence.logisland:logisland-service-inmemory-cache:1.3.0 +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 Class _____ @@ -1876,7 +1876,7 @@ Provides a controller service that for the moment only allows to bulkput records Module ______ -com.hurence.logisland:logisland-service-cassandra-client:1.3.0 +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 Class _____ @@ -1918,7 +1918,7 @@ Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. Module ______ -com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.3.0 +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 Class _____ @@ -1967,7 +1967,7 @@ Implementation of HBaseClientService for HBase 1.1.2. This service can be config Module ______ -com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.3.0 +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 Class _____ @@ -2018,7 +2018,7 @@ Provides a controller service that for the moment only allows to bulkput records Module ______ -com.hurence.logisland:logisland-service-influxdb-client:1.3.0 +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 Class _____ @@ -2064,7 +2064,7 @@ A controller service for caching data by key value pair with LRU (last recently Module ______ -com.hurence.logisland:logisland-service-inmemory-cache:1.3.0 +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 Class _____ @@ -2099,7 +2099,7 @@ Provides a controller service that wraps most of the functionality of the MongoD Module ______ -com.hurence.logisland:logisland-service-mongodb-client:1.3.0 +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 Class _____ @@ -2142,7 +2142,7 @@ A controller service for caching records by key value pair with LRU (last recent Module ______ -com.hurence.logisland:logisland-service-redis:1.3.0 +com.hurence.logisland:logisland-service-redis:1.4.0 Class _____ @@ -2196,7 +2196,7 @@ Implementation of ElasticsearchClientService for Solr 5.5.5. Module ______ -com.hurence.logisland:logisland-service-solr_6_6_2-client:1.3.0 +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 Class _____ @@ -2238,7 +2238,7 @@ Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that al Module ______ -com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.3.0 +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 Class _____ @@ -2287,7 +2287,7 @@ Implementation of SolrClientService for Solr 8 Module ______ -com.hurence.logisland:logisland-service-solr_8-client:1.3.0 +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 Class _____ @@ -2329,7 +2329,7 @@ Implementation of the IP 2 GEO Service using maxmind lite db file Module ______ -com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.3.0 +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 Class _____ @@ -2367,7 +2367,7 @@ A cache that store csv lines as records loaded from a file Module ______ -com.hurence.logisland:logisland-service-inmemory-cache:1.3.0 +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 Class _____ @@ -2409,7 +2409,7 @@ Provides a controller service that for the moment only allows to bulkput records Module ______ -com.hurence.logisland:logisland-service-cassandra-client:1.3.0 +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 Class _____ @@ -2451,7 +2451,7 @@ Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. Module ______ -com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.3.0 +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 Class _____ @@ -2500,7 +2500,7 @@ Implementation of HBaseClientService for HBase 1.1.2. This service can be config Module ______ -com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.3.0 +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 Class _____ @@ -2551,7 +2551,7 @@ Provides a controller service that for the moment only allows to bulkput records Module ______ -com.hurence.logisland:logisland-service-influxdb-client:1.3.0 +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 Class _____ @@ -2597,7 +2597,7 @@ A controller service for caching data by key value pair with LRU (last recently Module ______ -com.hurence.logisland:logisland-service-inmemory-cache:1.3.0 +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 Class _____ @@ -2632,7 +2632,7 @@ Provides a controller service that wraps most of the functionality of the MongoD Module ______ -com.hurence.logisland:logisland-service-mongodb-client:1.3.0 +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 Class _____ @@ -2675,7 +2675,7 @@ A controller service for caching records by key value pair with LRU (last recent Module ______ -com.hurence.logisland:logisland-service-redis:1.3.0 +com.hurence.logisland:logisland-service-redis:1.4.0 Class _____ @@ -2729,7 +2729,7 @@ Implementation of ElasticsearchClientService for Solr 5.5.5. Module ______ -com.hurence.logisland:logisland-service-solr_6_6_2-client:1.3.0 +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 Class _____ @@ -2771,7 +2771,7 @@ Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that al Module ______ -com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.3.0 +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 Class _____ @@ -2820,7 +2820,7 @@ Implementation of SolrClientService for Solr 8 Module ______ -com.hurence.logisland:logisland-service-solr_8-client:1.3.0 +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 Class _____ @@ -2862,7 +2862,7 @@ Implementation of the IP 2 GEO Service using maxmind lite db file Module ______ -com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.3.0 +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 Class _____ @@ -2900,7 +2900,7 @@ A cache that store csv lines as records loaded from a file Module ______ -com.hurence.logisland:logisland-service-inmemory-cache:1.3.0 +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 Class _____ @@ -2942,7 +2942,7 @@ Provides a controller service that for the moment only allows to bulkput records Module ______ -com.hurence.logisland:logisland-service-cassandra-client:1.3.0 +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 Class _____ @@ -2984,7 +2984,7 @@ Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. Module ______ -com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.3.0 +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 Class _____ @@ -3033,7 +3033,7 @@ Implementation of HBaseClientService for HBase 1.1.2. This service can be config Module ______ -com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.3.0 +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 Class _____ @@ -3084,7 +3084,7 @@ Provides a controller service that for the moment only allows to bulkput records Module ______ -com.hurence.logisland:logisland-service-influxdb-client:1.3.0 +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 Class _____ @@ -3130,7 +3130,7 @@ A controller service for caching data by key value pair with LRU (last recently Module ______ -com.hurence.logisland:logisland-service-inmemory-cache:1.3.0 +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 Class _____ @@ -3165,7 +3165,7 @@ Provides a controller service that wraps most of the functionality of the MongoD Module ______ -com.hurence.logisland:logisland-service-mongodb-client:1.3.0 +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 Class _____ @@ -3208,7 +3208,7 @@ A controller service for caching records by key value pair with LRU (last recent Module ______ -com.hurence.logisland:logisland-service-redis:1.3.0 +com.hurence.logisland:logisland-service-redis:1.4.0 Class _____ @@ -3262,7 +3262,7 @@ Implementation of ElasticsearchClientService for Solr 5.5.5. Module ______ -com.hurence.logisland:logisland-service-solr_6_6_2-client:1.3.0 +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 Class _____ @@ -3304,7 +3304,7 @@ Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that al Module ______ -com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.3.0 +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 Class _____ @@ -3353,7 +3353,7 @@ Implementation of SolrClientService for Solr 8 Module ______ -com.hurence.logisland:logisland-service-solr_8-client:1.3.0 +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 Class _____ @@ -3395,7 +3395,7 @@ Implementation of the IP 2 GEO Service using maxmind lite db file Module ______ -com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.3.0 +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 Class _____ @@ -3433,7 +3433,7 @@ A cache that store csv lines as records loaded from a file Module ______ -com.hurence.logisland:logisland-service-inmemory-cache:1.3.0 +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 Class _____ @@ -3475,7 +3475,7 @@ Provides a controller service that for the moment only allows to bulkput records Module ______ -com.hurence.logisland:logisland-service-cassandra-client:1.3.0 +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 Class _____ @@ -3517,7 +3517,7 @@ Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. Module ______ -com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.3.0 +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 Class _____ @@ -3566,7 +3566,7 @@ Implementation of HBaseClientService for HBase 1.1.2. This service can be config Module ______ -com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.3.0 +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 Class _____ @@ -3617,7 +3617,7 @@ Provides a controller service that for the moment only allows to bulkput records Module ______ -com.hurence.logisland:logisland-service-influxdb-client:1.3.0 +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 Class _____ @@ -3663,7 +3663,7 @@ A controller service for caching data by key value pair with LRU (last recently Module ______ -com.hurence.logisland:logisland-service-inmemory-cache:1.3.0 +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 Class _____ @@ -3698,7 +3698,7 @@ Provides a controller service that wraps most of the functionality of the MongoD Module ______ -com.hurence.logisland:logisland-service-mongodb-client:1.3.0 +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 Class _____ @@ -3741,7 +3741,7 @@ A controller service for caching records by key value pair with LRU (last recent Module ______ -com.hurence.logisland:logisland-service-redis:1.3.0 +com.hurence.logisland:logisland-service-redis:1.4.0 Class _____ @@ -3795,7 +3795,7 @@ Implementation of ElasticsearchClientService for Solr 5.5.5. Module ______ -com.hurence.logisland:logisland-service-solr_6_6_2-client:1.3.0 +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 Class _____ @@ -3837,7 +3837,7 @@ Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that al Module ______ -com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.3.0 +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 Class _____ @@ -3886,7 +3886,7 @@ Implementation of SolrClientService for Solr 8 Module ______ -com.hurence.logisland:logisland-service-solr_8-client:1.3.0 +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 Class _____ @@ -3928,7 +3928,7 @@ Implementation of the IP 2 GEO Service using maxmind lite db file Module ______ -com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.3.0 +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 Class _____ @@ -3966,7 +3966,7 @@ A cache that store csv lines as records loaded from a file Module ______ -com.hurence.logisland:logisland-service-inmemory-cache:1.3.0 +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 Class _____ @@ -4008,7 +4008,7 @@ Provides a controller service that for the moment only allows to bulkput records Module ______ -com.hurence.logisland:logisland-service-cassandra-client:1.3.0 +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 Class _____ @@ -4050,7 +4050,7 @@ Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. Module ______ -com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.3.0 +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 Class _____ @@ -4099,7 +4099,7 @@ Implementation of HBaseClientService for HBase 1.1.2. This service can be config Module ______ -com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.3.0 +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 Class _____ @@ -4150,7 +4150,7 @@ Provides a controller service that for the moment only allows to bulkput records Module ______ -com.hurence.logisland:logisland-service-influxdb-client:1.3.0 +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 Class _____ @@ -4196,7 +4196,7 @@ A controller service for caching data by key value pair with LRU (last recently Module ______ -com.hurence.logisland:logisland-service-inmemory-cache:1.3.0 +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 Class _____ @@ -4231,7 +4231,7 @@ Provides a controller service that wraps most of the functionality of the MongoD Module ______ -com.hurence.logisland:logisland-service-mongodb-client:1.3.0 +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 Class _____ @@ -4274,7 +4274,7 @@ A controller service for caching records by key value pair with LRU (last recent Module ______ -com.hurence.logisland:logisland-service-redis:1.3.0 +com.hurence.logisland:logisland-service-redis:1.4.0 Class _____ @@ -4328,7 +4328,7 @@ Implementation of ElasticsearchClientService for Solr 5.5.5. Module ______ -com.hurence.logisland:logisland-service-solr_6_6_2-client:1.3.0 +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 Class _____ @@ -4370,7 +4370,7 @@ Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that al Module ______ -com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.3.0 +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 Class _____ @@ -4419,7 +4419,7 @@ Implementation of SolrClientService for Solr 8 Module ______ -com.hurence.logisland:logisland-service-solr_8-client:1.3.0 +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 Class _____ @@ -4461,7 +4461,7 @@ Implementation of the IP 2 GEO Service using maxmind lite db file Module ______ -com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.3.0 +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 Class _____ @@ -4499,7 +4499,7 @@ A cache that store csv lines as records loaded from a file Module ______ -com.hurence.logisland:logisland-service-inmemory-cache:1.3.0 +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 Class _____ @@ -4541,7 +4541,7 @@ Provides a controller service that for the moment only allows to bulkput records Module ______ -com.hurence.logisland:logisland-service-cassandra-client:1.3.0 +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 Class _____ @@ -4583,7 +4583,7 @@ Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. Module ______ -com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.3.0 +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 Class _____ @@ -4632,7 +4632,7 @@ Implementation of HBaseClientService for HBase 1.1.2. This service can be config Module ______ -com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.3.0 +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 Class _____ @@ -4683,7 +4683,7 @@ Provides a controller service that for the moment only allows to bulkput records Module ______ -com.hurence.logisland:logisland-service-influxdb-client:1.3.0 +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 Class _____ @@ -4729,7 +4729,7 @@ A controller service for caching data by key value pair with LRU (last recently Module ______ -com.hurence.logisland:logisland-service-inmemory-cache:1.3.0 +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 Class _____ @@ -4764,7 +4764,7 @@ Provides a controller service that wraps most of the functionality of the MongoD Module ______ -com.hurence.logisland:logisland-service-mongodb-client:1.3.0 +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 Class _____ @@ -4807,7 +4807,7 @@ A controller service for caching records by key value pair with LRU (last recent Module ______ -com.hurence.logisland:logisland-service-redis:1.3.0 +com.hurence.logisland:logisland-service-redis:1.4.0 Class _____ @@ -4861,7 +4861,7 @@ Implementation of ElasticsearchClientService for Solr 5.5.5. Module ______ -com.hurence.logisland:logisland-service-solr_6_6_2-client:1.3.0 +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 Class _____ @@ -4903,7 +4903,7 @@ Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that al Module ______ -com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.3.0 +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 Class _____ @@ -4952,7 +4952,7 @@ Implementation of SolrClientService for Solr 8 Module ______ -com.hurence.logisland:logisland-service-solr_8-client:1.3.0 +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 Class _____ @@ -4994,7 +4994,7 @@ Implementation of the IP 2 GEO Service using maxmind lite db file Module ______ -com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.3.0 +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 Class _____ @@ -5032,7 +5032,7 @@ A cache that store csv lines as records loaded from a file Module ______ -com.hurence.logisland:logisland-service-inmemory-cache:1.3.0 +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 Class _____ @@ -5074,7 +5074,7 @@ Provides a controller service that for the moment only allows to bulkput records Module ______ -com.hurence.logisland:logisland-service-cassandra-client:1.3.0 +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 Class _____ @@ -5116,7 +5116,7 @@ Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. Module ______ -com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.3.0 +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 Class _____ @@ -5165,7 +5165,7 @@ Implementation of HBaseClientService for HBase 1.1.2. This service can be config Module ______ -com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.3.0 +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 Class _____ @@ -5216,7 +5216,7 @@ Provides a controller service that for the moment only allows to bulkput records Module ______ -com.hurence.logisland:logisland-service-influxdb-client:1.3.0 +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 Class _____ @@ -5262,7 +5262,7 @@ A controller service for caching data by key value pair with LRU (last recently Module ______ -com.hurence.logisland:logisland-service-inmemory-cache:1.3.0 +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 Class _____ @@ -5297,7 +5297,7 @@ Provides a controller service that wraps most of the functionality of the MongoD Module ______ -com.hurence.logisland:logisland-service-mongodb-client:1.3.0 +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 Class _____ @@ -5340,7 +5340,7 @@ A controller service for caching records by key value pair with LRU (last recent Module ______ -com.hurence.logisland:logisland-service-redis:1.3.0 +com.hurence.logisland:logisland-service-redis:1.4.0 Class _____ @@ -5394,7 +5394,7 @@ Implementation of ElasticsearchClientService for Solr 5.5.5. Module ______ -com.hurence.logisland:logisland-service-solr_6_6_2-client:1.3.0 +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 Class _____ @@ -5436,7 +5436,7 @@ Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that al Module ______ -com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.3.0 +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 Class _____ @@ -5485,7 +5485,26557 @@ Implementation of SolrClientService for Solr 8 Module ______ -com.hurence.logisland:logisland-service-solr_8-client:1.3.0 +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.3.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.3.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.3.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.3.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.3.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.3.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.3.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.3.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.3.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.3.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.3.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.3.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + "geolocation.output.field.name", "Label used to name the output record field for geolocation properties", "", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService: + +HBase_1_1_2_ClientService +------------------------- +Implementation of HBaseClientService for HBase 1.1.2. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration. + +Module +______ +com.hurence.logisland:logisland-service-hbase_1_1_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.hbase.HBase_1_1_2_ClientService + +Tags +____ +hbase, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "hadoop.configuration.files", "Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.", "", "null", "false", "false" + "zookeeper.quorum", "Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.client.port", "The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "zookeeper.znode.parent", "The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.", "", "null", "false", "false" + "hbase.client.retries", "The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.", "", "3", "false", "false" + "phoenix.client.jar.location", "The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.", "", "null", "false", "**true**" + +Dynamic Properties +__________________ +Dynamic Properties allow the user to specify both the name and value of a property. + +.. csv-table:: dynamic-properties + :header: "Name","Value","Description","Allowable Values","Default Value","EL" + :widths: 20,20,40,40,20,10 + :escape: \ + + "The name of an HBase configuration property.", "The value of the given HBase configuration property.", "These properties will be set on the HBase configuration after loading any provided configuration files.", "", "null", false + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + "geolocation.output.field.name", "Label used to name the output record field for geolocation properties", "", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + "geolocation.output.field.name", "Label used to name the output record field for geolocation properties", "", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + "geolocation.output.field.name", "Label used to name the output record field for geolocation properties", "", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr8ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService: + +MaxmindIpToGeoService +--------------------- +Implementation of the IP 2 GEO Service using maxmind lite db file + +Module +______ +com.hurence.logisland:logisland-service-ip-to-geo-maxmind:1.4.0 + +Class +_____ +com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + +Tags +____ +ip, service, geo, maxmind + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "maxmind.database.uri", "Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "maxmind.database.path", "Local Path to the Maxmind Geo Enrichment Database File.", "", "null", "false", "false" + "locale", "Locale to use for geo information. Defaults to 'en'.", "", "en", "false", "false" + "lookup.time", "Should the additional lookup_micros field be returned or not.", "", "false", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.CSVKeyValueCacheService: + +CSVKeyValueCacheService +----------------------- +A cache that store csv lines as records loaded from a file + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.CSVKeyValueCacheService + +Tags +____ +csv, service, cache + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**csv.format**", "a configuration for loading csv", "default (Standard comma separated format, as for RFC4180 but allowing empty lines. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(true)), excel (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), excel_fr (Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. withDelimiter(';') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false) withAllowMissingColumnNames(true)), mysql (Default MySQL format used by the SELECT INTO OUTFILE and LOAD DATA INFILE operations.This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with '\'. The default NULL string is \"\\N\". Settings are: withDelimiter('\t') withQuote(null) withRecordSeparator('\n') withIgnoreEmptyLines(false) withEscape('\\') withNullString(\"\\N\") withQuoteMode(QuoteMode.ALL_NON_NULL)), rfc4180 (Comma separated format as defined by RFC 4180. Settings are: withDelimiter(',') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreEmptyLines(false)), tdf (Tab-delimited format. Settings are: withDelimiter('\t') withQuote('\"') withRecordSeparator(\"\r\n\") withIgnoreSurroundingSpaces(true))", "default", "false", "false" + "csv.header", "comma separated header values", "", "null", "false", "false" + "csv.file.uri", "Path to the CSV File.", "", "null", "false", "false" + "csv.file.path", "Local Path to the CSV File.", "", "null", "false", "false" + "**row.key**", "th primary key of this db", "", "null", "false", "false" + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + "first.line.header", "csv headers grabbed from first line", "", "null", "false", "false" + "encoding.charset", "charset", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cassandra.CassandraControllerService: + +CassandraControllerService +-------------------------- +Provides a controller service that for the moment only allows to bulkput records into cassandra. + +Module +______ +com.hurence.logisland:logisland-service-cassandra-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.cassandra.CassandraControllerService + +Tags +____ +cassandra, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**cassandra.hosts**", "Cassandra cluster hosts as a comma separated value list", "", "null", "false", "false" + "**cassandra.port**", "Cassandra cluster port", "", "null", "false", "false" + "cassandra.with-ssl", "If this property is true, use SSL. Default is no SSL (false).", "", "false", "false", "false" + "cassandra.with-credentials", "If this property is true, use credentials. Default is no credentials (false).", "", "false", "false", "false" + "cassandra.credentials.user", "The user name to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "cassandra.credentials.password", "The user password to use for authentication. cassandra.with-credentials must be true for that property to be used.", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService: + +Elasticsearch_6_6_2_ClientService +--------------------------------- +Implementation of ElasticsearchClientService for Elasticsearch 6.6.2. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_6_6_2_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.influxdb.InfluxDBControllerService: + +InfluxDBControllerService +------------------------- +Provides a controller service that for the moment only allows to bulkput records into influxdb. + +Module +______ +com.hurence.logisland:logisland-service-influxdb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.influxdb.InfluxDBControllerService + +Tags +____ +influxdb, service, time series + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**influxdb.url**", "InfluxDB connection url", "", "null", "false", "false" + "influxdb.user", "The user name to use for authentication.", "", "null", "false", "false" + "**influxdb.database**", "InfluxDB database name", "", "null", "false", "false" + "influxdb.password", "The user password to use for authentication.", "", "null", "false", "false" + "influxdb.tags", "List of tags for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 tags: core1 and core2 and the mem measurement has 1 tag: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_fields_but_explicit_tags.", "", "null", "false", "false" + "influxdb.fields", "List of fields for each supported measurement. Syntax: :[,]...[;:,[]]... Example: cpu:core1,core2;mem:used : in this example, the cpu measurement has 2 fields: core1 and core2 and the mem measurement has 1 field: used. This must only be set if configuration mode is explicit_tags_and_fields or all_as_tags_but_explicit_fields.", "", "null", "false", "false" + "**influxdb.configuration_mode**", "Determines the way fields and tags are chosen from the logisland record. Possible values and meaning: explicit_tags_and_fields: only logisland record fields listed in influxdb.tags and influxdb.fields will be inserted into InfluxDB with the explicit type. all_as_fields: all available logisland record fields will be inserted into InfluxDB as fields. all_as_tags_but_explicit_fields: all available logisland record fields will be inserted into InfluxDB as tags except those listed in influxdb.fields that will be inserted into InfluxDB as fields. all_as_fields_but_explicit_tags: all available logisland record fields will be inserted into InfluxDB as fields except those listed in influxdb.tags that will be inserted into InfluxDB as tags", "explicit_tags_and_fields, all_as_fields, all_as_fields_but_explicit_tags, all_as_tags_but_explicit_fields", "null", "false", "false" + "influxdb.consistency_level", "Determines the consistency level used to write points into InfluxDB. Possible values are: ANY, ONE, QUORUMand ALL. Default value is ANY. This is only useful when using a clustered InfluxDB infrastructure.", "ANY, ONE, QUORUM, ALL", "ANY", "false", "false" + "influxdb.retention_policy", "Determines the name of the retention policy to use. Defaults to autogen. The defined retention policy must already be defined in the InfluxDB server.", "", "autogen", "false", "false" + "influxdb.timefield", "Time field for each supported measurement. Syntax: :,...[;:,]... With format being any constant defined in java.util.concurrent.TimeUnit enum: DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS or SECONDS. Example: cpu:time,NANOSECONDS;mem:timeStamp,MILLISECONDS In this example: for the cpu measurement, the time for the influx DB point matching the record will be the value of the time field that represents nanoseconds. For the mem measurement, the time for the influx DB point matching the record will be the value of the timeStamp field that represents milliseconds. Any measurement for which the time field is not defined will use the content of the record_time technical field as the time (which is a number of milliseconds since epoch).", "", "null", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.cache.LRUKeyValueCacheService: + +LRUKeyValueCacheService +----------------------- +A controller service for caching data by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-inmemory-cache:1.4.0 + +Class +_____ +com.hurence.logisland.service.cache.LRUKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, LRU + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "cache.size", "The maximum number of element in the cache.", "", "16384", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.mongodb.MongoDBControllerService: + +MongoDBControllerService +------------------------ +Provides a controller service that wraps most of the functionality of the MongoDB driver. + +Module +______ +com.hurence.logisland:logisland-service-mongodb-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.mongodb.MongoDBControllerService + +Tags +____ +mongo, mongodb, service + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property supports the `Expression Language `_ . + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**mongo.uri**", "MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]", "", "null", "false", "**true**" + "**mongo.db.name**", "The name of the database to use", "", "null", "false", "**true**" + "**mongo.collection.name**", "The name of the collection to use", "", "null", "false", "**true**" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "mongo.bulk.mode", "Bulk mode (insert or upsert)", "insert (Insert records whose key must be unique), upsert (Insert records if not already existing or update the record if already existing)", "insert", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "**mongo.write.concern**", "The write concern to use", "ACKNOWLEDGED, UNACKNOWLEDGED, FSYNCED, JOURNALED, REPLICA_ACKNOWLEDGED, MAJORITY", "ACKNOWLEDGED", "false", "false" + "mongo.bulk.upsert.condition", "A custom condition for the bulk upsert (Filter for the bulkwrite). If not specified the standard condition is to match same id ('_id': data._id)", "", "${'{ \"_id\" :\"' + record_id + '\"}'}", "false", "**true**" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.redis.service.RedisKeyValueCacheService: + +RedisKeyValueCacheService +------------------------- +A controller service for caching records by key value pair with LRU (last recently used) strategy. using LinkedHashMap + +Module +______ +com.hurence.logisland:logisland-service-redis:1.4.0 + +Class +_____ +com.hurence.logisland.redis.service.RedisKeyValueCacheService + +Tags +____ +cache, service, key, value, pair, redis + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**redis.mode**", "The type of Redis being communicated with - standalone, sentinel, or clustered.", "standalone (A single standalone Redis instance.), sentinel (Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel), cluster (Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec)", "standalone", "false", "false" + "**connection.string**", "The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.", "", "null", "false", "false" + "**database.index**", "The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.", "", "0", "false", "false" + "**communication.timeout**", "The timeout to use when attempting to communicate with Redis.", "", "10 seconds", "false", "false" + "**cluster.max.redirects**", "The maximum number of redirects that can be performed when clustered.", "", "5", "false", "false" + "sentinel.master", "The name of the sentinel master, require when Mode is set to Sentinel", "", "null", "false", "false" + "password", "The password used to authenticate to the Redis server. See the requirepass property in redis.conf.", "", "null", "**true**", "false" + "**pool.max.total**", "The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.", "", "8", "false", "false" + "**pool.max.idle**", "The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.", "", "8", "false", "false" + "**pool.min.idle**", "The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.", "", "0", "false", "false" + "**pool.block.when.exhausted**", "Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.", "true, false", "true", "false", "false" + "**pool.max.wait.time**", "The amount of time to wait for an available connection when Block When Exhausted is set to true.", "", "10 seconds", "false", "false" + "**pool.min.evictable.idle.time**", "The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.", "", "60 seconds", "false", "false" + "**pool.time.between.eviction.runs**", "The amount of time between attempting to evict idle connections from the pool.", "", "30 seconds", "false", "false" + "**pool.num.tests.per.eviction.run**", "The number of connections to tests per eviction attempt. A negative value indicates to test all connections.", "", "-1", "false", "false" + "**pool.test.on.create**", "Whether or not connections should be tested upon creation.", "true, false", "false", "false", "false" + "**pool.test.on.borrow**", "Whether or not connections should be tested upon borrowing from the pool.", "true, false", "false", "false", "false" + "**pool.test.on.return**", "Whether or not connections should be tested upon returning to the pool.", "true, false", "false", "false", "false" + "**pool.test.while.idle**", "Whether or not connections should be tested while idle.", "true, false", "true", "false", "false" + "**record.recordSerializer**", "the way to serialize/deserialize the record", "com.hurence.logisland.serializer.KryoSerializer (serialize events as json blocs), com.hurence.logisland.serializer.JsonSerializer (serialize events as json blocs), com.hurence.logisland.serializer.AvroSerializer (serialize events as avro blocs), com.hurence.logisland.serializer.BytesArraySerializer (serialize events as byte arrays), com.hurence.logisland.serializer.KuraProtobufSerializer (serialize events as Kura protocol buffer), none (send events as bytes)", "com.hurence.logisland.serializer.JsonSerializer", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr_6_6_2_ClientService: + +Solr_6_6_2_ClientService +------------------------ +Implementation of ElasticsearchClientService for Solr 5.5.5. + +Module +______ +com.hurence.logisland:logisland-service-solr_6_6_2-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.solr.Solr_6_6_2_ClientService + +Tags +____ +solr, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "**solr.cloud**", "is slor cloud enabled", "", "false", "false", "false" + "**solr.collection**", "name of the collection to use", "", "null", "false", "false" + "**solr.connection.string**", "zookeeper quorum host1:2181,host2:2181 for solr cloud or http address of a solr core ", "", "localhost:8983/solr", "false", "false" + "solr.concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "flush.interval", "flush interval in ms", "", "500", "false", "false" + "schema.update_timeout", "Schema update timeout interval in s", "", "15", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService: + +Elasticsearch_7_x_ClientService +------------------------------- +Implementation of ElasticsearchClientService for ElasticSearch 7.x. Note that although Elasticsearch 7.x still accepts type information, this implementation will ignore any type usage and will only work at the index level to be already compliant with the ElasticSearch 8.x version that will completely remove type usage. + +Module +______ +com.hurence.logisland:logisland-service-elasticsearch_7_x-client:1.4.0 + +Class +_____ +com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + +Tags +____ +elasticsearch, client + +Properties +__________ +In the list below, the names of required properties appear in **bold**. Any other properties (not in bold) are considered optional. The table also indicates any default values, and whether a property is considered "sensitive".. + +.. csv-table:: allowable-values + :header: "Name","Description","Allowable Values","Default Value","Sensitive","EL" + :widths: 20,60,30,20,10,10 + :escape: \ + + "**backoff.policy**", "strategy for retrying to execute requests in bulkRequest", "noBackoff (when a request fail there won't be any retry.), constantBackoff (wait a fixed amount of time between retries, using user put retry number and throttling delay), exponentialBackoff (time waited between retries grow exponentially, using user put retry number and throttling delay), defaultExponentialBackoff (time waited between retries grow exponentially, using es default parameters)", "defaultExponentialBackoff", "false", "false" + "**throttling.delay**", "number of time we should wait between each retry (in milliseconds)", "", "500", "false", "false" + "**num.retry**", "number of time we should try to inject a bulk into es", "", "3", "false", "false" + "batch.size", "The preferred number of Records to setField to the database in a single transaction", "", "1000", "false", "false" + "bulk.size", "bulk size in MB", "", "5", "false", "false" + "flush.interval", "flush interval in sec", "", "5", "false", "false" + "concurrent.requests", "setConcurrentRequests", "", "2", "false", "false" + "**ping.timeout**", "The ping timeout used to determine when a node is unreachable. For example, 5s (5 seconds). If non-local recommended is 30s", "", "5s", "false", "false" + "**sampler.interval**", "How often to sample / ping the nodes listed and connected. For example, 5s (5 seconds). If non-local recommended is 30s.", "", "5s", "false", "false" + "username", "Username to access the Elasticsearch cluster", "", "null", "false", "false" + "password", "Password to access the Elasticsearch cluster", "", "null", "**true**", "false" + "enable.ssl", "Whether to enable (true) TLS/SSL connections or not (false). This can for instance be used with opendistro. Defaults to false. Note that the current implementation does try to validate the server certificate.", "", "false", "false", "false" + "shield.location", "Specifies the path to the JAR for the Elasticsearch Shield plugin. If the Elasticsearch cluster has been secured with the Shield plugin, then the Shield plugin JAR must also be available to this processor. Note: Do NOT place the Shield JAR into NiFi's lib/ directory, doing so will prevent the Shield plugin from being loaded.", "", "null", "false", "false" + "**hosts**", "ElasticSearch Hosts, which should be comma separated and colon for hostname/port host1:port,host2:port,.... For example testcluster:9300.", "", "null", "false", "false" + "ssl.context.service", "The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Shield plugin is available.", "", "null", "false", "false" + "**charset**", "Specifies the character set of the document data.", "", "UTF-8", "false", "false" + "geolocation.output.field.name", "Label used to name the output record field for geolocation properties", "", "null", "false", "false" + +Extra informations +__________________ +No additional information is provided + +---------- + +.. _com.hurence.logisland.service.solr.Solr8ClientService: + +Solr8ClientService +------------------ +Implementation of SolrClientService for Solr 8 + +Module +______ +com.hurence.logisland:logisland-service-solr_8-client:1.4.0 Class _____ diff --git a/logisland-resources/pom.xml b/logisland-resources/pom.xml index be00d3ffa..918443df4 100644 --- a/logisland-resources/pom.xml +++ b/logisland-resources/pom.xml @@ -21,7 +21,7 @@ com.hurence.logisland logisland - 1.3.0 + 1.4.0 logisland-resources pom diff --git a/logisland-resources/src/main/resources/bin/logisland.sh b/logisland-resources/src/main/resources/bin/logisland.sh index 34e23faa4..c682be33e 100755 --- a/logisland-resources/src/main/resources/bin/logisland.sh +++ b/logisland-resources/src/main/resources/bin/logisland.sh @@ -29,6 +29,8 @@ VERBOSE_OPTIONS="" YARN_CLUSTER_OPTIONS="" APP_NAME="logisland" OPENCV_NATIVE_LIB_PATH="/usr/local/share/java/opencv4" +UPLOADED_CONF_FILE="logisland-configuration.yml" +DEBUG="false" # update $app_classpath so that it contains all logisland jars except for engines. # we look for jars into specified dir recursively. @@ -59,6 +61,22 @@ initSparkJarsOptRecursively() { return 0; } +# Create app classpath for spark standalone mode +initSparkStandaloneClassPath() { + for entry in `ls ${1}/*.jar` + do + #echo "add spark standalone jar ${entry}" + if [[ -z "$spark_standalone_classpath" ]] + then + spark_standalone_classpath="$entry" + else + spark_standalone_classpath="$entry,$spark_standalone_classpath" + fi + done + + echo $spark_standalone_classpath + return 0 +} # update $java_cp so that it contains all logisland jars except for engines. # we look for jars into specified dir recursively. @@ -98,11 +116,13 @@ usage() { echo echo "Options:" echo - echo " --conf : provides the configuration file" + echo " --conf : provide the configuration file" echo " --standalone start logisland in standalone mode (no spark required)" - echo " --spark-home : sets the SPARK_HOME (defaults to \$SPARK_HOME environment variable)" - echo " --help : displays help" + echo " --spark-home : set the SPARK_HOME (defaults to \$SPARK_HOME environment variable)" +# echo " --spark-standalone-dir : set the base shared directory for logisland jars for spark standlone (experimental)" echo " --kb : use kerberos" + echo " --help : display help" + echo " --debug : debug file for logs" } # compare versions @@ -157,6 +177,15 @@ parse_input() { case $KEY in --conf) CONF_FILE="$2" + case "$(uname -s)" in + Darwin) + echo "I've detected that you're running Mac OS X, using greadlink instead of readlink" + CONF_FILE_ABOSLUTE_PATH="$(greadlink -f "${CONF_FILE}")" + ;; + *) + CONF_FILE_ABOSLUTE_PATH=$(readlink -f "${CONF_FILE}") + ;; + esac shift ;; --standalone) @@ -172,10 +201,17 @@ parse_input() { SPARK_HOME="$2" shift ;; +# --spark-standalone-dir) +# SPARK_STANDALONE_DIR="$2" +# shift +# ;; --help) usage exit 0 ;; + --debug) + DEBUG="true" + ;; *) echo "Unsupported option : $KEY" usage @@ -252,22 +288,503 @@ run_standalone() { -conf ${CONF_FILE} } +#Update MODE variable depending on value in spark.master of job in conf file +update_mode() { + MODE=`awk '{ if( $1 == "spark.master:" ){ print $2 } }' ${CONF_FILE}` + # + # YARN mode? + # + case ${MODE} in + "yarn") + SPARK_MASTER=${MODE} + EXTRA_MODE=`awk '{ if( $1 == "spark.yarn.deploy-mode:" ){ print $2 } }' ${CONF_FILE}` + if [[ -z "${EXTRA_MODE}" ]] + then + echo "The property \"spark.yarn.deploy-mode\" is missing in config file \"${CONF_FILE}\"" + exit 1 + fi + + if [[ ! ${EXTRA_MODE} = "cluster" && ! ${EXTRA_MODE} = "client" ]] + then + echo "The property \"spark.yarn.deploy-mode\" value \"${EXTRA_MODE}\" is not supported" + exit 1 + else + MODE=${MODE}-${EXTRA_MODE} + fi + ;; + esac + + # + # MESOS mode? + # + if [[ "${MODE}" =~ "mesos" ]] + then + SPARK_MASTER=${MODE} + MODE="mesos" + fi + + # + # Spark standalone mode? + # + if [[ "${MODE}" =~ ^spark://.* ]] # Starts with spark:// (spark standalone url) + then + + SPARK_MASTER=${MODE} + EXTRA_MODE=`awk '{ if( $1 == "spark.deploy-mode:" ){ print $2 } }' ${CONF_FILE}` + if [[ -z "${EXTRA_MODE}" ]] + then + echo "The property \"spark.deploy-mode\" is missing in config file \"${CONF_FILE}\"" + exit 1 + fi + + if [[ ! ${EXTRA_MODE} = "cluster" && ! ${EXTRA_MODE} = "client" ]] + then + echo "The property \"spark.deploy-mode\" value \"${EXTRA_MODE}\" is not supported" + exit 1 + else + MODE=spark-${EXTRA_MODE} + fi + fi +} + +run_spark_local_mode() { + #--files ${CONF_DIR}/kafka_client_jaas_longrun.conf#kafka_client_jaas_longrun.conf,${CONF_DIR}/hurence.keytab#hurence.keytab \ + SPARK_MASTER=`awk '{ if( $1 == "spark.master:" ){ print $2 } }' ${CONF_FILE}` + echo "SPARK_MASTER is ${SPARK_MASTER}" + + if [[ "$USE_KERBEROS" = true ]] + then + echo "Using Kerberos" + KB_SETTINGS="-Djava.security.auth.login.config=${CONF_DIR}/kafka_client_jaas_longrun.conf" + fi + + SPARK_LOCAL_OPTIONS="--master ${SPARK_MASTER} --conf spark.metrics.namespace=\"${APP_NAME}\"" + + EXTRA_DRIVER_JAVA_OPTIONS="spark.driver.extraJavaOptions=${LOG4J_SETTINGS} ${KB_SETTINGS}" + EXTRA_EXECUTOR_JAVA_OPTIONS="spark.executor.extraJavaOptions=${LOG4J_SETTINGS} ${KB_SETTINGS}" + +# DRIVER_CORES=`awk '{ if( $1 == "spark.driver.cores:" ){ print $2 } }' ${CONF_FILE}` +# if [[ ! -z "${DRIVER_CORES}" ]] +# then +# SPARK_LOCAL_OPTIONS="${SPARK_LOCAL_OPTIONS} --driver-cores ${DRIVER_CORES}" +# fi + + DRIVER_MEMORY=`awk '{ if( $1 == "spark.driver.memory:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${DRIVER_MEMORY}" ]] + then + SPARK_LOCAL_OPTIONS="${SPARK_LOCAL_OPTIONS} --driver-memory ${DRIVER_MEMORY}" + fi + +# EXECUTORS_CORES=`awk '{ if( $1 == "spark.executor.cores:" ){ print $2 } }' ${CONF_FILE}` +# if [[ ! -z "${EXECUTORS_CORES}" ]] +# then +# YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --executor-cores ${EXECUTORS_CORES}" +# fi +# +# EXECUTORS_MEMORY=`awk '{ if( $1 == "spark.executor.memory:" ){ print $2 } }' ${CONF_FILE}` +# if [[ ! -z "${EXECUTORS_MEMORY}" ]] +# then +# YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --executor-memory ${EXECUTORS_MEMORY}" +# fi + + echo "Running logisland job in local :" + + ${SPARK_HOME}/bin/spark-submit ${VERBOSE_OPTIONS} ${SPARK_LOCAL_OPTIONS} \ + --conf "${EXTRA_DRIVER_JAVA_OPTIONS}" \ + --conf "${EXTRA_EXECUTOR_JAVA_OPTIONS}" \ + --conf spark.metrics.conf="${lib_dir}/../monitoring/metrics.properties" \ + --driver-library-path ${OPENCV_NATIVE_LIB_PATH} \ + --class ${app_mainclass} \ + --jars ${app_classpath} ${engine_jar} \ + -conf ${CONF_FILE_ABOSLUTE_PATH} +} + +run_yarn_client_mode() { + YARN_CLIENT_OPTIONS="--master yarn --deploy-mode client --conf spark.metrics.namespace=\"${APP_NAME}\"" + + if [[ "$DEBUG" = true ]]; then + LOG4J_FILE_TO_USE="log4j-debug.properties" + else + LOG4J_FILE_TO_USE="log4j.properties" + fi + YARN_FILES_OPTIONS="${CONF_DIR}/${LOG4J_FILE_TO_USE}#log4j.properties" + LOG4J_DRIVER_SETTINGS="-Dlog4j.configuration=file:${CONF_DIR}/${LOG4J_FILE_TO_USE}" + LOG4J_WORKERS_SETTINGS="-Dlog4j.configuration=log4j.properties" + + DRIVER_CORES=`awk '{ if( $1 == "spark.driver.cores:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${DRIVER_CORES}" ]] + then + YARN_CLIENT_OPTIONS="${YARN_CLIENT_OPTIONS} --driver-cores ${DRIVER_CORES}" + fi + + DRIVER_MEMORY=`awk '{ if( $1 == "spark.driver.memory:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${DRIVER_MEMORY}" ]] + then + YARN_CLIENT_OPTIONS="${YARN_CLIENT_OPTIONS} --driver-memory ${DRIVER_MEMORY}" + fi + + PROPERTIES_FILE_PATH=`awk '{ if( $1 == "spark.properties.file.path:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${PROPERTIES_FILE_PATH}" ]] + then + YARN_CLIENT_OPTIONS="${YARN_CLIENT_OPTIONS} --properties-file ${PROPERTIES_FILE_PATH}" + fi + + if [[ "$USE_KERBEROS" = true ]] + then + echo "Using Kerberos" + KB_DRIVER_SETTINGS="-Djava.security.auth.login.config=${CONF_DIR}/kafka_client_jaas_longrun.conf -Dsun.security.krb5.debug=true" + KB_WORKERS_SETTINGS="spark.executor.extraJavaOptions=-Djava.security.auth.login.config=kafka_client_jaas_longrun2.conf -Dsun.security.krb5.debug=true" + YARN_FILES_OPTIONS="${YARN_FILES_OPTIONS},/tmp/hurence.keytab#hurence.keytab,${CONF_DIR}/kafka_client_jaas_longrun2.conf#kafka_client_jaas_longrun2.conf" + fi + + echo "CONF_DIR is set to ${CONF_DIR}" + +# cat << EOF +#${SPARK_HOME}/bin/spark-submit ${VERBOSE_OPTIONS} ${YARN_CLIENT_OPTIONS} \ +# --files ${YARN_FILES_OPTIONS} \ +# --driver-java-options "${KB_DRIVER_SETTINGS} ${LOG4J_DRIVER_SETTINGS}" \ +# --conf "${KB_WORKERS_SETTINGS} ${LOG4J_WORKERS_SETTINGS}" \ +# --class ${app_mainclass} \ +# --jars ${app_classpath} ${engine_jar} \ +# -conf ${CONF_FILE} +#EOF + + ${SPARK_HOME}/bin/spark-submit ${VERBOSE_OPTIONS} ${YARN_CLIENT_OPTIONS} \ + --files ${YARN_FILES_OPTIONS} \ + --driver-java-options "${KB_DRIVER_SETTINGS} ${LOG4J_DRIVER_SETTINGS}" \ + --conf "${KB_WORKERS_SETTINGS} ${LOG4J_WORKERS_SETTINGS}" \ + --class ${app_mainclass} \ + --jars ${app_classpath} ${engine_jar} \ + -conf ${CONF_FILE} +} + +run_yarn_cluster_mode() { + YARN_CLUSTER_OPTIONS="--master yarn --deploy-mode cluster" + if [[ "$DEBUG" = true ]]; then + LOG4J_FILE_TO_USE="log4j-debug.properties" + else + LOG4J_FILE_TO_USE="log4j.properties" + fi + YARN_FILES_OPTIONS="${CONF_FILE}#${UPLOADED_CONF_FILE},${CONF_DIR}/${LOG4J_FILE_TO_USE}#log4j.properties" + LOG4J_SETTINGS="-Dlog4j.configuration=log4j.properties" + DRIVER_EXTRA_JAVA_OPTIONS="spark.driver.extraJavaOptions=${LOG4J_SETTINGS}" + EXECUTOR_EXTRA_JAVA_OPTIONS="spark.executor.extraJavaOptions=${LOG4J_SETTINGS}" + + if [[ ! -z "${YARN_APP_NAME}" ]] + then + YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --name ${YARN_APP_NAME}" + else + YARN_APP_NAME=`awk '{ if( $1 == "spark.app.name:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${YARN_APP_NAME}" ]] + then + YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --name ${YARN_APP_NAME}" + fi + fi + + SPARK_YARN_QUEUE=`awk '{ if( $1 == "spark.yarn.queue:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${SPARK_YARN_QUEUE}" ]] + then + YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --queue ${SPARK_YARN_QUEUE}" + fi + + DRIVER_CORES=`awk '{ if( $1 == "spark.driver.cores:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${DRIVER_CORES}" ]] + then + YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --driver-cores ${DRIVER_CORES}" + fi + + DRIVER_MEMORY=`awk '{ if( $1 == "spark.driver.memory:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${DRIVER_MEMORY}" ]] + then + YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --driver-memory ${DRIVER_MEMORY}" + fi + + EXECUTORS_CORES=`awk '{ if( $1 == "spark.executor.cores:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${EXECUTORS_CORES}" ]] + then + YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --executor-cores ${EXECUTORS_CORES}" + fi + + EXECUTORS_MEMORY=`awk '{ if( $1 == "spark.executor.memory:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${EXECUTORS_MEMORY}" ]] + then + YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --executor-memory ${EXECUTORS_MEMORY}" + fi + + EXECUTORS_INSTANCES=`awk '{ if( $1 == "spark.executor.instances:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${EXECUTORS_INSTANCES}" ]] + then + YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --num-executors ${EXECUTORS_INSTANCES}" + fi + + SPARK_YARN_MAX_APP_ATTEMPTS=`awk '{ if( $1 == "spark.yarn.maxAppAttempts:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${SPARK_YARN_MAX_APP_ATTEMPTS}" ]] + then + YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --conf spark.yarn.maxAppAttempts=${SPARK_YARN_MAX_APP_ATTEMPTS}" + fi + + SPARK_YARN_AM_ATTEMPT_FAILURES_VALIDITY_INTERVAL=`awk '{ if( $1 == "spark.yarn.am.attemptFailuresValidityInterval:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${SPARK_YARN_AM_ATTEMPT_FAILURES_VALIDITY_INTERVAL}" ]] + then + YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --conf spark.yarn.am.attemptFailuresValidityInterval=${SPARK_YARN_AM_ATTEMPT_FAILURES_VALIDITY_INTERVAL}" + fi + + SPARK_YARN_MAX_EXECUTOR_FAILURES=`awk '{ if( $1 == "spark.yarn.max.executor.failures:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${SPARK_YARN_MAX_EXECUTOR_FAILURES}" ]] + then + YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --conf spark.yarn.max.executor.failures=${SPARK_YARN_MAX_EXECUTOR_FAILURES}" + fi + + SPARK_YARN_EXECUTOR_FAILURES_VALIDITY_INTERVAL=`awk '{ if( $1 == "spark.yarn.executor.failuresValidityInterval:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${SPARK_YARN_EXECUTOR_FAILURES_VALIDITY_INTERVAL}" ]] + then + YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --conf spark.yarn.executor.failuresValidityInterval=${SPARK_YARN_EXECUTOR_FAILURES_VALIDITY_INTERVAL}" + fi + + SPARK_TASK_MAX_FAILURES=`awk '{ if( $1 == "spark.task.maxFailures:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${SPARK_TASK_MAX_FAILURES}" ]] + then + YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --conf spark.task.maxFailures=${SPARK_TASK_MAX_FAILURES}" + fi + + PROPERTIES_FILE_PATH=`awk '{ if( $1 == "spark.properties.file.path:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${PROPERTIES_FILE_PATH}" ]] + then + YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --properties-file ${PROPERTIES_FILE_PATH}" + fi + + SPARK_MONITORING_DRIVER_PORT=`awk '{ if( $1 == "spark.monitoring.driver.port:" ){ print $2 } }' ${CONF_FILE}` + if [[ -z "${SPARK_MONITORING_DRIVER_PORT}" ]] + then + echo "Using Monitoring : disabled because a bug" + #YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --conf spark.metrics.namespace=${APP_NAME}" + #MONITORING_SETTINGS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=0 -Dcom.sun.management.jmxremote.rmi.port=0 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -javaagent:./jmx_prometheus_javaagent-0.10.jar=${SPARK_MONITORING_DRIVER_PORT}:./spark-prometheus.yml" + #DRIVER_EXTRA_JAVA_OPTIONS="${DRIVER_EXTRA_JAVA_OPTIONS} ${MONITORING_SETTINGS}" + #EXECUTOR_EXTRA_JAVA_OPTIONS="${EXECUTOR_EXTRA_JAVA_OPTIONS} ${MONITORING_SETTINGS}" + #YARN_FILES_OPTIONS="${YARN_FILES_OPTIONS},${CONF_DIR}/../monitoring/jmx_prometheus_javaagent-0.10.jar#jmx_prometheus_javaagent-0.10.jar,${CONF_DIR}/../monitoring/spark-prometheus.yml#spark-prometheus.yml,${CONF_DIR}/../monitoring/metrics.properties#metrics.properties" + fi + + if [[ "$USE_KERBEROS" = true ]] + then + echo "Using Kerberos" + KB_WORKERS_SETTINGS="-Djava.security.auth.login.config=kafka_client_jaas_longrun2.conf -Dsun.security.krb5.debug=true" + DRIVER_EXTRA_JAVA_OPTIONS="${DRIVER_EXTRA_JAVA_OPTIONS} ${KB_WORKERS_SETTINGS}" + EXECUTOR_EXTRA_JAVA_OPTIONS="${EXECUTOR_EXTRA_JAVA_OPTIONS} ${KB_WORKERS_SETTINGS}" + YARN_FILES_OPTIONS="${YARN_FILES_OPTIONS},/tmp/hurence.keytab#hurence.keytab,${CONF_DIR}/kafka_client_jaas_longrun2.conf#kafka_client_jaas_longrun2.conf" + fi + + #--principal --keytab +#cat << EOF +#${SPARK_HOME}/bin/spark-submit ${VERBOSE_OPTIONS} ${YARN_CLUSTER_OPTIONS} \ +# --files ${YARN_FILES_OPTIONS} \ +# --conf "${DRIVER_EXTRA_JAVA_OPTIONS}" \ +# --conf "${EXECUTOR_EXTRA_JAVA_OPTIONS}" \ +# --class ${app_mainclass} \ +# --jars ${app_classpath} ${engine_jar} \ +# -conf ${UPLOADED_CONF_FILE} +#EOF + + ${SPARK_HOME}/bin/spark-submit ${VERBOSE_OPTIONS} ${YARN_CLUSTER_OPTIONS} \ + --files ${YARN_FILES_OPTIONS} \ + --conf "${DRIVER_EXTRA_JAVA_OPTIONS}" \ + --conf "${EXECUTOR_EXTRA_JAVA_OPTIONS}" \ + --class ${app_mainclass} \ + --jars ${app_classpath} ${engine_jar} \ + -conf ${UPLOADED_CONF_FILE} +} + +run_mesos_mode() { + MESOS_OPTIONS="--master ${SPARK_MASTER} --conf spark.metrics.namespace=\"${APP_NAME}\"" + + DRIVER_CORES=`awk '{ if( $1 == "spark.driver.cores:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${DRIVER_CORES}" ]] + then + MESOS_OPTIONS="${MESOS_OPTIONS} --driver-cores ${DRIVER_CORES}" + fi + + DRIVER_MEMORY=`awk '{ if( $1 == "spark.driver.memory:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${DRIVER_MEMORY}" ]] + then + MESOS_OPTIONS="${MESOS_OPTIONS} --driver-memory ${DRIVER_MEMORY}" + fi + + EXECUTORS_CORES=`awk '{ if( $1 == "spark.executor.cores:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${EXECUTORS_CORES}" ]] + then + MESOS_OPTIONS="${MESOS_OPTIONS} --executor-cores ${EXECUTORS_CORES}" + fi + + EXECUTORS_MEMORY=`awk '{ if( $1 == "spark.executor.memory:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${EXECUTORS_MEMORY}" ]] + then + MESOS_OPTIONS="${MESOS_OPTIONS} --executor-memory ${EXECUTORS_MEMORY}" + fi + + EXECUTORS_INSTANCES=`awk '{ if( $1 == "spark.executor.instances:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${EXECUTORS_INSTANCES}" ]] + then + MESOS_OPTIONS="${MESOS_OPTIONS} --num-executors ${EXECUTORS_INSTANCES}" + fi + + + TOTAL_EXECUTOR_CORES=`awk '{ if( $1 == "spark.cores.max:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${TOTAL_EXECUTOR_CORES}" ]] + then + MESOS_OPTIONS="${MESOS_OPTIONS} --total-executor-cores ${TOTAL_EXECUTOR_CORES}" + fi + + MESOS_NATIVE_JAVA_LIBRARY=`awk '{ if( $1 == "java.library.path:" ){ print $2 } }' ${CONF_FILE}` + + export MESOS_NATIVE_JAVA_LIBRARY="${MESOS_NATIVE_JAVA_LIBRARY}" + + echo ${SPARK_HOME}'/bin/spark-submit '${VERBOSE_OPTIONS}' '${MESOS_OPTIONS}' \ + --driver-library-path '${OPENCV_NATIVE_LIB_PATH}' \ + --class '${app_mainclass}' \ + --jars '${app_classpath}' '${engine_jar}' \ + -conf '${CONF_FILE} + + ${SPARK_HOME}/bin/spark-submit ${VERBOSE_OPTIONS} ${MESOS_OPTIONS} \ + --driver-library-path ${OPENCV_NATIVE_LIB_PATH} \ + --class ${app_mainclass} \ + --jars ${app_classpath} ${engine_jar} \ + -conf ${CONF_FILE} +} + + +update_cluster_options_for_spark_cluster() { + if [[ ! -z "${SPARK_APP_NAME}" ]] + then + SPARK_CLUSTER_OPTIONS="${SPARK_CLUSTER_OPTIONS} --name ${SPARK_APP_NAME}" + else + SPARK_APP_NAME=`awk '{ if( $1 == "spark.app.name:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${SPARK_APP_NAME}" ]] + then + SPARK_CLUSTER_OPTIONS="${SPARK_CLUSTER_OPTIONS} --name ${SPARK_APP_NAME}" + fi + fi + + local TOTAL_EXECUTOR_CORES=`awk '{ if( $1 == "spark.total.executor.cores:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${TOTAL_EXECUTOR_CORES}" ]] + then + SPARK_CLUSTER_OPTIONS="${SPARK_CLUSTER_OPTIONS} --total-executor-cores ${TOTAL_EXECUTOR_CORES}" + fi + + local EXECUTOR_MEMORY=`awk '{ if( $1 == "spark.executor.memory:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${EXECUTOR_MEMORY}" ]] + then + SPARK_CLUSTER_OPTIONS="${SPARK_CLUSTER_OPTIONS} --executor-memory ${EXECUTOR_MEMORY}" + fi + + local SUPERVISE=`awk '{ if( $1 == "spark.supervise:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${SUPERVISE}" && "${SUPERVISE}" == "true" ]] + then + SPARK_CLUSTER_OPTIONS="${SPARK_CLUSTER_OPTIONS} --supervise" + fi + + local DRIVER_MEMORY=`awk '{ if( $1 == "spark.driver.memory:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${DRIVER_MEMORY}" ]] + then + SPARK_CLUSTER_OPTIONS="${SPARK_CLUSTER_OPTIONS} --driver-memory ${DRIVER_MEMORY}" + fi + + local EXECUTORS_CORES=`awk '{ if( $1 == "spark.executor.cores:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${EXECUTORS_CORES}" ]] + then + SPARK_CLUSTER_OPTIONS="${SPARK_CLUSTER_OPTIONS} --executor-cores ${EXECUTORS_CORES}" + fi +} + +run_spark_client_mode() { + SPARK_CLUSTER_OPTIONS="--master ${SPARK_MASTER} --deploy-mode client --conf spark.metrics.namespace=\"${APP_NAME}\"" + + update_cluster_options_for_spark_cluster + + EXTRA_DRIVER_JAVA_OPTIONS='spark.driver.extraJavaOptions='${LOG4J_SETTINGS} + EXTRA_EXECUTOR_JAVA_OPTIONS='spark.executor.extraJavaOptions='${LOG4J_SETTINGS} + + echo "##################" + echo "Will run command :" + echo "##################" + echo ${SPARK_HOME}'/bin/spark-submit '${VERBOSE_OPTIONS}' '${SPARK_CLUSTER_OPTIONS}' \ + --conf "'${EXTRA_DRIVER_JAVA_OPTIONS}'" \ + --conf "'${EXTRA_EXECUTOR_JAVA_OPTIONS}'" \ + --class '${app_mainclass}' \ + --jars '${app_classpath}' '${engine_jar}' \ + -conf '${CONF_FILE_ABOSLUTE_PATH}'' + + ${SPARK_HOME}/bin/spark-submit ${VERBOSE_OPTIONS} ${SPARK_CLUSTER_OPTIONS} \ + --conf "${EXTRA_DRIVER_JAVA_OPTIONS}" \ + --conf "${EXTRA_EXECUTOR_JAVA_OPTIONS}" \ + --class ${app_mainclass} \ + --jars ${app_classpath} ${engine_jar} \ + -conf ${CONF_FILE_ABOSLUTE_PATH} +} + +run_spark_cluster_mode() { + SPARK_CLUSTER_OPTIONS="--master ${SPARK_MASTER} --deploy-mode cluster --conf spark.metrics.namespace=\"${APP_NAME}\" --conf spark.ui.showConsoleProgress=false" + + update_cluster_options_for_spark_cluster + + #only in cluster mode + DRIVER_CORES=`awk '{ if( $1 == "spark.driver.cores:" ){ print $2 } }' ${CONF_FILE}` + if [[ ! -z "${DRIVER_CORES}" ]] + then + SPARK_CLUSTER_OPTIONS="${SPARK_CLUSTER_OPTIONS} --driver-cores ${DRIVER_CORES}" + fi + + EXTRA_DRIVER_JAVA_OPTIONS='spark.driver.extraJavaOptions='${LOG4J_SETTINGS} + if [ -z "${EXTRA_EXECUTOR_JAVA_OPTIONS}" ] + then + EXTRA_EXECUTOR_JAVA_OPTIONS='spark.executor.extraJavaOptions='${LOG4J_SETTINGS} + else + # EXTRA_EXECUTOR_JAVA_OPTIONS already filled with some options, reuse them. + # This allows for instance to set the garbage collector on executor nodes with + # something like + # EXTRA_EXECUTOR_JAVA_OPTIONS="-Xmn1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=65 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseCompressedOops" + # in a script calling logisland.sh:q! + EXTRA_EXECUTOR_JAVA_OPTIONS="spark.executor.extraJavaOptions=${LOG4J_SETTINGS} ${EXTRA_EXECUTOR_JAVA_OPTIONS}" + fi + + echo "##################" + echo "Will run command :" + echo "##################" + echo ${SPARK_HOME}'/bin/spark-submit '${VERBOSE_OPTIONS}' '${SPARK_CLUSTER_OPTIONS}' \ + --conf "'${EXTRA_DRIVER_JAVA_OPTIONS}'" \ + --conf "'${EXTRA_EXECUTOR_JAVA_OPTIONS}'" \ + --class '${app_mainclass}' \ + --jars '${app_classpath}' '${engine_jar}' \ + -conf '${CONF_FILE_ABOSLUTE_PATH}'' + + ${SPARK_HOME}/bin/spark-submit ${VERBOSE_OPTIONS} ${SPARK_CLUSTER_OPTIONS} \ + --conf "${EXTRA_DRIVER_JAVA_OPTIONS}" \ + --conf "${EXTRA_EXECUTOR_JAVA_OPTIONS}" \ + --class ${app_mainclass} \ + --jars ${app_classpath} ${engine_jar} \ + -conf ${CONF_FILE_ABOSLUTE_PATH} +} main() { parse_input $@ + if [[ "$DEBUG" = true ]]; then + LOG4J_SETTINGS="-Dlog4j.configuration=file:${CONF_DIR}/log4j-debug.properties" + else + LOG4J_SETTINGS="-Dlog4j.configuration=file:${CONF_DIR}/log4j.properties" + fi + # ---------------------------------------------------------------- # find the spark-submit mode - # can be either local, standalone, mesos or yarn + # can be either local, standalone, spark (standalone), mesos or yarn # ---------------------------------------------------------------- if [[ "$STANDALONE" = true ]] ; then - run_standalone + run_standalone else echo "build classpath" app_classpath="" initSparkJarsOptRecursively "${lib_dir}" echo "app_classpath is ${app_classpath}" + echo "lib_dir is ${lib_dir}" # Find version to use for spark SPARK_VERSION=`${SPARK_HOME}/bin/spark-submit --version 2>&1 >/dev/null | grep -m 1 -o '[0-9]*\.[0-9]*\.[0-9]*'` @@ -277,319 +794,50 @@ main() { case $? in 2) engine_jar=`ls ${lib_dir}/engines/logisland-engine-spark_1_6-*.jar` ;; *) compare_versions ${SPARK_VERSION} 2.3.0 - case $? in - 2) engine_jar=`ls ${lib_dir}/engines/logisland-engine-spark_2_1-*.jar` ;; - *) engine_jar=`ls ${lib_dir}/engines/logisland-engine-spark_2_3-*.jar` ;; - - esac - ;; + case $? in + 2) engine_jar=`ls ${lib_dir}/engines/logisland-engine-spark_2_1-*.jar` ;; + 0) engine_jar=`ls ${lib_dir}/engines/logisland-engine-spark_2_3-*.jar` ;; + *) compare_versions ${SPARK_VERSION} 2.4.0 + case $? in + 2) engine_jar=`ls ${lib_dir}/engines/logisland-engine-spark_2_3-*.jar` ;; + *) engine_jar=`ls ${lib_dir}/engines/logisland-engine-spark_2_4-*.jar` ;; + esac + esac esac - - export SPARK_PRINT_LAUNCH_COMMAND=1 echo "Detected spark version ${SPARK_VERSION}. We'll automatically plug in engine jar ${engine_jar}" - APP_NAME=`awk '{ if( $1 == "spark.app.name:" ){ print $2 } }' ${CONF_FILE}` - MODE=`awk '{ if( $1 == "spark.master:" ){ print $2 } }' ${CONF_FILE}` - case ${MODE} in - "yarn") - SPARK_MASTER=${MODE} - EXTRA_MODE=`awk '{ if( $1 == "spark.yarn.deploy-mode:" ){ print $2 } }' ${CONF_FILE}` - if [[ -z "${EXTRA_MODE}" ]] - then - echo "The property \"spark.yarn.deploy-mode\" is missing in config file \"${CONF_FILE}\"" - exit 1 - fi - - if [[ ! ${EXTRA_MODE} = "cluster" && ! ${EXTRA_MODE} = "client" ]] - then - echo "The property \"spark.yarn.deploy-mode\" value \"${EXTRA_MODE}\" is not supported" - exit 1 - else - MODE=${MODE}-${EXTRA_MODE} - fi - ;; - esac - - - if [[ "${MODE}" =~ "mesos" ]] - then - SPARK_MASTER=${MODE} - MODE="mesos" - fi - + APP_NAME=`awk '{ if( $1 == "spark.app.name:" ){ print $2 } }' ${CONF_FILE}` + update_mode if [[ ! -z "${VERBOSE_OPTIONS}" ]] then - echo "Starting with mode \"${MODE}\" on master \"${SPARK_MASTER}\"" + echo "Starting with run mode \"${MODE}\" on master \"${SPARK_MASTER}\"" fi case ${MODE} in - - ######################### - # SPARK LOCAL MODE - ######################### local*) - - #--files ${CONF_DIR}/kafka_client_jaas_longrun.conf#kafka_client_jaas_longrun.conf,${CONF_DIR}/hurence.keytab#hurence.keytab \ - - LOG4J_SETTINGS="-Dlog4j.configuration=file:${CONF_DIR}/log4j.properties" - - if [[ "$USE_KERBEROS" = true ]] - then - echo "Using Kerberos" - KB_SETTINGS="-Djava.security.auth.login.config=${CONF_DIR}/kafka_client_jaas_longrun.conf" - fi - - echo "CONF_DIR is set to ${CONF_DIR}" - ${SPARK_HOME}/bin/spark-submit ${VERBOSE_OPTIONS} \ - --files ${CONF_DIR}/log4j.properties \ - --conf spark.executor.extraJavaOptions="${LOG4J_SETTINGS} ${KB_SETTINGS}" \ - --driver-library-path ${OPENCV_NATIVE_LIB_PATH} \ - --conf spark.driver.extraJavaOptions="${LOG4J_SETTINGS} ${KB_SETTINGS}" \ - --conf spark.metrics.namespace="${APP_NAME}" \ - --conf spark.metrics.conf="${lib_dir}/../monitoring/metrics.properties" \ - --class ${app_mainclass} \ - --jars ${app_classpath} ${engine_jar} \ - -conf ${CONF_FILE} - - ;; - - ######################### - # YARN CLUSTER MODE - ######################### + run_spark_local_mode + ;; yarn-cluster) - - YARN_CLUSTER_OPTIONS="--master yarn --deploy-mode cluster" - UPLOADED_CONF_FILE="logisland-configuration.yml" - YARN_FILES_OPTIONS="${CONF_FILE}#${UPLOADED_CONF_FILE},${CONF_DIR}/log4j.properties#log4j.properties" - LOG4J_SETTINGS="-Dlog4j.configuration=log4j.properties" - DRIVER_EXTRA_JAVA_OPTIONS="spark.driver.extraJavaOptions=${LOG4J_SETTINGS}" - EXECUTOR_EXTRA_JAVA_OPTIONS="spark.executor.extraJavaOptions=${LOG4J_SETTINGS}" - - if [[ ! -z "${YARN_APP_NAME}" ]] - then - YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --name ${YARN_APP_NAME}" - else - YARN_APP_NAME=`awk '{ if( $1 == "spark.app.name:" ){ print $2 } }' ${CONF_FILE}` - if [[ ! -z "${YARN_APP_NAME}" ]] - then - YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --name ${YARN_APP_NAME}" - fi - fi - - SPARK_YARN_QUEUE=`awk '{ if( $1 == "spark.yarn.queue:" ){ print $2 } }' ${CONF_FILE}` - if [[ ! -z "${SPARK_YARN_QUEUE}" ]] - then - YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --queue ${SPARK_YARN_QUEUE}" - fi - - DRIVER_CORES=`awk '{ if( $1 == "spark.driver.cores:" ){ print $2 } }' ${CONF_FILE}` - if [[ ! -z "${DRIVER_CORES}" ]] - then - YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --driver-cores ${DRIVER_CORES}" - fi - - DRIVER_MEMORY=`awk '{ if( $1 == "spark.driver.memory:" ){ print $2 } }' ${CONF_FILE}` - if [[ ! -z "${DRIVER_MEMORY}" ]] - then - YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --driver-memory ${DRIVER_MEMORY}" - fi - - EXECUTORS_CORES=`awk '{ if( $1 == "spark.executor.cores:" ){ print $2 } }' ${CONF_FILE}` - if [[ ! -z "${EXECUTORS_CORES}" ]] - then - YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --executor-cores ${EXECUTORS_CORES}" - fi - - EXECUTORS_MEMORY=`awk '{ if( $1 == "spark.executor.memory:" ){ print $2 } }' ${CONF_FILE}` - if [[ ! -z "${EXECUTORS_MEMORY}" ]] - then - YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --executor-memory ${EXECUTORS_MEMORY}" - fi - - EXECUTORS_INSTANCES=`awk '{ if( $1 == "spark.executor.instances:" ){ print $2 } }' ${CONF_FILE}` - if [[ ! -z "${EXECUTORS_INSTANCES}" ]] - then - YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --num-executors ${EXECUTORS_INSTANCES}" - fi - - SPARK_YARN_MAX_APP_ATTEMPTS=`awk '{ if( $1 == "spark.yarn.maxAppAttempts:" ){ print $2 } }' ${CONF_FILE}` - if [[ ! -z "${SPARK_YARN_MAX_APP_ATTEMPTS}" ]] - then - YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --conf spark.yarn.maxAppAttempts=${SPARK_YARN_MAX_APP_ATTEMPTS}" - fi - - SPARK_YARN_AM_ATTEMPT_FAILURES_VALIDITY_INTERVAL=`awk '{ if( $1 == "spark.yarn.am.attemptFailuresValidityInterval:" ){ print $2 } }' ${CONF_FILE}` - if [[ ! -z "${SPARK_YARN_AM_ATTEMPT_FAILURES_VALIDITY_INTERVAL}" ]] - then - YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --conf spark.yarn.am.attemptFailuresValidityInterval=${SPARK_YARN_AM_ATTEMPT_FAILURES_VALIDITY_INTERVAL}" - fi - - SPARK_YARN_MAX_EXECUTOR_FAILURES=`awk '{ if( $1 == "spark.yarn.max.executor.failures:" ){ print $2 } }' ${CONF_FILE}` - if [[ ! -z "${SPARK_YARN_MAX_EXECUTOR_FAILURES}" ]] - then - YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --conf spark.yarn.max.executor.failures=${SPARK_YARN_MAX_EXECUTOR_FAILURES}" - fi - - SPARK_YARN_EXECUTOR_FAILURES_VALIDITY_INTERVAL=`awk '{ if( $1 == "spark.yarn.executor.failuresValidityInterval:" ){ print $2 } }' ${CONF_FILE}` - if [[ ! -z "${SPARK_YARN_EXECUTOR_FAILURES_VALIDITY_INTERVAL}" ]] - then - YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --conf spark.yarn.executor.failuresValidityInterval=${SPARK_YARN_EXECUTOR_FAILURES_VALIDITY_INTERVAL}" - fi - - SPARK_TASK_MAX_FAILURES=`awk '{ if( $1 == "spark.task.maxFailures:" ){ print $2 } }' ${CONF_FILE}` - if [[ ! -z "${SPARK_TASK_MAX_FAILURES}" ]] - then - YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --conf spark.task.maxFailures=${SPARK_TASK_MAX_FAILURES}" - fi - - PROPERTIES_FILE_PATH=`awk '{ if( $1 == "spark.properties.file.path:" ){ print $2 } }' ${CONF_FILE}` - if [[ ! -z "${PROPERTIES_FILE_PATH}" ]] - then - YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --properties-file ${PROPERTIES_FILE_PATH}" - fi - - SPARK_MONITORING_DRIVER_PORT=`awk '{ if( $1 == "spark.monitoring.driver.port:" ){ print $2 } }' ${CONF_FILE}` - if [[ -z "${SPARK_MONITORING_DRIVER_PORT}" ]] - then - echo "Using Monitoring : disabled because a bug" - #YARN_CLUSTER_OPTIONS="${YARN_CLUSTER_OPTIONS} --conf spark.metrics.namespace=${APP_NAME}" - #MONITORING_SETTINGS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=0 -Dcom.sun.management.jmxremote.rmi.port=0 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -javaagent:./jmx_prometheus_javaagent-0.10.jar=${SPARK_MONITORING_DRIVER_PORT}:./spark-prometheus.yml" - #DRIVER_EXTRA_JAVA_OPTIONS="${DRIVER_EXTRA_JAVA_OPTIONS} ${MONITORING_SETTINGS}" - #EXECUTOR_EXTRA_JAVA_OPTIONS="${EXECUTOR_EXTRA_JAVA_OPTIONS} ${MONITORING_SETTINGS}" - #YARN_FILES_OPTIONS="${YARN_FILES_OPTIONS},${CONF_DIR}/../monitoring/jmx_prometheus_javaagent-0.10.jar#jmx_prometheus_javaagent-0.10.jar,${CONF_DIR}/../monitoring/spark-prometheus.yml#spark-prometheus.yml,${CONF_DIR}/../monitoring/metrics.properties#metrics.properties" - fi - - if [[ "$USE_KERBEROS" = true ]] - then - echo "Using Kerberos" - KB_WORKERS_SETTINGS="-Djava.security.auth.login.config=kafka_client_jaas_longrun2.conf -Dsun.security.krb5.debug=true" - DRIVER_EXTRA_JAVA_OPTIONS="${DRIVER_EXTRA_JAVA_OPTIONS} ${KB_WORKERS_SETTINGS}" - EXECUTOR_EXTRA_JAVA_OPTIONS="${EXECUTOR_EXTRA_JAVA_OPTIONS} ${KB_WORKERS_SETTINGS}" - YARN_FILES_OPTIONS="${YARN_FILES_OPTIONS},/tmp/hurence.keytab#hurence.keytab,${CONF_DIR}/kafka_client_jaas_longrun2.conf#kafka_client_jaas_longrun2.conf" - fi - - #--principal --keytab - - ${SPARK_HOME}/bin/spark-submit ${VERBOSE_OPTIONS} ${YARN_CLUSTER_OPTIONS} \ - --files ${YARN_FILES_OPTIONS} \ - --conf "${DRIVER_EXTRA_JAVA_OPTIONS}" \ - --conf "${EXECUTOR_EXTRA_JAVA_OPTIONS}" \ - --class ${app_mainclass} \ - --jars ${app_classpath} ${engine_jar} \ - -conf ${UPLOADED_CONF_FILE} - + run_yarn_cluster_mode ;; - - - - - ######################### - # YARN CLIENT MODE - ######################### yarn-client) - - YARN_CLIENT_OPTIONS="--master yarn --deploy-mode client --conf spark.metrics.namespace=\"${APP_NAME}\"" - YARN_FILES_OPTIONS="${CONF_DIR}/log4j.properties#log4j.properties" - LOG4J_DRIVER_SETTINGS="-Dlog4j.configuration=file:${CONF_DIR}/log4j.properties" - LOG4J_WORKERS_SETTINGS="-Dlog4j.configuration=log4j.properties" - - DRIVER_CORES=`awk '{ if( $1 == "spark.driver.cores:" ){ print $2 } }' ${CONF_FILE}` - if [[ ! -z "${DRIVER_CORES}" ]] - then - YARN_CLIENT_OPTIONS="${YARN_CLIENT_OPTIONS} --driver-cores ${DRIVER_CORES}" - fi - - DRIVER_MEMORY=`awk '{ if( $1 == "spark.driver.memory:" ){ print $2 } }' ${CONF_FILE}` - if [[ ! -z "${DRIVER_MEMORY}" ]] - then - YARN_CLIENT_OPTIONS="${YARN_CLIENT_OPTIONS} --driver-memory ${DRIVER_MEMORY}" - fi - - PROPERTIES_FILE_PATH=`awk '{ if( $1 == "spark.properties.file.path:" ){ print $2 } }' ${CONF_FILE}` - if [[ ! -z "${PROPERTIES_FILE_PATH}" ]] - then - YARN_CLIENT_OPTIONS="${YARN_CLIENT_OPTIONS} --properties-file ${PROPERTIES_FILE_PATH}" - fi - - if [[ "$USE_KERBEROS" = true ]] - then - echo "Using Kerberos" - KB_DRIVER_SETTINGS="-Djava.security.auth.login.config=${CONF_DIR}/kafka_client_jaas_longrun.conf -Dsun.security.krb5.debug=true" - KB_WORKERS_SETTINGS="spark.executor.extraJavaOptions=-Djava.security.auth.login.config=kafka_client_jaas_longrun2.conf -Dsun.security.krb5.debug=true" - YARN_FILES_OPTIONS="${YARN_FILES_OPTIONS},/tmp/hurence.keytab#hurence.keytab,${CONF_DIR}/kafka_client_jaas_longrun2.conf#kafka_client_jaas_longrun2.conf" - fi - - echo "CONF_DIR is set to ${CONF_DIR}" - ${SPARK_HOME}/bin/spark-submit ${VERBOSE_OPTIONS} ${YARN_CLIENT_OPTIONS} \ - --files ${YARN_FILES_OPTIONS} \ - --driver-java-options "${KB_DRIVER_SETTINGS} ${LOG4J_DRIVER_SETTINGS}" \ - --conf "${KB_WORKERS_SETTINGS} ${LOG4J_WORKERS_SETTINGS}" \ - --class ${app_mainclass} \ - --jars ${app_classpath} ${engine_jar} \ - -conf ${CONF_FILE} - + run_yarn_client_mode ;; - - - ######################### - # MESOS MODE - ######################### mesos) - - MESOS_OPTIONS="--master ${SPARK_MASTER} --conf spark.metrics.namespace=\"${APP_NAME}\"" - - - DRIVER_CORES=`awk '{ if( $1 == "spark.driver.cores:" ){ print $2 } }' ${CONF_FILE}` - if [[ ! -z "${DRIVER_CORES}" ]] - then - MESOS_OPTIONS="${MESOS_OPTIONS} --driver-cores ${DRIVER_CORES}" - fi - - DRIVER_MEMORY=`awk '{ if( $1 == "spark.driver.memory:" ){ print $2 } }' ${CONF_FILE}` - if [[ ! -z "${DRIVER_MEMORY}" ]] - then - MESOS_OPTIONS="${MESOS_OPTIONS} --driver-memory ${DRIVER_MEMORY}" - fi - - EXECUTORS_CORES=`awk '{ if( $1 == "spark.executor.cores:" ){ print $2 } }' ${CONF_FILE}` - if [[ ! -z "${EXECUTORS_CORES}" ]] - then - MESOS_OPTIONS="${MESOS_OPTIONS} --executor-cores ${EXECUTORS_CORES}" - fi - - EXECUTORS_MEMORY=`awk '{ if( $1 == "spark.executor.memory:" ){ print $2 } }' ${CONF_FILE}` - if [[ ! -z "${EXECUTORS_MEMORY}" ]] - then - MESOS_OPTIONS="${MESOS_OPTIONS} --executor-memory ${EXECUTORS_MEMORY}" - fi - - EXECUTORS_INSTANCES=`awk '{ if( $1 == "spark.executor.instances:" ){ print $2 } }' ${CONF_FILE}` - if [[ ! -z "${EXECUTORS_INSTANCES}" ]] - then - MESOS_OPTIONS="${MESOS_OPTIONS} --num-executors ${EXECUTORS_INSTANCES}" - fi - - - TOTAL_EXECUTOR_CORES=`awk '{ if( $1 == "spark.cores.max:" ){ print $2 } }' ${CONF_FILE}` - if [[ ! -z "${TOTAL_EXECUTOR_CORES}" ]] - then - MESOS_OPTIONS="${MESOS_OPTIONS} --total-executor-cores ${TOTAL_EXECUTOR_CORES}" - fi - - MESOS_NATIVE_JAVA_LIBRARY=`awk '{ if( $1 == "java.library.path:" ){ print $2 } }' ${CONF_FILE}` - - - export MESOS_NATIVE_JAVA_LIBRARY="${MESOS_NATIVE_JAVA_LIBRARY}" - ${SPARK_HOME}/bin/spark-submit ${VERBOSE_OPTIONS} ${MESOS_OPTIONS} \ - --driver-library-path ${OPENCV_NATIVE_LIB_PATH} \ - --class ${app_mainclass} \ - --jars ${app_classpath} ${engine_jar} \ - -conf ${CONF_FILE} + run_mesos_mode + ;; + spark-cluster) + run_spark_cluster_mode + ;; + spark-client) + run_spark_client_mode + ;; + *) + echo "Unsupported run mode: ${MODE}" ;; - esac fi } diff --git a/logisland-resources/src/main/resources/conf/aggregate-events.yml b/logisland-resources/src/main/resources/conf/aggregate-events.yml index c41ea7be1..a1f036271 100644 --- a/logisland-resources/src/main/resources/conf/aggregate-events.yml +++ b/logisland-resources/src/main/resources/conf/aggregate-events.yml @@ -2,7 +2,7 @@ # Logisland configuration script template ######################################################################################################### -version: 1.3.0 +version: 1.4.0 documentation: LogIsland analytics main config file. Put here every engine or component config ######################################################################################################### diff --git a/logisland-resources/src/main/resources/conf/configuration-template.yml b/logisland-resources/src/main/resources/conf/configuration-template.yml index 5300b930f..5d7c69938 100644 --- a/logisland-resources/src/main/resources/conf/configuration-template.yml +++ b/logisland-resources/src/main/resources/conf/configuration-template.yml @@ -2,7 +2,7 @@ # Logisland configuration script template ######################################################################################################### -version: 1.3.0 +version: 1.4.0 documentation: LogIsland analytics main config file. Put here every engine or component config ######################################################################################################### diff --git a/logisland-resources/src/main/resources/conf/enrich-apache-logs.yml b/logisland-resources/src/main/resources/conf/enrich-apache-logs.yml index c9d27f0b7..5821f0c55 100644 --- a/logisland-resources/src/main/resources/conf/enrich-apache-logs.yml +++ b/logisland-resources/src/main/resources/conf/enrich-apache-logs.yml @@ -2,7 +2,7 @@ # Logisland configuration script template ######################################################################################################### -version: 1.3.0 +version: 1.4.0 documentation: LogIsland analytics main config file. Put here every engine or component config ######################################################################################################### diff --git a/logisland-resources/src/main/resources/conf/future-factory-indexer.yml b/logisland-resources/src/main/resources/conf/future-factory-indexer.yml index 13fe00583..c8aa5c1b3 100644 --- a/logisland-resources/src/main/resources/conf/future-factory-indexer.yml +++ b/logisland-resources/src/main/resources/conf/future-factory-indexer.yml @@ -2,7 +2,7 @@ # Logisland configuration for future factory project ######################################################################################################### -version: 1.3.0 +version: 1.4.0 documentation: LogIsland future factory job ######################################################################################################### diff --git a/logisland-resources/src/main/resources/conf/index-apache-logs-es.yml b/logisland-resources/src/main/resources/conf/index-apache-logs-es.yml index f32e2e12d..65ac7332e 100644 --- a/logisland-resources/src/main/resources/conf/index-apache-logs-es.yml +++ b/logisland-resources/src/main/resources/conf/index-apache-logs-es.yml @@ -2,7 +2,7 @@ # Logisland configuration script tempate ######################################################################################################### -version: 1.3.0 +version: 1.4.0 documentation: LogIsland analytics main config file. Put here every engine or component config ######################################################################################################### diff --git a/logisland-resources/src/main/resources/conf/index-apache-logs-plainjava.yml b/logisland-resources/src/main/resources/conf/index-apache-logs-plainjava.yml index 9349e3481..039017341 100644 --- a/logisland-resources/src/main/resources/conf/index-apache-logs-plainjava.yml +++ b/logisland-resources/src/main/resources/conf/index-apache-logs-plainjava.yml @@ -2,7 +2,7 @@ # Logisland configuration script template ######################################################################################################### -version: 1.3.0 +version: 1.4.0 documentation: LogIsland analytics main config file. Put here every engine or component config ######################################################################################################### diff --git a/logisland-resources/src/main/resources/conf/index-apache-logs-solr.yml b/logisland-resources/src/main/resources/conf/index-apache-logs-solr.yml index 9b54d2eab..45b75f723 100644 --- a/logisland-resources/src/main/resources/conf/index-apache-logs-solr.yml +++ b/logisland-resources/src/main/resources/conf/index-apache-logs-solr.yml @@ -2,7 +2,7 @@ # Logisland configuration script tempate ######################################################################################################### -version: 1.3.0 +version: 1.4.0 documentation: LogIsland analytics main config file. Put here every engine or component config ######################################################################################################### diff --git a/logisland-resources/src/main/resources/conf/index-blockchain-transactions.yml b/logisland-resources/src/main/resources/conf/index-blockchain-transactions.yml index c451da49f..9f3a3ebf3 100644 --- a/logisland-resources/src/main/resources/conf/index-blockchain-transactions.yml +++ b/logisland-resources/src/main/resources/conf/index-blockchain-transactions.yml @@ -1,4 +1,4 @@ -version: 1.3.0 +version: 1.4.0 documentation: LogIsland future factory job engine: diff --git a/logisland-resources/src/main/resources/conf/index-jms-messages.yml b/logisland-resources/src/main/resources/conf/index-jms-messages.yml index 654de6414..2d9bbc53a 100644 --- a/logisland-resources/src/main/resources/conf/index-jms-messages.yml +++ b/logisland-resources/src/main/resources/conf/index-jms-messages.yml @@ -1,4 +1,4 @@ -version: 1.3.0 +version: 1.4.0 documentation: LogIsland JMS read job engine: diff --git a/logisland-resources/src/main/resources/conf/index-network-packets.yml b/logisland-resources/src/main/resources/conf/index-network-packets.yml index e0efe7d4c..4fd66dc2b 100644 --- a/logisland-resources/src/main/resources/conf/index-network-packets.yml +++ b/logisland-resources/src/main/resources/conf/index-network-packets.yml @@ -2,7 +2,7 @@ # Logisland configuration script example: parse network packets and display them in Kibana ######################################################################################################### -version: 1.3.0 +version: 1.4.0 documentation: LogIsland analytics main config file. Put here every engine or component config ######################################################################################################### diff --git a/logisland-resources/src/main/resources/conf/index-timeseries-solr.yml b/logisland-resources/src/main/resources/conf/index-timeseries-solr.yml index e3e79d720..fdfcdf705 100644 --- a/logisland-resources/src/main/resources/conf/index-timeseries-solr.yml +++ b/logisland-resources/src/main/resources/conf/index-timeseries-solr.yml @@ -1,4 +1,4 @@ -version: 1.3.0 +version: 1.4.0 documentation: LogIsland future factory job engine: diff --git a/logisland-resources/src/main/resources/conf/ivy.xml b/logisland-resources/src/main/resources/conf/ivy.xml index ff5277f65..07ac15d0f 100644 --- a/logisland-resources/src/main/resources/conf/ivy.xml +++ b/logisland-resources/src/main/resources/conf/ivy.xml @@ -21,7 +21,7 @@ - + diff --git a/logisland-resources/src/main/resources/conf/log4j-debug.properties b/logisland-resources/src/main/resources/conf/log4j-debug.properties new file mode 100644 index 000000000..81e57b44a --- /dev/null +++ b/logisland-resources/src/main/resources/conf/log4j-debug.properties @@ -0,0 +1,54 @@ +# Root logger option +log4j.rootLogger=DEBUG,stdout,rolling + + + +# Direct log messages to a log file +log4j.appender.rolling=org.apache.log4j.RollingFileAppender +log4j.appender.rolling.DatePattern='.'yyyy-MM-dd +log4j.appender.rolling.layout=org.apache.log4j.PatternLayout +log4j.appender.rolling.layout.conversionPattern=[%d] %p %m (%c)%n +log4j.appender.rolling.maxFileSize=50MB +log4j.appender.rolling.maxBackupIndex=5 +log4j.appender.rolling.ImmediateFlush=true +#log4j.appender.rolling.file=${spark.yarn.app.container.log.dir}/spark.log +log4j.appender.rolling.encoding=UTF-8 + +# Direct log messages to stdout +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n + + +log4j.logger.kafka=ERROR, stdout +log4j.logger.org.apache.zookeeper=ERROR, stdout +log4j.logger.org.apache.kafka=ERROR, stdout +log4j.logger.org.I0Itec.zkclient=ERROR, stdout +log4j.additivity.kafka.server=false +log4j.additivity.kafka.consumer.ZookeeperConsumerConnector=false + + +# Log levels +log4j.logger.org.apache.spark=WARN +log4j.logger.org.apache.spark.scheduler=WARN +log4j.logger.org.apache.spark.history=WARN +log4j.logger.org.apache.spark.streaming=WARN +log4j.logger.org.spark-project.jetty=WARN +log4j.logger.org.eclipse.jetty.server=OFF +log4j.logger.org.apache.spark.deploy.yarn=DEBUG +log4j.logger.io.netty=WARN +log4j.logger.org.apache.hadoop.ipc.Client=WARN +log4j.logger.org.apache.hadoop=WARN +log4j.logger.org.apache.hadoop.ipc.ProtobufRpcEngine=WARN +log4j.logger.parquet.hadoop=WARN +log4j.logger.org.apache.kafka=ERROR +log4j.logger.kafka=WARN +log4j.logger.org.elasticsearch=WARN + +log4j.logger.com.hurence=TRACE +log4j.logger.org.jinterop=WARN + + + +# log4j.logger.org.apache.spark.deploy.yarn.Client=DEBUG diff --git a/logisland-resources/src/main/resources/conf/log4j.properties b/logisland-resources/src/main/resources/conf/log4j.properties index ffaddcf2a..4b2fd6d2f 100644 --- a/logisland-resources/src/main/resources/conf/log4j.properties +++ b/logisland-resources/src/main/resources/conf/log4j.properties @@ -46,7 +46,7 @@ log4j.logger.org.apache.kafka=ERROR log4j.logger.kafka=WARN log4j.logger.org.elasticsearch=WARN -log4j.logger.com.hurence=DEBUG +#log4j.logger.com.hurence=DEBUG log4j.logger.org.jinterop=WARN diff --git a/logisland-resources/src/main/resources/conf/logisland-kafka-connect.yml b/logisland-resources/src/main/resources/conf/logisland-kafka-connect.yml index cc2ebb6c4..9d670e0e1 100644 --- a/logisland-resources/src/main/resources/conf/logisland-kafka-connect.yml +++ b/logisland-resources/src/main/resources/conf/logisland-kafka-connect.yml @@ -1,4 +1,4 @@ -version: 1.3.0 +version: 1.4.0 documentation: LogIsland Kafka Connect Integration engine: diff --git a/logisland-resources/src/main/resources/conf/match-queries.yml b/logisland-resources/src/main/resources/conf/match-queries.yml index 52600bf91..02d1641e4 100644 --- a/logisland-resources/src/main/resources/conf/match-queries.yml +++ b/logisland-resources/src/main/resources/conf/match-queries.yml @@ -2,7 +2,7 @@ # Logisland configuration script template ######################################################################################################### -version: 1.3.0 +version: 1.4.0 documentation: LogIsland analytics main config file. Put here every engine or component config ######################################################################################################### diff --git a/logisland-resources/src/main/resources/conf/mqtt-to-historian.yml b/logisland-resources/src/main/resources/conf/mqtt-to-historian.yml index 5f5e58b83..18fc287c8 100644 --- a/logisland-resources/src/main/resources/conf/mqtt-to-historian.yml +++ b/logisland-resources/src/main/resources/conf/mqtt-to-historian.yml @@ -1,4 +1,4 @@ -version: 1.3.0 +version: 1.4.0 documentation: LogIsland future factory job engine: diff --git a/logisland-resources/src/main/resources/conf/opc-iiot.yml b/logisland-resources/src/main/resources/conf/opc-iiot.yml index 6289b81c7..6680c455c 100644 --- a/logisland-resources/src/main/resources/conf/opc-iiot.yml +++ b/logisland-resources/src/main/resources/conf/opc-iiot.yml @@ -1,4 +1,4 @@ -version: 1.3.0 +version: 1.4.0 documentation: LogIsland IIoT OPC-UA Job engine: diff --git a/logisland-resources/src/main/resources/conf/outlier-detection.yml b/logisland-resources/src/main/resources/conf/outlier-detection.yml index e8d3f0823..61ad6475e 100644 --- a/logisland-resources/src/main/resources/conf/outlier-detection.yml +++ b/logisland-resources/src/main/resources/conf/outlier-detection.yml @@ -2,7 +2,7 @@ # Logisland configuration script template ######################################################################################################### -version: 1.3.0 +version: 1.4.0 documentation: LogIsland analytics main config file. Put here every engine or component config ######################################################################################################### diff --git a/logisland-resources/src/main/resources/conf/python-processing.yml b/logisland-resources/src/main/resources/conf/python-processing.yml index 3de4783d5..6249e513e 100644 --- a/logisland-resources/src/main/resources/conf/python-processing.yml +++ b/logisland-resources/src/main/resources/conf/python-processing.yml @@ -2,7 +2,7 @@ # Logisland configuration script template ######################################################################################################### -version: 1.3.0 +version: 1.4.0 documentation: LogIsland analytics main config file. Put here every engine or component config ######################################################################################################### diff --git a/logisland-resources/src/main/resources/conf/retrieve-data-from-elasticsearch.yml b/logisland-resources/src/main/resources/conf/retrieve-data-from-elasticsearch.yml index b89fba98c..a1fdb10e9 100644 --- a/logisland-resources/src/main/resources/conf/retrieve-data-from-elasticsearch.yml +++ b/logisland-resources/src/main/resources/conf/retrieve-data-from-elasticsearch.yml @@ -2,7 +2,7 @@ # Logisland configuration script template ######################################################################################################### -version: 1.3.0 +version: 1.4.0 documentation: LogIsland analytics main config file. Put here every engine or component config ######################################################################################################### diff --git a/logisland-resources/src/main/resources/conf/save-to-hdfs.yml b/logisland-resources/src/main/resources/conf/save-to-hdfs.yml index 3e8a9a930..a7f959ed3 100644 --- a/logisland-resources/src/main/resources/conf/save-to-hdfs.yml +++ b/logisland-resources/src/main/resources/conf/save-to-hdfs.yml @@ -2,7 +2,7 @@ # Logisland configuration script template ######################################################################################################### -version: 1.3.0 +version: 1.4.0 documentation: LogIsland analytics main config file. Put here every engine or component config ######################################################################################################### diff --git a/logisland-resources/src/main/resources/conf/send-apache-logs-to-hbase.yml b/logisland-resources/src/main/resources/conf/send-apache-logs-to-hbase.yml index 5fdf9e1d3..4ff936abe 100644 --- a/logisland-resources/src/main/resources/conf/send-apache-logs-to-hbase.yml +++ b/logisland-resources/src/main/resources/conf/send-apache-logs-to-hbase.yml @@ -2,7 +2,7 @@ # Logisland configuration script template ######################################################################################################### -version: 1.3.0 +version: 1.4.0 documentation: This tutorial job sends apache logs to an HBase table ######################################################################################################### diff --git a/logisland-resources/src/main/resources/conf/store-to-redis.yml b/logisland-resources/src/main/resources/conf/store-to-redis.yml index 9770c2523..c96f89b9f 100644 --- a/logisland-resources/src/main/resources/conf/store-to-redis.yml +++ b/logisland-resources/src/main/resources/conf/store-to-redis.yml @@ -2,7 +2,7 @@ # Logisland configuration script tempate ######################################################################################################### -version: 1.3.0 +version: 1.4.0 documentation: LogIsland analytics main config file. Put here every engine or component config ######################################################################################################### diff --git a/logisland-resources/src/main/resources/conf/threshold-alerting.yml b/logisland-resources/src/main/resources/conf/threshold-alerting.yml index 55b9d764a..c5c7df3ee 100644 --- a/logisland-resources/src/main/resources/conf/threshold-alerting.yml +++ b/logisland-resources/src/main/resources/conf/threshold-alerting.yml @@ -2,7 +2,7 @@ # Logisland configuration script tempate ######################################################################################################### -version: 1.3.0 +version: 1.4.0 documentation: LogIsland analytics main config file. Put here every engine or component config ######################################################################################################### diff --git a/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/README.md b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/README.md new file mode 100644 index 000000000..db3103713 --- /dev/null +++ b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/README.md @@ -0,0 +1 @@ +To run the test we use an embeded kafka server. diff --git a/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/pom.xml b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/pom.xml new file mode 100644 index 000000000..853610815 --- /dev/null +++ b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/pom.xml @@ -0,0 +1,146 @@ + + + + logisland-tests + com.hurence.logisland + 1.4.0 + + 4.0.0 + + kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline + jar + + + + 2.11 + 2.11.8 + 2.4.0 + 0-10 + 0.10.2.1 + + + + + + com.hurence.logisland + logisland-api + ${project.version} + provided + + + com.hurence.logisland + logisland-scripting-base + ${project.version} + provided + + + com.hurence.logisland + logisland-scripting-mvel + ${project.version} + provided + + + + + + + + + com.hurence.logisland + logisland-utils + ${project.version} + provided + + + com.fasterxml.jackson.core + jackson-databind + + + + + + com.hurence.logisland + logisland-bootstrap + ${project.version} + provided + + + com.hurence.logisland + logisland-plugin-support + ${project.version} + provided + + + + + + com.hurence.logisland + logisland-engine-spark_2_4 + ${project.version} + provided + + + + + com.hurence.logisland + logisland-processor-common + ${project.version} + provided + + + + org.scala-lang + scala-library + + + + + + org.apache.spark + spark-sql_${scala.binary.version} + ${spark.version} + + + org.apache.spark + spark-sql-kafka-${kafka.spark.version}_${scala.binary.version} + ${spark.version} + + + org.apache.spark + spark-streaming_${scala.binary.version} + ${spark.version} + provided + + + + + org.springframework.kafka + spring-kafka-test + 1.2.3.RELEASE + test + + + + org.apache.kafka + kafka_${scala.binary.version} + ${kafka.version} + test + + + org.apache.kafka + kafka-clients + ${kafka.version} + test + + + + org.slf4j + slf4j-log4j12 + ${org.slf4j.version} + test + + + \ No newline at end of file diff --git a/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/main/java/com/hurence/logisland/webanalytics/test/util/ConfJobHelper.java b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/main/java/com/hurence/logisland/webanalytics/test/util/ConfJobHelper.java new file mode 100644 index 000000000..a8e0ab339 --- /dev/null +++ b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/main/java/com/hurence/logisland/webanalytics/test/util/ConfJobHelper.java @@ -0,0 +1,108 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.webanalytics.test.util; + +import com.hurence.logisland.component.ComponentFactory; +import com.hurence.logisland.component.InitializationException; +import com.hurence.logisland.config.ConfigReader; +import com.hurence.logisland.config.ControllerServiceConfiguration; +import com.hurence.logisland.config.LogislandConfiguration; +import com.hurence.logisland.engine.EngineContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.Map; +import java.util.Optional; + +public class ConfJobHelper { + + private static Logger logger = LoggerFactory.getLogger(ConfJobHelper.class); + + private final LogislandConfiguration jobConfig; + private EngineContext engineContext; + + public ConfJobHelper(LogislandConfiguration jobConfig) { + this.jobConfig = jobConfig; + } + + public ConfJobHelper(String pathConfFile) throws IOException { + this(ConfigReader.loadConfig(pathConfFile)); + } + + public void modifyControllerServiceConf(String id, Map confToModify) { + ControllerServiceConfiguration service = jobConfig.getEngine().getControllerServiceConfigurations() + .stream() + .filter(c -> id.equals(c.getControllerService())) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("service with id " + id + " does not exist")); + service.getConfiguration().putAll(confToModify); + } + + public void initJob() throws InitializationException { + // instantiate engine and all the processor from the config + // this init the engine + Optional engineInstance = ComponentFactory.buildAndSetUpEngineContext(jobConfig.getEngine()); + if (!engineInstance.isPresent()) { + throw new IllegalArgumentException("engineInstance could not be instantiated"); + } + if (!engineInstance.get().isValid()) { + throw new IllegalArgumentException("engineInstance is not valid with input configuration !"); + } + engineContext = engineInstance.get(); + logger.info("Initialized Logisland job version {}", jobConfig.getVersion()); + logger.info(jobConfig.getDocumentation()); + } + + public void stopJob() { + engineContext.getEngine().stop(engineContext); + } + + public void softStop() { + engineContext.getEngine().softStop(engineContext); + } + + public void startJob() { + String engineName = engineContext.getEngine().getIdentifier(); + try { + logger.info("Init engine {}", engineName); + engineContext.getEngine().init(engineContext); + logger.info("Start engine {}", engineName); + engineContext.getEngine().start(engineContext); + } catch (Exception e) { + logger.error("Something went bad while running the job {} : {}", engineName, e); + System.exit(-1); + } + } + + public void awaitTermination() { + String engineName = engineContext.getEngine().getIdentifier(); + try { + logger.info("Waiting termination of engine {}", engineName); + engineContext.getEngine().awaitTermination(engineContext); + logger.info("Engine {} terminated", engineName); + System.exit(0); + } catch (Exception e) { + logger.error("Something went bad while running the job {} : {}", engineName, e); + System.exit(-1); + } + } + + public void startThenAwaitTermination() { + startJob(); + awaitTermination(); + } +} diff --git a/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/main/java/com/hurence/logisland/webanalytics/test/util/EventsGenerator.java b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/main/java/com/hurence/logisland/webanalytics/test/util/EventsGenerator.java new file mode 100644 index 000000000..2cd10b855 --- /dev/null +++ b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/main/java/com/hurence/logisland/webanalytics/test/util/EventsGenerator.java @@ -0,0 +1,83 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.webanalytics.test.util; + +import com.hurence.logisland.record.Record; +import com.hurence.logisland.record.StandardRecord; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.LongStream; + +/** + * No thread safe + */ +public class EventsGenerator { + + public final static String SESSION_ID = "sessionId"; + public final static String TOPIC_COLUMN = "topic"; + public final static String TIMESTAMP = "timestamp"; + public final static String FROM_TOPIC = "fromTopic"; + + final String sessionId; + + private long eventId = 0; + + public EventsGenerator(String sessionId) { + this.sessionId = sessionId; + } + + public Record generateEvent(long timestamp, String outputTopic) { + return generateEvent(timestamp, outputTopic, "unknown"); + } + + + public Record generateEvent(long timestamp, String outputTopic, String fromTopic) { + Record record = new StandardRecord("generated"); + record.setId(sessionId + String.valueOf(eventId++)); + record.setStringField(SESSION_ID, sessionId); + record.setStringField(TOPIC_COLUMN, outputTopic); + record.setLongField(TIMESTAMP, timestamp); + record.setStringField(FROM_TOPIC, fromTopic); + return record; + } + + public List generateEvents(List timestamps, + String url) { + return timestamps.stream() + .map(ts -> generateEvent(ts, url)) + .collect(Collectors.toList()); + } + + public List generateEvents(Long from, + Long to, + Long padding) { + int numberOfRecord = (int)((to - from) / padding); + return LongStream.iterate(from, ts -> ts + padding) + .limit(numberOfRecord) + .mapToObj(ts -> generateEvent(ts, "url")) + .collect(Collectors.toList()); + } + + public List generateEventsRandomlyOrdered(Long from, + Long to, + Long padding) { + List sortedList = generateEvents(from, to, padding); + Collections.shuffle(sortedList);; + return sortedList; + } +} diff --git a/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/serializer/KafkaRecordSerializer.java b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/serializer/KafkaRecordSerializer.java new file mode 100644 index 000000000..696044490 --- /dev/null +++ b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/serializer/KafkaRecordSerializer.java @@ -0,0 +1,56 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.serializer; + +import com.hurence.logisland.record.Record; +import org.apache.kafka.common.serialization.Serializer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Map; + + +public class KafkaRecordSerializer implements Serializer { + + private static Logger logger = LoggerFactory.getLogger(KafkaRecordSerializer.class); + + private ExtendedJsonSerializer recordSerializer = new ExtendedJsonSerializer(); + private ByteArrayOutputStream out; + + @Override + public void configure(Map map, boolean b) { + out = new ByteArrayOutputStream(); + } + + @Override + public byte[] serialize(String s, Record record) { + recordSerializer.serialize(out, record); + return out.toByteArray(); + } + + @Override + public void close() { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + logger.error("error while closing stream", e); + } + } + } +} diff --git a/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/ConfToDynamicOutputTopicKafkaAndRewindForOnlyOneTopicTest.java b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/ConfToDynamicOutputTopicKafkaAndRewindForOnlyOneTopicTest.java new file mode 100644 index 000000000..9906d976d --- /dev/null +++ b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/ConfToDynamicOutputTopicKafkaAndRewindForOnlyOneTopicTest.java @@ -0,0 +1,154 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.webanalytics; + +import com.hurence.logisland.component.InitializationException; +import com.hurence.logisland.record.Record; +import com.hurence.logisland.stream.spark.structured.provider.KafkaProperties; +import com.hurence.logisland.webanalytics.test.util.ConfJobHelper; +import com.hurence.logisland.webanalytics.test.util.EventsGenerator; +import com.hurence.logisland.webanalytics.util.KafkaUtils; +import org.junit.ClassRule; +import org.junit.Ignore; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.kafka.test.rule.KafkaEmbedded; + +import java.io.IOException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Ignore +public class ConfToDynamicOutputTopicKafkaAndRewindForOnlyOneTopicTest { + + private static Logger logger = LoggerFactory.getLogger(ConfToDynamicOutputTopicKafkaAndRewindForOnlyOneTopicTest.class); + + final static String PREFIX = "AAAA"; + final static String SUFFIX = PREFIX; + final static String inputTopic1 = "my_topics_1"; + final static String inputTopic1WithPrefix = PREFIX + inputTopic1; + final static String inputTopic1WithSuffix = inputTopic1 + SUFFIX; + final static String inputTopic1withPrefixAndSuffix = PREFIX + inputTopic1 + SUFFIX; + final static String inputTopic2 = "my_topics_2"; + final static String inputTopic2WithPrefix = PREFIX + inputTopic2; + final static String inputTopic2WithSuffix = inputTopic2 + SUFFIX; + final static String inputTopic2withPrefixAndSuffix = PREFIX + inputTopic2 + SUFFIX; + final static String inputTopic3 = "my_topics_3"; + final static String inputTopic3WithPrefix = PREFIX + inputTopic3; + final static String inputTopic3WithSuffix = inputTopic3 + SUFFIX; + final static String inputTopic3withPrefixAndSuffix = PREFIX + inputTopic3 + SUFFIX; + final static String inputTopic4 = "my_topics_4"; + final static String inputTopic4WithPrefix = PREFIX + inputTopic4; + final static String inputTopic4WithSuffix = inputTopic4 + SUFFIX; + final static String inputTopic4withPrefixAndSuffix = PREFIX + inputTopic4 + SUFFIX; + final static String inputTopicAnyThingElse = "anythingelse"; + final static String outputTopic1 = "output_topic1"; + final static String outputTopic2 = "output_topic2"; + + List topicList = Arrays.asList(inputTopic1, inputTopic1WithPrefix, inputTopic1WithSuffix, inputTopic1withPrefixAndSuffix, + inputTopic2, inputTopic2WithPrefix, inputTopic2WithSuffix, inputTopic2withPrefixAndSuffix, + inputTopic3, inputTopic3WithPrefix, inputTopic3WithSuffix, inputTopic3withPrefixAndSuffix, + inputTopic4, inputTopic4WithPrefix, inputTopic4WithSuffix, inputTopic4withPrefixAndSuffix, + inputTopicAnyThingElse); + + @ClassRule + public static KafkaEmbedded embeddedKafka = new KafkaEmbedded( + 1, true, 2, + inputTopic1, inputTopic1WithPrefix, inputTopic1WithSuffix, inputTopic1withPrefixAndSuffix, + inputTopic2, inputTopic2WithPrefix, inputTopic2WithSuffix, inputTopic2withPrefixAndSuffix, + inputTopic3, inputTopic3WithPrefix, inputTopic3WithSuffix, inputTopic3withPrefixAndSuffix, + inputTopic4, inputTopic4WithPrefix, inputTopic4WithSuffix, inputTopic4withPrefixAndSuffix, + inputTopicAnyThingElse, outputTopic1, outputTopic2); + + private static KafkaUtils kafkaUtils = new KafkaUtils(embeddedKafka); + EventsGenerator eventGen = new EventsGenerator("divolte_1"); + + @Test + public void myTestMultiSourceAllTopics() throws IOException, InterruptedException, InitializationException { + injectDataIntoTopics(); + String confFilePath = getClass().getClassLoader().getResource("conf/conf-to-multisink-rewind-only-one-topic.yaml").getFile(); + ConfJobHelper confJob = new ConfJobHelper(confFilePath); + Map confKafka = new HashMap<>(); + confKafka.put(KafkaProperties.KAFKA_ZOOKEEPER_QUORUM().getName(), embeddedKafka.getZookeeperConnectionString()); + confKafka.put(KafkaProperties.KAFKA_METADATA_BROKER_LIST().getName(), embeddedKafka.getBrokersAsString()); + confJob.modifyControllerServiceConf("all_topics", confKafka); + confJob.modifyControllerServiceConf("rewind_topics", confKafka); + confJob.initJob(); + confJob.startJob(); + Thread.sleep(5000L);//wait logisland to be ready + final long padding = 500L; + long ts = 10000L; + int counter = 0; + while (counter < 10) { + counter++; + logger.info("Adding an event in topic"); + for (String inputTopic : topicList) { + Record event = eventGen.generateEvent(ts, outputTopic2, inputTopic); + kafkaUtils.addingEventsToTopicPartition(inputTopic, 0, event); + } + ts += padding; + } + + Thread.sleep(10000L); + confJob.stopJob(); + } + + @Test + public void myTestMultiSourceWithOneTopicInRewind() throws IOException, InterruptedException, InitializationException { + injectDataIntoTopics(); + String confFilePath = getClass().getClassLoader().getResource("conf/conf-to-multisink-rewind-only-one-topic-version-rewind.yaml").getFile(); + ConfJobHelper confJob = new ConfJobHelper(confFilePath); + Map confKafka = new HashMap<>(); + confKafka.put(KafkaProperties.KAFKA_ZOOKEEPER_QUORUM().getName(), embeddedKafka.getZookeeperConnectionString()); + confKafka.put(KafkaProperties.KAFKA_METADATA_BROKER_LIST().getName(), embeddedKafka.getBrokersAsString()); + confJob.modifyControllerServiceConf("all_topics", confKafka); + confJob.modifyControllerServiceConf("rewind_topics", confKafka); + confJob.initJob(); + confJob.startJob(); + Thread.sleep(5000L);//wait logisland to be ready + final long padding = 500L; + long ts = 10000L; + int counter = 0; + while (counter < 10) { + counter++; + logger.info("Adding an event in topic"); + for (String inputTopic : topicList) { + Record event = eventGen.generateEvent(ts, outputTopic2, inputTopic); + kafkaUtils.addingEventsToTopicPartition(inputTopic, 0, event); + } + ts += padding; + } + + Thread.sleep(30000L); + confJob.stopJob(); + } + + private void injectDataIntoTopics() throws InterruptedException { + EventsGenerator eventGen = new EventsGenerator("events_before_running_job"); + long ts = 0L; + while (ts < 1000) { + logger.info("Adding an event in topics"); + for (String inputTopic : topicList) { + Record event = eventGen.generateEvent(ts, outputTopic1, inputTopic); + kafkaUtils.addingEventsToTopicPartition(inputTopic, 0, event); + } + ts += 100; + } + } +} \ No newline at end of file diff --git a/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/ConfToDynamicTopicKafkaTest.java b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/ConfToDynamicTopicKafkaTest.java new file mode 100644 index 000000000..44b053fd5 --- /dev/null +++ b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/ConfToDynamicTopicKafkaTest.java @@ -0,0 +1,118 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.webanalytics; + +import com.hurence.logisland.component.InitializationException; +import com.hurence.logisland.record.Record; +import com.hurence.logisland.stream.spark.structured.provider.KafkaProperties; +import com.hurence.logisland.webanalytics.test.util.ConfJobHelper; +import com.hurence.logisland.webanalytics.test.util.EventsGenerator; +import com.hurence.logisland.webanalytics.util.KafkaUtils; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.junit.ClassRule; +import org.junit.Ignore; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.kafka.test.rule.KafkaEmbedded; +import org.springframework.kafka.test.utils.KafkaTestUtils; + +import java.io.IOException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +import static org.junit.Assert.assertTrue; + +@Ignore +public class ConfToDynamicTopicKafkaTest { + + private static Logger logger = LoggerFactory.getLogger(ConfToDynamicTopicKafkaTest.class); + + final static String inputTopic1 = "my_topics_1"; + final static String inputTopic2 = "my_topics_2"; + final static String outputTopic1 = "output_topic1"; + final static String outputTopic2 = "output_topic2"; + + @ClassRule + public static KafkaEmbedded embeddedKafka = new KafkaEmbedded( + 1, true, 2, + inputTopic1, inputTopic2, outputTopic1); + + private static KafkaUtils kafkaUtils = new KafkaUtils(embeddedKafka); + + EventsGenerator eventGen = new EventsGenerator("divolte_1"); + + @Test + public void myWebAnalDebugTest() throws IOException, InterruptedException, InitializationException { + String confFilePath = getClass().getClassLoader().getResource("conf/conf-to-multisink.yaml").getFile(); + ConfJobHelper confJob = new ConfJobHelper(confFilePath); + Map confKafka = new HashMap<>(); + confKafka.put(KafkaProperties.KAFKA_ZOOKEEPER_QUORUM().getName(), embeddedKafka.getZookeeperConnectionString()); + confKafka.put(KafkaProperties.KAFKA_METADATA_BROKER_LIST().getName(), embeddedKafka.getBrokersAsString()); + confJob.modifyControllerServiceConf("all_topics", confKafka); + confJob.initJob(); + confJob.startJob(); + Thread.sleep(5000L);//wait logisland to be ready + final long padding = 500L; + long ts = 10000L; + int counter = 0; + while (counter < 10) { + counter++; + logger.info("Adding an event in topic"); + Record event = eventGen.generateEvent(ts, outputTopic1); + kafkaUtils.addingEventsToTopicPartition(inputTopic1, 0, event); + event = eventGen.generateEvent(ts, outputTopic2); + kafkaUtils.addingEventsToTopicPartition(inputTopic2, 0, event); + ts += padding; + } + + //Verify data injected in dynamic topic + Map consumerProps = KafkaTestUtils.consumerProps("sampleRawConsumer", "false", embeddedKafka); + consumerProps.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); + consumerProps.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); + consumerProps.put("auto.offset.reset", "earliest"); + final CountDownLatch latch = new CountDownLatch(20); + ExecutorService executorService = Executors.newSingleThreadExecutor(); + executorService.execute(() -> { + KafkaConsumer kafkaConsumer = new KafkaConsumer<>(consumerProps); + kafkaConsumer.subscribe(Arrays.asList(outputTopic1, outputTopic2)); + try { + while (true) { + ConsumerRecords records = kafkaConsumer.poll(100); + for (ConsumerRecord record : records) { + logger.info("consuming from topic = {}, partition = {}, offset = {}, key = {}, value = {}", + record.topic(), record.partition(), record.offset(), record.key(), record.value()); + latch.countDown(); + } + } + } finally { + kafkaConsumer.close(); + } + }); + + assertTrue(latch.await(30, TimeUnit.SECONDS)); + + confJob.stopJob(); + } + +} \ No newline at end of file diff --git a/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/KafkaRegexInputIgnoreingSomeTopicsTest.java b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/KafkaRegexInputIgnoreingSomeTopicsTest.java new file mode 100644 index 000000000..f88f1b35a --- /dev/null +++ b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/KafkaRegexInputIgnoreingSomeTopicsTest.java @@ -0,0 +1,207 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.webanalytics; + +import com.hurence.logisland.record.Record; +import com.hurence.logisland.webanalytics.test.util.EventsGenerator; +import com.hurence.logisland.webanalytics.util.KafkaUtils; +import org.apache.kafka.clients.consumer.ConsumerRebalanceListener; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.common.TopicPartition; +import org.junit.Assert; +import org.junit.ClassRule; +import org.junit.Ignore; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.kafka.test.rule.KafkaEmbedded; +import org.springframework.kafka.test.utils.KafkaTestUtils; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.*; +import java.util.regex.Pattern; + +import static org.junit.Assert.assertTrue; + +@Ignore +public class KafkaRegexInputIgnoreingSomeTopicsTest { + + private static Logger logger = LoggerFactory.getLogger(KafkaRegexInputIgnoreingSomeTopicsTest.class); + + final static String PREFIX = "AAAA"; + final static String SUFFIX = PREFIX; + final static String inputTopic1 = "my_topics_1"; + final static String inputTopic1WithPrefix = PREFIX + inputTopic1; + final static String inputTopic1WithSuffix = inputTopic1 + SUFFIX; + final static String inputTopic1withPrefixAndSuffix = PREFIX + inputTopic1 + SUFFIX; + final static String inputTopic2 = "my_topics_2"; + final static String inputTopic2WithPrefix = PREFIX + inputTopic2; + final static String inputTopic2WithSuffix = inputTopic2 + SUFFIX; + final static String inputTopic2withPrefixAndSuffix = PREFIX + inputTopic2 + SUFFIX; + final static String inputTopic3 = "my_topics_3"; + final static String inputTopic3WithPrefix = PREFIX + inputTopic3; + final static String inputTopic3WithSuffix = inputTopic3 + SUFFIX; + final static String inputTopic3withPrefixAndSuffix = PREFIX + inputTopic3 + SUFFIX; + final static String inputTopic4 = "my_topics_4"; + final static String inputTopic4WithPrefix = PREFIX + inputTopic4; + final static String inputTopic4WithSuffix = inputTopic4 + SUFFIX; + final static String inputTopic4withPrefixAndSuffix = PREFIX + inputTopic4 + SUFFIX; + final static String inputTopicAnyThingElse = "anythingelse"; + + List topicList = Arrays.asList(inputTopic1, inputTopic1WithPrefix, inputTopic1WithSuffix, inputTopic1withPrefixAndSuffix, + inputTopic2, inputTopic2WithPrefix, inputTopic2WithSuffix, inputTopic2withPrefixAndSuffix, + inputTopic3, inputTopic3WithPrefix, inputTopic3WithSuffix, inputTopic3withPrefixAndSuffix, + inputTopic4, inputTopic4WithPrefix, inputTopic4WithSuffix, inputTopic4withPrefixAndSuffix, + inputTopicAnyThingElse); + + @ClassRule + public static KafkaEmbedded embeddedKafka = new KafkaEmbedded( + 1, true, 2, + inputTopic1, inputTopic1WithPrefix, inputTopic1WithSuffix, inputTopic1withPrefixAndSuffix, + inputTopic2, inputTopic2WithPrefix, inputTopic2WithSuffix, inputTopic2withPrefixAndSuffix, + inputTopic3, inputTopic3WithPrefix, inputTopic3WithSuffix, inputTopic3withPrefixAndSuffix, + inputTopic4, inputTopic4WithPrefix, inputTopic4WithSuffix, inputTopic4withPrefixAndSuffix, + inputTopicAnyThingElse); + + private static KafkaUtils kafkaUtils = new KafkaUtils(embeddedKafka); + + @Test + public void javaPatternTests() throws Exception { + Pattern pattern = Pattern.compile("my_topics.*"); + Assert.assertTrue(pattern.matcher("my_topics_2").matches()); + + pattern = Pattern.compile("^((?!my_topics_2$).*my_topics.*)*$"); + Assert.assertFalse(pattern.matcher("my_topics_2").matches()); + Assert.assertTrue(pattern.matcher("my_topics_1").matches()); + Assert.assertTrue(pattern.matcher("my_topics_3").matches()); + Assert.assertTrue(pattern.matcher("my_topics_4").matches()); + Assert.assertTrue(pattern.matcher("AAAAmy_topics_1AAAA").matches()); + Assert.assertTrue(pattern.matcher("AAAAmy_topics_2").matches()); + Assert.assertTrue(pattern.matcher("my_topics_2AAAA").matches()); + Assert.assertTrue(pattern.matcher("AAAAmy_topics_2AAAA").matches()); + Assert.assertTrue(pattern.matcher("AAAAmy_topics_3AAAA").matches()); + Assert.assertTrue(pattern.matcher("AAAAmy_topics_4AAAA").matches()); + Assert.assertFalse(pattern.matcher("anythingelse").matches()); + + pattern = Pattern.compile("^((?!(my_topics_2|my_topics_3)$).*my_topics.*)*$"); + Assert.assertFalse(pattern.matcher("my_topics_2").matches()); + Assert.assertTrue(pattern.matcher("my_topics_1").matches()); + Assert.assertFalse(pattern.matcher("my_topics_3").matches()); + Assert.assertTrue(pattern.matcher("my_topics_4").matches()); + Assert.assertTrue(pattern.matcher("AAAAmy_topics_1AAAA").matches()); + Assert.assertTrue(pattern.matcher("AAAAmy_topics_2").matches()); + Assert.assertTrue(pattern.matcher("my_topics_2AAAA").matches()); + Assert.assertTrue(pattern.matcher("AAAAmy_topics_2AAAA").matches()); + Assert.assertTrue(pattern.matcher("AAAAmy_topics_3").matches()); + Assert.assertTrue(pattern.matcher("my_topics_3AAAA").matches()); + Assert.assertTrue(pattern.matcher("AAAAmy_topics_3AAAA").matches()); + Assert.assertTrue(pattern.matcher("AAAAmy_topics_4AAAA").matches()); + Assert.assertFalse(pattern.matcher("anythingelse").matches()); + + pattern = Pattern.compile("^((?!(my_topics_2|my_topics_3)$)my_topics.*)*$"); + Assert.assertFalse(pattern.matcher("my_topics_2").matches()); + Assert.assertTrue(pattern.matcher("my_topics_1").matches()); + Assert.assertFalse(pattern.matcher("my_topics_3").matches()); + Assert.assertTrue(pattern.matcher("my_topics_4").matches()); + Assert.assertFalse(pattern.matcher("AAAAmy_topics_1AAAA").matches()); + Assert.assertFalse(pattern.matcher("AAAAmy_topics_2").matches()); + Assert.assertTrue(pattern.matcher("my_topics_2AAAA").matches()); + Assert.assertFalse(pattern.matcher("AAAAmy_topics_2AAAA").matches()); + Assert.assertFalse(pattern.matcher("AAAAmy_topics_3").matches()); + Assert.assertTrue(pattern.matcher("my_topics_3AAAA").matches()); + Assert.assertFalse(pattern.matcher("AAAAmy_topics_3AAAA").matches()); + Assert.assertFalse(pattern.matcher("AAAAmy_topics_4AAAA").matches()); + Assert.assertFalse(pattern.matcher("anythingelse").matches()); + } + + @Test + public void matchAllPattern() throws Exception { + runTestWithPatternAndExpectMatch("my_topics.*", 8 * 2); + } + + + @Test + public void matchAllPatternExcept2() throws Exception { + runTestWithPatternAndExpectMatch("^((?!my_topics_2$).*my_topics.*)*$", 3*4+3); + } + + + @Test + public void matchAllPatternExcept2And3() throws Exception { + runTestWithPatternAndExpectMatch("^((?!(my_topics_2|my_topics_3)$).*my_topics.*)*$", 2*4+2*3); + } + + private void runTestWithPatternAndExpectMatch(String pattern,int eventmatches) throws InterruptedException, java.util.concurrent.ExecutionException { + Map senderProps = KafkaTestUtils.producerProps(embeddedKafka); + final KafkaProducer producer = new KafkaProducer<>(senderProps); + logger.info("will produce events"); + topicList.forEach(topic -> { + try { + producer.send(new ProducerRecord<>(topic, 0, 0, "message0")).get(); + producer.send(new ProducerRecord<>(topic, 1, 1, "message1")).get(); + } catch (InterruptedException | ExecutionException e) { + logger.error("error", e); + } + }); + logger.info("produced 4 events"); + Map consumerProps = KafkaTestUtils.consumerProps("sampleRawConsumer", "false", embeddedKafka); + consumerProps.put("auto.offset.reset", "earliest"); + + final CountDownLatch latch = new CountDownLatch(eventmatches); + ExecutorService executorService = Executors.newSingleThreadExecutor(); + executorService.execute(() -> { + KafkaConsumer kafkaConsumer = new KafkaConsumer<>(consumerProps); + + Pattern rgexp = Pattern.compile(pattern); + kafkaConsumer.subscribe(rgexp, new ConsumerRebalanceListener() { + @Override + public void onPartitionsRevoked(Collection collection) { + collection.forEach(p -> { + logger.info("revoke partition {} of topic {}", p.partition(), p.topic()); + }); + } + + @Override + public void onPartitionsAssigned(Collection collection) { + collection.forEach(p -> { + logger.info("assigned partition {} of topic {}", p.partition(), p.topic()); + }); + } + }); + try { + while (true) { + ConsumerRecords records = kafkaConsumer.poll(100); + for (ConsumerRecord record : records) { + logger.info("consuming from topic = {}, partition = {}, offset = {}, key = {}, value = {}", + record.topic(), record.partition(), record.offset(), record.key(), record.value()); + latch.countDown(); + } + } + } finally { + kafkaConsumer.close(); + } + }); + + assertTrue(latch.await(30, TimeUnit.SECONDS)); + } +} \ No newline at end of file diff --git a/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/KafkaSimpleTest.java b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/KafkaSimpleTest.java new file mode 100644 index 000000000..cd33ef1f1 --- /dev/null +++ b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/KafkaSimpleTest.java @@ -0,0 +1,131 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.webanalytics; + +import com.hurence.logisland.record.Record; +import com.hurence.logisland.webanalytics.test.util.EventsGenerator; +import com.hurence.logisland.webanalytics.util.KafkaUtils; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.junit.ClassRule; +import org.junit.Ignore; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.kafka.test.rule.KafkaEmbedded; +import org.springframework.kafka.test.utils.KafkaTestUtils; + +import java.util.Arrays; +import java.util.Map; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +import static org.junit.Assert.assertTrue; + +public class KafkaSimpleTest { + + private static Logger logger = LoggerFactory.getLogger(KafkaSimpleTest.class); + + final static String inputTopic1 = "my_topics_1"; + final static String inputTopic2 = "my_topics_2"; + + @ClassRule + public static KafkaEmbedded embeddedKafka = new KafkaEmbedded( + 1, true, 2, + inputTopic1, inputTopic2); + + private static KafkaUtils kafkaUtils = new KafkaUtils(embeddedKafka); + + @Test + public void testWithEvent() throws Exception { + logger.info("Starting test"); + EventsGenerator eventGen = new EventsGenerator("divolte_1"); + logger.info("Adding an event in topic"); + + Record event = eventGen.generateEvent(0, "url"); + kafkaUtils.addingEventsToTopicPartition(inputTopic2, 0, event); + kafkaUtils.addingEventsToTopicPartition(inputTopic2, 0, "session1", event); + kafkaUtils.addingEventsToTopicPartition(inputTopic2, 0, "session2", event); + + Map consumerProps = KafkaTestUtils.consumerProps("sampleRawConsumer", "false", embeddedKafka); + consumerProps.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); + consumerProps.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); + consumerProps.put("auto.offset.reset", "earliest"); + final CountDownLatch latch = new CountDownLatch(3); + ExecutorService executorService = Executors.newSingleThreadExecutor(); + executorService.execute(() -> { + KafkaConsumer kafkaConsumer = new KafkaConsumer<>(consumerProps); + kafkaConsumer.subscribe(Arrays.asList(inputTopic2, inputTopic1)); + try { + while (true) { + ConsumerRecords records = kafkaConsumer.poll(100); + for (ConsumerRecord record : records) { + logger.info("consuming from topic = {}, partition = {}, offset = {}, key = {}, value = {}", + record.topic(), record.partition(), record.offset(), record.key(), record.value()); + latch.countDown(); + } + } + } finally { + kafkaConsumer.close(); + } + }); + + assertTrue(latch.await(30, TimeUnit.SECONDS)); + } + + + /** + * + */ + @Test + public void simpleTest() throws Exception { + Map senderProps = KafkaTestUtils.producerProps(embeddedKafka); + KafkaProducer producer = new KafkaProducer<>(senderProps); + producer.send(new ProducerRecord<>(inputTopic1, 0, 0, "message0")).get(); + producer.send(new ProducerRecord<>(inputTopic1, 0, 1, "message1")).get(); + producer.send(new ProducerRecord<>(inputTopic1, 1, 2, "message2")).get(); + producer.send(new ProducerRecord<>(inputTopic1, 1, 3, "message3")).get(); + + Map consumerProps = KafkaTestUtils.consumerProps("sampleRawConsumer", "false", embeddedKafka); + consumerProps.put("auto.offset.reset", "earliest"); + + final CountDownLatch latch = new CountDownLatch(4); + ExecutorService executorService = Executors.newSingleThreadExecutor(); + executorService.execute(() -> { + KafkaConsumer kafkaConsumer = new KafkaConsumer<>(consumerProps); + kafkaConsumer.subscribe(Arrays.asList(inputTopic1, inputTopic2)); + try { + while (true) { + ConsumerRecords records = kafkaConsumer.poll(100); + for (ConsumerRecord record : records) { + logger.info("consuming from topic = {}, partition = {}, offset = {}, key = {}, value = {}", + record.topic(), record.partition(), record.offset(), record.key(), record.value()); + latch.countDown(); + } + } + } finally { + kafkaConsumer.close(); + } + }); + + assertTrue(latch.await(30, TimeUnit.SECONDS)); + } +} \ No newline at end of file diff --git a/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/SparkStreamingMultiSourceAndSinkTest.java b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/SparkStreamingMultiSourceAndSinkTest.java new file mode 100644 index 000000000..d79313967 --- /dev/null +++ b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/SparkStreamingMultiSourceAndSinkTest.java @@ -0,0 +1,222 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.webanalytics; + +import com.hurence.logisland.record.FieldDictionary; +import com.hurence.logisland.record.Record; +import com.hurence.logisland.record.RecordDictionary; +import com.hurence.logisland.webanalytics.test.util.EventsGenerator; +import com.hurence.logisland.webanalytics.util.KafkaUtils; +import com.hurence.logisland.webanalytics.util.SparkMethods; +import org.apache.spark.api.java.function.FlatMapGroupsFunction; +import org.apache.spark.api.java.function.MapFunction; +import org.apache.spark.api.java.function.MapPartitionsFunction; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Encoders; +import org.apache.spark.sql.Row; +import org.apache.spark.sql.SparkSession; +import org.apache.spark.sql.catalyst.encoders.RowEncoder; +import org.apache.spark.sql.streaming.StreamingQuery; +import org.apache.spark.sql.types.DataTypes; +import org.apache.spark.sql.types.StructField; +import org.apache.spark.sql.types.StructType; +import org.junit.ClassRule; +import org.junit.Ignore; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.kafka.test.rule.KafkaEmbedded; + +@Ignore +public class SparkStreamingMultiSourceAndSinkTest { + + private static Logger logger = LoggerFactory.getLogger(SparkStreamingMultiSourceAndSinkTest.class); + + final static String topic1 = "topic1"; + final static String topic2 = "topic2"; + + @ClassRule + public static KafkaEmbedded embeddedKafka = new KafkaEmbedded( + 1, true, 2, + topic1, topic2); + + private static KafkaUtils kafkaUtils = new KafkaUtils(embeddedKafka); + + /** + * + */ + @Test + public void multipleSourceOneRewindOneLastestWithoutGroupByTest() throws Exception { + logger.info("Starting test"); + final String topicName = topic1; + final String topicName2 = topic2; + SparkSession spark = SparkSession + .builder() + .master("local[2]") +// .appName("StructuredSessionizationFromKafka") + .getOrCreate(); + logger.info("Created SparkSession"); +// +// // Subscribe to 1 topic + Dataset df = spark + .readStream() + .format("kafka") + .option("kafka.bootstrap.servers", embeddedKafka.getBrokersAsString()) + .option("subscribe", topicName) + .option("startingOffsets", "latest")//latest by default for stream + .load(); + + Dataset df2 = spark + .readStream() + .format("kafka") + .option("kafka.bootstrap.servers", embeddedKafka.getBrokersAsString()) + .option("subscribe", topicName2) + .option("startingOffsets", "earliest")//latest by default for stream + .load(); + + injectDataIntoTopics(); + StructType schema = new StructType( + new StructField[]{ + new StructField("key", DataTypes.StringType, true, null), + new StructField("value", DataTypes.StringType, true, null), + } + ); + +// if (context.getPropertyValue(GROUP_BY_FIELDS).isSet) { +// import readDF.sparkSession.implicits._ +// readDF +// .groupByKey(_.getField(groupByField).asString()) +// .flatMapGroups((key, iterator) => { +// pipelineMethods.executePipeline(key, iterator) +// }) + + Dataset dataset = df.union(df2).selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)") + .mapPartitions((MapPartitionsFunction) SparkMethods::mappartitionRowIntoKeyValueRow, RowEncoder.apply(schema)); + + logger.info("Start streaming"); + // Start running the query that prints the session updates to the console + StreamingQuery query = dataset + .writeStream() + .outputMode("update") + .format("console") + .option("truncate", false) + .start(); + + Thread.sleep(5000L);//wait to process earliest for topic 2 only ! + EventsGenerator eventGen = new EventsGenerator("events_after_starting_stream"); + long ts = 0L; + while (true) { + logger.info("Adding an event in topic"); + Record event = eventGen.generateEvent(ts, topicName); + kafkaUtils.addingEventsToTopicPartition(topicName, 0, "fromtopic1", event); + kafkaUtils.addingEventsToTopicPartition(topicName, 0, "fromtopic2", event); + logger.info("Waiting 5 sec"); + long sleep = 5000L; + ts += sleep; + Thread.sleep(sleep); + } + } + + /** + * + */ + @Test + public void multipleSourceOneRewindOneLastestWithGroupByTest() throws Exception { + logger.info("Starting test"); + final String topicName = topic1; + final String topicName2 = topic2; + SparkSession spark = SparkSession + .builder() + .master("local[2]") +// .appName("StructuredSessionizationFromKafka") + .getOrCreate(); + logger.info("Created SparkSession"); +// +// // Subscribe to 1 topic + Dataset df = spark + .readStream() + .format("kafka") + .option("kafka.bootstrap.servers", embeddedKafka.getBrokersAsString()) + .option("subscribe", topicName) + .option("startingOffsets", "latest")//latest by default for stream + .load(); + + Dataset df2 = spark + .readStream() + .format("kafka") + .option("kafka.bootstrap.servers", embeddedKafka.getBrokersAsString()) + .option("subscribe", topicName2) + .option("startingOffsets", "earliest")//latest by default for stream + .load(); + + injectDataIntoTopics(); + StructType schema = new StructType( + new StructField[]{ + new StructField("key", DataTypes.StringType, true, null), + new StructField("value", DataTypes.StringType, true, null), + } + ); + +// if (context.getPropertyValue(GROUP_BY_FIELDS).isSet) { +// import readDF.sparkSession.implicits._ +// readDF +// .groupByKey(_.getField(groupByField).asString()) +// .flatMapGroups((key, iterator) => { +// pipelineMethods.executePipeline(key, iterator) +// }) + + Dataset dataset = df.union(df2).selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)") +// .mapPartitions((MapPartitionsFunction) SparkMethods::mappartitionRowIntoKeyValueRow, RowEncoder.apply(schema)); + .groupByKey((MapFunction) SparkMethods::groupBySession, + Encoders.STRING()) + .flatMapGroups((FlatMapGroupsFunction) SparkMethods::doForEAchSessionGroup, + RowEncoder.apply(schema)); + logger.info("Start streaming"); + // Start running the query that prints the session updates to the console + StreamingQuery query = dataset + .writeStream() + .outputMode("update") + .format("console") + .option("truncate", false) + .start(); + + Thread.sleep(5000L);//wait to process earliest for topic 2 only ! + EventsGenerator eventGen = new EventsGenerator("events_after_starting_stream"); + long ts = 0L; + while (true) { + logger.info("Adding an event in topic"); + Record event = eventGen.generateEvent(ts, topicName); + kafkaUtils.addingEventsToTopicPartition(topicName, 0, "fromtopic1", event); + kafkaUtils.addingEventsToTopicPartition(topicName, 0, "fromtopic2", event); + logger.info("Waiting 5 sec"); + long sleep = 5000L; + ts += sleep; + Thread.sleep(sleep); + } + } + + private void injectDataIntoTopics() throws InterruptedException { + EventsGenerator eventGen = new EventsGenerator("events_before_running_job"); + long ts = 0L; + while (ts < 1000) { + logger.info("Adding an event in topics"); + Record event = eventGen.generateEvent(ts, "outputtopic"); + kafkaUtils.addingEventsToTopicPartition(topic1, 0, "fromtopic1", event); + kafkaUtils.addingEventsToTopicPartition(topic2, 0, "fromtopic2", event); + ts += 100; + } + } +} \ No newline at end of file diff --git a/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/util/KafkaUtils.java b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/util/KafkaUtils.java new file mode 100644 index 000000000..6aa5dceba --- /dev/null +++ b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/util/KafkaUtils.java @@ -0,0 +1,70 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.webanalytics.util; + +import com.hurence.logisland.record.Record; +import com.hurence.logisland.webanalytics.test.util.EventsGenerator; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.clients.producer.RecordMetadata; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.kafka.test.rule.KafkaEmbedded; +import org.springframework.kafka.test.utils.KafkaTestUtils; + +import java.util.Map; +import java.util.concurrent.Future; + +public class KafkaUtils { + + private static Logger logger = LoggerFactory.getLogger(KafkaUtils.class); + + public final KafkaEmbedded embeddedKafka; + + public KafkaUtils(KafkaEmbedded embeddedKafka) { + this.embeddedKafka = embeddedKafka; + } + + + public void addingEventsToTopicPartition(String topicName, int partitionId, Record record) throws InterruptedException { + String key = record.getField(EventsGenerator.TIMESTAMP).asString(); + addingEventsToTopicPartition(topicName, partitionId, key, record); + } + + public void addingEventsToTopicPartition(String topicName, int partitionId, String key, Record record) throws InterruptedException { + // Define the record we want to produce + final ProducerRecord producerRecord = new ProducerRecord( + topicName, + partitionId, + key, + record + ); + + Map senderProps = KafkaTestUtils.producerProps(embeddedKafka); + senderProps.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); + senderProps.put("value.serializer", "com.hurence.logisland.serializer.KafkaRecordSerializer"); + try (final KafkaProducer producer = new KafkaProducer<>(senderProps)) { + final Future future = producer.send(producerRecord); + producer.flush(); + while (!future.isDone()) { + Thread.sleep(500L); + } + logger.trace("Produce completed:{}", producerRecord); + } catch (Exception e) { + logger.error("error while sending data to kafka", e); + } + } +} diff --git a/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/util/SparkMethods.java b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/util/SparkMethods.java new file mode 100644 index 000000000..7eb8e8db0 --- /dev/null +++ b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/util/SparkMethods.java @@ -0,0 +1,50 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.webanalytics.util; + +import org.apache.spark.sql.Row; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +public class SparkMethods implements Serializable { + + private static Logger logger = LoggerFactory.getLogger(SparkMethods.class); + + public static Iterator mappartitionRowIntoKeyValueRow(Iterator rows) { + List output = new ArrayList(); + while (rows.hasNext()) { + Row row = rows.next(); + logger.info("processing row {}", row); + output.add(row); + } + return output.iterator(); + } + + public static String groupBySession(Row row) { + return row.getAs("key"); + } + + public static Iterator doForEAchSessionGroup(String session, Iterator rows) { + logger.info("processing group with key {}", session); + return mappartitionRowIntoKeyValueRow(rows); + } + +} diff --git a/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/conf-to-multisink-rewind-only-one-topic-version-rewind.yaml b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/conf-to-multisink-rewind-only-one-topic-version-rewind.yaml new file mode 100644 index 000000000..648b03deb --- /dev/null +++ b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/conf-to-multisink-rewind-only-one-topic-version-rewind.yaml @@ -0,0 +1,98 @@ +######################################################################################################### +# Logisland Rubix Web Analytics +# Receive web events from eventhubs, treat them then push events and sessions into opendistro cluster +######################################################################################################### + +version: 1.4.0 +documentation: Logisland Rubix Webanalytics + +engine: + component: com.hurence.logisland.engine.spark.KafkaStreamProcessingEngine + type: engine + documentation: job to test dynamic output topic and multisource topic ! + configuration: + spark.app.name: LogislandWebanalytics + spark.master: local[3] + spark.streaming.batchDuration: 5000 + spark.streaming.blockInterval: 350 + spark.streaming.kafka.maxRatePerPartition: 5000 + + controllerServiceConfigurations: + # Kafka sink configuration + - controllerService: all_topics + component: com.hurence.logisland.stream.spark.structured.provider.KafkaStructuredStreamProviderService + configuration: + #earliest or latest + kafka.startingOffsets: "latest" + output.mode: "update" + kafka.input.topics.pattern: "my_topics.*" + kafka.input.topics.ignored: "my_topics_2" + kafka.output.topics.field: "topic" + kafka.zookeeper.quorum: ${kafka.zookeeper.quorum} + kafka.topic.autoCreate: true + kafka.topic.default.partitions: 1 + kafka.topic.default.replicationFactor: 1 + read.value.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + write.value.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + write.key.serializer: com.hurence.logisland.serializer.StringSerializer + read.value.schema: > + { "version": 1, + "name": "io.divolte.examples.record", + "type": "record", + "fields": [ + { "name": "h2kTimestamp", "type": "long" }, + { "name": "record_type", "type": ["null", "string"], "default": null }, + { "name": "record_id", "type": ["null", "string"], "default": null }, + { "name": "topic", "type": ["null", "string"], "default": null }, + { "name": "sessionId", "type": ["null", "string"], "default": null }, + { "name": "fromTopic", "type": ["null", "string"], "default": null } + ] + } + + # Kafka source and sink configuration + - controllerService: rewind_topics + component: com.hurence.logisland.stream.spark.structured.provider.KafkaStructuredStreamProviderService + configuration: + #should have exactly the same conf !!!!!! I only put here the new or different conf for more clarity + kafka.startingOffsets: "earliest" + kafka.input.topics: "my_topics_2" + output.mode: "update" + kafka.output.topics.field: "topic" + kafka.zookeeper.quorum: ${kafka.zookeeper.quorum} + kafka.topic.autoCreate: true + kafka.topic.default.partitions: 1 + kafka.topic.default.replicationFactor: 1 + read.value.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + write.value.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + write.key.serializer: com.hurence.logisland.serializer.StringSerializer + read.value.schema: > + { "version": 1, + "name": "io.divolte.examples.record", + "type": "record", + "fields": [ + { "name": "h2kTimestamp", "type": "long" }, + { "name": "record_type", "type": ["null", "string"], "default": null }, + { "name": "record_id", "type": ["null", "string"], "default": null }, + { "name": "topic", "type": ["null", "string"], "default": null }, + { "name": "sessionId", "type": ["null", "string"], "default": null }, + { "name": "fromTopic", "type": ["null", "string"], "default": null } + ] + } + + streamConfigurations: + + - stream: sessionalization + component: com.hurence.logisland.stream.spark.structured.StructuredStream + configuration: + #group by fields is not mandatory, but it may be more efficient for webanalytic + group.by.fields: sessionId +# read.stream.service.provider: all_topics + read.stream.service.provider: all_topics, rewind_topics + write.stream.service.provider: all_topics + + processorConfigurations: + # Tag ALL events with default values + - processor: debug + component: com.hurence.logisland.processor.DebugStream + type: processor + documentation: debug diff --git a/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/conf-to-multisink-rewind-only-one-topic.yaml b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/conf-to-multisink-rewind-only-one-topic.yaml new file mode 100644 index 000000000..7462ecc77 --- /dev/null +++ b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/conf-to-multisink-rewind-only-one-topic.yaml @@ -0,0 +1,98 @@ +######################################################################################################### +# Logisland Rubix Web Analytics +# Receive web events from eventhubs, treat them then push events and sessions into opendistro cluster +######################################################################################################### + +version: 1.4.0 +documentation: Logisland Rubix Webanalytics + +engine: + component: com.hurence.logisland.engine.spark.KafkaStreamProcessingEngine + type: engine + documentation: job to test dynamic output topic and multisource topic ! + configuration: + spark.app.name: LogislandWebanalytics + spark.master: local[3] + spark.streaming.batchDuration: 5000 + spark.streaming.blockInterval: 350 + spark.streaming.kafka.maxRatePerPartition: 5000 + + controllerServiceConfigurations: + # Kafka sink configuration + - controllerService: all_topics + component: com.hurence.logisland.stream.spark.structured.provider.KafkaStructuredStreamProviderService + configuration: + #earliest or latest + kafka.startingOffsets: "latest" + output.mode: "update" + kafka.input.topics.pattern: "my_topics.*" +# kafka.input.topics.ignored: "my_topics_2" + kafka.output.topics.field: "topic" + kafka.zookeeper.quorum: ${kafka.zookeeper.quorum} + kafka.topic.autoCreate: true + kafka.topic.default.partitions: 1 + kafka.topic.default.replicationFactor: 1 + read.value.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + write.value.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + write.key.serializer: com.hurence.logisland.serializer.StringSerializer + read.value.schema: > + { "version": 1, + "name": "io.divolte.examples.record", + "type": "record", + "fields": [ + { "name": "h2kTimestamp", "type": "long" }, + { "name": "record_type", "type": ["null", "string"], "default": null }, + { "name": "record_id", "type": ["null", "string"], "default": null }, + { "name": "topic", "type": ["null", "string"], "default": null }, + { "name": "sessionId", "type": ["null", "string"], "default": null }, + { "name": "fromTopic", "type": ["null", "string"], "default": null } + ] + } + + # Kafka source and sink configuration + - controllerService: rewind_topics + component: com.hurence.logisland.stream.spark.structured.provider.KafkaStructuredStreamProviderService + configuration: + #should have exactly the same conf !!!!!! I only put here the new or different conf for more clarity + kafka.startingOffsets: "earliest" + kafka.input.topics: "my_topics_2" + output.mode: "update" + kafka.output.topics.field: "topic" + kafka.zookeeper.quorum: ${kafka.zookeeper.quorum} + kafka.topic.autoCreate: true + kafka.topic.default.partitions: 1 + kafka.topic.default.replicationFactor: 1 + read.value.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + write.value.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + write.key.serializer: com.hurence.logisland.serializer.StringSerializer + read.value.schema: > + { "version": 1, + "name": "io.divolte.examples.record", + "type": "record", + "fields": [ + { "name": "h2kTimestamp", "type": "long" }, + { "name": "record_type", "type": ["null", "string"], "default": null }, + { "name": "record_id", "type": ["null", "string"], "default": null }, + { "name": "topic", "type": ["null", "string"], "default": null }, + { "name": "sessionId", "type": ["null", "string"], "default": null }, + { "name": "fromTopic", "type": ["null", "string"], "default": null } + ] + } + + streamConfigurations: + + - stream: sessionalization + component: com.hurence.logisland.stream.spark.structured.StructuredStream + configuration: + #group by fields is not mandatory, but it may be more efficient for webanalytic + group.by.fields: sessionId + read.stream.service.provider: all_topics + # read.stream.service.provider: all_topics, rewind_topics + write.stream.service.provider: all_topics + + processorConfigurations: + # Tag ALL events with default values + - processor: debug + component: com.hurence.logisland.processor.DebugStream + type: processor + documentation: debug diff --git a/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/conf-to-multisink.yaml b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/conf-to-multisink.yaml new file mode 100644 index 000000000..2dd3ed30c --- /dev/null +++ b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/conf-to-multisink.yaml @@ -0,0 +1,65 @@ +######################################################################################################### +# Logisland Rubix Web Analytics +# Receive web events from eventhubs, treat them then push events and sessions into opendistro cluster +######################################################################################################### + +version: 1.4.0 +documentation: Logisland Rubix Webanalytics + +engine: + component: com.hurence.logisland.engine.spark.KafkaStreamProcessingEngine + type: engine + documentation: job to test dynamic output topic and multisource topic ! + configuration: + spark.app.name: dynamicOutputTopicApp + spark.master: local[3] + spark.streaming.batchDuration: 5000 + spark.streaming.blockInterval: 350 + spark.streaming.kafka.maxRatePerPartition: 5000 + + controllerServiceConfigurations: + # Kafka sink configuration + - controllerService: all_topics + component: com.hurence.logisland.stream.spark.structured.provider.KafkaStructuredStreamProviderService + configuration: + #earliest or latest + kafka.startingOffsets: "latest" + output.mode: "update" +# kafka.input.topics.pattern: "my_topics*" + kafka.input.topics: "my_topics_1,my_topics_2" + kafka.output.topics.field: "topic" + kafka.zookeeper.quorum: ${kafka.zookeeper.quorum} + kafka.topic.autoCreate: true + kafka.topic.default.partitions: 1 + kafka.topic.default.replicationFactor: 1 + read.value.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + write.value.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + write.key.serializer: com.hurence.logisland.serializer.StringSerializer + read.value.schema: > + { "version": 1, + "name": "io.divolte.examples.record", + "type": "record", + "fields": [ + { "name": "timestamp", "type": "long" }, + { "name": "record_type", "type": ["null", "string"], "default": null }, + { "name": "record_id", "type": ["null", "string"], "default": null }, + { "name": "topic", "type": ["null", "string"], "default": null }, + { "name": "sessionId", "type": ["null", "string"], "default": null } + ] + } + + streamConfigurations: + + - stream: dynamicOutputTopic + component: com.hurence.logisland.stream.spark.structured.StructuredStream + configuration: + group.by.fields: sessionId + read.stream.service.provider: all_topics + write.stream.service.provider: all_topics + + processorConfigurations: + # Tag ALL events with default values + - processor: debug + component: com.hurence.logisland.processor.DebugStream + type: processor + documentation: debug diff --git a/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/log4j.properties b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/log4j.properties new file mode 100644 index 000000000..1d0e7cd63 --- /dev/null +++ b/logisland-tests/kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/log4j.properties @@ -0,0 +1,11 @@ +# Root logger option +log4j.rootLogger=ERROR,stdout + +# Direct log messages to stdout +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n + +#log4j.logger.com.hurence=DEBUG +log4j.logger.com.hurence.logisland=INFO diff --git a/logisland-tests/pom.xml b/logisland-tests/pom.xml new file mode 100644 index 000000000..0cef40a59 --- /dev/null +++ b/logisland-tests/pom.xml @@ -0,0 +1,21 @@ + + + + logisland + com.hurence.logisland + 1.4.0 + + 4.0.0 + + logisland-tests + pom + + webanal-spark-2.4-streaming-pipeline + webanal-spark-2.4-kafka0.10-streaming-pipeline + kafka-to-multikafka-topics-spark-2.4-kafka0.10-streaming-pipeline + + + + \ No newline at end of file diff --git a/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/README.md b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/README.md new file mode 100644 index 000000000..3a286ad6d --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/README.md @@ -0,0 +1,13 @@ +To run the test we use an embeded kafka server. + +For open_distro (elasticserach) we use the docker-compose file available +on open distro web site and in folder +```resources/docker/docker-compose.yml``` + +SO before running any test run + +``` +docker-compose up +``` + +on this docker file. \ No newline at end of file diff --git a/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/pom.xml b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/pom.xml new file mode 100644 index 000000000..c206010ec --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/pom.xml @@ -0,0 +1,182 @@ + + + + logisland-tests + com.hurence.logisland + 1.4.0 + + 4.0.0 + + webanal-spark-2.4-kafka0.10-streaming-pipeline + jar + + + + 2.11 + 2.11.8 + 2.4.0 + 0-10 + 0.10.2.1 + + + + + + com.hurence.logisland + logisland-api + ${project.version} + provided + + + com.hurence.logisland + logisland-scripting-base + ${project.version} + provided + + + com.hurence.logisland + logisland-scripting-mvel + ${project.version} + provided + + + + + + + + + com.hurence.logisland + logisland-utils + ${project.version} + provided + + + com.fasterxml.jackson.core + jackson-databind + + + + + + com.hurence.logisland + logisland-bootstrap + ${project.version} + provided + + + com.hurence.logisland + logisland-plugin-support + ${project.version} + provided + + + + + + com.hurence.logisland + logisland-engine-spark_2_4 + ${project.version} + provided + + + + + com.hurence.logisland + logisland-processor-web-analytics + ${project.version} + provided + + + + + com.hurence.logisland + logisland-processor-common + ${project.version} + provided + + + org.scala-lang + scala-library + + + + + com.hurence.logisland + logisland-processor-elasticsearch + ${project.version} + repackaged + provided + + + com.hurence.logisland + logisland-service-inmemory-cache + ${project.version} + repackaged + provided + + + com.hurence.logisland + logisland-service-elasticsearch_7_x-client + ${project.version} + repackaged + provided + + + com.hurence.logisland + logisland-processor-useragent + ${project.version} + repackaged + provided + + + + + org.apache.spark + spark-sql_${scala.binary.version} + ${spark.version} + + + org.apache.spark + spark-sql-kafka-${kafka.spark.version}_${scala.binary.version} + ${spark.version} + + + org.apache.spark + spark-streaming_${scala.binary.version} + ${spark.version} + provided + + + + + org.springframework.kafka + spring-kafka-test + 1.2.3.RELEASE + test + + + + org.apache.kafka + kafka_${scala.binary.version} + ${kafka.version} + test + + + org.apache.kafka + kafka-clients + ${kafka.version} + test + + + + org.slf4j + slf4j-log4j12 + ${org.slf4j.version} + test + + + \ No newline at end of file diff --git a/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/main/java/com/hurence/logisland/webanalytics/test/util/ConfJobHelper.java b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/main/java/com/hurence/logisland/webanalytics/test/util/ConfJobHelper.java new file mode 100644 index 000000000..a8e0ab339 --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/main/java/com/hurence/logisland/webanalytics/test/util/ConfJobHelper.java @@ -0,0 +1,108 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.webanalytics.test.util; + +import com.hurence.logisland.component.ComponentFactory; +import com.hurence.logisland.component.InitializationException; +import com.hurence.logisland.config.ConfigReader; +import com.hurence.logisland.config.ControllerServiceConfiguration; +import com.hurence.logisland.config.LogislandConfiguration; +import com.hurence.logisland.engine.EngineContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.Map; +import java.util.Optional; + +public class ConfJobHelper { + + private static Logger logger = LoggerFactory.getLogger(ConfJobHelper.class); + + private final LogislandConfiguration jobConfig; + private EngineContext engineContext; + + public ConfJobHelper(LogislandConfiguration jobConfig) { + this.jobConfig = jobConfig; + } + + public ConfJobHelper(String pathConfFile) throws IOException { + this(ConfigReader.loadConfig(pathConfFile)); + } + + public void modifyControllerServiceConf(String id, Map confToModify) { + ControllerServiceConfiguration service = jobConfig.getEngine().getControllerServiceConfigurations() + .stream() + .filter(c -> id.equals(c.getControllerService())) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("service with id " + id + " does not exist")); + service.getConfiguration().putAll(confToModify); + } + + public void initJob() throws InitializationException { + // instantiate engine and all the processor from the config + // this init the engine + Optional engineInstance = ComponentFactory.buildAndSetUpEngineContext(jobConfig.getEngine()); + if (!engineInstance.isPresent()) { + throw new IllegalArgumentException("engineInstance could not be instantiated"); + } + if (!engineInstance.get().isValid()) { + throw new IllegalArgumentException("engineInstance is not valid with input configuration !"); + } + engineContext = engineInstance.get(); + logger.info("Initialized Logisland job version {}", jobConfig.getVersion()); + logger.info(jobConfig.getDocumentation()); + } + + public void stopJob() { + engineContext.getEngine().stop(engineContext); + } + + public void softStop() { + engineContext.getEngine().softStop(engineContext); + } + + public void startJob() { + String engineName = engineContext.getEngine().getIdentifier(); + try { + logger.info("Init engine {}", engineName); + engineContext.getEngine().init(engineContext); + logger.info("Start engine {}", engineName); + engineContext.getEngine().start(engineContext); + } catch (Exception e) { + logger.error("Something went bad while running the job {} : {}", engineName, e); + System.exit(-1); + } + } + + public void awaitTermination() { + String engineName = engineContext.getEngine().getIdentifier(); + try { + logger.info("Waiting termination of engine {}", engineName); + engineContext.getEngine().awaitTermination(engineContext); + logger.info("Engine {} terminated", engineName); + System.exit(0); + } catch (Exception e) { + logger.error("Something went bad while running the job {} : {}", engineName, e); + System.exit(-1); + } + } + + public void startThenAwaitTermination() { + startJob(); + awaitTermination(); + } +} diff --git a/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/main/java/com/hurence/logisland/webanalytics/test/util/EventsGenerator.java b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/main/java/com/hurence/logisland/webanalytics/test/util/EventsGenerator.java new file mode 100644 index 000000000..9ca9b7f9b --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/main/java/com/hurence/logisland/webanalytics/test/util/EventsGenerator.java @@ -0,0 +1,151 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.webanalytics.test.util; + +import com.hurence.logisland.record.Record; +import com.hurence.logisland.record.StandardRecord; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.LongStream; + +/** + * No thread safe + */ +public class EventsGenerator { + + final String sessionId; + + private long eventId = 0; + + public EventsGenerator(String sessionId) { + this.sessionId = sessionId; + } + + public Record generateEvent(long timestamp, String url) { + Record record = new StandardRecord("generated"); + record.setId(sessionId + String.valueOf(eventId++)); + record.setStringField(TestMappings.eventsInternalFields.getSessionIdField(), sessionId); + record.setLongField(TestMappings.eventsInternalFields.getTimestampField(), timestamp); + record.setStringField(TestMappings.eventsInternalFields.getVisitedPageField(), url); + record.setStringField(TestMappings.eventsInternalFields.getUserIdField(), "greg"); + record.setStringField("Company", "orexad"); + record.setStringField("codeProduct_rev", "fake_product"); + record.setStringField("categoryNiv4", "fakeniv4"); + return record; + +// { "version": 1, +// "name": "io.divolte.examples.record", +// "type": "record", +// "fields": [ +// { "name": "h2kTimestamp", "type": "long" }, +// { "name": "remoteHost", "type": "string"}, +// { "name": "record_type", "type": ["null", "string"], "default": null }, +// { "name": "record_id", "type": ["null", "string"], "default": null }, +// { "name": "location", "type": ["null", "string"], "default": null }, +// { "name": "hitType", "type": ["null", "string"], "default": null }, +// { "name": "eventCategory", "type": ["null", "string"], "default": null }, +// { "name": "eventAction", "type": ["null", "string"], "default": null }, +// { "name": "eventLabel", "type": ["null", "string"], "default": null }, +// { "name": "localPath", "type": ["null", "string"], "default": null }, +// { "name": "q", "type": ["null", "string"], "default": null }, +// { "name": "n", "type": ["null", "int"], "default": null }, +// { "name": "referer", "type": ["null", "string"], "default": null}, +// { "name": "viewportPixelWidth", "type": ["null", "int"], "default": null}, +// { "name": "viewportPixelHeight", "type": ["null", "int"], "default": null}, +// { "name": "screenPixelWidth", "type": ["null", "int"], "default": null}, +// { "name": "screenPixelHeight", "type": ["null", "int"], "default": null}, +// { "name": "partyId", "type": ["null", "string"], "default": null}, +// { "name": "sessionId", "type": ["null", "string"], "default": null}, +// { "name": "pageViewId", "type": ["null", "string"], "default": null}, +// { "name": "is_newSession", "type": ["null", "boolean"], "default": null}, +// { "name": "userAgentString", "type": ["null", "string"], "default": null}, +// { "name": "pageType", "type": ["null", "string"], "default": null}, +// { "name": "Userid", "type": ["null", "string"], "default": null}, +// { "name": "B2BUnit", "type": ["null", "string"], "default": null}, +// { "name": "pointOfService", "type": ["null", "string"], "default": null}, +// { "name": "companyID", "type": ["null", "string"], "default": null}, +// { "name": "GroupCode", "type": ["null", "string"], "default": null}, +// { "name": "userRoles", "type": ["null", "string"], "default": null}, +// { "name": "is_PunchOut", "type": ["null", "string"], "default": null}, +// { "name": "codeProduct", "type": ["null", "string"], "default": null}, +// { "name": "categoryProductId", "type": ["null", "string"], "default": null}, +// { "name": "categoryName", "type": ["null", "string"], "default": null}, +// { "name": "categoryCode", "type": ["null", "string"], "default": null}, +// { "name": "categoryNiv5", "type": ["null", "string"], "default": null}, +// { "name": "categoryNiv4", "type": ["null", "string"], "default": null}, +// { "name": "categoryNiv3", "type": ["null", "string"], "default": null}, +// { "name": "categoryNiv2", "type": ["null", "string"], "default": null}, +// { "name": "categoryNiv1", "type": ["null", "string"], "default": null}, +// { "name": "countryCode", "type": ["null", "string"], "default": null}, +// { "name": "Company", "type": ["null", "string"], "default": null}, +// { "name": "is_Link", "type": ["null", "boolean"], "default": null}, +// { "name": "clickText", "type": ["null", "string"], "default": null}, +// { "name": "clickURL", "type": ["null", "string"], "default": null}, +// { "name": "newCustomerWebOnly", "type": ["null", "int"], "default": null}, +// { "name": "newCustomerWebOrAgency", "type": ["null", "int"], "default": null}, +// { "name": "productPrice", "type": ["null", "float"], "default": null}, +// { "name": "searchedProductIndex", "type": ["null", "int"], "default": null}, +// { "name": "searchedProductPage", "type": ["null", "int"], "default": null}, +// { "name": "stockInfo", "type": ["null", "string"], "default": null}, +// { "name": "transactionId", "type": ["null", "string"], "default": null}, +// { "name": "transactionTotal", "type": ["null", "float"], "default": null}, +// { "name": "transactionCurrency", "type": ["null", "string"], "default": null}, +// { "name": "productQuantity", "type": ["null", "int"], "default": null}, +// { "name": "Alt", "type": ["null", "string"], "default": null}, +// { "name": "erpLocaleCode", "type": ["null", "string"], "default": null}, +// { "name": "salesOrg", "type": ["null", "string"], "default": null}, +// { "name": "country", "type": ["null", "string"], "default": null}, +// { "name": "currency", "type": ["null", "string"], "default": null}, +// { "name": "currentCart", "type": ["null", {"type": "array", "items":{ +// "name": "Product", "type": "record", "fields":[ +// {"name": "price", "type": "double"}, +// {"name": "quantity", "type": "int"}, +// {"name": "sku", "type": "string"} +// ]} +// }], +// "default": null +// } +// ] +// } + } + + public List generateEvents(List timestamps, + String url) { + return timestamps.stream() + .map(ts -> generateEvent(ts, url)) + .collect(Collectors.toList()); + } + + public List generateEvents(Long from, + Long to, + Long padding) { + int numberOfRecord = (int)((to - from) / padding); + return LongStream.iterate(from, ts -> ts + padding) + .limit(numberOfRecord) + .mapToObj(ts -> generateEvent(ts, "url")) + .collect(Collectors.toList()); + } + + public List generateEventsRandomlyOrdered(Long from, + Long to, + Long padding) { + List sortedList = generateEvents(from, to, padding); + Collections.shuffle(sortedList);; + return sortedList; + } +} diff --git a/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/main/java/com/hurence/logisland/webanalytics/test/util/TestMappings.java b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/main/java/com/hurence/logisland/webanalytics/test/util/TestMappings.java new file mode 100644 index 000000000..eacc011bb --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/main/java/com/hurence/logisland/webanalytics/test/util/TestMappings.java @@ -0,0 +1,64 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.webanalytics.test.util; + +import com.hurence.logisland.processor.webanalytics.IncrementalWebSession; +import com.hurence.logisland.processor.webanalytics.modele.Event; +import com.hurence.logisland.processor.webanalytics.modele.WebSession; + +import static com.hurence.logisland.processor.webanalytics.IncrementalWebSession.DEFAULT_SOURCE_OF_TRAFFIC_PREFIX; + +public class TestMappings { + + + public static Event.InternalFields eventsInternalFields = new Event.InternalFields() + .setSessionIdField("sessionId") + .setTimestampField("h2kTimestamp") + .setVisitedPageField("location") + .setSourceOffTrafficCampaignField(IncrementalWebSession.DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_CAMPAIGN) + .setSourceOffTrafficContentField(IncrementalWebSession.DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_CONTENT) + .setSourceOffTrafficKeyWordField(IncrementalWebSession.DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_KEYWORD) + .setSourceOffTrafficMediumField(IncrementalWebSession.DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_MEDIUM) + .setSourceOffTrafficSourceField(IncrementalWebSession.DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_SOURCE) + .setNewSessionReasonField("reasonForNewSession") + .setUserIdField("Userid") + .setOriginalSessionIdField("originalSessionId") + .setTransactionIdField("transactionId") + .setTransactionIdsField("transactionIds"); + + + + public static WebSession.InternalFields sessionInternalFields = new WebSession.InternalFields() + .setSessionIdField("sessionId") + .setTimestampField("h2kTimestamp") + .setSourceOffTrafficCampaignField(IncrementalWebSession.DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_CAMPAIGN) + .setSourceOffTrafficContentField(IncrementalWebSession.DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_CONTENT) + .setSourceOffTrafficKeyWordField(IncrementalWebSession.DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_KEYWORD) + .setSourceOffTrafficMediumField(IncrementalWebSession.DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_MEDIUM) + .setSourceOffTrafficSourceField(IncrementalWebSession.DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_SOURCE) + .setIsSessionActiveField("is_sessionActive") + .setSessionDurationField("sessionDuration") + .setSessionInactivityDurationField("sessionInactivityDuration") + .setEventsCounterField("eventsCounter") + .setFirstEventDateTimeField("firstEventDateTime") + .setFirstEventEpochSecondsField("firstEventEpochSeconds") + .setFirstVisitedPageField("firstVisitedPage") + .setLastEventDateTimeField("lastEventDateTime") + .setLastEventEpochSecondsField("lastEventEpochSeconds") + .setLastVisitedPageField("lastVisitedPage") + .setTransactionIdsField("transactionIds") + .setUserIdField("Userid"); +} diff --git a/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/bean/KeyValue.java b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/bean/KeyValue.java new file mode 100644 index 000000000..446ef76e6 --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/bean/KeyValue.java @@ -0,0 +1,30 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.bean; + +import java.io.Serializable; + +public class KeyValue implements Serializable { + + public String key; + public Long count; + + public KeyValue(String key, Long count) { + this.key = key; + this.count = count; + } + +} diff --git a/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/serializer/KafkaRecordSerializer.java b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/serializer/KafkaRecordSerializer.java new file mode 100644 index 000000000..696044490 --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/serializer/KafkaRecordSerializer.java @@ -0,0 +1,56 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.serializer; + +import com.hurence.logisland.record.Record; +import org.apache.kafka.common.serialization.Serializer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Map; + + +public class KafkaRecordSerializer implements Serializer { + + private static Logger logger = LoggerFactory.getLogger(KafkaRecordSerializer.class); + + private ExtendedJsonSerializer recordSerializer = new ExtendedJsonSerializer(); + private ByteArrayOutputStream out; + + @Override + public void configure(Map map, boolean b) { + out = new ByteArrayOutputStream(); + } + + @Override + public byte[] serialize(String s, Record record) { + recordSerializer.serialize(out, record); + return out.toByteArray(); + } + + @Override + public void close() { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + logger.error("error while closing stream", e); + } + } + } +} diff --git a/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/MySimpleTest.java b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/MySimpleTest.java new file mode 100644 index 000000000..c5dac3627 --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/MySimpleTest.java @@ -0,0 +1,130 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.webanalytics; + +import com.hurence.logisland.record.Record; +import com.hurence.logisland.webanalytics.test.util.EventsGenerator; +import com.hurence.logisland.webanalytics.util.KafkaUtils; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.clients.producer.RecordMetadata; +import org.junit.ClassRule; +import org.junit.Ignore; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.kafka.test.rule.KafkaEmbedded; +import org.springframework.kafka.test.utils.KafkaTestUtils; + +import java.util.Arrays; +import java.util.Map; +import java.util.concurrent.*; + +import static org.junit.Assert.assertTrue; + +@Ignore +public class MySimpleTest { + + private static Logger logger = LoggerFactory.getLogger(MySimpleTest.class); + + final static String topic2 = "topicEvent"; + final static String topic1 = "topic1"; + + @ClassRule + public static KafkaEmbedded embeddedKafka = new KafkaEmbedded( + 1, true, 2, + topic1, topic2); + + private static KafkaUtils kafkaUtils = new KafkaUtils(embeddedKafka); + + @Test + public void testWithEvent() throws Exception { + logger.info("Starting test"); + EventsGenerator eventGen = new EventsGenerator("divolte_1"); + logger.info("Adding an event in topic"); + + Record event = eventGen.generateEvent(0, "url"); + kafkaUtils.addingEventsToTopicPartition(topic2, 0, event); + kafkaUtils.addingEventsToTopicPartition(topic2, 0, "session1", event); + kafkaUtils.addingEventsToTopicPartition(topic2, 0, "session2", event); + + Map consumerProps = KafkaTestUtils.consumerProps("sampleRawConsumer", "false", embeddedKafka); + consumerProps.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); + consumerProps.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); + consumerProps.put("auto.offset.reset", "earliest"); + final CountDownLatch latch = new CountDownLatch(3); + ExecutorService executorService = Executors.newSingleThreadExecutor(); + executorService.execute(() -> { + KafkaConsumer kafkaConsumer = new KafkaConsumer<>(consumerProps); + kafkaConsumer.subscribe(Arrays.asList(topic2, topic1)); + try { + while (true) { + ConsumerRecords records = kafkaConsumer.poll(100); + for (ConsumerRecord record : records) { + logger.info("consuming from topic = {}, partition = {}, offset = {}, key = {}, value = {}", + record.topic(), record.partition(), record.offset(), record.key(), record.value()); + latch.countDown(); + } + } + } finally { + kafkaConsumer.close(); + } + }); + + assertTrue(latch.await(90, TimeUnit.SECONDS)); + } + + + /** + * + */ + @Test + public void simpleTest() throws Exception { + Map senderProps = KafkaTestUtils.producerProps(embeddedKafka); + KafkaProducer producer = new KafkaProducer<>(senderProps); + producer.send(new ProducerRecord<>(topic1, 0, 0, "message0")).get(); + producer.send(new ProducerRecord<>(topic1, 0, 1, "message1")).get(); + producer.send(new ProducerRecord<>(topic1, 1, 2, "message2")).get(); + producer.send(new ProducerRecord<>(topic1, 1, 3, "message3")).get(); + + Map consumerProps = KafkaTestUtils.consumerProps("sampleRawConsumer", "false", embeddedKafka); + consumerProps.put("auto.offset.reset", "earliest"); + + final CountDownLatch latch = new CountDownLatch(4); + ExecutorService executorService = Executors.newSingleThreadExecutor(); + executorService.execute(() -> { + KafkaConsumer kafkaConsumer = new KafkaConsumer<>(consumerProps); + kafkaConsumer.subscribe(Arrays.asList(topic1, topic2)); + try { + while (true) { + ConsumerRecords records = kafkaConsumer.poll(100); + for (ConsumerRecord record : records) { + logger.info("consuming from topic = {}, partition = {}, offset = {}, key = {}, value = {}", + record.topic(), record.partition(), record.offset(), record.key(), record.value()); + latch.countDown(); + } + } + } finally { + kafkaConsumer.close(); + } + }); + + assertTrue(latch.await(90, TimeUnit.SECONDS)); + } +} \ No newline at end of file diff --git a/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/SparkStreamingMultiSourceAndSinkTest.java b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/SparkStreamingMultiSourceAndSinkTest.java new file mode 100644 index 000000000..fd5037481 --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/SparkStreamingMultiSourceAndSinkTest.java @@ -0,0 +1,269 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.webanalytics; + +import com.hurence.logisland.record.Record; +import com.hurence.logisland.webanalytics.test.util.EventsGenerator; +import com.hurence.logisland.webanalytics.util.KafkaUtils; +import com.hurence.logisland.webanalytics.util.SparkMethods; +import org.apache.spark.api.java.function.MapFunction; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; +import org.apache.spark.sql.SparkSession; +import org.apache.spark.sql.catalyst.encoders.RowEncoder; +import org.apache.spark.sql.streaming.StreamingQuery; +import org.apache.spark.sql.types.DataTypes; +import org.apache.spark.sql.types.StructField; +import org.apache.spark.sql.types.StructType; +import org.junit.ClassRule; +import org.junit.Ignore; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.kafka.test.rule.KafkaEmbedded; + +@Ignore +public class SparkStreamingMultiSourceAndSinkTest { + + private static Logger logger = LoggerFactory.getLogger(SparkStreamingMultiSourceAndSinkTest.class); + + final static String topic1 = "topic1"; + final static String topic2 = "topic2"; + + @ClassRule + public static KafkaEmbedded embeddedKafka = new KafkaEmbedded( + 1, true, 2, + topic1, topic2); + + private static KafkaUtils kafkaUtils = new KafkaUtils(embeddedKafka); + + /** + * + */ + @Test + public void multipleSinkTest() throws Exception { + logger.info("Starting test"); + SparkSession spark = SparkSession + .builder() + .master("local[2]") + .appName("StructuredSessionizationFromKafka") + .getOrCreate(); + logger.info("Created SparkSession"); + +// // Subscribe to 1 topic + Dataset df = spark + .readStream() + .format("kafka") + .option("kafka.bootstrap.servers", embeddedKafka.getBrokersAsString()) + .option("subscribe", topic1) + .option("startingOffsets", "earliest")//latest by default for stream + //failOnDataLoss => may be false alarm + //kafkaConsumer.pollTimeoutMs + //fetchOffset.numRetries + //fetchOffset.retryIntervalMs + //maxOffsetsPerTrigger + .load(); + + df = df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)") + .groupBy("key") + .count(); + + StructType schema = new StructType( + new StructField[]{ + new StructField("key", DataTypes.StringType, true, null), + new StructField("counter", DataTypes.LongType, true, null) + } + ); + + Dataset dataset = df.map((MapFunction) SparkMethods::mapRowIntoKeyValueRow, RowEncoder.apply(schema)); + + logger.info("Start streaming"); + // Start running the query that prints the session updates to the console + StreamingQuery query = dataset + .writeStream() + .outputMode("update") + .format("console") + .option("truncate", false) + .start(); + + StreamingQuery query2 = dataset + .writeStream() + .outputMode("update") + .format("console") + .option("truncate", false) + .start(); + + EventsGenerator eventGen = new EventsGenerator("divolte_1"); + long ts = 0L; + while (true) { + logger.info("Adding an event in topic"); + Record event = eventGen.generateEvent(ts, "url"); + kafkaUtils.addingEventsToTopicPartition(topic1, 0, event); + kafkaUtils.addingEventsToTopicPartition(topic1, 0, "session1", event); + kafkaUtils.addingEventsToTopicPartition(topic1, 1, "session2", event); + logger.info("Waiting 5 sec"); + long sleep = 5000L; + ts += sleep; + Thread.sleep(sleep); + } + } + + /** + * + */ + @Test + public void multipleSourceTest() throws Exception { + logger.info("Starting test"); + final String topicName = topic1; + final String topicName2 = topic2; + SparkSession spark = SparkSession + .builder() + .master("local[2]") +// .appName("StructuredSessionizationFromKafka") + .getOrCreate(); + logger.info("Created SparkSession"); +// +// // Subscribe to 1 topic + Dataset df = spark + .readStream() + .format("kafka") + .option("kafka.bootstrap.servers", embeddedKafka.getBrokersAsString()) + .option("subscribe", topicName) + .option("startingOffsets", "earliest")//latest by default for stream + .load(); + + Dataset df2 = spark + .readStream() + .format("kafka") + .option("kafka.bootstrap.servers", embeddedKafka.getBrokersAsString()) + .option("subscribe", topicName2) + .option("startingOffsets", "earliest")//latest by default for stream + .load(); + + df = df.union(df2).selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)") + .groupBy("key") + .count(); + + StructType schema = new StructType( + new StructField[]{ + new StructField("key", DataTypes.StringType, true, null), + new StructField("counter", DataTypes.LongType, true, null) + } + ); + + Dataset dataset = df.map((MapFunction) SparkMethods::mapRowIntoKeyValueRow, RowEncoder.apply(schema)); + + logger.info("Start streaming"); + // Start running the query that prints the session updates to the console + StreamingQuery query = dataset + .writeStream() + .outputMode("update") + .format("console") + .option("truncate", false) + .start(); + + EventsGenerator eventGen = new EventsGenerator("divolte_1"); + long ts = 0L; + while (true) { + logger.info("Adding an event in topic"); + Record event = eventGen.generateEvent(ts, "url"); + kafkaUtils.addingEventsToTopicPartition(topicName, 0, "fromtopic1", event); + kafkaUtils.addingEventsToTopicPartition(topicName2, 0, "fromtopic2", event); + logger.info("Waiting 5 sec"); + long sleep = 5000L; + ts += sleep; + Thread.sleep(sleep); + } + } + + + /** + * + */ + @Test + public void multipleSourceAndSinkTest() throws Exception { + logger.info("Starting test"); + final String topicName = topic1; + final String topicName2 = topic2; + SparkSession spark = SparkSession + .builder() + .master("local[2]") +// .appName("StructuredSessionizationFromKafka") + .getOrCreate(); + logger.info("Created SparkSession"); +// +// // Subscribe to 1 topic + Dataset df = spark + .readStream() + .format("kafka") + .option("kafka.bootstrap.servers", embeddedKafka.getBrokersAsString()) + .option("subscribe", topicName) + .option("startingOffsets", "earliest")//latest by default for stream + .load(); + + Dataset df2 = spark + .readStream() + .format("kafka") + .option("kafka.bootstrap.servers", embeddedKafka.getBrokersAsString()) + .option("subscribe", topicName2) + .option("startingOffsets", "earliest")//latest by default for stream + .load(); + + df = df.union(df2).selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)") + .groupBy("key") + .count(); + + StructType schema = new StructType( + new StructField[]{ + new StructField("key", DataTypes.StringType, true, null), + new StructField("counter", DataTypes.LongType, true, null) + } + ); + + Dataset dataset = df.map((MapFunction) SparkMethods::mapRowIntoKeyValueRow, RowEncoder.apply(schema)); + + logger.info("Start streaming"); + // Start running the query that prints the session updates to the console + StreamingQuery query = dataset + .writeStream() + .outputMode("update") + .format("console") + .option("truncate", false) + .start(); + + StreamingQuery query2 = dataset + .writeStream() + .outputMode("update") + .format("console") + .option("truncate", false) + .start(); + + EventsGenerator eventGen = new EventsGenerator("divolte_1"); + long ts = 0L; + while (true) { + logger.info("Adding an event in topic"); + Record event = eventGen.generateEvent(ts, "url"); + kafkaUtils.addingEventsToTopicPartition(topicName, 0, "fromtopic1", event); + kafkaUtils.addingEventsToTopicPartition(topicName2, 0, "fromtopic2", event); + logger.info("Waiting 5 sec"); + long sleep = 5000L; + ts += sleep; + Thread.sleep(sleep); + } + } + + +} \ No newline at end of file diff --git a/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/WebanalSessionnalizationGroupByStreamTest.java b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/WebanalSessionnalizationGroupByStreamTest.java new file mode 100644 index 000000000..4978937c4 --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/WebanalSessionnalizationGroupByStreamTest.java @@ -0,0 +1,273 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.webanalytics; + +import com.hurence.logisland.component.InitializationException; +import com.hurence.logisland.record.Record; +import com.hurence.logisland.service.elasticsearch.ElasticsearchClientService; +import com.hurence.logisland.stream.spark.structured.provider.KafkaProperties; +import com.hurence.logisland.webanalytics.test.util.ConfJobHelper; +import com.hurence.logisland.webanalytics.test.util.EventsGenerator; +import com.hurence.logisland.webanalytics.util.KafkaUtils; +import org.junit.ClassRule; +import org.junit.Ignore; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.kafka.test.rule.KafkaEmbedded; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +@Ignore +public class WebanalSessionnalizationGroupByStreamTest { + + private static Logger logger = LoggerFactory.getLogger(WebanalSessionnalizationGroupByStreamTest.class); + + final static String logisland_raw = "logisland_raw"; + + @ClassRule + public static KafkaEmbedded embeddedKafka = new KafkaEmbedded( + 1, true, 2, + logisland_raw); + + private static KafkaUtils kafkaUtils = new KafkaUtils(embeddedKafka); + + + /** + */ + @Test + public void startFromlatestOffset() throws IOException, InterruptedException, InitializationException { + final EventsGenerator eventGen = new EventsGenerator("divolte_1"); + final long numberOfREcordsToPutInKafka = 5000; + //init kafka + boolean running = true; + long ts = 0L; + long tsInitial = ts; + int partitionId = 0; + final long increment = 10000L; + while (running) { + logger.trace("Adding an event in topic"); + Record event = eventGen.generateEvent(ts, "url"); + kafkaUtils.addingEventsToTopicPartition(logisland_raw, partitionId, event); + ts += increment; + running = ts != increment * numberOfREcordsToPutInKafka + tsInitial; +// partitionId = partitionId == 0 ? 1 : 0; + } + + //start logisland + String confFilePath = getClass().getClassLoader().getResource("conf/final-webanal-conf.yaml").getFile(); + ConfJobHelper confJob = new ConfJobHelper(confFilePath); + Map confKafka = new HashMap<>(); + confKafka.put(KafkaProperties.INPUT_TOPICS().getName(), logisland_raw); + confKafka.put(KafkaProperties.KAFKA_ZOOKEEPER_QUORUM().getName(), embeddedKafka.getZookeeperConnectionString()); + confKafka.put(KafkaProperties.KAFKA_METADATA_BROKER_LIST().getName(), embeddedKafka.getBrokersAsString()); + confKafka.put(KafkaProperties.KAFKA_STARTING_OFFSETS().getName(), "latest"); + confJob.modifyControllerServiceConf("kafka_service", confKafka); + Map confOpenDistro = new HashMap<>(); + confOpenDistro.put(ElasticsearchClientService.ENABLE_SSL.getName(), "true"); + confJob.modifyControllerServiceConf("opendistro_service", confOpenDistro); + confJob.initJob(); + confJob.startJob(); + + + running = true; + tsInitial = ts; + while (running) { + logger.trace("Adding an event in topic"); + Record event = eventGen.generateEvent(ts, "url"); + kafkaUtils.addingEventsToTopicPartition(logisland_raw, partitionId, event); + ts += increment; + running = ts != increment * numberOfREcordsToPutInKafka + tsInitial; +// partitionId = partitionId == 0 ? 1 : 0; + } + + confJob.awaitTermination(); + confJob.stopJob(); + } + + /** + */ + @Test + public void startFromEarliestOffset() throws IOException, InterruptedException, InitializationException { + final EventsGenerator eventGen = new EventsGenerator("divolte_1"); + final long numberOfREcordsToPutInKafka = 5000; + //init kafka + boolean running = true; + long ts = 0L; + long tsInitial = ts; + int partitionId = 0; + final long increment = 10000L; + while (running) { + logger.trace("Adding an event in topic"); + Record event = eventGen.generateEvent(ts, "url"); + kafkaUtils.addingEventsToTopicPartition(logisland_raw, partitionId, event); + ts += increment; + running = ts != increment * numberOfREcordsToPutInKafka + tsInitial; +// partitionId = partitionId == 0 ? 1 : 0; + } + + //start logisland + String confFilePath = getClass().getClassLoader().getResource("conf/final-webanal-conf.yaml").getFile(); + ConfJobHelper confJob = new ConfJobHelper(confFilePath); + Map confKafka = new HashMap<>(); + confKafka.put(KafkaProperties.INPUT_TOPICS().getName(), logisland_raw); + confKafka.put(KafkaProperties.KAFKA_ZOOKEEPER_QUORUM().getName(), embeddedKafka.getZookeeperConnectionString()); + confKafka.put(KafkaProperties.KAFKA_METADATA_BROKER_LIST().getName(), embeddedKafka.getBrokersAsString()); + confKafka.put(KafkaProperties.KAFKA_STARTING_OFFSETS().getName(), "earliest"); +// confKafka.put(KafkaProperties.KAFKA_STARTING_OFFSETS().getName(), "latest"); + confJob.modifyControllerServiceConf("kafka_service", confKafka); + Map confOpenDistro = new HashMap<>(); + confOpenDistro.put(ElasticsearchClientService.ENABLE_SSL.getName(), "true"); + confJob.modifyControllerServiceConf("opendistro_service", confOpenDistro); + confJob.initJob(); + confJob.startJob(); + + + running = true; + tsInitial = ts; + while (running) { + logger.trace("Adding an event in topic"); + Record event = eventGen.generateEvent(ts, "url"); + kafkaUtils.addingEventsToTopicPartition(logisland_raw, partitionId, event); + ts += increment; + running = ts != increment * numberOfREcordsToPutInKafka + tsInitial; +// partitionId = partitionId == 0 ? 1 : 0; + } + + confJob.awaitTermination(); + confJob.stopJob(); + } + + + + /** + */ + @Test + public void restartFromLastOffset() throws IOException, InterruptedException, InitializationException { + final EventsGenerator eventGen = new EventsGenerator("divolte_2"); + final long numberOfREcordsToPutInKafka = 5000; + //init kafka + boolean running = true; + long ts = 0L; + long tsInitial = ts; + int partitionId = 0; + final long increment = 10000L; + while (running) { + logger.trace("Adding an event in topic"); + Record event = eventGen.generateEvent(ts, "url"); + kafkaUtils.addingEventsToTopicPartition(logisland_raw, partitionId, event); + ts += increment; + running = ts != increment * numberOfREcordsToPutInKafka + tsInitial; +// partitionId = partitionId == 0 ? 1 : 0; + } + + //start logisland + String confFilePath = getClass().getClassLoader().getResource("conf/final-webanal-conf.yaml").getFile(); + ConfJobHelper confJob = new ConfJobHelper(confFilePath); + Map confKafka = new HashMap<>(); + confKafka.put(KafkaProperties.INPUT_TOPICS().getName(), logisland_raw); + confKafka.put(KafkaProperties.KAFKA_ZOOKEEPER_QUORUM().getName(), embeddedKafka.getZookeeperConnectionString()); + confKafka.put(KafkaProperties.KAFKA_METADATA_BROKER_LIST().getName(), embeddedKafka.getBrokersAsString()); + confKafka.put(KafkaProperties.KAFKA_STARTING_OFFSETS().getName(), "earliest"); + confJob.modifyControllerServiceConf("kafka_service", confKafka); + Map confOpenDistro = new HashMap<>(); + confOpenDistro.put(ElasticsearchClientService.ENABLE_SSL.getName(), "true"); + confJob.modifyControllerServiceConf("opendistro_service", confOpenDistro); + confJob.initJob(); + confJob.startJob(); + Thread.sleep(30000); + confJob.stopJob(); + + + + + running = true; + tsInitial = ts; + while (running) { + logger.trace("Adding an event in topic"); + Record event = eventGen.generateEvent(ts, "url"); + kafkaUtils.addingEventsToTopicPartition(logisland_raw, partitionId, event); + ts += increment; + running = ts != increment * numberOfREcordsToPutInKafka + tsInitial; +// partitionId = partitionId == 0 ? 1 : 0; + } + + confJob = new ConfJobHelper(confFilePath); + confKafka.put(KafkaProperties.KAFKA_STARTING_OFFSETS().getName(), "latest"); + confJob.modifyControllerServiceConf("kafka_service", confKafka); + confJob.modifyControllerServiceConf("opendistro_service", confOpenDistro); + confJob.initJob(); + confJob.startJob(); + + confJob.awaitTermination(); + } + + +// /** +// */ +// @Test +// public void showBugWhenSamecheckpoint() throws IOException, InterruptedException, InitializationException { +// final EventsGenerator eventGen = new EventsGenerator("divolte_1"); +// final long numberOfREcordsToPutInKafka = 5000; +// //init kafka +// boolean running = true; +// long ts = 0L; +// long tsInitial = ts; +// int partitionId = 0; +// final long increment = 10000L; +// while (running) { +// logger.trace("Adding an event in topic"); +// Record event = eventGen.generateEvent(ts, "url"); +// kafkaUtils.addingEventsToTopicPartition(logisland_raw, partitionId, event); +// ts += increment; +// running = ts != increment * numberOfREcordsToPutInKafka + tsInitial; +//// partitionId = partitionId == 0 ? 1 : 0; +// } +// +// //start logisland +// String confFilePath = getClass().getClassLoader().getResource("conf/final-webanal-conf.yaml").getFile(); +// ConfJobHelper confJob = new ConfJobHelper(confFilePath); +// Map confKafka = new HashMap<>(); +// confKafka.put(KafkaProperties.INPUT_TOPICS().getName(), logisland_raw); +// confKafka.put(KafkaProperties.KAFKA_ZOOKEEPER_QUORUM().getName(), embeddedKafka.getZookeeperConnectionString()); +// confKafka.put(KafkaProperties.KAFKA_METADATA_BROKER_LIST().getName(), embeddedKafka.getBrokersAsString()); +// confKafka.put(KafkaProperties.KAFKA_STARTING_OFFSETS().getName(), "earliest"); +//// confKafka.put(KafkaProperties.KAFKA_STARTING_OFFSETS().getName(), "latest"); +// confJob.modifyControllerServiceConf("kafka_service", confKafka); +// Map confOpenDistro = new HashMap<>(); +// confOpenDistro.put(ElasticsearchClientService.ENABLE_SSL.getName(), "true"); +// confJob.modifyControllerServiceConf("opendistro_service", confOpenDistro); +// confJob.initJob(); +// confJob.startJob(); +// +// +// running = true; +// tsInitial = ts; +// while (running) { +// logger.trace("Adding an event in topic"); +// Record event = eventGen.generateEvent(ts, "url"); +// kafkaUtils.addingEventsToTopicPartition(logisland_raw, partitionId, event); +// ts += increment; +// running = ts != increment * numberOfREcordsToPutInKafka + tsInitial; +//// partitionId = partitionId == 0 ? 1 : 0; +// } +// +// confJob.awaitTermination(); +// confJob.stopJob(); +// } +} \ No newline at end of file diff --git a/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/WebanalSessionnalizationStructedStreamTest.java b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/WebanalSessionnalizationStructedStreamTest.java new file mode 100644 index 000000000..41c4b67aa --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/WebanalSessionnalizationStructedStreamTest.java @@ -0,0 +1,138 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.webanalytics; + +import com.hurence.logisland.component.InitializationException; +import com.hurence.logisland.record.Record; +import com.hurence.logisland.service.elasticsearch.ElasticsearchClientService; +import com.hurence.logisland.stream.spark.structured.provider.KafkaProperties; +import com.hurence.logisland.webanalytics.test.util.ConfJobHelper; +import com.hurence.logisland.webanalytics.test.util.EventsGenerator; +import com.hurence.logisland.webanalytics.util.KafkaUtils; +import org.junit.ClassRule; +import org.junit.Ignore; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.kafka.test.rule.KafkaEmbedded; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +public class WebanalSessionnalizationStructedStreamTest { + + private static Logger logger = LoggerFactory.getLogger(WebanalSessionnalizationStructedStreamTest.class); + + final static String logisland_raw = "logisland_raw"; + + @ClassRule + public static KafkaEmbedded embeddedKafka = new KafkaEmbedded( + 1, true, 2, + logisland_raw); + + private static KafkaUtils kafkaUtils = new KafkaUtils(embeddedKafka); + + EventsGenerator eventGen = new EventsGenerator("divolte_1"); + + /** + */ + @Test + @Ignore + public void mySimpleDebugTest() throws IOException, InterruptedException, InitializationException { + String confFilePath = getClass().getClassLoader().getResource("conf/my-simple-conf-test").getFile(); + ConfJobHelper confJob = new ConfJobHelper(confFilePath); + Map confKafka = new HashMap<>(); + confKafka.put(KafkaProperties.KAFKA_ZOOKEEPER_QUORUM().getName(), embeddedKafka.getZookeeperConnectionString()); + confKafka.put(KafkaProperties.KAFKA_METADATA_BROKER_LIST().getName(), embeddedKafka.getBrokersAsString()); + confJob.modifyControllerServiceConf("kafka_service", confKafka); + Map confOpenDistro = new HashMap<>(); + confOpenDistro.put(ElasticsearchClientService.ENABLE_SSL.getName(), "true"); + confJob.modifyControllerServiceConf("opendistro_service", confOpenDistro); + confJob.initJob(); + confJob.startJob(); + boolean running = true; + long ts = 0L; + while (running) { + logger.info("Adding an event in topic"); + Record event = eventGen.generateEvent(ts, "url"); + kafkaUtils.addingEventsToTopicPartition(logisland_raw, 0, event); + long increment = 5000L; + ts += increment; + running = ts != increment * 10; + } + Thread.sleep(10000L); + confJob.stopJob(); + } + + @Test + @Ignore + public void mySimpleDebugTestWithServices() throws IOException, InterruptedException, InitializationException { + final long padding = 30000L; + String confFilePath = getClass().getClassLoader().getResource("conf/my-conf-test-with-services.yaml").getFile(); + ConfJobHelper confJob = new ConfJobHelper(confFilePath); + Map confKafka = new HashMap<>(); + confKafka.put(KafkaProperties.KAFKA_ZOOKEEPER_QUORUM().getName(), embeddedKafka.getZookeeperConnectionString()); + confKafka.put(KafkaProperties.KAFKA_METADATA_BROKER_LIST().getName(), embeddedKafka.getBrokersAsString()); + confJob.modifyControllerServiceConf("kafka_service", confKafka); + Map confOpenDistro = new HashMap<>(); + confOpenDistro.put(ElasticsearchClientService.ENABLE_SSL.getName(), "true"); + confJob.modifyControllerServiceConf("opendistro_service", confOpenDistro); + confJob.initJob(); + confJob.startJob(); + boolean running = true; + long ts = 0L; + while (running) { + logger.info("Adding an event in topic"); + Record event = eventGen.generateEvent(ts, "url"); + kafkaUtils.addingEventsToTopicPartition(logisland_raw, 0, event); + ts += padding; + running = ts != padding * 10; + Thread.sleep(padding); + } + Thread.sleep(10000L); + confJob.stopJob(); + } + + @Test + @Ignore + public void myWebAnalDebugTest() throws IOException, InterruptedException, InitializationException { + String confFilePath = getClass().getClassLoader().getResource("conf/my-webanal-conf-test.yaml").getFile(); + ConfJobHelper confJob = new ConfJobHelper(confFilePath); + Map confKafka = new HashMap<>(); + confKafka.put(KafkaProperties.KAFKA_ZOOKEEPER_QUORUM().getName(), embeddedKafka.getZookeeperConnectionString()); + confKafka.put(KafkaProperties.KAFKA_METADATA_BROKER_LIST().getName(), embeddedKafka.getBrokersAsString()); + confJob.modifyControllerServiceConf("kafka_service", confKafka); + Map confOpenDistro = new HashMap<>(); + confOpenDistro.put(ElasticsearchClientService.ENABLE_SSL.getName(), "true"); + confJob.modifyControllerServiceConf("opendistro_service", confOpenDistro); + confJob.initJob(); + confJob.startJob(); + final long padding = 30000L; + boolean running = true; + long ts = 0L; + while (running) { + logger.info("Adding an event in topic"); + Record event = eventGen.generateEvent(ts, "url"); + kafkaUtils.addingEventsToTopicPartition(logisland_raw, 0, event); + ts += padding; + running = ts != padding * 10; + Thread.sleep(padding); + } + Thread.sleep(10000L); + confJob.stopJob(); + } +} \ No newline at end of file diff --git a/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/util/KafkaUtils.java b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/util/KafkaUtils.java new file mode 100644 index 000000000..b10f3b74a --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/util/KafkaUtils.java @@ -0,0 +1,70 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.webanalytics.util; + +import com.hurence.logisland.record.Record; +import com.hurence.logisland.webanalytics.test.util.TestMappings; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.clients.producer.RecordMetadata; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.kafka.test.rule.KafkaEmbedded; +import org.springframework.kafka.test.utils.KafkaTestUtils; + +import java.util.Map; +import java.util.concurrent.Future; + +public class KafkaUtils { + + private static Logger logger = LoggerFactory.getLogger(KafkaUtils.class); + + public final KafkaEmbedded embeddedKafka; + + public KafkaUtils(KafkaEmbedded embeddedKafka) { + this.embeddedKafka = embeddedKafka; + } + + + public void addingEventsToTopicPartition(String topicName, int partitionId, Record record) throws InterruptedException { + String key = record.getField(TestMappings.eventsInternalFields.getTimestampField()).asString(); + addingEventsToTopicPartition(topicName, partitionId, key, record); + } + + public void addingEventsToTopicPartition(String topicName, int partitionId, String key, Record record) throws InterruptedException { + // Define the record we want to produce + final ProducerRecord producerRecord = new ProducerRecord( + topicName, + partitionId, + key, + record + ); + + Map senderProps = KafkaTestUtils.producerProps(embeddedKafka); + senderProps.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); + senderProps.put("value.serializer", "com.hurence.logisland.serializer.KafkaRecordSerializer"); + try (final KafkaProducer producer = new KafkaProducer<>(senderProps)) { + final Future future = producer.send(producerRecord); + producer.flush(); + while (!future.isDone()) { + Thread.sleep(500L); + } + logger.trace("Produce completed:{}", producerRecord); + } catch (Exception e) { + logger.error("error while sending data to kafka", e); + } + } +} diff --git a/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/util/SparkMethods.java b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/util/SparkMethods.java new file mode 100644 index 000000000..aeb7e1b90 --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/util/SparkMethods.java @@ -0,0 +1,35 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.webanalytics.util; + +import com.hurence.logisland.bean.KeyValue; +import org.apache.spark.sql.Row; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.Serializable; + +public class SparkMethods implements Serializable { + + private static Logger logger = LoggerFactory.getLogger(SparkMethods.class); + + public static Row mapRowIntoKeyValueRow(Row row) { + KeyValue kv = new KeyValue(row.getString(0), row.getLong(1)); + logger.info("processing key {} with count {}", kv.key, kv.count); + return row; + } + +} diff --git a/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/final-webanal-conf.yaml b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/final-webanal-conf.yaml new file mode 100644 index 000000000..d3743e3d6 --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/final-webanal-conf.yaml @@ -0,0 +1,519 @@ +######################################################################################################### +# Logisland Rubix Web Analytics +# Receive web events from eventhubs, treat them then push events and sessions into opendistro cluster +######################################################################################################### + +version: 1.4.0 +documentation: Logisland Rubix Webanalytics + +engine: + component: com.hurence.logisland.engine.spark.KafkaStreamProcessingEngine + type: engine + documentation: Receive web events from kafka, treat them and push events and sessions on opendsitro/es cluster + configuration: + spark.app.name: LogislandWebanalytics + spark.master: local[3] + spark.streaming.batchDuration: 5000 + spark.streaming.blockInterval: 350 + spark.streaming.kafka.maxRatePerPartition: 5000 + + controllerServiceConfigurations: + # Kafka sink configuration + - controllerService: kafka_service + component: com.hurence.logisland.stream.spark.structured.provider.KafkaStructuredStreamProviderService + configuration: + #earliest or latest + kafka.startingOffsets: "latest" + output.mode: "update" + kafka.input.topics: logisland_raw + kafka.output.topics: logisland_out + kafka.zookeeper.quorum: ${kafka.zookeeper.quorum} + kafka.topic.autoCreate: true + kafka.topic.default.partitions: 1 + kafka.topic.default.replicationFactor: 1 + read.value.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + write.value.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + write.key.serializer: com.hurence.logisland.serializer.StringSerializer + read.value.schema: > + { "version": 1, + "name": "io.divolte.examples.record", + "type": "record", + "fields": [ + { "name": "h2kTimestamp", "type": "long" }, + { "name": "remoteHost", "type": "string"}, + { "name": "record_type", "type": ["null", "string"], "default": null }, + { "name": "record_id", "type": ["null", "string"], "default": null }, + { "name": "location", "type": ["null", "string"], "default": null }, + { "name": "hitType", "type": ["null", "string"], "default": null }, + { "name": "eventCategory", "type": ["null", "string"], "default": null }, + { "name": "eventAction", "type": ["null", "string"], "default": null }, + { "name": "eventLabel", "type": ["null", "string"], "default": null }, + { "name": "localPath", "type": ["null", "string"], "default": null }, + { "name": "q", "type": ["null", "string"], "default": null }, + { "name": "n", "type": ["null", "int"], "default": null }, + { "name": "referer", "type": ["null", "string"], "default": null}, + { "name": "viewportPixelWidth", "type": ["null", "int"], "default": null}, + { "name": "viewportPixelHeight", "type": ["null", "int"], "default": null}, + { "name": "screenPixelWidth", "type": ["null", "int"], "default": null}, + { "name": "screenPixelHeight", "type": ["null", "int"], "default": null}, + { "name": "partyId", "type": ["null", "string"], "default": null}, + { "name": "sessionId", "type": ["null", "string"], "default": null}, + { "name": "pageViewId", "type": ["null", "string"], "default": null}, + { "name": "is_newSession", "type": ["null", "boolean"], "default": null}, + { "name": "userAgentString", "type": ["null", "string"], "default": null}, + { "name": "pageType", "type": ["null", "string"], "default": null}, + { "name": "Userid", "type": ["null", "string"], "default": null}, + { "name": "B2BUnit", "type": ["null", "string"], "default": null}, + { "name": "pointOfService", "type": ["null", "string"], "default": null}, + { "name": "companyID", "type": ["null", "string"], "default": null}, + { "name": "GroupCode", "type": ["null", "string"], "default": null}, + { "name": "userRoles", "type": ["null", "string"], "default": null}, + { "name": "is_PunchOut", "type": ["null", "string"], "default": null}, + { "name": "codeProduct", "type": ["null", "string"], "default": null}, + { "name": "categoryProductId", "type": ["null", "string"], "default": null}, + { "name": "categoryName", "type": ["null", "string"], "default": null}, + { "name": "categoryCode", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv5", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv4", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv3", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv2", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv1", "type": ["null", "string"], "default": null}, + { "name": "countryCode", "type": ["null", "string"], "default": null}, + { "name": "Company", "type": ["null", "string"], "default": null}, + { "name": "is_Link", "type": ["null", "boolean"], "default": null}, + { "name": "clickText", "type": ["null", "string"], "default": null}, + { "name": "clickURL", "type": ["null", "string"], "default": null}, + { "name": "newCustomerWebOnly", "type": ["null", "int"], "default": null}, + { "name": "newCustomerWebOrAgency", "type": ["null", "int"], "default": null}, + { "name": "productPrice", "type": ["null", "float"], "default": null}, + { "name": "searchedProductIndex", "type": ["null", "int"], "default": null}, + { "name": "searchedProductPage", "type": ["null", "int"], "default": null}, + { "name": "stockInfo", "type": ["null", "string"], "default": null}, + { "name": "transactionId", "type": ["null", "string"], "default": null}, + { "name": "transactionTotal", "type": ["null", "float"], "default": null}, + { "name": "transactionCurrency", "type": ["null", "string"], "default": null}, + { "name": "productQuantity", "type": ["null", "int"], "default": null}, + { "name": "Alt", "type": ["null", "string"], "default": null}, + { "name": "erpLocaleCode", "type": ["null", "string"], "default": null}, + { "name": "salesOrg", "type": ["null", "string"], "default": null}, + { "name": "country", "type": ["null", "string"], "default": null}, + { "name": "currency", "type": ["null", "string"], "default": null}, + { "name": "currentCart", "type": ["null", {"type": "array", "items":{ + "name": "Product", "type": "record", "fields":[ + {"name": "price", "type": "double"}, + {"name": "quantity", "type": "int"}, + {"name": "sku", "type": "string"} + ]} + }], + "default": null + } + ] + } + + - controllerService: lru_cache_service_domain + component: com.hurence.logisland.service.cache.LRUKeyValueCacheService + type: service + documentation: Cache service for Ip to Geo service to keep resolved addresses geo information + configuration: + cache.size: 100000 + + - controllerService: lru_cache_service_sessions + component: com.hurence.logisland.service.cache.LRUKeyValueCacheService + type: service + documentation: Cache service for saving web session in cache + configuration: + cache.size: 100000 + + - controllerService: opendistro_service + component: com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + type: service + documentation: OpenDistro Service + configuration: + hosts: localhost:9200 + batch.size: 2000 + username: admin + password: admin + flush.interval: 2 + + streamConfigurations: + + - stream: sessionalization + component: com.hurence.logisland.stream.spark.structured.StructuredStream + configuration: + group.by.fields: sessionId + read.stream.service.provider: kafka_service + write.stream.service.provider: kafka_service + + processorConfigurations: + + # Tag ALL events with default values + - processor: add_default_fields + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that add default values for tagOrigin, sourceOrigin, spamCandidate if not present yet + configuration: + tagOrigin: prod + sourceOrigin: external_traffic + spamOrigin: ghost_spam + decodedLocation: ${location} + codeProduct_rev: ${if(codeProduct == null || codeProduct.length == 0) return 'undefined'; return codeProduct;} + + # Extract the company name from the URL (location field) + - processor: regexp proc + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts company name and country code from location URL + configuration: + conflict.resolution.policy: overwrite_existing + location: googletranslate,webshop,tagOrigin,countryCode:(https\:\/\/translate\.google.*\.com/.+)?https\:\/\/([^\/\.\-]+[\.\-](preprod)?[^\/]+)\/?(\w+)?\/?.* + + - processor: Update countryCode using country field if available + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that compute countryCode using country if available or the location value + configuration: + conflict.resolution.policy: overwrite_existing + countryCode: ${if(country!=null && country != '') return country.toLowerCase(); return countryCode;} + webshopId: ${erpLocaleCode + '-' + salesOrg} + + - processor: Build_Company + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: Build Company from first CompanyFromERP if exists otherwise from CompanyFromLocation + configuration: + conflict.resolution.policy: overwrite_existing + Company: ${if(CompanyFromERP!=null && CompanyFromERP != '') return CompanyFromERP; return CompanyFromLocation;} + + # Tag event as a not spam + - processor: Tag internal traffic + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that tags event from internal traffic + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: spamOrigin:(not_spam).* + + # Extract the hostname from the referer + - processor: Extract hostname from referer + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts hostname from referer + configuration: + conflict.resolution.policy: overwrite_existing + referer: referer_hostname:https?\:\/\/([^\/]+)\/?.* + + # If it is crawler spam, then mark the event as such + - processor: Tag crawler referer traffic + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that tags event from internal traffic + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: spamOrigin:(crawler_spam).* + + # Tag an event that belongs to internal traffic (i-e IPH, Hurence, Altimis) + - processor: Tag internal traffic + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that tags event from internal traffic + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: sourceOrigin:(internal_traffic).* + + # Decode special chars (if any) from productSearchKeywords + - processor: Decode special chars from productSearchkeywords + component: com.hurence.logisland.processor.webanalytics.URLDecoder + type: processor + documentation: a processor that decode urls + configuration: + decode.fields: decodedLocation + charset: UTF-8 + + # Extract the list of keywords from a product search + - processor: Extract keywords from product search + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: + configuration: + decodedLocation: productSearchKeywords:https\:\/\/[^\/]+\/\w+\/search(?:\/)?.*[\?|\&](?:text|q)=([^\&\?\|]+)\&?.* + + # Build an array of keywords as well as count the number of items + - processor: Split search keywords and count number of keywords + component: com.hurence.logisland.processor.SplitField + type: processor + documentation: a processor that splits a string and return an array of values + configuration: + split.counter.enable: true + split.counter.suffix: Counter + productSearchKeywords: productSearchKeywordsArray:\s+ + + # Enrich the events that have a product id with info from PIM + - processor: Enrich_events_with_product_coverage + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${codeProduct_rev} + es.index: pim_listsku + es.type: details + es.includes.field: ${'coverage:coverage_'+countryCode+',brandName,Class,brandRef'} + + # Univers produit + - processor: Decompose product class level 1 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 1 categories any product belongs to. + configuration: + Class: categoryNiv1:^(\d+)$ + + # Univers produit + - processor: Decompose product class level 2 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 2 categories any product belongs to. + configuration: + Class: categoryNiv2,categoryNiv1:^((\d+)\-\d+)$ + + # Univers produit + - processor: Decompose product class level 3 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 3 categories any product belongs to. + configuration: + Class: categoryNiv3,categoryNiv2,categoryNiv1:^(((\d+)\-\d+)\-\d+)$ + + # Univers produit + - processor: Decompose product class level 4 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 4 categories any product belongs to. + configuration: + Class: categoryNiv4,categoryNiv3,categoryNiv2,categoryNiv1:^((((\d+)\-\d+)\-\d+)\-\d+)$ + + # Univers produit + - processor: Decompose product class level 5 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 5 categories any product belongs to. + configuration: + Class: categoryNiv5,categoryNiv4,categoryNiv3,categoryNiv2,categoryNiv1:(((((\d+)\-\d+)\-\d+)\-\d+)\-\d+) + + # Grab the synopsis of each category the product belongs to (in the right language) + - processor: Enrich_events_with_synopsis_of_categoryNiv5 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${categoryNiv5} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel5:en" + # es.includes.field: ${'categoryLabel5:'+countryCode} + + - processor: Enrich_events_with_synopsis_of_categoryNiv4 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${categoryNiv4} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel4:en" + # es.includes.field: ${'categoryLabel4:'+countryCode} + + - processor: Enrich_events_with_synopsis_of_categoryNiv3 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${categoryNiv3} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel3:en" + # es.includes.field: ${'categoryLabel3:'+countryCode} + + - processor: Enrich_events_with_synopsis_of_categoryNiv2 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${categoryNiv2} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel2:en" + # es.includes.field: ${'categoryLabel2:'+countryCode} + + - processor: Enrich_events_with_synopsis_of_categoryNiv1 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${categoryNiv1} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel1:en" + # es.includes.field: ${'categoryLabel1:'+countryCode} + + # Enrich the events that have a product id with info from workit + - processor: Enrich_events_with_workit + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${codeProduct_rev} + es.index: ${'workit_'+Company} + es.includes.field: Position,UnitPrice* + + - processor: Cleanup record + component: com.hurence.logisland.processor.RemoveFields + type: processor + documentation: + configuration: + fields.to.remove: codeProduct_rev + + # Enrich the events that have a Userid + - processor: Enrich_events_with_users_info + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${Userid} + es.type: details + es.index: ${'openanalytics_users.'+Company} + es.includes.field: "*" + es.excludes.field: Userid, Date_Creation,Date_LastLogin,Company + + # Add User Agent fields + - processor: User_Agent + component: com.hurence.logisland.processor.useragent.ParseUserAgent + type: processor + documentation: a processor that adds user agent fields to an event + configuration: + useragent.field: userAgentString + fields: DeviceClass,DeviceName,OperatingSystemClass,OperatingSystemName,OperatingSystemVersion,OperatingSystemNameVersion,LayoutEngineClass,LayoutEngineName,LayoutEngineVersion,LayoutEngineVersionMajor,LayoutEngineNameVersion,LayoutEngineNameVersionMajor,LayoutEngineBuild,AgentClass,AgentName,AgentVersion,AgentVersionMajor,AgentNameVersion,AgentNameVersionMajor,IECompatibilityVersion,IECompatibilityVersionMajor,IECompatibilityNameVersion,IECompatibilityNameVersionMajor,WebviewAppName,WebviewAppNameVersionMajor,WebviewAppVersion,WebviewAppVersionMajor + + # Extract the utm_source + - processor: Extract utm_source from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_source:.*[\&\?]utm_source=\s*([^\&\?]+)\&?.* + + # Extract the utm_medium + - processor: Extract utm_medium from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_medium:.*[\&\?]utm_medium=\s*([^\&\?]+)\&?.* + + # Extract the utm_campaign + - processor: Extract utm_campaign from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_campaign:.*[\&\?]utm_campaign=\s*([^\&\?]+)\&?.* + + # Extract the utm_term + - processor: Extract utm_term from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_term:.*[\&\?]utm_term=\s*([^\&\?]+)\&?.* + + # Extract the utm_content + - processor: Extract utm_content from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_content:.*[\&\?]utm_content=\s*([^\&\?]+)\&?.* + + # Integrated customers : all other customers + - processor: Setup_empty_string + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that set empty string for ImportanceCode, B2BUnit, and libelle_zone fields if they do not exist in the record + configuration: + conflict.resolution.policy: keep_only_old_field + ImportanceCode: "" + B2BUnit: "" + libelle_zone: "" + Userid: "" + + - processor: detect_internal_b2bunit + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that detect internal B2BUnit + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: ${if (B2BUnit == 'SL899999' || B2BUnit == 'SL8999998') return 'internalB2BUnit'; return alert_match_name;} + sourceOrigin: ${if (B2BUnit == 'SL899999' || B2BUnit == 'SL8999998') return 'internal_traffic'; return sourceOrigin;} + + - processor: categorize_customers + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that categorize the customers (affiliates, marketplace, subsidiaries,integrated) + configuration: + customer_category: ${if( ImportanceCode == '9003' || ImportanceCode == '9004') return 'affiliates'; if ( B2BUnit contains '*_*' ) return 'marketplace'; if ( libelle_zone != 'EST' && libelle_zone != 'OUEST' && libelle_zone != 'NORD' ) return 'subsidiaries'; else return 'integrated';} + + # Figure out the source of traffic for this websession + - processor: Source Of Traffic + component: com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic + type: processor + documentation: a processor that figure out the source of traffic for the websession + configuration: + referer.field: referer + first.visited.page.field: location + elasticsearch.client.service: opendistro_service + es.index: openanalytics_search_engines_and_social_networks + es.search_engine.field: search_engine + es.social_network.field: social_network + source_of_traffic.prefix: source_of_traffic + source_of_traffic.hierarchical: false + cache.service: lru_cache_service_domain + cache.validity.timeout: 3600 + debug: false + + # Create or update web session based on web events + - processor: consolidate_session + component: com.hurence.logisland.processor.webanalytics.IncrementalWebSession + type: processor + documentation: compute session duration as well as other informations + configuration: + elasticsearch.client.service: opendistro_service + cache.service: lru_cache_service_sessions + es.session.index.prefix: openanalytics_websessions- + es.session.index.suffix.date: yyyy.MM + es.session.type.name: sessions + es.event.index.prefix: openanalytics_webevents. + es.event.index.suffix.date: yyyy.MM.dd + es.event.type.name: event + session.timeout: 1800 + userid.field: Userid + fields.to.return: partyId,Company,remoteHost,tagOrigin,sourceOrigin,spamOrigin,referer,userAgentString,utm_source,utm_campaign,utm_medium,utm_content,utm_term,alert_match_name,alert_match_query,referer_hostname,DeviceClass,AgentName,ImportanceCode,B2BUnit,libelle_zone,Userid,customer_category,source_of_traffic_source,source_of_traffic_medium,source_of_traffic_keyword,source_of_traffic_campaign,source_of_traffic_organic_search,source_of_traffic_content,source_of_traffic_referral_path +# debug: true + + # put to opendistro + - processor: opendistro_es_publisher + component: com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + type: processor + documentation: a processor that stores the web sessions + configuration: + # es.index.field: websessionIndex + elasticsearch.client.service: opendistro_service + default.index: openanalytics_default + default.type: default + es.index.field: es_index + es.type.field: es_type diff --git a/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/my-conf-test-backup.yaml b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/my-conf-test-backup.yaml new file mode 100644 index 000000000..6c4d3c3db --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/my-conf-test-backup.yaml @@ -0,0 +1,118 @@ +######################################################################################################### +# Logisland Rubix Web Analytics +# Receive web events from eventhubs, treat them then push events and sessions into opendistro cluster +######################################################################################################### + +version: 1.4.0 +documentation: Logisland Rubix Webanalytics + +engine: + component: com.hurence.logisland.engine.spark.KafkaStreamProcessingEngine + type: engine + documentation: Receive web events from kafka, treat them and push events and sessions on opendsitro/es cluster + configuration: + spark.app.name: LogislandWebanalytics + spark.master: local[3] + + controllerServiceConfigurations: + + # Kafka sink configuration + - controllerService: kafka_service + component: com.hurence.logisland.stream.spark.structured.provider.KafkaStructuredStreamProviderServiceReader + configuration: +# output.mode: "complete" + kafka.input.topics: test-simple + kafka.output.topics: logisland_out + kafka.error.topics: logisland_errors + kafka.input.topics.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + kafka.output.topics.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + kafka.error.topics.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer +# kafka.metadata.broker.list: kafka:9092 + kafka.zookeeper.quorum: ${kafka.zookeeper.quorum} + kafka.topic.autoCreate: true + kafka.topic.default.partitions: 1 + kafka.topic.default.replicationFactor: 1 + + - controllerService: console_service + component: com.hurence.logisland.stream.spark.structured.provider.ConsoleStructuredStreamProviderService + configuration: + output.mode: "update" + truncate: false + + +# - controllerService: opendistro_service +# component: com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService +# type: service +# documentation: OpenDistro Service +# configuration: +# # SVAZ-VLP-OD01: 10.232.68.16 +# # SVAZ-VLP-OD02: 110.232.68.11 +# # SVAZ-VLP-OD03: 10.232.68.17 +# # SVAZ-VLP-OD04: 10.232.68.15 +# # SVAZ-VLP-OD05: 10.232.68.18 +# hosts: 10.232.68.16:9200,10.232.68.11:9200,10.232.68.17:9200,10.232.68.15:9200,10.232.68.18:9200 +# username: admin +# password: admin +# batch.size: 2000 +# flush.interval: 2 + +# - controllerService: elasticsearch_service +# component: com.hurence.logisland.service.elasticsearch.Elasticsearch_2_4_0_ClientService +# type: service +# documentation: elasticsearch 2.4.0 service implementation +# configuration: +# hosts: ns3004505.ovh.net:9300,ns3005860.ovh.net:9300,ns3050034.ovh.net:9300 +# cluster.name: iph-cluster +# batch.size: 2000 +# flush.interval: 2 + +# - controllerService: lru_cache_service_domain +# component: com.hurence.logisland.service.cache.LRUKeyValueCacheService +# type: service +# documentation: Cache service for Ip to Geo service to keep resolved addresses geo information +# configuration: +# cache.size: 100000 +# +# - controllerService: ip_to_geo_service +# component: com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService +# type: service +# documentation: Service to get geo information from an ip address using maxmind DB +# configuration: +# maxmind.database.uri: dbfs:/FileStore/logisland/maxmind/GeoLite2-City.mmdb +# locale: fr + + + + streamConfigurations: + - stream: kafka_to_console + component: com.hurence.logisland.stream.spark.structured.StructuredStream + configuration: + read.stream.service.provider: kafka_service_site_1 + write.stream.service.provider: console_service + processorConfigurations: + - processor: debug + component: com.hurence.logisland.processor.DebugStream + type: processor + documentation: print input + + - stream: kafka_to_console + component: com.hurence.logisland.stream.spark.structured.StructuredStream + configuration: + read.stream.service.provider: kafka_service_site_2 + write.stream.service.provider: console_service + processorConfigurations: + - processor: debug + component: com.hurence.logisland.processor.DebugStream + type: processor + documentation: print input + + - stream: kafka_to_console + component: com.hurence.logisland.stream.spark.structured.StructuredStream + configuration: + read.stream.service.provider: kafka_service_site_3 + write.stream.service.provider: console_service + processorConfigurations: + - processor: debug + component: com.hurence.logisland.processor.DebugStream + type: processor + documentation: print input diff --git a/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/my-conf-test-with-services.yaml b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/my-conf-test-with-services.yaml new file mode 100644 index 000000000..960d7e86b --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/my-conf-test-with-services.yaml @@ -0,0 +1,519 @@ +######################################################################################################### +# Logisland Rubix Web Analytics +# Receive web events from eventhubs, treat them then push events and sessions into opendistro cluster +######################################################################################################### + +version: 1.4.0 +documentation: Logisland Rubix Webanalytics + +engine: + component: com.hurence.logisland.engine.spark.KafkaStreamProcessingEngine + type: engine + documentation: Receive web events from kafka, treat them and push events and sessions on opendsitro/es cluster + configuration: + spark.app.name: LogislandWebanalytics + spark.master: local[3] + + controllerServiceConfigurations: + # Kafka sink configuration + - controllerService: kafka_service + component: com.hurence.logisland.stream.spark.structured.provider.KafkaStructuredStreamProviderService + configuration: + output.mode: "update" + kafka.input.topics: logisland_raw + kafka.output.topics: logisland_out + kafka.error.topics: logisland_errors + kafka.input.topics.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + kafka.output.topics.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + kafka.error.topics.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + kafka.zookeeper.quorum: ${kafka.zookeeper.quorum} + kafka.topic.autoCreate: true + kafka.topic.default.partitions: 1 + kafka.topic.default.replicationFactor: 1 + read.value.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + write.value.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + write.key.serializer: com.hurence.logisland.serializer.StringSerializer + read.value.schema: > + { "version": 1, + "name": "io.divolte.examples.record", + "type": "record", + "fields": [ + { "name": "h2kTimestamp", "type": "long" }, + { "name": "remoteHost", "type": "string"}, + { "name": "record_type", "type": ["null", "string"], "default": null }, + { "name": "record_id", "type": ["null", "string"], "default": null }, + { "name": "location", "type": ["null", "string"], "default": null }, + { "name": "hitType", "type": ["null", "string"], "default": null }, + { "name": "eventCategory", "type": ["null", "string"], "default": null }, + { "name": "eventAction", "type": ["null", "string"], "default": null }, + { "name": "eventLabel", "type": ["null", "string"], "default": null }, + { "name": "localPath", "type": ["null", "string"], "default": null }, + { "name": "q", "type": ["null", "string"], "default": null }, + { "name": "n", "type": ["null", "int"], "default": null }, + { "name": "referer", "type": ["null", "string"], "default": null}, + { "name": "viewportPixelWidth", "type": ["null", "int"], "default": null}, + { "name": "viewportPixelHeight", "type": ["null", "int"], "default": null}, + { "name": "screenPixelWidth", "type": ["null", "int"], "default": null}, + { "name": "screenPixelHeight", "type": ["null", "int"], "default": null}, + { "name": "partyId", "type": ["null", "string"], "default": null}, + { "name": "sessionId", "type": ["null", "string"], "default": null}, + { "name": "pageViewId", "type": ["null", "string"], "default": null}, + { "name": "is_newSession", "type": ["null", "boolean"], "default": null}, + { "name": "userAgentString", "type": ["null", "string"], "default": null}, + { "name": "pageType", "type": ["null", "string"], "default": null}, + { "name": "Userid", "type": ["null", "string"], "default": null}, + { "name": "B2BUnit", "type": ["null", "string"], "default": null}, + { "name": "pointOfService", "type": ["null", "string"], "default": null}, + { "name": "companyID", "type": ["null", "string"], "default": null}, + { "name": "GroupCode", "type": ["null", "string"], "default": null}, + { "name": "userRoles", "type": ["null", "string"], "default": null}, + { "name": "is_PunchOut", "type": ["null", "string"], "default": null}, + { "name": "codeProduct", "type": ["null", "string"], "default": null}, + { "name": "categoryProductId", "type": ["null", "string"], "default": null}, + { "name": "categoryName", "type": ["null", "string"], "default": null}, + { "name": "categoryCode", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv5", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv4", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv3", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv2", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv1", "type": ["null", "string"], "default": null}, + { "name": "countryCode", "type": ["null", "string"], "default": null}, + { "name": "Company", "type": ["null", "string"], "default": null}, + { "name": "is_Link", "type": ["null", "boolean"], "default": null}, + { "name": "clickText", "type": ["null", "string"], "default": null}, + { "name": "clickURL", "type": ["null", "string"], "default": null}, + { "name": "newCustomerWebOnly", "type": ["null", "int"], "default": null}, + { "name": "newCustomerWebOrAgency", "type": ["null", "int"], "default": null}, + { "name": "productPrice", "type": ["null", "float"], "default": null}, + { "name": "searchedProductIndex", "type": ["null", "int"], "default": null}, + { "name": "searchedProductPage", "type": ["null", "int"], "default": null}, + { "name": "stockInfo", "type": ["null", "string"], "default": null}, + { "name": "transactionId", "type": ["null", "string"], "default": null}, + { "name": "transactionTotal", "type": ["null", "float"], "default": null}, + { "name": "transactionCurrency", "type": ["null", "string"], "default": null}, + { "name": "productQuantity", "type": ["null", "int"], "default": null}, + { "name": "Alt", "type": ["null", "string"], "default": null}, + { "name": "erpLocaleCode", "type": ["null", "string"], "default": null}, + { "name": "salesOrg", "type": ["null", "string"], "default": null}, + { "name": "country", "type": ["null", "string"], "default": null}, + { "name": "currency", "type": ["null", "string"], "default": null}, + { "name": "currentCart", "type": ["null", {"type": "array", "items":{ + "name": "Product", "type": "record", "fields":[ + {"name": "price", "type": "double"}, + {"name": "quantity", "type": "int"}, + {"name": "sku", "type": "string"} + ]} + }], + "default": null + } + ] + } + + - controllerService: console_service + component: com.hurence.logisland.stream.spark.structured.provider.ConsoleStructuredStreamProviderService + configuration: + output.mode: "update" + truncate: false + + - controllerService: lru_cache_service_domain + component: com.hurence.logisland.service.cache.LRUKeyValueCacheService + type: service + documentation: Cache service for Ip to Geo service to keep resolved addresses geo information + configuration: + cache.size: 100000 + + - controllerService: opendistro_service + component: com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + type: service + documentation: OpenDistro Service + configuration: + hosts: localhost:9200 + batch.size: 2000 + flush.interval: 2 + + streamConfigurations: + + - stream: kafka_to_console + component: com.hurence.logisland.stream.spark.structured.StructuredStream + configuration: + read.stream.service.provider: kafka_service + write.stream.service.provider: console_service + + processorConfigurations: + + # Tag ALL events with default values + - processor: add_default_fields + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that add default values for tagOrigin, sourceOrigin, spamCandidate if not present yet + configuration: + tagOrigin: prod + sourceOrigin: external_traffic + spamOrigin: ghost_spam + decodedLocation: ${location} + codeProduct_rev: ${if(codeProduct == null || codeProduct.length == 0) return 'undefined'; return codeProduct;} + + # Extract the company name from the URL (location field) + - processor: regexp proc + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts company name and country code from location URL + configuration: + conflict.resolution.policy: overwrite_existing + location: googletranslate,webshop,tagOrigin,countryCode:(https\:\/\/translate\.google.*\.com/.+)?https\:\/\/([^\/\.\-]+[\.\-](preprod)?[^\/]+)\/?(\w+)?\/?.* + + - processor: Update countryCode using country field if available + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that compute countryCode using country if available or the location value + configuration: + conflict.resolution.policy: overwrite_existing + countryCode: ${if(country!=null && country != '') return country.toLowerCase(); return countryCode;} + webshopId: ${erpLocaleCode + '-' + salesOrg} + + - processor: Build_Company + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: Build Company from first CompanyFromERP if exists otherwise from CompanyFromLocation + configuration: + conflict.resolution.policy: overwrite_existing + Company: ${if(CompanyFromERP!=null && CompanyFromERP != '') return CompanyFromERP; return CompanyFromLocation;} + + # Tag event as a not spam + - processor: Tag internal traffic + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that tags event from internal traffic + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: spamOrigin:(not_spam).* + + # Extract the hostname from the referer + - processor: Extract hostname from referer + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts hostname from referer + configuration: + conflict.resolution.policy: overwrite_existing + referer: referer_hostname:https?\:\/\/([^\/]+)\/?.* + + # If it is crawler spam, then mark the event as such + - processor: Tag crawler referer traffic + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that tags event from internal traffic + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: spamOrigin:(crawler_spam).* + + # Tag an event that belongs to internal traffic (i-e IPH, Hurence, Altimis) + - processor: Tag internal traffic + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that tags event from internal traffic + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: sourceOrigin:(internal_traffic).* + + # Decode special chars (if any) from productSearchKeywords + - processor: Decode special chars from productSearchkeywords + component: com.hurence.logisland.processor.webanalytics.URLDecoder + type: processor + documentation: a processor that decode urls + configuration: + decode.fields: decodedLocation + charset: UTF-8 + + # Extract the list of keywords from a product search + - processor: Extract keywords from product search + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: + configuration: + decodedLocation: productSearchKeywords:https\:\/\/[^\/]+\/\w+\/search(?:\/)?.*[\?|\&](?:text|q)=([^\&\?\|]+)\&?.* + + # Build an array of keywords as well as count the number of items + - processor: Split search keywords and count number of keywords + component: com.hurence.logisland.processor.SplitField + type: processor + documentation: a processor that splits a string and return an array of values + configuration: + split.counter.enable: true + split.counter.suffix: Counter + productSearchKeywords: productSearchKeywordsArray:\s+ + + # Enrich the events that have a product id with info from PIM + - processor: Enrich_events_with_product_coverage + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${codeProduct_rev} + es.index: pim_listsku + es.type: details + es.includes.field: ${'coverage:coverage_'+countryCode+',brandName,Class,brandRef'} + +# # Univers produit +# - processor: Decompose product class level 1 +# component: com.hurence.logisland.processor.ApplyRegexp +# type: processor +# documentation: a processor that extracts the 1 categories any product belongs to. +# configuration: +# Class: categoryNiv1:^(\d+)$ +# +# # Univers produit +# - processor: Decompose product class level 2 +# component: com.hurence.logisland.processor.ApplyRegexp +# type: processor +# documentation: a processor that extracts the 2 categories any product belongs to. +# configuration: +# Class: categoryNiv2,categoryNiv1:^((\d+)\-\d+)$ +# +# # Univers produit +# - processor: Decompose product class level 3 +# component: com.hurence.logisland.processor.ApplyRegexp +# type: processor +# documentation: a processor that extracts the 3 categories any product belongs to. +# configuration: +# Class: categoryNiv3,categoryNiv2,categoryNiv1:^(((\d+)\-\d+)\-\d+)$ +# +# # Univers produit +# - processor: Decompose product class level 4 +# component: com.hurence.logisland.processor.ApplyRegexp +# type: processor +# documentation: a processor that extracts the 4 categories any product belongs to. +# configuration: +# Class: categoryNiv4,categoryNiv3,categoryNiv2,categoryNiv1:^((((\d+)\-\d+)\-\d+)\-\d+)$ +# +# # Univers produit +# - processor: Decompose product class level 5 +# component: com.hurence.logisland.processor.ApplyRegexp +# type: processor +# documentation: a processor that extracts the 5 categories any product belongs to. +# configuration: +# Class: categoryNiv5,categoryNiv4,categoryNiv3,categoryNiv2,categoryNiv1:(((((\d+)\-\d+)\-\d+)\-\d+)\-\d+) +# +# # Grab the synopsis of each category the product belongs to (in the right language) +# - processor: Enrich_events_with_synopsis_of_categoryNiv5 +# component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch +# type: processor +# documentation: a processor that enriches input records with Workit info from ES records +# configuration: +# elasticsearch.client.service: opendistro_service +# record.key: ${categoryNiv5} +# es.index: pim_categories +# es.type: details +# es.includes.field: "categoryLabel5:en" +# # es.includes.field: ${'categoryLabel5:'+countryCode} +# +# - processor: Enrich_events_with_synopsis_of_categoryNiv4 +# component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch +# type: processor +# documentation: a processor that enriches input records with Workit info from ES records +# configuration: +# elasticsearch.client.service: opendistro_service +# record.key: ${categoryNiv4} +# es.index: pim_categories +# es.type: details +# es.includes.field: "categoryLabel4:en" +# # es.includes.field: ${'categoryLabel4:'+countryCode} +# +# - processor: Enrich_events_with_synopsis_of_categoryNiv3 +# component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch +# type: processor +# documentation: a processor that enriches input records with Workit info from ES records +# configuration: +# elasticsearch.client.service: opendistro_service +# record.key: ${categoryNiv3} +# es.index: pim_categories +# es.type: details +# es.includes.field: "categoryLabel3:en" +# # es.includes.field: ${'categoryLabel3:'+countryCode} +# +# - processor: Enrich_events_with_synopsis_of_categoryNiv2 +# component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch +# type: processor +# documentation: a processor that enriches input records with Workit info from ES records +# configuration: +# elasticsearch.client.service: opendistro_service +# record.key: ${categoryNiv2} +# es.index: pim_categories +# es.type: details +# es.includes.field: "categoryLabel2:en" +# # es.includes.field: ${'categoryLabel2:'+countryCode} +# +# - processor: Enrich_events_with_synopsis_of_categoryNiv1 +# component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch +# type: processor +# documentation: a processor that enriches input records with Workit info from ES records +# configuration: +# elasticsearch.client.service: opendistro_service +# record.key: ${categoryNiv1} +# es.index: pim_categories +# es.type: details +# es.includes.field: "categoryLabel1:en" +# # es.includes.field: ${'categoryLabel1:'+countryCode} +# +# # Enrich the events that have a product id with info from workit +# - processor: Enrich_events_with_workit +# component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch +# type: processor +# documentation: a processor that enriches input records with Workit info from ES records +# configuration: +# elasticsearch.client.service: opendistro_service +# record.key: ${codeProduct_rev} +# es.index: ${'workit_'+Company} +# es.includes.field: Position,UnitPrice* +# +# - processor: Cleanup record +# component: com.hurence.logisland.processor.RemoveFields +# type: processor +# documentation: +# configuration: +# fields.to.remove: codeProduct_rev +# +# # Enrich the events that have a Userid +# - processor: Enrich_events_with_users_info +# component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch +# type: processor +# documentation: a processor that enriches input records with info from ES records +# configuration: +# elasticsearch.client.service: opendistro_service +# record.key: ${Userid} +# es.type: details +# es.index: ${'openanalytics_users.'+Company} +# es.includes.field: "*" +# es.excludes.field: Userid, Date_Creation,Date_LastLogin,Company +# +# # Add User Agent fields +# - processor: User_Agent +# component: com.hurence.logisland.processor.useragent.ParseUserAgent +# type: processor +# documentation: a processor that adds user agent fields to an event +# configuration: +# useragent.field: userAgentString +# fields: DeviceClass,DeviceName,OperatingSystemClass,OperatingSystemName,OperatingSystemVersion,OperatingSystemNameVersion,LayoutEngineClass,LayoutEngineName,LayoutEngineVersion,LayoutEngineVersionMajor,LayoutEngineNameVersion,LayoutEngineNameVersionMajor,LayoutEngineBuild,AgentClass,AgentName,AgentVersion,AgentVersionMajor,AgentNameVersion,AgentNameVersionMajor,IECompatibilityVersion,IECompatibilityVersionMajor,IECompatibilityNameVersion,IECompatibilityNameVersionMajor,WebviewAppName,WebviewAppNameVersionMajor,WebviewAppVersion,WebviewAppVersionMajor +# +# # Extract the utm_source +# - processor: Extract utm_source from location +# component: com.hurence.logisland.processor.ApplyRegexp +# type: processor +# documentation: a processor that extracts info from location URL +# configuration: +# location: utm_source:.*[\&\?]utm_source=\s*([^\&\?]+)\&?.* +# +# # Extract the utm_medium +# - processor: Extract utm_medium from location +# component: com.hurence.logisland.processor.ApplyRegexp +# type: processor +# documentation: a processor that extracts info from location URL +# configuration: +# location: utm_medium:.*[\&\?]utm_medium=\s*([^\&\?]+)\&?.* +# +# # Extract the utm_campaign +# - processor: Extract utm_campaign from location +# component: com.hurence.logisland.processor.ApplyRegexp +# type: processor +# documentation: a processor that extracts info from location URL +# configuration: +# location: utm_campaign:.*[\&\?]utm_campaign=\s*([^\&\?]+)\&?.* +# +# # Extract the utm_term +# - processor: Extract utm_term from location +# component: com.hurence.logisland.processor.ApplyRegexp +# type: processor +# documentation: a processor that extracts info from location URL +# configuration: +# location: utm_term:.*[\&\?]utm_term=\s*([^\&\?]+)\&?.* +# +# # Extract the utm_content +# - processor: Extract utm_content from location +# component: com.hurence.logisland.processor.ApplyRegexp +# type: processor +# documentation: a processor that extracts info from location URL +# configuration: +# location: utm_content:.*[\&\?]utm_content=\s*([^\&\?]+)\&?.* +# +# # Integrated customers : all other customers +# - processor: Setup_empty_string +# component: com.hurence.logisland.processor.AddFields +# type: processor +# documentation: a processor that set empty string for ImportanceCode, B2BUnit, and libelle_zone fields if they do not exist in the record +# configuration: +# conflict.resolution.policy: keep_only_old_field +# ImportanceCode: "" +# B2BUnit: "" +# libelle_zone: "" +# Userid: "" +# +# - processor: detect_internal_b2bunit +# component: com.hurence.logisland.processor.AddFields +# type: processor +# documentation: a processor that detect internal B2BUnit +# configuration: +# conflict.resolution.policy: overwrite_existing +# alert_match_name: ${if (B2BUnit == 'SL899999' || B2BUnit == 'SL8999998') return 'internalB2BUnit'; return alert_match_name;} +# sourceOrigin: ${if (B2BUnit == 'SL899999' || B2BUnit == 'SL8999998') return 'internal_traffic'; return sourceOrigin;} +# +# - processor: categorize_customers +# component: com.hurence.logisland.processor.AddFields +# type: processor +# documentation: a processor that categorize the customers (affiliates, marketplace, subsidiaries,integrated) +# configuration: +# customer_category: ${if( ImportanceCode == '9003' || ImportanceCode == '9004') return 'affiliates'; if ( B2BUnit contains '*_*' ) return 'marketplace'; if ( libelle_zone != 'EST' && libelle_zone != 'OUEST' && libelle_zone != 'NORD' ) return 'subsidiaries'; else return 'integrated';} +# +# # Figure out the source of traffic for this websession +# - processor: Source Of Traffic +# component: com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic +# type: processor +# documentation: a processor that figure out the source of traffic for the websession +# configuration: +# referer.field: referer +# first.visited.page.field: location +# elasticsearch.client.service: opendistro_service +# es.index: openanalytics_search_engines_and_social_networks +# es.search_engine.field: search_engine +# es.social_network.field: social_network +# source_of_traffic.suffix: source_of_traffic +# source_of_traffic.hierarchical: false +# cache.service: lru_cache_service_domain +# cache.validity.timeout: 3600 +# debug: false +# +# - processor: Websession_index_name +# component: com.hurence.logisland.processor.AddFields +# type: processor +# documentation: a processor that specifies the name of the websession elasticsearch index into a field used by the BulkAdd processor afterward. +# configuration: +# websessionIndex: ${'openanalytics_websessions-' + new java.text.SimpleDateFormat('yyyy.MM').format(new java.util.Date(h2kTimestamp));} +# +# # Create or update web session based on web events +# - processor: consolidate_session +# component: com.hurence.logisland.processor.webanalytics.CalculWebSession +# type: processor +# documentation: compute session duration as well as other informations +# configuration: +# session.timeout: 1800 +# userid.field: Userid +# fields.to.return: partyId,Company,remoteHost,tagOrigin,sourceOrigin,spamOrigin,referer,userAgentString,utm_source,utm_campaign,utm_medium,utm_content,utm_term,alert_match_name,alert_match_query,referer_hostname,DeviceClass,AgentName,ImportanceCode,B2BUnit,libelle_zone,Userid,customer_category,source_of_traffic_source,source_of_traffic_medium,source_of_traffic_keyword,source_of_traffic_campaign,source_of_traffic_organic_search,source_of_traffic_content,source_of_traffic_referral_path,websessionIndex +# elasticsearch.client.service: opendistro_service +# # es.session.index.field: websessionIndex +# es.session.type.name: sessions +# es.event.index.prefix: openanalytics_webevents +# es.event.type.name: event +# es.mapping.event.to.session.index.name: openanalytics_websession_mappings +# # debug: true +# +# # put to opendistro +# - processor: opendistro_es_publisher +# component: com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch +# type: processor +# documentation: a processor that stores the web sessions +# configuration: +# # es.index.field: websessionIndex +# elasticsearch.client.service: opendistro_service +# default.index: openanalytics_default +# default.type: default +# es.index.field: es_index +# es.type.field: es_type diff --git a/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/my-simple-conf-test.yaml b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/my-simple-conf-test.yaml new file mode 100644 index 000000000..3dca10fb7 --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/my-simple-conf-test.yaml @@ -0,0 +1,132 @@ +######################################################################################################### +# Logisland Rubix Web Analytics +# Receive web events from eventhubs, treat them then push events and sessions into opendistro cluster +######################################################################################################### + +version: 1.4.0 +documentation: Logisland Rubix Webanalytics + +engine: + component: com.hurence.logisland.engine.spark.KafkaStreamProcessingEngine + type: engine + documentation: Receive web events from kafka, treat them and push events and sessions on opendsitro/es cluster + configuration: + spark.app.name: LogislandWebanalytics + spark.master: local[3] + + controllerServiceConfigurations: + # Kafka sink configuration + - controllerService: kafka_service + component: com.hurence.logisland.stream.spark.structured.provider.KafkaStructuredStreamProviderService + configuration: + output.mode: "update" + kafka.input.topics: logisland_raw + kafka.output.topics: logisland_out + kafka.error.topics: logisland_errors + kafka.input.topics.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + kafka.output.topics.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + kafka.error.topics.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + kafka.zookeeper.quorum: ${kafka.zookeeper.quorum} + kafka.topic.autoCreate: true + kafka.topic.default.partitions: 1 + kafka.topic.default.replicationFactor: 1 + read.value.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + write.value.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + write.key.serializer: com.hurence.logisland.serializer.StringSerializer + read.value.schema: > + { "version": 1, + "name": "io.divolte.examples.record", + "type": "record", + "fields": [ + { "name": "h2kTimestamp", "type": "long" }, + { "name": "remoteHost", "type": "string"}, + { "name": "record_type", "type": ["null", "string"], "default": null }, + { "name": "record_id", "type": ["null", "string"], "default": null }, + { "name": "location", "type": ["null", "string"], "default": null }, + { "name": "hitType", "type": ["null", "string"], "default": null }, + { "name": "eventCategory", "type": ["null", "string"], "default": null }, + { "name": "eventAction", "type": ["null", "string"], "default": null }, + { "name": "eventLabel", "type": ["null", "string"], "default": null }, + { "name": "localPath", "type": ["null", "string"], "default": null }, + { "name": "q", "type": ["null", "string"], "default": null }, + { "name": "n", "type": ["null", "int"], "default": null }, + { "name": "referer", "type": ["null", "string"], "default": null}, + { "name": "viewportPixelWidth", "type": ["null", "int"], "default": null}, + { "name": "viewportPixelHeight", "type": ["null", "int"], "default": null}, + { "name": "screenPixelWidth", "type": ["null", "int"], "default": null}, + { "name": "screenPixelHeight", "type": ["null", "int"], "default": null}, + { "name": "partyId", "type": ["null", "string"], "default": null}, + { "name": "sessionId", "type": ["null", "string"], "default": null}, + { "name": "pageViewId", "type": ["null", "string"], "default": null}, + { "name": "is_newSession", "type": ["null", "boolean"], "default": null}, + { "name": "userAgentString", "type": ["null", "string"], "default": null}, + { "name": "pageType", "type": ["null", "string"], "default": null}, + { "name": "Userid", "type": ["null", "string"], "default": null}, + { "name": "B2BUnit", "type": ["null", "string"], "default": null}, + { "name": "pointOfService", "type": ["null", "string"], "default": null}, + { "name": "companyID", "type": ["null", "string"], "default": null}, + { "name": "GroupCode", "type": ["null", "string"], "default": null}, + { "name": "userRoles", "type": ["null", "string"], "default": null}, + { "name": "is_PunchOut", "type": ["null", "string"], "default": null}, + { "name": "codeProduct", "type": ["null", "string"], "default": null}, + { "name": "categoryProductId", "type": ["null", "string"], "default": null}, + { "name": "categoryName", "type": ["null", "string"], "default": null}, + { "name": "categoryCode", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv5", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv4", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv3", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv2", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv1", "type": ["null", "string"], "default": null}, + { "name": "countryCode", "type": ["null", "string"], "default": null}, + { "name": "Company", "type": ["null", "string"], "default": null}, + { "name": "is_Link", "type": ["null", "boolean"], "default": null}, + { "name": "clickText", "type": ["null", "string"], "default": null}, + { "name": "clickURL", "type": ["null", "string"], "default": null}, + { "name": "newCustomerWebOnly", "type": ["null", "int"], "default": null}, + { "name": "newCustomerWebOrAgency", "type": ["null", "int"], "default": null}, + { "name": "productPrice", "type": ["null", "float"], "default": null}, + { "name": "searchedProductIndex", "type": ["null", "int"], "default": null}, + { "name": "searchedProductPage", "type": ["null", "int"], "default": null}, + { "name": "stockInfo", "type": ["null", "string"], "default": null}, + { "name": "transactionId", "type": ["null", "string"], "default": null}, + { "name": "transactionTotal", "type": ["null", "float"], "default": null}, + { "name": "transactionCurrency", "type": ["null", "string"], "default": null}, + { "name": "productQuantity", "type": ["null", "int"], "default": null}, + { "name": "Alt", "type": ["null", "string"], "default": null}, + { "name": "erpLocaleCode", "type": ["null", "string"], "default": null}, + { "name": "salesOrg", "type": ["null", "string"], "default": null}, + { "name": "country", "type": ["null", "string"], "default": null}, + { "name": "currency", "type": ["null", "string"], "default": null}, + { "name": "currentCart", "type": ["null", {"type": "array", "items":{ + "name": "Product", "type": "record", "fields":[ + {"name": "price", "type": "double"}, + {"name": "quantity", "type": "int"}, + {"name": "sku", "type": "string"} + ]} + }], + "default": null + } + ] + } + + - controllerService: console_service + component: com.hurence.logisland.stream.spark.structured.provider.ConsoleStructuredStreamProviderService + configuration: + output.mode: "update" + truncate: false + + streamConfigurations: + + - stream: kafka_to_console + component: com.hurence.logisland.stream.spark.structured.StructuredStream + configuration: + read.stream.service.provider: kafka_service + write.stream.service.provider: console_service + + processorConfigurations: + +# - processor: debug +# component: com.hurence.logisland.processor.DebugStream +# type: processor +# documentation: print input + diff --git a/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/my-webanal-conf-test.yaml b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/my-webanal-conf-test.yaml new file mode 100644 index 000000000..bd826000a --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/my-webanal-conf-test.yaml @@ -0,0 +1,515 @@ +######################################################################################################### +# Logisland Rubix Web Analytics +# Receive web events from eventhubs, treat them then push events and sessions into opendistro cluster +######################################################################################################### + +version: 1.4.0 +documentation: Logisland Rubix Webanalytics + +engine: + component: com.hurence.logisland.engine.spark.KafkaStreamProcessingEngine + type: engine + documentation: Receive web events from kafka, treat them and push events and sessions on opendsitro/es cluster + configuration: + spark.app.name: LogislandWebanalytics + spark.master: local[3] + + controllerServiceConfigurations: + # Kafka sink configuration + - controllerService: kafka_service + component: com.hurence.logisland.stream.spark.structured.provider.KafkaStructuredStreamProviderService + configuration: + output.mode: "update" + kafka.input.topics: logisland_raw + kafka.output.topics: logisland_out + kafka.zookeeper.quorum: ${kafka.zookeeper.quorum} + kafka.topic.autoCreate: true + kafka.topic.default.partitions: 1 + kafka.topic.default.replicationFactor: 1 + read.value.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + write.value.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + write.key.serializer: com.hurence.logisland.serializer.StringSerializer + read.value.schema: > + { "version": 1, + "name": "io.divolte.examples.record", + "type": "record", + "fields": [ + { "name": "h2kTimestamp", "type": "long" }, + { "name": "remoteHost", "type": "string"}, + { "name": "record_type", "type": ["null", "string"], "default": null }, + { "name": "record_id", "type": ["null", "string"], "default": null }, + { "name": "location", "type": ["null", "string"], "default": null }, + { "name": "hitType", "type": ["null", "string"], "default": null }, + { "name": "eventCategory", "type": ["null", "string"], "default": null }, + { "name": "eventAction", "type": ["null", "string"], "default": null }, + { "name": "eventLabel", "type": ["null", "string"], "default": null }, + { "name": "localPath", "type": ["null", "string"], "default": null }, + { "name": "q", "type": ["null", "string"], "default": null }, + { "name": "n", "type": ["null", "int"], "default": null }, + { "name": "referer", "type": ["null", "string"], "default": null}, + { "name": "viewportPixelWidth", "type": ["null", "int"], "default": null}, + { "name": "viewportPixelHeight", "type": ["null", "int"], "default": null}, + { "name": "screenPixelWidth", "type": ["null", "int"], "default": null}, + { "name": "screenPixelHeight", "type": ["null", "int"], "default": null}, + { "name": "partyId", "type": ["null", "string"], "default": null}, + { "name": "sessionId", "type": ["null", "string"], "default": null}, + { "name": "pageViewId", "type": ["null", "string"], "default": null}, + { "name": "is_newSession", "type": ["null", "boolean"], "default": null}, + { "name": "userAgentString", "type": ["null", "string"], "default": null}, + { "name": "pageType", "type": ["null", "string"], "default": null}, + { "name": "Userid", "type": ["null", "string"], "default": null}, + { "name": "B2BUnit", "type": ["null", "string"], "default": null}, + { "name": "pointOfService", "type": ["null", "string"], "default": null}, + { "name": "companyID", "type": ["null", "string"], "default": null}, + { "name": "GroupCode", "type": ["null", "string"], "default": null}, + { "name": "userRoles", "type": ["null", "string"], "default": null}, + { "name": "is_PunchOut", "type": ["null", "string"], "default": null}, + { "name": "codeProduct", "type": ["null", "string"], "default": null}, + { "name": "categoryProductId", "type": ["null", "string"], "default": null}, + { "name": "categoryName", "type": ["null", "string"], "default": null}, + { "name": "categoryCode", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv5", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv4", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv3", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv2", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv1", "type": ["null", "string"], "default": null}, + { "name": "countryCode", "type": ["null", "string"], "default": null}, + { "name": "Company", "type": ["null", "string"], "default": null}, + { "name": "is_Link", "type": ["null", "boolean"], "default": null}, + { "name": "clickText", "type": ["null", "string"], "default": null}, + { "name": "clickURL", "type": ["null", "string"], "default": null}, + { "name": "newCustomerWebOnly", "type": ["null", "int"], "default": null}, + { "name": "newCustomerWebOrAgency", "type": ["null", "int"], "default": null}, + { "name": "productPrice", "type": ["null", "float"], "default": null}, + { "name": "searchedProductIndex", "type": ["null", "int"], "default": null}, + { "name": "searchedProductPage", "type": ["null", "int"], "default": null}, + { "name": "stockInfo", "type": ["null", "string"], "default": null}, + { "name": "transactionId", "type": ["null", "string"], "default": null}, + { "name": "transactionTotal", "type": ["null", "float"], "default": null}, + { "name": "transactionCurrency", "type": ["null", "string"], "default": null}, + { "name": "productQuantity", "type": ["null", "int"], "default": null}, + { "name": "Alt", "type": ["null", "string"], "default": null}, + { "name": "erpLocaleCode", "type": ["null", "string"], "default": null}, + { "name": "salesOrg", "type": ["null", "string"], "default": null}, + { "name": "country", "type": ["null", "string"], "default": null}, + { "name": "currency", "type": ["null", "string"], "default": null}, + { "name": "currentCart", "type": ["null", {"type": "array", "items":{ + "name": "Product", "type": "record", "fields":[ + {"name": "price", "type": "double"}, + {"name": "quantity", "type": "int"}, + {"name": "sku", "type": "string"} + ]} + }], + "default": null + } + ] + } + + - controllerService: lru_cache_service_domain + component: com.hurence.logisland.service.cache.LRUKeyValueCacheService + type: service + documentation: Cache service for Ip to Geo service to keep resolved addresses geo information + configuration: + cache.size: 100000 + + - controllerService: opendistro_service + component: com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + type: service + documentation: OpenDistro Service + configuration: + hosts: localhost:9200 + batch.size: 2000 + username: admin + password: admin + flush.interval: 2 + + streamConfigurations: + + - stream: kafka_to_console + component: com.hurence.logisland.stream.spark.structured.StructuredStream + configuration: + groupby: sessionId + chunk.size: 1000 + state.timeout.ms: 50000 + output.mode: "update" + read.stream.service.provider: kafka_service + write.stream.service.provider: kafka_service + + processorConfigurations: + + # Tag ALL events with default values + - processor: add_default_fields + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that add default values for tagOrigin, sourceOrigin, spamCandidate if not present yet + configuration: + tagOrigin: prod + sourceOrigin: external_traffic + spamOrigin: ghost_spam + decodedLocation: ${location} + codeProduct_rev: ${if(codeProduct == null || codeProduct.length == 0) return 'undefined'; return codeProduct;} + + # Extract the company name from the URL (location field) + - processor: regexp proc + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts company name and country code from location URL + configuration: + conflict.resolution.policy: overwrite_existing + location: googletranslate,webshop,tagOrigin,countryCode:(https\:\/\/translate\.google.*\.com/.+)?https\:\/\/([^\/\.\-]+[\.\-](preprod)?[^\/]+)\/?(\w+)?\/?.* + + - processor: Update countryCode using country field if available + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that compute countryCode using country if available or the location value + configuration: + conflict.resolution.policy: overwrite_existing + countryCode: ${if(country!=null && country != '') return country.toLowerCase(); return countryCode;} + webshopId: ${erpLocaleCode + '-' + salesOrg} + + - processor: Build_Company + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: Build Company from first CompanyFromERP if exists otherwise from CompanyFromLocation + configuration: + conflict.resolution.policy: overwrite_existing + Company: ${if(CompanyFromERP!=null && CompanyFromERP != '') return CompanyFromERP; return CompanyFromLocation;} + + # Tag event as a not spam + - processor: Tag internal traffic + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that tags event from internal traffic + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: spamOrigin:(not_spam).* + + # Extract the hostname from the referer + - processor: Extract hostname from referer + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts hostname from referer + configuration: + conflict.resolution.policy: overwrite_existing + referer: referer_hostname:https?\:\/\/([^\/]+)\/?.* + + # If it is crawler spam, then mark the event as such + - processor: Tag crawler referer traffic + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that tags event from internal traffic + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: spamOrigin:(crawler_spam).* + + # Tag an event that belongs to internal traffic (i-e IPH, Hurence, Altimis) + - processor: Tag internal traffic + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that tags event from internal traffic + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: sourceOrigin:(internal_traffic).* + + # Decode special chars (if any) from productSearchKeywords + - processor: Decode special chars from productSearchkeywords + component: com.hurence.logisland.processor.webanalytics.URLDecoder + type: processor + documentation: a processor that decode urls + configuration: + decode.fields: decodedLocation + charset: UTF-8 + + # Extract the list of keywords from a product search + - processor: Extract keywords from product search + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: + configuration: + decodedLocation: productSearchKeywords:https\:\/\/[^\/]+\/\w+\/search(?:\/)?.*[\?|\&](?:text|q)=([^\&\?\|]+)\&?.* + + # Build an array of keywords as well as count the number of items + - processor: Split search keywords and count number of keywords + component: com.hurence.logisland.processor.SplitField + type: processor + documentation: a processor that splits a string and return an array of values + configuration: + split.counter.enable: true + split.counter.suffix: Counter + productSearchKeywords: productSearchKeywordsArray:\s+ + + # Enrich the events that have a product id with info from PIM + - processor: Enrich_events_with_product_coverage + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${codeProduct_rev} + es.index: pim_listsku + es.type: details + es.includes.field: ${'coverage:coverage_'+countryCode+',brandName,Class,brandRef'} + + # Univers produit + - processor: Decompose product class level 1 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 1 categories any product belongs to. + configuration: + Class: categoryNiv1:^(\d+)$ + + # Univers produit + - processor: Decompose product class level 2 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 2 categories any product belongs to. + configuration: + Class: categoryNiv2,categoryNiv1:^((\d+)\-\d+)$ + + # Univers produit + - processor: Decompose product class level 3 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 3 categories any product belongs to. + configuration: + Class: categoryNiv3,categoryNiv2,categoryNiv1:^(((\d+)\-\d+)\-\d+)$ + + # Univers produit + - processor: Decompose product class level 4 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 4 categories any product belongs to. + configuration: + Class: categoryNiv4,categoryNiv3,categoryNiv2,categoryNiv1:^((((\d+)\-\d+)\-\d+)\-\d+)$ + + # Univers produit + - processor: Decompose product class level 5 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 5 categories any product belongs to. + configuration: + Class: categoryNiv5,categoryNiv4,categoryNiv3,categoryNiv2,categoryNiv1:(((((\d+)\-\d+)\-\d+)\-\d+)\-\d+) + + # Grab the synopsis of each category the product belongs to (in the right language) + - processor: Enrich_events_with_synopsis_of_categoryNiv5 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${categoryNiv5} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel5:en" + # es.includes.field: ${'categoryLabel5:'+countryCode} + + - processor: Enrich_events_with_synopsis_of_categoryNiv4 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${categoryNiv4} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel4:en" + # es.includes.field: ${'categoryLabel4:'+countryCode} + + - processor: Enrich_events_with_synopsis_of_categoryNiv3 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${categoryNiv3} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel3:en" + # es.includes.field: ${'categoryLabel3:'+countryCode} + + - processor: Enrich_events_with_synopsis_of_categoryNiv2 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${categoryNiv2} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel2:en" + # es.includes.field: ${'categoryLabel2:'+countryCode} + + - processor: Enrich_events_with_synopsis_of_categoryNiv1 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${categoryNiv1} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel1:en" + # es.includes.field: ${'categoryLabel1:'+countryCode} + + # Enrich the events that have a product id with info from workit + - processor: Enrich_events_with_workit + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${codeProduct_rev} + es.index: ${'workit_'+Company} + es.includes.field: Position,UnitPrice* + + - processor: Cleanup record + component: com.hurence.logisland.processor.RemoveFields + type: processor + documentation: + configuration: + fields.to.remove: codeProduct_rev + + # Enrich the events that have a Userid + - processor: Enrich_events_with_users_info + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${Userid} + es.type: details + es.index: ${'openanalytics_users.'+Company} + es.includes.field: "*" + es.excludes.field: Userid, Date_Creation,Date_LastLogin,Company + + # Add User Agent fields + - processor: User_Agent + component: com.hurence.logisland.processor.useragent.ParseUserAgent + type: processor + documentation: a processor that adds user agent fields to an event + configuration: + useragent.field: userAgentString + fields: DeviceClass,DeviceName,OperatingSystemClass,OperatingSystemName,OperatingSystemVersion,OperatingSystemNameVersion,LayoutEngineClass,LayoutEngineName,LayoutEngineVersion,LayoutEngineVersionMajor,LayoutEngineNameVersion,LayoutEngineNameVersionMajor,LayoutEngineBuild,AgentClass,AgentName,AgentVersion,AgentVersionMajor,AgentNameVersion,AgentNameVersionMajor,IECompatibilityVersion,IECompatibilityVersionMajor,IECompatibilityNameVersion,IECompatibilityNameVersionMajor,WebviewAppName,WebviewAppNameVersionMajor,WebviewAppVersion,WebviewAppVersionMajor + + # Extract the utm_source + - processor: Extract utm_source from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_source:.*[\&\?]utm_source=\s*([^\&\?]+)\&?.* + + # Extract the utm_medium + - processor: Extract utm_medium from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_medium:.*[\&\?]utm_medium=\s*([^\&\?]+)\&?.* + + # Extract the utm_campaign + - processor: Extract utm_campaign from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_campaign:.*[\&\?]utm_campaign=\s*([^\&\?]+)\&?.* + + # Extract the utm_term + - processor: Extract utm_term from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_term:.*[\&\?]utm_term=\s*([^\&\?]+)\&?.* + + # Extract the utm_content + - processor: Extract utm_content from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_content:.*[\&\?]utm_content=\s*([^\&\?]+)\&?.* + + # Integrated customers : all other customers + - processor: Setup_empty_string + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that set empty string for ImportanceCode, B2BUnit, and libelle_zone fields if they do not exist in the record + configuration: + conflict.resolution.policy: keep_only_old_field + ImportanceCode: "" + B2BUnit: "" + libelle_zone: "" + Userid: "" + + - processor: detect_internal_b2bunit + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that detect internal B2BUnit + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: ${if (B2BUnit == 'SL899999' || B2BUnit == 'SL8999998') return 'internalB2BUnit'; return alert_match_name;} + sourceOrigin: ${if (B2BUnit == 'SL899999' || B2BUnit == 'SL8999998') return 'internal_traffic'; return sourceOrigin;} + + - processor: categorize_customers + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that categorize the customers (affiliates, marketplace, subsidiaries,integrated) + configuration: + customer_category: ${if( ImportanceCode == '9003' || ImportanceCode == '9004') return 'affiliates'; if ( B2BUnit contains '*_*' ) return 'marketplace'; if ( libelle_zone != 'EST' && libelle_zone != 'OUEST' && libelle_zone != 'NORD' ) return 'subsidiaries'; else return 'integrated';} + + # Figure out the source of traffic for this websession + - processor: Source Of Traffic + component: com.hurence.logisland.processor.webanalytics.SetSourceOfTraffic + type: processor + documentation: a processor that figure out the source of traffic for the websession + configuration: + referer.field: referer + first.visited.page.field: location + elasticsearch.client.service: opendistro_service + es.index: openanalytics_search_engines_and_social_networks + es.search_engine.field: search_engine + es.social_network.field: social_network + source_of_traffic.prefix: source_of_traffic + source_of_traffic.hierarchical: false + cache.service: lru_cache_service_domain + cache.validity.timeout: 3600 + debug: false + + - processor: Websession_index_name + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that specifies the name of the websession elasticsearch index into a field used by the BulkAdd processor afterward. + configuration: + websessionIndex: ${'openanalytics_websessions-' + new java.text.SimpleDateFormat('yyyy.MM').format(new java.util.Date(h2kTimestamp));} + + # Create or update web session based on web events + - processor: consolidate_session + component: com.hurence.logisland.processor.webanalytics.CalculWebSession + type: processor + documentation: compute session duration as well as other informations + configuration: + es.session.index.prefix: openanalytics_websessions- + es.session.index.suffix.date: yyyy.MM + es.session.type.name: sessions + es.event.index.prefix: openanalytics_webevents. + es.event.index.suffix.date: yyyy.MM.dd + es.event.type.name: event + session.timeout: 1800 + userid.field: Userid + fields.to.return: partyId,Company,remoteHost,tagOrigin,sourceOrigin,spamOrigin,referer,userAgentString,utm_source,utm_campaign,utm_medium,utm_content,utm_term,alert_match_name,alert_match_query,referer_hostname,DeviceClass,AgentName,ImportanceCode,B2BUnit,libelle_zone,Userid,customer_category,source_of_traffic_source,source_of_traffic_medium,source_of_traffic_keyword,source_of_traffic_campaign,source_of_traffic_organic_search,source_of_traffic_content,source_of_traffic_referral_path +# debug: true + + # put to opendistro + - processor: opendistro_es_publisher + component: com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + type: processor + documentation: a processor that stores the web sessions + configuration: + # es.index.field: websessionIndex + elasticsearch.client.service: opendistro_service + default.index: openanalytics_default + default.type: default + es.index.field: es_index + es.type.field: es_type diff --git a/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/webanalytics-ovh.yml b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/webanalytics-ovh.yml new file mode 100644 index 000000000..2c57600af --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/webanalytics-ovh.yml @@ -0,0 +1,646 @@ +######################################################################################################### +# Logisland configuration script tempate +######################################################################################################### + +version: 0.9.7 +documentation: LogIsland analytics main config file. Put here every engine or component config + +######################################################################################################### +# engine +engine: + component: com.hurence.logisland.engine.spark.KafkaStreamProcessingEngine + type: engine + documentation: Hurence Analytics - Create consolidate sessions object + configuration: + spark.app.name: webanalyticsIncrementalWebSession + spark.master: yarn-cluster + spark.monitoring.driver.port: 7091 +# spark.master: local[1] + spark.driver.memory: 2G + spark.driver.cores: 1 + spark.executor.memory: 4G + spark.executor.instances: 1 + spark.executor.cores: 4 +# spark.executor.cores: 1 + spark.yarn.queue: default + spark.yarn.maxAppAttempts: 4 + spark.yarn.am.attemptFailuresValidityInterval: 1h + spark.yarn.max.executor.failures: 20 + spark.yarn.executor.failuresValidityInterval: 1h + spark.task.maxFailures: 8 + spark.serializer: org.apache.spark.serializer.KryoSerializer +# spark.streaming.backpressure.enabled: false + spark.streaming.backpressure.enabled: true + spark.streaming.unpersist: false + spark.streaming.blockInterval: 500 + spark.streaming.timeout: -1 + spark.streaming.kafka.maxRetries: 3 + spark.streaming.ui.retainedBatches: 200 + spark.streaming.receiver.writeAheadLog.enable: false + spark.ui.port: 4054 + spark.streaming.kafka.maxRatePerPartition: 3000 + spark.streaming.batchDuration: 5000 + + controllerServiceConfigurations: + + - controllerService: elasticsearch_service + component: com.hurence.logisland.service.elasticsearch.Elasticsearch_2_4_0_ClientService + type: service + documentation: elasticsearch 2.4.0 service implementation + configuration: + hosts: ns3004505.ovh.net:9300,ns3005860.ovh.net:9300,ns3050034.ovh.net:9300 + cluster.name: iph-cluster + batch.size: 2000 + flush.interval: 2 + + - controllerService: lru_cache_service_domain + component: com.hurence.logisland.service.cache.LRUKeyValueCacheService + type: service + documentation: cache service implementation using LinkedHashMap (Least Recent Used) + configuration: + cache.size: 100000 + + - controllerService: ip_to_geo_service + component: com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + type: service + documentation: service to get geo information from an ip address + configuration: + maxmind.database.uri: hdfs:///user/hurence/Geolite2-City-MaxMind/GeoLite2-City.mmdb + locale: fr + + streamConfigurations: + + # parsing + - stream: parsing_stream + component: com.hurence.logisland.stream.spark.KafkaRecordStreamParallelProcessing + type: stream + documentation: a processor that links + configuration: + kafka.input.topics: openanalytics + kafka.output.topics: logisland_null + kafka.error.topics: logisland_errors + kafka.input.topics.serializer: com.hurence.logisland.serializer.AvroSerializer + kafka.output.topics.serializer: com.hurence.logisland.serializer.KryoSerializer + kafka.error.topics.serializer: com.hurence.logisland.serializer.JsonSerializer + avro.input.schema: > + { "version": 1, + "name": "io.divolte.examples.record", + "type": "record", + "fields": [ + { "name": "h2kTimestamp", "type": "long" }, + { "name": "remoteHost", "type": "string"}, + { "name": "record_type", "type": ["null", "string"], "default": null }, + { "name": "record_id", "type": ["null", "string"], "default": null }, + { "name": "location", "type": ["null", "string"], "default": null }, + { "name": "hitType", "type": ["null", "string"], "default": null }, + { "name": "eventCategory", "type": ["null", "string"], "default": null }, + { "name": "eventAction", "type": ["null", "string"], "default": null }, + { "name": "eventLabel", "type": ["null", "string"], "default": null }, + { "name": "localPath", "type": ["null", "string"], "default": null }, + { "name": "q", "type": ["null", "string"], "default": null }, + { "name": "n", "type": ["null", "int"], "default": null }, + { "name": "referer", "type": ["null", "string"], "default": null}, + { "name": "viewportPixelWidth", "type": ["null", "int"], "default": null}, + { "name": "viewportPixelHeight", "type": ["null", "int"], "default": null}, + { "name": "screenPixelWidth", "type": ["null", "int"], "default": null}, + { "name": "screenPixelHeight", "type": ["null", "int"], "default": null}, + { "name": "partyId", "type": ["null", "string"], "default": null}, + { "name": "sessionId", "type": ["null", "string"], "default": null}, + { "name": "pageViewId", "type": ["null", "string"], "default": null}, + { "name": "is_newSession", "type": ["null", "boolean"], "default": null}, + { "name": "userAgentString", "type": ["null", "string"], "default": null}, + { "name": "pageType", "type": ["null", "string"], "default": null}, + { "name": "Userid", "type": ["null", "string"], "default": null}, + { "name": "B2BUnit", "type": ["null", "string"], "default": null}, + { "name": "pointOfService", "type": ["null", "string"], "default": null}, + { "name": "companyID", "type": ["null", "string"], "default": null}, + { "name": "GroupCode", "type": ["null", "string"], "default": null}, + { "name": "userRoles", "type": ["null", "string"], "default": null}, + { "name": "is_PunchOut", "type": ["null", "string"], "default": null}, + { "name": "codeProduct", "type": ["null", "string"], "default": null}, + { "name": "categoryProductId", "type": ["null", "string"], "default": null}, + { "name": "categoryName", "type": ["null", "string"], "default": null}, + { "name": "categoryCode", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv5", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv4", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv3", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv2", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv1", "type": ["null", "string"], "default": null}, + { "name": "countryCode", "type": ["null", "string"], "default": null}, + { "name": "Company", "type": ["null", "string"], "default": null}, + { "name": "is_Link", "type": ["null", "boolean"], "default": null}, + { "name": "clickText", "type": ["null", "string"], "default": null}, + { "name": "clickURL", "type": ["null", "string"], "default": null}, + { "name": "newCustomerWebOnly", "type": ["null", "int"], "default": null}, + { "name": "newCustomerWebOrAgency", "type": ["null", "int"], "default": null}, + { "name": "productPrice", "type": ["null", "float"], "default": null}, + { "name": "stockInfo", "type": ["null", "string"], "default": null}, + { "name": "transactionId", "type": ["null", "string"], "default": null}, + { "name": "transactionTotal", "type": ["null", "float"], "default": null}, + { "name": "transactionCurrency", "type": ["null", "string"], "default": null}, + { "name": "productQuantity", "type": ["null", "int"], "default": null}, + { "name": "Alt", "type": ["null", "string"], "default": null}, + { "name": "currentCart", "type": ["null", {"type": "array", "items":{ + "name": "Product", "type": "record", "fields":[ + {"name": "price", "type": "double"}, + {"name": "quantity", "type": "int"}, + {"name": "sku", "type": "string"} + ]} + }], + "default": null + } + ] + } + kafka.metadata.broker.list: ns3004505.ovh.net:6667,ns3005860.ovh.net:6667,ns3050034.ovh.net:6667 + kafka.zookeeper.quorum: ns3050045.ovh.net:2181,ns3050046.ovh.net:2181,ns346614.ovh.net:2181 + kafka.topic.autoCreate: true + kafka.topic.default.partitions: 4 + kafka.topic.default.replicationFactor: 3 +# kafka.manual.offset.reset: smallest + + processorConfigurations: + + # Tag ALL events with default values + - processor: add_default_fields + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that add default values for tagOrigin, sourceOrigin, spamCandidate if not present yet + configuration: + tagOrigin: prod + sourceOrigin: external_traffic + spamOrigin: ghost_spam + decodedLocation: ${location} + + # Extract the company name from the URL (location field) + - processor: regexp proc + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts company name and country code from location URL + configuration: + conflict.resolution.policy: overwrite_existing + location: googletranslate,webshop,tagOrigin,countryCode:(https\:\/\/translate\.google.*\.com/.+)?https\:\/\/([^\/\.\-]+[\.\-](preprod)?[^\/]+)\/?(\w+)?\/?.* + + - processor: Enrich_events_with_company_name_for_workit + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with info from ES records + configuration: + elasticsearch.client.service: elasticsearch_service + record.key: ${webshop} + es.index: openanalytics_webshops + es.includes.field: Company + + # Add an alert if the Company is authorized, so we mark the event as not spam + - processor: Filter_SPAM_Traffic + component: com.hurence.logisland.processor.MatchIP + type: processor + documentation: a processor that filter traffic (based on static IPs and netmasks) and tag them as spam candidates if there is no mapping for the webshop + configuration: + policy.onmiss: forward + policy.onmatch: first + record.type.updatePolicy: keep + not_spam_1: Company:orexad\.com + not_spam_2: Company:minetti\.it + not_spam_3: Company:kistenpfennig\.com + not_spam_4: Company:btshop\.be + not_spam_5: Company:btshop\.nl + not_spam_6: Company:zitec\.com + + # Tag event as a not spam + - processor: Tag internal traffic + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that tags event from internal traffic + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: spamOrigin:(not_spam).* + + # Extract the hostname from the referer + - processor: Extract hostname from referer + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts hostname from referer + configuration: + conflict.resolution.policy: overwrite_existing + referer: referer_hostname:https?\:\/\/([^\/]+)\/?.* + + # Check if the tag is coming from crawler referer spam + - processor: Filter_Crawler_referrer_SPAM_Traffic + component: com.hurence.logisland.processor.MatchIP + type: processor + documentation: a processor that filter traffic and tag it as spam candidates if it matches crawler spam site + configuration: + policy.onmiss: forward + policy.onmatch: first + record.type.updatePolicy: keep + crawler_spam_1: referer_hostname:uptime(robot|bot|check|\-|\.com)|vitaly|sharebutton|semalt|ranksonic|share\-button|anticrawler|timer4web|free\-video\-tool|responsive\-test|dogsrun|fix\-website\-er|dailyrank|sitevaluation|99seo|top10\-way|seo(\-2\-0|\-analysis)\. + crawler_spam_2: referer_hostname:(videos|buttons)\-for\-your|best\-seo\-(solution|offer)|buttons\-for\-website|profit\.xyz|dbutton|keywords\-monitoring|platezhka|7makemoney|forum69|kings\-analytics|checkpagerank|pr\-cy\.ru|\-\-(production|website|sale)\.com + crawler_spam_3: referer_hostname:(express|audit|dollars|success|top1|amazon|commerce)\-seo|free\-video\-tool|datract|hacĸer|ɢoogl|slifty\.github|\-liar.ru|3\-letter\-|foxweber|free\-fbook|goodwriterssales|your\-rankings|tourcroatia|spinnerco|justkillingti|suralink|worldtraveler\.w + crawler_spam_4: referer_hostname:oldfaithfultaxi|christopherlane|hollywoodweeklymagazine|losangeles\-ads|anniemation|timdreby|pcimforum|yellowstonesafaritours|autoseo|blogarama|for\-placing|brainwizard|casinos4|ḷ\.com|\-backlinks\.com|phoenicx\.co\.uk|be\-escorts + + # If it is crawler spam, then mark the event as such + - processor: Tag crawler referer traffic + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that tags event from internal traffic + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: spamOrigin:(crawler_spam).* + + # Tag internal traffic + - processor: Filter_Internal_Traffic + component: com.hurence.logisland.processor.MatchIP + type: processor + documentation: a processor that filter internal traffic (based on static IPs and netmasks) and tag them accordingly + configuration: + policy.onmiss: forward + policy.onmatch: first + record.type.updatePolicy: keep + internal_traffic_hurence: remoteHost:80.14.66.205 + internal_traffic_altimis: remoteHost:82.196.22.62 + internal_traffic_iph_1: remoteHost:62.23.167.200/29 + internal_traffic_iph_2: remoteHost:41.231.84.205 + internal_traffic_iph_3: remoteHost:41.226.24.45 + internal_traffic_iph_4: remoteHost:196.203.53.115 + internal_traffic_iph_5: remoteHost:41.231.87.32/29 + internal_traffic_iph_6: remoteHost:92.103.11.11 + internal_traffic_iph_7: remoteHost:89.227.208.230 + internal_traffic_iph_8: remoteHost:89.227.198.162 + internal_traffic_iph_9: remoteHost:194.123.34.17[6-9] + internal_traffic_iph_10: remoteHost:194.123.34.18[0-3] + internal_traffic_iph_11: remoteHost:194.123.34.178 + internal_traffic_iph_12: remoteHost:83.163.193.90 + internal_traffic_iph_13: remoteHost:188.111.40.72/29 + internal_traffic_iph_14: remoteHost:80.156.245.120/29 + internal_traffic_iph_15: remoteHost:212.202.154.0/24 + internal_traffic_iph_16: remoteHost:212.144.36.128/28 + internal_traffic_iph_17: remoteHost:80.91.51.130 + internal_traffic_iph_18: remoteHost:80.91.51.203 + internal_traffic_iph_19: remoteHost:137.117.208.90 + internal_traffic_iph_20: remoteHost:92.103.67.218 + internal_traffic_iph_21: remoteHost:46.218.163.96/29 + internal_traffic_iph_22: remoteHost:88.160.233.80 + internal_traffic_iph_23: remoteHost:84.98.217.241 + internal_traffic_iph_24: remoteHost:84.98.217.142 + internal_traffic_iph_25: remoteHost:77.246.37.160 + internal_traffic_iph_26: remoteHost:80.11.18.50 + internal_traffic_iph_27: remoteHost:194.213.124.6 + internal_traffic_iph_28: remoteHost:194.213.124.7 + internal_traffic_iph_29: remoteHost:195.154.185.228 + internal_traffic_iph_30: remoteHost:178.33.182.35 + internal_traffic_iph_31: remoteHost:192.168 + internal_traffic_iph_32: remoteHost:91.121.126.112 + internal_traffic_iph_33: remoteHost:85.17.224.82 + internal_traffic_iph_34: remoteHost:78.46.102.213 + internal_traffic_iph_35: remoteHost:109.69.218.20 + internal_traffic_iph_36: remoteHost:80.86.200.135 + internal_traffic_iph_37: remoteHost:67.19.47.50 + internal_traffic_iph_38: remoteHost:5.135.138.183 + internal_traffic_iph_39: remoteHost:92.103.11.28 + internal_traffic_iph_40: remoteHost:92.103.11.30 + internal_traffic_iph_41: remoteHost:192.168.0.([0-9]|1[0-6]) + internal_traffic_iph_42: remoteHost:10.0.0.[0-8] + internal_traffic_iph_43: remoteHost:62.23.167.20[0-7] + internal_traffic_iph_44: remoteHost:78.192.104.65 + internal_traffic_iph_45: remoteHost:89.227.234.201 + internal_traffic_iph_46: remoteHost:82.176.18.162 + + # Tag an event that belongs to internal traffic (i-e IPH, Hurence, Altimis) + - processor: Tag internal traffic + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that tags event from internal traffic + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: sourceOrigin:(internal_traffic).* + + # Decode special chars (if any) from productSearchKeywords + - processor: Decode special chars from productSearchkeywords + component: com.hurence.logisland.processor.webAnalytics.URLDecoder + type: processor + documentation: a processor that decode urls + configuration: + decode.fields: decodedLocation + charset: UTF-8 + + # Extract the list of keywords from a product search + - processor: Extract keywords from product search + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: + configuration: + decodedLocation: productSearchKeywords:https\:\/\/[^\/]+\/\w+\/search(?:\/)?.*[\?|\&](?:text|q)=([^\&\?\|]+)\&?.* + + # Build an array of keywords as well as count the number of items + - processor: Split search keywords and count number of keywords + component: com.hurence.logisland.processor.SplitField + type: processor + documentation: a processor that splits a string and return an array of values + configuration: + split.counter.enable: true + split.counter.suffix: Counter + productSearchKeywords: productSearchKeywordsArray:\s+ + +# # Extract the list of keywords from a product search +# - processor: Extract keywords from product search +# component: com.hurence.logisland.processor.ApplyRegexp +# type: processor +# documentation: a processor that extracts search keywords from location URL +# configuration: +# location: productSearchKeywords:https\:\/\/[^\/]+\/\w+\/search\/.*[\?|\&]text=([^\&\?]+)\&?.* +# +# # Build an array of keywords as well as count the number of items +# - processor: Split search keywords and count number of keywords +# component: com.hurence.logisland.processor.SplitField +# type: processor +# documentation: a processor that splits a string and return an array of values +# configuration: +# split.counter.enable: true +# split.counter.suffix: Counter +# productSearchKeywords: productSearchKeywordsArray:\s*\+\s* + + # Enrich the events that have a product id with info from PIM + - processor: Enrich_events_with_product_coverage + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with info from ES records + configuration: + elasticsearch.client.service: elasticsearch_service + record.key: ${codeProduct} + es.index: pim_listsku + es.type: details + es.includes.field: ${'coverage:coverage_'+countryCode+',brandName,Class,brandRef'} + + # Univers produit + - processor: Decompose product class level 1 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 1 categories any product belongs to. + configuration: + Class: categoryNiv1:^(\d+)$ + + # Univers produit + - processor: Decompose product class level 2 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 2 categories any product belongs to. + configuration: + Class: categoryNiv2,categoryNiv1:^((\d+)\-\d+)$ + + # Univers produit + - processor: Decompose product class level 3 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 3 categories any product belongs to. + configuration: + Class: categoryNiv3,categoryNiv2,categoryNiv1:^(((\d+)\-\d+)\-\d+)$ + + # Univers produit + - processor: Decompose product class level 4 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 4 categories any product belongs to. + configuration: + Class: categoryNiv4,categoryNiv3,categoryNiv2,categoryNiv1:^((((\d+)\-\d+)\-\d+)\-\d+)$ + + # Univers produit + - processor: Decompose product class level 5 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 5 categories any product belongs to. + configuration: + Class: categoryNiv5,categoryNiv4,categoryNiv3,categoryNiv2,categoryNiv1:(((((\d+)\-\d+)\-\d+)\-\d+)\-\d+) + + # Grab the synopsis of each category the product belongs to (in the right language) + - processor: Enrich_events_with_synopsis_of_categoryNiv5 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: elasticsearch_service + record.key: ${categoryNiv5} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel5:en" +# es.includes.field: ${'categoryLabel5:'+countryCode} + + - processor: Enrich_events_with_synopsis_of_categoryNiv4 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: elasticsearch_service + record.key: ${categoryNiv4} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel4:en" +# es.includes.field: ${'categoryLabel4:'+countryCode} + + - processor: Enrich_events_with_synopsis_of_categoryNiv3 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: elasticsearch_service + record.key: ${categoryNiv3} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel3:en" +# es.includes.field: ${'categoryLabel3:'+countryCode} + + - processor: Enrich_events_with_synopsis_of_categoryNiv2 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: elasticsearch_service + record.key: ${categoryNiv2} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel2:en" +# es.includes.field: ${'categoryLabel2:'+countryCode} + + - processor: Enrich_events_with_synopsis_of_categoryNiv1 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: elasticsearch_service + record.key: ${categoryNiv1} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel1:en" +# es.includes.field: ${'categoryLabel1:'+countryCode} + + # Enrich the events that have a product id with info from workit + - processor: Enrich_events_with_workit + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: elasticsearch_service + record.key: ${codeProduct} + es.index: ${'workit_'+Company} + es.includes.field: Position,UnitPrice* + + # Enrich the events that have a Userid + - processor: Enrich_events_with_users_info + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with info from ES records + configuration: + elasticsearch.client.service: elasticsearch_service + record.key: ${Userid} + es.type: details + es.index: ${'openanalytics_users.'+Company} + es.includes.field: "*" + es.excludes.field: Userid, Date_Creation,Date_LastLogin,Company + + # Add User Agent fields + - processor: User_Agent + component: com.hurence.logisland.processor.useragent.ParseUserAgent + type: processor + documentation: a processor that adds user agent fields to an event + configuration: + useragent.field: userAgentString + fields: DeviceClass,DeviceName,OperatingSystemClass,OperatingSystemName,OperatingSystemVersion,OperatingSystemNameVersion,LayoutEngineClass,LayoutEngineName,LayoutEngineVersion,LayoutEngineVersionMajor,LayoutEngineNameVersion,LayoutEngineNameVersionMajor,LayoutEngineBuild,AgentClass,AgentName,AgentVersion,AgentVersionMajor,AgentNameVersion,AgentNameVersionMajor,IECompatibilityVersion,IECompatibilityVersionMajor,IECompatibilityNameVersion,IECompatibilityNameVersionMajor,WebviewAppName,WebviewAppNameVersionMajor,WebviewAppVersion,WebviewAppVersionMajor + + # Ip2Geo processor + - processor: ipToGeoForIncomingWebTraffic + component: com.hurence.logisland.processor.enrichment.IpToGeo + type: processor + documentation: Find geo information correponding to an ip using maxmind service + configuration: + ip.address.field: remoteHost + iptogeo.service: ip_to_geo_service + cache.service: lru_cache_service_domain +# debug: true + + # Extract the utm_source + - processor: Extract utm_source from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_source:.*[\&\?]utm_source=\s*([^\&\?]+)\&?.* + + # Extract the utm_medium + - processor: Extract utm_medium from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_medium:.*[\&\?]utm_medium=\s*([^\&\?]+)\&?.* + + # Extract the utm_campaign + - processor: Extract utm_campaign from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_campaign:.*[\&\?]utm_campaign=\s*([^\&\?]+)\&?.* + + # Extract the utm_term + - processor: Extract utm_term from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_term:.*[\&\?]utm_term=\s*([^\&\?]+)\&?.* + + # Extract the utm_content + - processor: Extract utm_content from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_content:.*[\&\?]utm_content=\s*([^\&\?]+)\&?.* + + # Integrated customers : all other customers + - processor: Setup_empty_string + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that set empty string for ImportanceCode, B2BUnit, and libelle_zone fields if they do not exist in the record + configuration: + conflict.resolution.policy: keep_only_old_field + ImportanceCode: "" + B2BUnit: "" + libelle_zone: "" + Userid: "" + + # Categorize the customer such as: + # Affiliates customers : code importance 9003 et 9004 + # Marketplace customers : B2Bunit composed with '*_*' + # Subsidiaries : customers that are not part of segments above, and not part of the ZONE "EST", "OUEST" and "NORD" + # Integrated customers : all other customers + - processor: categorize_customers + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that categorize the customers (affiliates, marketplace, subsidiaries,integrated) + configuration: + customer_category: ${if( ImportanceCode == '9003' || ImportanceCode == '9004') return 'affiliates'; if ( B2BUnit contains '*_*' ) return 'marketplace'; if ( libelle_zone != 'EST' && libelle_zone != 'OUEST' && libelle_zone != 'NORD' ) return 'subsidiaries'; else return 'integrated';} + + # Figure out the source of traffic for this websession + - processor: Source Of Traffic + component: com.hurence.logisland.processor.webAnalytics.setSourceOfTraffic + type: processor + documentation: a processor that figure out the source of traffic for the websession + configuration: + referer.field: referer + first.visited.page.field: location + elasticsearch.client.service: elasticsearch_service + es.index: openanalytics_search_engines_and_social_networks + es.search_engine.field: search_engine + es.social_network.field: social_network + source_of_traffic.suffix: source_of_traffic + source_of_traffic.hierarchical: false + cache.service: lru_cache_service_domain + cache.validity.timeout: 3600 +# debug: true + + - processor: Websession_index_name + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that specifies the name of the websession elasticsearch index into a field used by the BulkAdd processor afterward. + configuration: + websessionIndex: ${'new_openanalytics_websessions-' + new java.text.SimpleDateFormat('yyyy.MM').format(new java.util.Date(h2kTimestamp));} + + # Create or update web session based on web events + - processor: consolidate_session + component: com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + type: processor + documentation: compute session duration as well as other informations + configuration: + session.timeout: 1800 + userid.field: Userid + fields.to.return: partyId,Company,remoteHost,tagOrigin,sourceOrigin,spamOrigin,referer,userAgentString,utm_source,utm_campaign,utm_medium,utm_content,utm_term,alert_match_name,alert_match_query,referer_hostname,DeviceClass,AgentName,ImportanceCode,B2BUnit,libelle_zone,Userid,customer_category,source_of_traffic_source,source_of_traffic_medium,source_of_traffic_keyword,source_of_traffic_campaign,source_of_traffic_organic_search,source_of_traffic_content,source_of_traffic_referral_path,websessionIndex + elasticsearch.client.service: elasticsearch_service + es.session.index.field: websessionIndex + es.session.type.name: sessions + es.event.index.prefix: new_openanalytics_webevents + es.event.type.name: event + es.mapping.event.to.session.index.name: new_openanalytics_websession_mappings +# debug: true + + # Enrich session record with userid info from ES + - processor: Enrich_events_with_users_info + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with info from ES records + configuration: + elasticsearch.client.service: elasticsearch_service + record.key: ${Userid} + es.type: details + es.index: ${'openanalytics_users.'+Company} + es.includes.field: "*" + es.excludes.field: Userid, Date_Creation,Date_LastLogin,Company + + # put to elasticsearch + - processor: es_publisher + component: com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + type: processor + documentation: a processor that stores the web sessions + configuration: + elasticsearch.client.service: elasticsearch_service + es.index.field: websessionIndex + default.type: sessions diff --git a/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/webanalytics.yml b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/webanalytics.yml new file mode 100644 index 000000000..812071952 --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/conf/webanalytics.yml @@ -0,0 +1,683 @@ +######################################################################################################### +# Logisland Rubix Web Analytics +# Receive web events from eventhubs, treat them then push events and sessions into opendistro cluster +######################################################################################################### + +version: 1.4.0 +documentation: Logisland Rubix Webanalytics + +engine: + component: com.hurence.logisland.engine.spark.KafkaStreamProcessingEngine + type: engine + documentation: Receive web events from Azure Event Hubs, treat them and push events and sessions on opendsitro cluster + configuration: + spark.app.name: LogislandWebanalytics + + controllerServiceConfigurations: + + - controllerService: eventhubs_service + component: com.hurence.logisland.stream.spark.structured.provider.AzureEventHubsStructuredStreamProviderService + type: service + documentation: Service to allow reading from eventhubs + configuration: + eventhubs.nameSpace: logisland-dev + eventhubs.read.eventHub: openanalytics + eventhubs.read.sasKeyName: openanalytics-read + eventhubs.read.sasKey: "odq73UvHQEEbc4LaQV8hfD34/nkaF6IusmsK0wH2jHk=" + eventhubs.read.position: end-of-stream + # Need a sink stream to have the checkpoint feature able to work (write offset of last treated event into checkpoint location + # passed at job creation command line (using the -chkploc option) + eventhubs.write.eventHub: openanalytics-sink + eventhubs.write.sasKeyName: openanalytics-sink-write + eventhubs.write.sasKey: "OGJMTraRWUbq8NJqR49J+CQUzH0LNCJBAIqat4KDHvI=" + + - controllerService: opendistro_service + component: com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + type: service + documentation: OpenDistro Service + configuration: + # SVAZ-VLP-OD01: 10.232.68.16 + # SVAZ-VLP-OD02: 110.232.68.11 + # SVAZ-VLP-OD03: 10.232.68.17 + # SVAZ-VLP-OD04: 10.232.68.15 + # SVAZ-VLP-OD05: 10.232.68.18 + hosts: 10.232.68.16:9200,10.232.68.11:9200,10.232.68.17:9200,10.232.68.15:9200,10.232.68.18:9200 + username: admin + password: admin + batch.size: 2000 + flush.interval: 2 + + - controllerService: lru_cache_service_domain + component: com.hurence.logisland.service.cache.LRUKeyValueCacheService + type: service + documentation: Cache service for Ip to Geo service to keep resolved addresses geo information + configuration: + cache.size: 100000 + + - controllerService: ip_to_geo_service + component: com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + type: service + documentation: Service to get geo information from an ip address using maxmind DB + configuration: + maxmind.database.uri: dbfs:/FileStore/logisland/maxmind/GeoLite2-City.mmdb + locale: fr + + streamConfigurations: + + - stream: eventhubs_to_opendistro + component: com.hurence.logisland.stream.spark.structured.StructuredStream + configuration: + read.stream.service.provider: eventhubs_service + read.topics.serializer: com.hurence.logisland.serializer.AvroSerializer + read.topics.key.serializer: com.hurence.logisland.serializer.StringSerializer + write.stream.service.provider: eventhubs_service + write.topics.serializer: com.hurence.logisland.serializer.StringSerializer + write.topics.key.serializer: com.hurence.logisland.serializer.StringSerializer + avro.input.schema: > + { "version": 1, + "name": "io.divolte.examples.record", + "type": "record", + "fields": [ + { "name": "h2kTimestamp", "type": "long" }, + { "name": "remoteHost", "type": "string"}, + { "name": "record_type", "type": ["null", "string"], "default": null }, + { "name": "record_id", "type": ["null", "string"], "default": null }, + { "name": "location", "type": ["null", "string"], "default": null }, + { "name": "hitType", "type": ["null", "string"], "default": null }, + { "name": "eventCategory", "type": ["null", "string"], "default": null }, + { "name": "eventAction", "type": ["null", "string"], "default": null }, + { "name": "eventLabel", "type": ["null", "string"], "default": null }, + { "name": "localPath", "type": ["null", "string"], "default": null }, + { "name": "q", "type": ["null", "string"], "default": null }, + { "name": "n", "type": ["null", "int"], "default": null }, + { "name": "referer", "type": ["null", "string"], "default": null}, + { "name": "viewportPixelWidth", "type": ["null", "int"], "default": null}, + { "name": "viewportPixelHeight", "type": ["null", "int"], "default": null}, + { "name": "screenPixelWidth", "type": ["null", "int"], "default": null}, + { "name": "screenPixelHeight", "type": ["null", "int"], "default": null}, + { "name": "partyId", "type": ["null", "string"], "default": null}, + { "name": "sessionId", "type": ["null", "string"], "default": null}, + { "name": "pageViewId", "type": ["null", "string"], "default": null}, + { "name": "is_newSession", "type": ["null", "boolean"], "default": null}, + { "name": "userAgentString", "type": ["null", "string"], "default": null}, + { "name": "pageType", "type": ["null", "string"], "default": null}, + { "name": "Userid", "type": ["null", "string"], "default": null}, + { "name": "B2BUnit", "type": ["null", "string"], "default": null}, + { "name": "pointOfService", "type": ["null", "string"], "default": null}, + { "name": "companyID", "type": ["null", "string"], "default": null}, + { "name": "GroupCode", "type": ["null", "string"], "default": null}, + { "name": "userRoles", "type": ["null", "string"], "default": null}, + { "name": "is_PunchOut", "type": ["null", "string"], "default": null}, + { "name": "codeProduct", "type": ["null", "string"], "default": null}, + { "name": "categoryProductId", "type": ["null", "string"], "default": null}, + { "name": "categoryName", "type": ["null", "string"], "default": null}, + { "name": "categoryCode", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv5", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv4", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv3", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv2", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv1", "type": ["null", "string"], "default": null}, + { "name": "countryCode", "type": ["null", "string"], "default": null}, + { "name": "Company", "type": ["null", "string"], "default": null}, + { "name": "is_Link", "type": ["null", "boolean"], "default": null}, + { "name": "clickText", "type": ["null", "string"], "default": null}, + { "name": "clickURL", "type": ["null", "string"], "default": null}, + { "name": "newCustomerWebOnly", "type": ["null", "int"], "default": null}, + { "name": "newCustomerWebOrAgency", "type": ["null", "int"], "default": null}, + { "name": "productPrice", "type": ["null", "float"], "default": null}, + { "name": "searchedProductIndex", "type": ["null", "int"], "default": null}, + { "name": "searchedProductPage", "type": ["null", "int"], "default": null}, + { "name": "stockInfo", "type": ["null", "string"], "default": null}, + { "name": "transactionId", "type": ["null", "string"], "default": null}, + { "name": "transactionTotal", "type": ["null", "float"], "default": null}, + { "name": "transactionCurrency", "type": ["null", "string"], "default": null}, + { "name": "productQuantity", "type": ["null", "int"], "default": null}, + { "name": "Alt", "type": ["null", "string"], "default": null}, + { "name": "erpLocaleCode", "type": ["null", "string"], "default": null}, + { "name": "salesOrg", "type": ["null", "string"], "default": null}, + { "name": "country", "type": ["null", "string"], "default": null}, + { "name": "currency", "type": ["null", "string"], "default": null}, + { "name": "currentCart", "type": ["null", {"type": "array", "items":{ + "name": "Product", "type": "record", "fields":[ + {"name": "price", "type": "double"}, + {"name": "quantity", "type": "int"}, + {"name": "sku", "type": "string"} + ]} + }], + "default": null + } + ] + } + processorConfigurations: + + # Tag ALL events with default values + - processor: add_default_fields + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that add default values for tagOrigin, sourceOrigin, spamCandidate if not present yet + configuration: + tagOrigin: prod + sourceOrigin: external_traffic + spamOrigin: ghost_spam + decodedLocation: ${location} + codeProduct_rev: ${if(codeProduct == null || codeProduct.length == 0) return 'undefined'; return codeProduct;} + + # Extract the company name from the URL (location field) + - processor: regexp proc + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts company name and country code from location URL + configuration: + conflict.resolution.policy: overwrite_existing + location: googletranslate,webshop,tagOrigin,countryCode:(https\:\/\/translate\.google.*\.com/.+)?https\:\/\/([^\/\.\-]+[\.\-](preprod)?[^\/]+)\/?(\w+)?\/?.* + + - processor: Update countryCode using country field if available + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that compute countryCode using country if available or the location value + configuration: + conflict.resolution.policy: overwrite_existing + countryCode: ${if(country!=null && country != '') return country.toLowerCase(); return countryCode;} + webshopId: ${erpLocaleCode + '-' + salesOrg} + + - processor: Enrich_events_with_company_name_using_erpLocalCode_and_salesOrg + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${webshopId} + es.index: openanalytics_webshops + es.includes.field: CompanyFromERP:Company + + - processor: Enrich_events_with_company_name_for_workit + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${webshop} + es.index: openanalytics_webshops + es.includes.field: CompanyFromLocation:Company + + - processor: Build_Company + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: Build Company from first CompanyFromERP if exists otherwise from CompanyFromLocation + configuration: + conflict.resolution.policy: overwrite_existing + Company: ${if(CompanyFromERP!=null && CompanyFromERP != '') return CompanyFromERP; return CompanyFromLocation;} + + # Add an alert if the Company is authorized, so we mark the event as not spam + - processor: Filter_SPAM_Traffic + component: com.hurence.logisland.processor.MatchIP + type: processor + documentation: a processor that filter traffic (based on static IPs and netmasks) and tag them as spam candidates if there is no mapping for the webshop + configuration: + policy.onmiss: forward + policy.onmatch: first + record.type.updatePolicy: keep + not_spam_1: Company:orexad\.com + not_spam_2: Company:minetti\.it + not_spam_3: Company:kistenpfennig\.com + not_spam_4: Company:btshop\.be + not_spam_5: Company:btshop\.nl + not_spam_6: Company:zitec\.com + not_spam_7: Company:is\.rubix\.com + not_spam_8: Company:es\.rubix\.com + not_spam_9: Company:fr-legoueix\.rubix\.com + not_spam_10: Company:uk\.rubix\.com + not_spam_11: Company:no\.rubix\.com + not_spam_12: Company:se\.rubix\.com + not_spam_13: Company:dk\.rubix\.com + not_spam_14: Company:fi\.rubix\.com + not_spam_15: Company:fr\.rubix\.com + not_spam_16: Company:de\.rubix\.com + not_spam_17: Company:it\.rubix\.com + not_spam_18: Company:nl\.rubix\.com + not_spam_19: Company:be\.rubix\.com + + # Tag event as a not spam + - processor: Tag internal traffic + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that tags event from internal traffic + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: spamOrigin:(not_spam).* + + # Extract the hostname from the referer + - processor: Extract hostname from referer + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts hostname from referer + configuration: + conflict.resolution.policy: overwrite_existing + referer: referer_hostname:https?\:\/\/([^\/]+)\/?.* + + # Check if the tag is coming from crawler referer spam + - processor: Filter_Crawler_referrer_SPAM_Traffic + component: com.hurence.logisland.processor.MatchIP + type: processor + documentation: a processor that filter traffic and tag it as spam candidates if it matches crawler spam site + configuration: + policy.onmiss: forward + policy.onmatch: first + record.type.updatePolicy: keep + crawler_spam_1: referer_hostname:uptime(robot|bot|check|\-|\.com)|vitaly|sharebutton|semalt|ranksonic|share\-button|anticrawler|timer4web|free\-video\-tool|responsive\-test|dogsrun|fix\-website\-er|dailyrank|sitevaluation|99seo|top10\-way|seo(\-2\-0|\-analysis)\. + crawler_spam_2: referer_hostname:(videos|buttons)\-for\-your|best\-seo\-(solution|offer)|buttons\-for\-website|profit\.xyz|dbutton|keywords\-monitoring|platezhka|7makemoney|forum69|kings\-analytics|checkpagerank|pr\-cy\.ru|\-\-(production|website|sale)\.com + crawler_spam_3: referer_hostname:(express|audit|dollars|success|top1|amazon|commerce)\-seo|free\-video\-tool|datract|hacĸer|ɢoogl|slifty\.github|\-liar.ru|3\-letter\-|foxweber|free\-fbook|goodwriterssales|your\-rankings|tourcroatia|spinnerco|justkillingti|suralink|worldtraveler\.w + crawler_spam_4: referer_hostname:oldfaithfultaxi|christopherlane|hollywoodweeklymagazine|losangeles\-ads|anniemation|timdreby|pcimforum|yellowstonesafaritours|autoseo|blogarama|for\-placing|brainwizard|casinos4|ḷ\.com|\-backlinks\.com|phoenicx\.co\.uk|be\-escorts + + # If it is crawler spam, then mark the event as such + - processor: Tag crawler referer traffic + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that tags event from internal traffic + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: spamOrigin:(crawler_spam).* + + # Tag internal traffic + - processor: Filter_Internal_Traffic + component: com.hurence.logisland.processor.MatchIP + type: processor + documentation: a processor that filter internal traffic (based on static IPs and netmasks) and tag them accordingly + configuration: + policy.onmiss: forward + policy.onmatch: first + record.type.updatePolicy: keep + internal_traffic_hurence: remoteHost:80.14.66.205 + internal_traffic_altimis: remoteHost:82.196.22.62 + internal_traffic_iph_1: remoteHost:62.23.167.200/29 + internal_traffic_iph_2: remoteHost:41.231.84.205 + internal_traffic_iph_3: remoteHost:41.226.24.45 + internal_traffic_iph_4: remoteHost:196.203.53.115 + internal_traffic_iph_5: remoteHost:41.231.87.32/29 + internal_traffic_iph_6: remoteHost:92.103.11.11 + internal_traffic_iph_7: remoteHost:89.227.208.230 + internal_traffic_iph_8: remoteHost:89.227.198.162 + internal_traffic_iph_9: remoteHost:194.123.34.17[6-9] + internal_traffic_iph_10: remoteHost:194.123.34.18[0-3] + internal_traffic_iph_11: remoteHost:194.123.34.178 + internal_traffic_iph_12: remoteHost:83.163.193.90 + internal_traffic_iph_13: remoteHost:188.111.40.72/29 + internal_traffic_iph_14: remoteHost:80.156.245.120/29 + internal_traffic_iph_15: remoteHost:212.202.154.0/24 + internal_traffic_iph_16: remoteHost:212.144.36.128/28 + internal_traffic_iph_17: remoteHost:80.91.51.130 + internal_traffic_iph_18: remoteHost:80.91.51.203 + internal_traffic_iph_19: remoteHost:137.117.208.90 + internal_traffic_iph_20: remoteHost:92.103.67.218 + internal_traffic_iph_21: remoteHost:46.218.163.96/29 + internal_traffic_iph_22: remoteHost:88.160.233.80 + internal_traffic_iph_23: remoteHost:84.98.217.241 + internal_traffic_iph_24: remoteHost:84.98.217.142 + internal_traffic_iph_25: remoteHost:77.246.37.160 + internal_traffic_iph_26: remoteHost:80.11.18.50 + internal_traffic_iph_27: remoteHost:194.213.124.6 + internal_traffic_iph_28: remoteHost:194.213.124.7 + internal_traffic_iph_29: remoteHost:195.154.185.228 + internal_traffic_iph_30: remoteHost:178.33.182.35 + internal_traffic_iph_31: remoteHost:192.168 + internal_traffic_iph_32: remoteHost:91.121.126.112 + internal_traffic_iph_33: remoteHost:85.17.224.82 + internal_traffic_iph_34: remoteHost:78.46.102.213 + internal_traffic_iph_35: remoteHost:109.69.218.20 + internal_traffic_iph_36: remoteHost:80.86.200.135 + internal_traffic_iph_37: remoteHost:67.19.47.50 + internal_traffic_iph_38: remoteHost:5.135.138.183 + internal_traffic_iph_39: remoteHost:92.103.11.28 + internal_traffic_iph_40: remoteHost:92.103.11.30 + internal_traffic_iph_41: remoteHost:192.168.0.([0-9]|1[0-6]) + internal_traffic_iph_42: remoteHost:10.0.0.[0-8] + internal_traffic_iph_43: remoteHost:62.23.167.20[0-7] + internal_traffic_iph_44: remoteHost:78.192.104.65 + internal_traffic_iph_45: remoteHost:89.227.234.201 + internal_traffic_iph_46: remoteHost:82.176.18.162 + + # Tag an event that belongs to internal traffic (i-e IPH, Hurence, Altimis) + - processor: Tag internal traffic + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that tags event from internal traffic + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: sourceOrigin:(internal_traffic).* + + # Decode special chars (if any) from productSearchKeywords + - processor: Decode special chars from productSearchkeywords + component: com.hurence.logisland.processor.webAnalytics.URLDecoder + type: processor + documentation: a processor that decode urls + configuration: + decode.fields: decodedLocation + charset: UTF-8 + + # Extract the list of keywords from a product search + - processor: Extract keywords from product search + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: + configuration: + decodedLocation: productSearchKeywords:https\:\/\/[^\/]+\/\w+\/search(?:\/)?.*[\?|\&](?:text|q)=([^\&\?\|]+)\&?.* + + # Build an array of keywords as well as count the number of items + - processor: Split search keywords and count number of keywords + component: com.hurence.logisland.processor.SplitField + type: processor + documentation: a processor that splits a string and return an array of values + configuration: + split.counter.enable: true + split.counter.suffix: Counter + productSearchKeywords: productSearchKeywordsArray:\s+ + +# # Extract the list of keywords from a product search +# - processor: Extract keywords from product search +# component: com.hurence.logisland.processor.ApplyRegexp +# type: processor +# documentation: a processor that extracts search keywords from location URL +# configuration: +# location: productSearchKeywords:https\:\/\/[^\/]+\/\w+\/search\/.*[\?|\&]text=([^\&\?]+)\&?.* +# +# # Build an array of keywords as well as count the number of items +# - processor: Split search keywords and count number of keywords +# component: com.hurence.logisland.processor.SplitField +# type: processor +# documentation: a processor that splits a string and return an array of values +# configuration: +# split.counter.enable: true +# split.counter.suffix: Counter +# productSearchKeywords: productSearchKeywordsArray:\s*\+\s* + + # Enrich the events that have a product id with info from PIM + - processor: Enrich_events_with_product_coverage + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${codeProduct_rev} + es.index: pim_listsku + es.type: details + es.includes.field: ${'coverage:coverage_'+countryCode+',brandName,Class,brandRef'} + + # Univers produit + - processor: Decompose product class level 1 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 1 categories any product belongs to. + configuration: + Class: categoryNiv1:^(\d+)$ + + # Univers produit + - processor: Decompose product class level 2 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 2 categories any product belongs to. + configuration: + Class: categoryNiv2,categoryNiv1:^((\d+)\-\d+)$ + + # Univers produit + - processor: Decompose product class level 3 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 3 categories any product belongs to. + configuration: + Class: categoryNiv3,categoryNiv2,categoryNiv1:^(((\d+)\-\d+)\-\d+)$ + + # Univers produit + - processor: Decompose product class level 4 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 4 categories any product belongs to. + configuration: + Class: categoryNiv4,categoryNiv3,categoryNiv2,categoryNiv1:^((((\d+)\-\d+)\-\d+)\-\d+)$ + + # Univers produit + - processor: Decompose product class level 5 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 5 categories any product belongs to. + configuration: + Class: categoryNiv5,categoryNiv4,categoryNiv3,categoryNiv2,categoryNiv1:(((((\d+)\-\d+)\-\d+)\-\d+)\-\d+) + + # Grab the synopsis of each category the product belongs to (in the right language) + - processor: Enrich_events_with_synopsis_of_categoryNiv5 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${categoryNiv5} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel5:en" +# es.includes.field: ${'categoryLabel5:'+countryCode} + + - processor: Enrich_events_with_synopsis_of_categoryNiv4 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${categoryNiv4} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel4:en" +# es.includes.field: ${'categoryLabel4:'+countryCode} + + - processor: Enrich_events_with_synopsis_of_categoryNiv3 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${categoryNiv3} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel3:en" +# es.includes.field: ${'categoryLabel3:'+countryCode} + + - processor: Enrich_events_with_synopsis_of_categoryNiv2 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${categoryNiv2} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel2:en" +# es.includes.field: ${'categoryLabel2:'+countryCode} + + - processor: Enrich_events_with_synopsis_of_categoryNiv1 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${categoryNiv1} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel1:en" +# es.includes.field: ${'categoryLabel1:'+countryCode} + + # Enrich the events that have a product id with info from workit + - processor: Enrich_events_with_workit + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${codeProduct_rev} + es.index: ${'workit_'+Company} + es.includes.field: Position,UnitPrice* + + - processor: Cleanup record + component: com.hurence.logisland.processor.RemoveFields + type: processor + documentation: + configuration: + fields.to.remove: codeProduct_rev + + # Enrich the events that have a Userid + - processor: Enrich_events_with_users_info + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${Userid} + es.type: details + es.index: ${'openanalytics_users.'+Company} + es.includes.field: "*" + es.excludes.field: Userid, Date_Creation,Date_LastLogin,Company + + # Add User Agent fields + - processor: User_Agent + component: com.hurence.logisland.processor.useragent.ParseUserAgent + type: processor + documentation: a processor that adds user agent fields to an event + configuration: + useragent.field: userAgentString + fields: DeviceClass,DeviceName,OperatingSystemClass,OperatingSystemName,OperatingSystemVersion,OperatingSystemNameVersion,LayoutEngineClass,LayoutEngineName,LayoutEngineVersion,LayoutEngineVersionMajor,LayoutEngineNameVersion,LayoutEngineNameVersionMajor,LayoutEngineBuild,AgentClass,AgentName,AgentVersion,AgentVersionMajor,AgentNameVersion,AgentNameVersionMajor,IECompatibilityVersion,IECompatibilityVersionMajor,IECompatibilityNameVersion,IECompatibilityNameVersionMajor,WebviewAppName,WebviewAppNameVersionMajor,WebviewAppVersion,WebviewAppVersionMajor + + # Ip2Geo processor + - processor: ipToGeoForIncomingWebTraffic + component: com.hurence.logisland.processor.enrichment.IpToGeo + type: processor + documentation: Find geo information correponding to an ip using maxmind service + configuration: + ip.address.field: remoteHost + iptogeo.service: ip_to_geo_service + cache.service: lru_cache_service_domain + debug: false + + # Extract the utm_source + - processor: Extract utm_source from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_source:.*[\&\?]utm_source=\s*([^\&\?]+)\&?.* + + # Extract the utm_medium + - processor: Extract utm_medium from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_medium:.*[\&\?]utm_medium=\s*([^\&\?]+)\&?.* + + # Extract the utm_campaign + - processor: Extract utm_campaign from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_campaign:.*[\&\?]utm_campaign=\s*([^\&\?]+)\&?.* + + # Extract the utm_term + - processor: Extract utm_term from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_term:.*[\&\?]utm_term=\s*([^\&\?]+)\&?.* + + # Extract the utm_content + - processor: Extract utm_content from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_content:.*[\&\?]utm_content=\s*([^\&\?]+)\&?.* + + # Integrated customers : all other customers + - processor: Setup_empty_string + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that set empty string for ImportanceCode, B2BUnit, and libelle_zone fields if they do not exist in the record + configuration: + conflict.resolution.policy: keep_only_old_field + ImportanceCode: "" + B2BUnit: "" + libelle_zone: "" + Userid: "" + + - processor: detect_internal_b2bunit + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that detect internal B2BUnit + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: ${if (B2BUnit == 'SL899999' || B2BUnit == 'SL8999998') return 'internalB2BUnit'; return alert_match_name;} + sourceOrigin: ${if (B2BUnit == 'SL899999' || B2BUnit == 'SL8999998') return 'internal_traffic'; return sourceOrigin;} + + # Categorize the customer such as: + # Affiliates customers : code importance 9003 et 9004 + # Marketplace customers : B2Bunit composed with '*_*' + # Subsidiaries : customers that are not part of segments above, and not part of the ZONE "EST", "OUEST" and "NORD" + # Integrated customers : all other customers + - processor: categorize_customers + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that categorize the customers (affiliates, marketplace, subsidiaries,integrated) + configuration: + customer_category: ${if( ImportanceCode == '9003' || ImportanceCode == '9004') return 'affiliates'; if ( B2BUnit contains '*_*' ) return 'marketplace'; if ( libelle_zone != 'EST' && libelle_zone != 'OUEST' && libelle_zone != 'NORD' ) return 'subsidiaries'; else return 'integrated';} + + # Figure out the source of traffic for this websession + - processor: Source Of Traffic + component: com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + type: processor + documentation: a processor that figure out the source of traffic for the websession + configuration: + referer.field: referer + first.visited.page.field: location + elasticsearch.client.service: opendistro_service + es.index: openanalytics_search_engines_and_social_networks + es.search_engine.field: search_engine + es.social_network.field: social_network + source_of_traffic.suffix: source_of_traffic + source_of_traffic.hierarchical: false + cache.service: lru_cache_service_domain + cache.validity.timeout: 3600 + debug: false + + - processor: Websession_index_name + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that specifies the name of the websession elasticsearch index into a field used by the BulkAdd processor afterward. + configuration: + websessionIndex: ${'openanalytics_websessions-' + new java.text.SimpleDateFormat('yyyy.MM').format(new java.util.Date(h2kTimestamp));} + + # Create or update web session based on web events + - processor: consolidate_session + component: com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + type: processor + documentation: compute session duration as well as other informations + configuration: + session.timeout: 1800 + userid.field: Userid + fields.to.return: partyId,Company,remoteHost,tagOrigin,sourceOrigin,spamOrigin,referer,userAgentString,utm_source,utm_campaign,utm_medium,utm_content,utm_term,alert_match_name,alert_match_query,referer_hostname,DeviceClass,AgentName,ImportanceCode,B2BUnit,libelle_zone,Userid,customer_category,source_of_traffic_source,source_of_traffic_medium,source_of_traffic_keyword,source_of_traffic_campaign,source_of_traffic_organic_search,source_of_traffic_content,source_of_traffic_referral_path,websessionIndex + elasticsearch.client.service: opendistro_service +# es.session.index.field: websessionIndex + es.session.type.name: sessions + es.event.index.prefix: openanalytics_webevents + es.event.type.name: event + es.mapping.event.to.session.index.name: openanalytics_websession_mappings +# debug: true + + # put to opendistro + - processor: opendistro_es_publisher + component: com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + type: processor + documentation: a processor that stores the web sessions + configuration: +# es.index.field: websessionIndex + elasticsearch.client.service: opendistro_service + default.index: openanalytics_default + default.type: default + es.index.field: es_index + es.type.field: es_type \ No newline at end of file diff --git a/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/docker/docker-compose.yml b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/docker/docker-compose.yml new file mode 100644 index 000000000..376db94ef --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/docker/docker-compose.yml @@ -0,0 +1,66 @@ +version: '3' +services: + odfe-node1: + image: amazon/opendistro-for-elasticsearch:1.12.0 + container_name: odfe-node1 + environment: + - cluster.name=odfe-cluster + - node.name=odfe-node1 + - discovery.seed_hosts=odfe-node1,odfe-node2 + - cluster.initial_master_nodes=odfe-node1,odfe-node2 + - bootstrap.memory_lock=true # along with the memlock settings below, disables swapping + - "ES_JAVA_OPTS=-Xms512m -Xmx512m" # minimum and maximum Java heap size, recommend setting both to 50% of system RAM + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65536 # maximum number of open files for the Elasticsearch user, set to at least 65536 on modern systems + hard: 65536 + volumes: + - odfe-data1:/usr/share/elasticsearch/data + ports: + - 9200:9200 + - 9600:9600 # required for Performance Analyzer + networks: + - odfe-net + odfe-node2: + image: amazon/opendistro-for-elasticsearch:1.12.0 + container_name: odfe-node2 + environment: + - cluster.name=odfe-cluster + - node.name=odfe-node2 + - discovery.seed_hosts=odfe-node1,odfe-node2 + - cluster.initial_master_nodes=odfe-node1,odfe-node2 + - bootstrap.memory_lock=true + - "ES_JAVA_OPTS=-Xms512m -Xmx512m" + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65536 + hard: 65536 + volumes: + - odfe-data2:/usr/share/elasticsearch/data + networks: + - odfe-net + kibana: + image: amazon/opendistro-for-elasticsearch-kibana:1.12.0 + container_name: odfe-kibana + ports: + - 5601:5601 + expose: + - "5601" + environment: + ELASTICSEARCH_URL: https://odfe-node1:9200 + ELASTICSEARCH_HOSTS: https://odfe-node1:9200 + networks: + - odfe-net + +volumes: + odfe-data1: + odfe-data2: + +networks: + odfe-net: \ No newline at end of file diff --git a/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/log4j.properties b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/log4j.properties new file mode 100644 index 000000000..48db5dafc --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-kafka0.10-streaming-pipeline/src/test/resources/log4j.properties @@ -0,0 +1,13 @@ +# Root logger option +log4j.rootLogger=ERROR,stdout + +# Direct log messages to stdout +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n + +#log4j.logger.com.hurence=DEBUG +log4j.logger.com.hurence.logisland=INFO +log4j.logger.com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch=ERROR +#log4j.logger.com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService=TRACE diff --git a/logisland-tests/webanal-spark-2.4-streaming-pipeline/pom.xml b/logisland-tests/webanal-spark-2.4-streaming-pipeline/pom.xml new file mode 100644 index 000000000..5ba29cfd1 --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-streaming-pipeline/pom.xml @@ -0,0 +1,142 @@ + + + + logisland-tests + com.hurence.logisland + 1.4.0 + + 4.0.0 + + webanal-spark-2.4-streaming-pipepline + jar + + + + 2.11 + 2.11.8 + 2.4.0 + 0-10 + 2.0.1 + + + + + + + + + com.hurence.logisland + logisland-api + ${project.version} + provided + + + + + + + + + com.hurence.logisland + logisland-utils + ${project.version} + provided + + + com.fasterxml.jackson.core + jackson-databind + + + + + com.hurence.logisland + logisland-engine-spark_2_4 + ${project.version} + provided + + + com.hurence.logisland + logisland-processor-web-analytics + ${project.version} + provided + + + + com.hurence.logisland + logisland-processor-common + ${project.version} + provided + + + org.scala-lang + scala-library + + + + + + + + org.apache.spark + spark-sql_${scala.binary.version} + ${spark.version} + + + org.apache.spark + spark-sql-kafka-${kafka.spark.version}_${scala.binary.version} + ${spark.version} + + + + + + + + + + + + + + + + + + + + + + + + + com.salesforce.kafka.test + kafka-junit5 + 3.2.2 + test + + + + org.apache.kafka + kafka_${scala.binary.version} + ${kafka.version} + test + + + org.apache.kafka + kafka-clients + ${kafka.version} + test + + + + org.slf4j + slf4j-log4j12 + ${org.slf4j.version} + test + + + + \ No newline at end of file diff --git a/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/main/java/com/hurence/logisland/webanalytics/test/util/ConfJobHelper.java b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/main/java/com/hurence/logisland/webanalytics/test/util/ConfJobHelper.java new file mode 100644 index 000000000..f18a6d7d4 --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/main/java/com/hurence/logisland/webanalytics/test/util/ConfJobHelper.java @@ -0,0 +1,91 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.webanalytics.test.util; + +import com.hurence.logisland.component.ComponentFactory; +import com.hurence.logisland.config.ConfigReader; +import com.hurence.logisland.config.ControllerServiceConfiguration; +import com.hurence.logisland.config.LogislandConfiguration; +import com.hurence.logisland.engine.EngineContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.Map; + +public class ConfJobHelper { + + private static Logger logger = LoggerFactory.getLogger(ConfJobHelper.class); + + private final LogislandConfiguration jobConfig; + private EngineContext engineContext; + + public ConfJobHelper(LogislandConfiguration jobConfig) { + this.jobConfig = jobConfig; + } + + public ConfJobHelper(String pathConfFile) throws IOException { + this(ConfigReader.loadConfig(pathConfFile)); + } + + public void modifyControllerServiceConf(String id, Map confToModify) { + ControllerServiceConfiguration service = jobConfig.getEngine().getControllerServiceConfigurations() + .stream() + .filter(c -> id.equals(c.getControllerService())) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("service with id " + id + " does not exist")); + service.getConfiguration().putAll(confToModify); + } + + public void initEngineContext() { + this.engineContext = ComponentFactory.buildAndSetUpEngineContext(jobConfig.getEngine()) + .orElseThrow(() -> new IllegalArgumentException("engineInstance could not be instantiated")); + if (!engineContext.isValid()) { + throw new IllegalArgumentException("engineInstance is not valid with input configuration !"); + } + } + + public EngineContext getEngineContext() { + return engineContext; + } + + public void startJob() { + String engineName = engineContext.getEngine().getIdentifier(); + try { + logger.info("Start engine {}", engineName); + engineContext.getEngine().start(engineContext); + } catch (Exception e) { + logger.error("Something went bad while running the job {} : {}", engineName, e); + System.exit(-1); + } + } + + public void startThenAwaitTermination() { + String engineName = engineContext.getEngine().getIdentifier(); + startJob(); + try { + logger.info("Waiting termination of engine {}", engineName); + engineContext.getEngine().awaitTermination(engineContext); + logger.info("Engine {} terminated", engineName); + System.exit(0); + } catch (Exception e) { + logger.error("Something went bad while running the job {} : {}", engineName, e); + System.exit(-1); + } + } + + +} diff --git a/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/main/java/com/hurence/logisland/webanalytics/test/util/EventsGenerator.java b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/main/java/com/hurence/logisland/webanalytics/test/util/EventsGenerator.java new file mode 100644 index 000000000..816e739e4 --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/main/java/com/hurence/logisland/webanalytics/test/util/EventsGenerator.java @@ -0,0 +1,69 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.webanalytics.test.util; + +import com.hurence.logisland.record.Record; +import com.hurence.logisland.record.StandardRecord; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.LongStream; + +public class EventsGenerator { + + final String sessionId; + + public EventsGenerator(String sessionId) { + this.sessionId = sessionId; + } + + public Record generateEvent(long timestamp, String url) { + Record record = new StandardRecord("generated"); +// record.setStringField(TestMappings.eventsInternalFields.getSessionIdField(), sessionId); +// record.setLongField(TestMappings.eventsInternalFields.getTimestampField(), timestamp); +// record.setStringField(TestMappings.eventsInternalFields.getVisitedPageField(), url); + record.setStringField("sessionId", sessionId); + record.setLongField("ts", timestamp); + record.setStringField("TestMappings.eventsInternalFields.getVisitedPageField()", url); + return record; + } + + public List generateEvents(List timestamps, + String url) { + return timestamps.stream() + .map(ts -> generateEvent(ts, url)) + .collect(Collectors.toList()); + } + + public List generateEvents(Long from, + Long to, + Long padding) { + int numberOfRecord = (int)((to - from) / padding); + return LongStream.iterate(from, ts -> ts + padding) + .limit(numberOfRecord) + .mapToObj(ts -> generateEvent(ts, "url")) + .collect(Collectors.toList()); + } + + public List generateEventsRandomlyOrdered(Long from, + Long to, + Long padding) { + List sortedList = generateEvents(from, to, padding); + Collections.shuffle(sortedList);; + return sortedList; + } +} diff --git a/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/main/java/com/hurence/logisland/webanalytics/test/util/TestMappings.java b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/main/java/com/hurence/logisland/webanalytics/test/util/TestMappings.java new file mode 100644 index 000000000..4beb8455d --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/main/java/com/hurence/logisland/webanalytics/test/util/TestMappings.java @@ -0,0 +1,63 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.webanalytics.test.util; + +import com.hurence.logisland.processor.webanalytics.IncrementalWebSession; +import com.hurence.logisland.processor.webanalytics.modele.Event; +import com.hurence.logisland.processor.webanalytics.modele.WebSession; + +import static com.hurence.logisland.processor.webanalytics.IncrementalWebSession.DEFAULT_SOURCE_OF_TRAFFIC_PREFIX; + +public class TestMappings { + + + public static Event.InternalFields eventsInternalFields = new Event.InternalFields() + .setSessionIdField("sessionId") + .setTimestampField("h2kTimestamp") + .setVisitedPageField("VISITED_PAGE") + .setSourceOffTrafficCampaignField(IncrementalWebSession.DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_CAMPAIGN) + .setSourceOffTrafficContentField(IncrementalWebSession.DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_CONTENT) + .setSourceOffTrafficKeyWordField(IncrementalWebSession.DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_KEYWORD) + .setSourceOffTrafficMediumField(IncrementalWebSession.DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_MEDIUM) + .setSourceOffTrafficSourceField(IncrementalWebSession.DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_SOURCE) + .setNewSessionReasonField("reasonForNewSession") + .setUserIdField("Userid") + .setOriginalSessionIdField("originalSessionId") + .setTransactionIdField("transactionId") + .setTransactionIdsField("transactionIds"); + + + public static WebSession.InternalFields sessionInternalFields = new WebSession.InternalFields() + .setSessionIdField("sessionId") + .setTimestampField("h2kTimestamp") + .setSourceOffTrafficCampaignField(IncrementalWebSession.DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_CAMPAIGN) + .setSourceOffTrafficContentField(IncrementalWebSession.DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_CONTENT) + .setSourceOffTrafficKeyWordField(IncrementalWebSession.DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_KEYWORD) + .setSourceOffTrafficMediumField(IncrementalWebSession.DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_MEDIUM) + .setSourceOffTrafficSourceField(IncrementalWebSession.DEFAULT_SOURCE_OF_TRAFFIC_PREFIX + IncrementalWebSession.SOURCE_OF_TRAFFIC_FIELD_SOURCE) + .setIsSessionActiveField("is_sessionActive") + .setSessionDurationField("sessionDuration") + .setSessionInactivityDurationField("sessionInactivityDuration") + .setEventsCounterField("eventsCounter") + .setFirstEventDateTimeField("firstEventDateTime") + .setFirstEventEpochSecondsField("firstEventEpochSeconds") + .setFirstVisitedPageField("firstVisitedPage") + .setLastEventDateTimeField("lastEventDateTime") + .setLastEventEpochSecondsField("lastEventEpochSeconds") + .setLastVisitedPageField("lastVisitedPage") + .setTransactionIdsField("transactionIds") + .setUserIdField("Userid"); +} diff --git a/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/java/com/hurence/logisland/bean/KeyValue.java b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/java/com/hurence/logisland/bean/KeyValue.java new file mode 100644 index 000000000..446ef76e6 --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/java/com/hurence/logisland/bean/KeyValue.java @@ -0,0 +1,30 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.bean; + +import java.io.Serializable; + +public class KeyValue implements Serializable { + + public String key; + public Long count; + + public KeyValue(String key, Long count) { + this.key = key; + this.count = count; + } + +} diff --git a/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/java/com/hurence/logisland/serializer/KafkaRecordSerializer.java b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/java/com/hurence/logisland/serializer/KafkaRecordSerializer.java new file mode 100644 index 000000000..696044490 --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/java/com/hurence/logisland/serializer/KafkaRecordSerializer.java @@ -0,0 +1,56 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.serializer; + +import com.hurence.logisland.record.Record; +import org.apache.kafka.common.serialization.Serializer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Map; + + +public class KafkaRecordSerializer implements Serializer { + + private static Logger logger = LoggerFactory.getLogger(KafkaRecordSerializer.class); + + private ExtendedJsonSerializer recordSerializer = new ExtendedJsonSerializer(); + private ByteArrayOutputStream out; + + @Override + public void configure(Map map, boolean b) { + out = new ByteArrayOutputStream(); + } + + @Override + public byte[] serialize(String s, Record record) { + recordSerializer.serialize(out, record); + return out.toByteArray(); + } + + @Override + public void close() { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + logger.error("error while closing stream", e); + } + } + } +} diff --git a/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/AbstractSharedKafkaTestResourceTest.java b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/AbstractSharedKafkaTestResourceTest.java new file mode 100644 index 000000000..d0a641822 --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/AbstractSharedKafkaTestResourceTest.java @@ -0,0 +1,167 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +//package com.hurence.logisland.webanalytics; +// +//import com.salesforce.kafka.test.KafkaTestUtils; +//import org.apache.kafka.clients.admin.AdminClient; +//import org.apache.kafka.clients.admin.Config; +//import org.apache.kafka.clients.consumer.ConsumerRecord; +//import org.apache.kafka.clients.consumer.ConsumerRecords; +//import org.apache.kafka.clients.consumer.KafkaConsumer; +//import org.apache.kafka.clients.producer.KafkaProducer; +//import org.apache.kafka.clients.producer.ProducerRecord; +//import org.apache.kafka.clients.producer.RecordMetadata; +//import org.apache.kafka.common.Node; +//import org.apache.kafka.common.PartitionInfo; +//import org.apache.kafka.common.TopicPartition; +//import org.apache.kafka.common.config.ConfigResource; +//import org.apache.kafka.common.serialization.StringDeserializer; +//import org.apache.kafka.common.serialization.StringSerializer; +//import org.junit.jupiter.api.Assertions; +//import org.junit.jupiter.api.Test; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +// +//import java.util.ArrayList; +//import java.util.Collection; +//import java.util.Collections; +//import java.util.List; +//import java.util.Set; +//import java.util.concurrent.ExecutionException; +//import java.util.concurrent.Future; +//import java.util.stream.Collectors; +// +///** +// * Abstract base test class. This defines shared test cases used by other Concrete tests. +// */ +//public abstract class AbstractSharedKafkaTestResourceTest { +// private static final Logger logger = LoggerFactory.getLogger(AbstractSharedKafkaTestResourceTest.class); +// +// /** +// * Validate that we started 2 brokers. +// */ +// @Test +// void testTwoBrokersStarted() { +// final Collection nodes = getKafkaTestUtils().describeClusterNodes(); +// Assertions.assertNotNull(nodes, "Sanity test, should not be null"); +// Assertions.assertEquals(2, nodes.size(), "Should have two entries"); +// +// // Grab id for each node found. +// final Set foundBrokerIds = nodes.stream() +// .map(Node::id) +// .collect(Collectors.toSet()); +// +// Assertions.assertEquals(2, foundBrokerIds.size(), "Found 2 brokers."); +// Assertions.assertTrue(foundBrokerIds.contains(1), "Found brokerId 1"); +// Assertions.assertTrue(foundBrokerIds.contains(2), "Found brokerId 2"); +// } +// +// /** +// * Test consuming and producing via KafkaProducer and KafkaConsumer instances. +// */ +// @Test +// void testProducerAndConsumer() throws Exception { +// // Create a topic +// final String topicName = "ProducerAndConsumerTest" + System.currentTimeMillis(); +// getKafkaTestUtils().createTopic(topicName, 1, (short) 1); +// +// final int partitionId = 0; +// +// // Define our message +// final String expectedKey = "my-key"; +// final String expectedValue = "my test message"; +// +// // Define the record we want to produce +// final ProducerRecord producerRecord = new ProducerRecord<>(topicName, partitionId, expectedKey, expectedValue); +// +// // Create a new producer +// try (final KafkaProducer producer = +// getKafkaTestUtils().getKafkaProducer(StringSerializer.class, StringSerializer.class)) { +// +// // Produce it & wait for it to complete. +// final Future future = producer.send(producerRecord); +// producer.flush(); +// while (!future.isDone()) { +// Thread.sleep(500L); +// } +// logger.info("Produce completed"); +// } +// +// // Create consumer +// try (final KafkaConsumer kafkaConsumer = +// getKafkaTestUtils().getKafkaConsumer(StringDeserializer.class, StringDeserializer.class)) { +// +// final List topicPartitionList = new ArrayList<>(); +// for (final PartitionInfo partitionInfo: kafkaConsumer.partitionsFor(topicName)) { +// topicPartitionList.add(new TopicPartition(partitionInfo.topic(), partitionInfo.partition())); +// } +// kafkaConsumer.assign(topicPartitionList); +// kafkaConsumer.seekToBeginning(topicPartitionList); +// +// // Pull records from kafka, keep polling until we get nothing back +// ConsumerRecords records; +// do { +// records = kafkaConsumer.poll(2000L); +// logger.info("Found {} records in kafka", records.count()); +// for (ConsumerRecord record: records) { +// // Validate +// Assertions.assertEquals(expectedKey, record.key(), "Key matches expected"); +// Assertions.assertEquals(expectedValue, record.value(), "value matches expected"); +// } +// } +// while (!records.isEmpty()); +// } +// } +// +// /** +// * Simple smoke test to ensure broker running appropriate listeners. +// */ +// @Test +// void validateListener() throws ExecutionException, InterruptedException { +// try (final AdminClient adminClient = getKafkaTestUtils().getAdminClient()) { +// final ConfigResource broker1Resource = new ConfigResource(ConfigResource.Type.BROKER, "1"); +// +// // Pull broker configs +// final Config configResult = adminClient +// .describeConfigs(Collections.singletonList(broker1Resource)) +// .values() +// .get(broker1Resource) +// .get(); +// +// // Check listener +// final String actualListener = configResult.get("listeners").value(); +// Assertions.assertTrue( +// actualListener.contains(getExpectedListenerProtocol() + "://"), +// "Expected " + getExpectedListenerProtocol() + ":// and found: " + actualListener); +// +// // Check inter broker protocol +// final String actualBrokerProtocol = configResult.get("security.inter.broker.protocol").value(); +// Assertions.assertEquals(getExpectedListenerProtocol(), actualBrokerProtocol, "Unexpected inter-broker protocol"); +// } +// } +// +// /** +// * Simple accessor. +// */ +// protected abstract KafkaTestUtils getKafkaTestUtils(); +// +// /** +// * The listener protocol the test is running over. +// * @return Expected listener protocol +// */ +// protected abstract String getExpectedListenerProtocol(); +//} +// diff --git a/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/SparkStreamingMultiSourceAndSinkTest.java b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/SparkStreamingMultiSourceAndSinkTest.java new file mode 100644 index 000000000..db72956ba --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/SparkStreamingMultiSourceAndSinkTest.java @@ -0,0 +1,341 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hurence.logisland.webanalytics; + +import com.hurence.logisland.bean.KeyValue; +import com.hurence.logisland.record.Record; +import com.hurence.logisland.serializer.KafkaRecordSerializer; +import com.hurence.logisland.webanalytics.test.util.EventsGenerator; +import com.salesforce.kafka.test.junit5.SharedKafkaTestResource; +import com.salesforce.kafka.test.listeners.PlainListener; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.clients.producer.RecordMetadata; +import org.apache.kafka.common.serialization.StringSerializer; +import org.apache.spark.api.java.function.MapFunction; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; +import org.apache.spark.sql.SparkSession; +import org.apache.spark.sql.catalyst.encoders.RowEncoder; +import org.apache.spark.sql.streaming.StreamingQuery; +import org.apache.spark.sql.types.DataTypes; +import org.apache.spark.sql.types.StructField; +import org.apache.spark.sql.types.StructType; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.Serializable; +import java.util.concurrent.Future; + +@Disabled +public class SparkStreamingMultiSourceAndSinkTest implements Serializable { + + private static Logger logger = LoggerFactory.getLogger(SparkStreamingMultiSourceAndSinkTest.class); + + /** + * We have a single embedded Kafka server that gets started when this test class is initialized. + * + * It's automatically started before any methods are run via the @RegisterExtension annotation. + * It's automatically stopped after all of the tests are completed via the @RegisterExtension annotation. + */ + @RegisterExtension + public static final SharedKafkaTestResource sharedKafkaTestResource = new SharedKafkaTestResource() + .withBrokerProperty("auto.create.topics.enable", "false") + .withBrokerProperty("message.max.bytes", "512000") + .registerListener(new PlainListener().onPorts(9092)); + + /** + * + */ + @Test + public void multipleSinkTest() throws Exception { + logger.info("Starting test"); + final String topicName = "test-simple"; +// sharedKafkaTestResource.getKafkaTestUtils().createTopic(topicName, 1, (short)1); + SparkSession spark = SparkSession + .builder() + .master("local[2]") +// .appName("StructuredSessionizationFromKafka") + .getOrCreate(); + logger.info("Created SparkSession"); +// +// // Subscribe to 1 topic + Dataset df = spark + .readStream() + .format("kafka") + .option("kafka.bootstrap.servers", sharedKafkaTestResource.getKafkaConnectString()) + .option("subscribe", topicName) + .option("startingOffsets", "earliest")//latest by default for stream + //failOnDataLoss => may be false alarm + //kafkaConsumer.pollTimeoutMs + //fetchOffset.numRetries + //fetchOffset.retryIntervalMs + //maxOffsetsPerTrigger + .load(); + + df = df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)") + .groupBy("key") + .count(); + + StructType schema = new StructType( + new StructField[]{ + new StructField("key", DataTypes.StringType, true, null), + new StructField("counter", DataTypes.LongType, true, null) + } + ); + Dataset dataset = df.map(new MapFunction() { + @Override + public Row call(Row row) throws Exception { + KeyValue kv = new KeyValue(row.getString(0), row.getLong(1)); + logger.info("processing key {} with count {}", kv.key, kv.count); + return row; + } + }, RowEncoder.apply(schema)); + + logger.info("Start streaming"); + // Start running the query that prints the session updates to the console + StreamingQuery query = dataset + .writeStream() + .outputMode("update") + .format("console") + .option("truncate", false) + .start(); + + StreamingQuery query2 = dataset + .writeStream() + .outputMode("update") + .format("console") + .option("truncate", false) + .start(); + + EventsGenerator eventGen = new EventsGenerator("divolte_1"); + long ts = 0L; + while (true) { + logger.info("Adding an event in topic"); + Record event = eventGen.generateEvent(ts, "url"); + addingEventsToTopicPartition(topicName, 0, event); +// addingEventsToTopicPartition(topicName, 0, "session1", event); +// addingEventsToTopicPartition(topicName, 0, "session2", event); + logger.info("Waiting 5 sec"); + long sleep = 5000L; + ts += sleep; + Thread.sleep(sleep); + } + } + + /** + * + */ + @Test + public void multipleSourceTest() throws Exception { + logger.info("Starting test"); + final String topicName = "test-simple"; + final String topicName2 = "test-simple2"; + sharedKafkaTestResource.getKafkaTestUtils().createTopic(topicName, 1, (short)1); + sharedKafkaTestResource.getKafkaTestUtils().createTopic(topicName2, 1, (short)1); + SparkSession spark = SparkSession + .builder() + .master("local[2]") +// .appName("StructuredSessionizationFromKafka") + .getOrCreate(); + logger.info("Created SparkSession"); +// +// // Subscribe to 1 topic + Dataset df = spark + .readStream() + .format("kafka") + .option("kafka.bootstrap.servers", sharedKafkaTestResource.getKafkaConnectString()) + .option("subscribe", topicName) + .option("startingOffsets", "earliest")//latest by default for stream + .load(); + + Dataset df2 = spark + .readStream() + .format("kafka") + .option("kafka.bootstrap.servers", sharedKafkaTestResource.getKafkaConnectString()) + .option("subscribe", topicName2) + .option("startingOffsets", "earliest")//latest by default for stream + .load(); + + df = df.union(df2).selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)") + .groupBy("key") + .count(); + + StructType schema = new StructType( + new StructField[]{ + new StructField("key", DataTypes.StringType, true, null), + new StructField("counter", DataTypes.LongType, true, null) + } + ); + + Dataset dataset = df.map(new MapFunction() { + @Override + public Row call(Row row) throws Exception { + KeyValue kv = new KeyValue(row.getString(0), row.getLong(1)); + logger.info("processing key {} with count {}", kv.key, kv.count); + return row; + } + }, RowEncoder.apply(schema)); + + logger.info("Start streaming"); + // Start running the query that prints the session updates to the console + StreamingQuery query = dataset + .writeStream() + .outputMode("update") + .format("console") + .option("truncate", false) + .start(); + + EventsGenerator eventGen = new EventsGenerator("divolte_1"); + long ts = 0L; + while (true) { + logger.info("Adding an event in topic"); + Record event = eventGen.generateEvent(ts, "url"); + addingEventsToTopicPartition(topicName, 0, "fromtopic1", event); + addingEventsToTopicPartition(topicName2, 0, "fromtopic2", event); +// addingEventsToTopicPartition(topicName, 0, "session1", event); +// addingEventsToTopicPartition(topicName, 0, "session2", event); + logger.info("Waiting 5 sec"); + long sleep = 5000L; + ts += sleep; + Thread.sleep(sleep); + } + } + + + /** + * + */ + @Test + public void multipleSourceAndSinkTest() throws Exception { + logger.info("Starting test"); + final String topicName = "test-simple"; + final String topicName2 = "test-simple2"; + sharedKafkaTestResource.getKafkaTestUtils().createTopic(topicName, 1, (short)1); + sharedKafkaTestResource.getKafkaTestUtils().createTopic(topicName2, 1, (short)1); + SparkSession spark = SparkSession + .builder() + .master("local[2]") +// .appName("StructuredSessionizationFromKafka") + .getOrCreate(); + logger.info("Created SparkSession"); +// +// // Subscribe to 1 topic + Dataset df = spark + .readStream() + .format("kafka") + .option("kafka.bootstrap.servers", sharedKafkaTestResource.getKafkaConnectString()) + .option("subscribe", topicName) + .option("startingOffsets", "earliest")//latest by default for stream + .load(); + + Dataset df2 = spark + .readStream() + .format("kafka") + .option("kafka.bootstrap.servers", sharedKafkaTestResource.getKafkaConnectString()) + .option("subscribe", topicName2) + .option("startingOffsets", "earliest")//latest by default for stream + .load(); + + df = df.union(df2).selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)") + .groupBy("key") + .count(); + + StructType schema = new StructType( + new StructField[]{ + new StructField("key", DataTypes.StringType, true, null), + new StructField("counter", DataTypes.LongType, true, null) + } + ); + + Dataset dataset = df.map(new MapFunction() { + @Override + public Row call(Row row) throws Exception { + KeyValue kv = new KeyValue(row.getString(0), row.getLong(1)); + logger.info("processing key {} with count {}", kv.key, kv.count); + return row; + } + }, RowEncoder.apply(schema)); + + logger.info("Start streaming"); + // Start running the query that prints the session updates to the console + StreamingQuery query = dataset + .writeStream() + .outputMode("update") + .format("console") + .option("truncate", false) + .start(); + + StreamingQuery query2 = dataset + .writeStream() + .outputMode("update") + .format("console") + .option("truncate", false) + .start(); + + EventsGenerator eventGen = new EventsGenerator("divolte_1"); + long ts = 0L; + while (true) { + logger.info("Adding an event in topic"); + Record event = eventGen.generateEvent(ts, "url"); + addingEventsToTopicPartition(topicName, 0, "fromtopic1", event); + addingEventsToTopicPartition(topicName2, 0, "fromtopic2", event); +// addingEventsToTopicPartition(topicName, 0, "session1", event); +// addingEventsToTopicPartition(topicName, 0, "session2", event); + logger.info("Waiting 5 sec"); + long sleep = 5000L; + ts += sleep; + Thread.sleep(sleep); + } + } + + + + private void addingEventsToTopicPartition(String topicName, int partitionId, Record record) throws InterruptedException { +// String key = record.getField(TestMappings.eventsInternalFields.getTimestampField()).asString(); + String key = record.getField("ts").asString(); + addingEventsToTopicPartition(topicName, partitionId, key, record); + } + + private void addingEventsToTopicPartition(String topicName, int partitionId, String key, Record record) throws InterruptedException { + // Define the record we want to produce + final ProducerRecord producerRecord = new ProducerRecord( + topicName, + partitionId, + key, + record + ); + +// Create a new producer + try (final KafkaProducer producer = + sharedKafkaTestResource.getKafkaTestUtils() + .getKafkaProducer( + StringSerializer.class, + KafkaRecordSerializer.class)) { + + // Produce it & wait for it to complete. + final Future future = producer.send(producerRecord); + producer.flush(); + while (!future.isDone()) { + Thread.sleep(500L); + } + logger.trace("Produce completed:{}", producerRecord); + } + } +} \ No newline at end of file diff --git a/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/SparkStructedStreamTest.java b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/SparkStructedStreamTest.java new file mode 100644 index 000000000..90480592c --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/SparkStructedStreamTest.java @@ -0,0 +1,290 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +//package com.hurence.logisland.webanalytics; +// +//import org.apache.spark.api.java.function.FlatMapFunction; +//import org.apache.spark.api.java.function.MapFunction; +//import org.apache.spark.api.java.function.MapGroupsWithStateFunction; +//import org.apache.spark.sql.Dataset; +//import org.apache.spark.sql.Encoders; +//import org.apache.spark.sql.Row; +//import org.apache.spark.sql.SparkSession; +//import org.apache.spark.sql.streaming.GroupState; +//import org.apache.spark.sql.streaming.GroupStateTimeout; +//import org.apache.spark.sql.streaming.StreamingQuery; +//import org.apache.spark.sql.streaming.StreamingQueryException; +//import org.junit.jupiter.api.Disabled; +//import org.junit.jupiter.api.Test; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +// +//import java.io.Serializable; +//import java.sql.Timestamp; +//import java.util.ArrayList; +//import java.util.Iterator; +// +////@Disabled +//public class SparkStructedStreamTest implements Serializable { +// +// private static Logger logger = LoggerFactory.getLogger(SparkStructedStreamTest.class); +// +// /** +// * Counts words in UTF8 encoded, '\n' delimited text received from the network. +// *

      +// * Usage: JavaStructuredNetworkWordCount +// * and describe the TCP server that Structured Streaming +// * would connect to receive data. +// *

      +// * To run this on your local machine, you need to first run a Netcat server +// * `$ nc -lk 9999` +// * and then run the example +// * `$ bin/run-example sql.streaming.JavaStructuredSessionization +// * localhost 9999` +// */ +// @Test +// public void localTest() throws StreamingQueryException { +// String host = "localhost"; +// int port = 9999; +// +// SparkSession spark = SparkSession +// .builder() +// .master("local[2]") +// .appName("JavaStructuredSessionization") +// .getOrCreate(); +// logger.info("Created SparkSession"); +//// Create DataFrame representing the stream of input lines from connection to host:port +// Dataset lines = spark +// .readStream() +// .format("socket") +// .option("host", host) +// .option("port", port) +// .option("includeTimestamp", true) +// .load(); +// +// FlatMapFunction linesToEvents = +// new FlatMapFunction() { +// @Override +// public Iterator call(LineWithTimestamp lineWithTimestamp) { +// ArrayList eventList = new ArrayList(); +// for (String word : lineWithTimestamp.getLine().split(" ")) { +// eventList.add(new Event(word, lineWithTimestamp.getTimestamp())); +// } +// return eventList.iterator(); +// } +// }; +// +// // Split the lines into words, treat words as sessionId of events +// Dataset events = lines +// .withColumnRenamed("value", "line") +// .as(Encoders.bean(LineWithTimestamp.class)) +// .flatMap(linesToEvents, Encoders.bean(Event.class)); +// +// // Sessionize the events. Track number of events, start and end timestamps of session, and +// // and report session updates. +// // +// // Step 1: Define the state update function +// MapGroupsWithStateFunction stateUpdateFunc = +// new MapGroupsWithStateFunction() { +// @Override public SessionUpdate call( +// String sessionId, Iterator events, GroupState state) { +// // If timed out, then remove session and send final update +// if (state.hasTimedOut()) { +// SessionUpdate finalUpdate = new SessionUpdate( +// sessionId, state.get().calculateDuration(), state.get().getNumEvents(), true); +// state.remove(); +// return finalUpdate; +// } else { +// // Find max and min timestamps in events +// long maxTimestampMs = Long.MIN_VALUE; +// long minTimestampMs = Long.MAX_VALUE; +// int numNewEvents = 0; +// while (events.hasNext()) { +// Event e = events.next(); +// long timestampMs = e.getTimestamp().getTime(); +// maxTimestampMs = Math.max(timestampMs, maxTimestampMs); +// minTimestampMs = Math.min(timestampMs, minTimestampMs); +// numNewEvents += 1; +// } +// SessionInfo updatedSession = new SessionInfo(); +// +// // Update start and end timestamps in session +// if (state.exists()) { +// SessionInfo oldSession = state.get(); +// updatedSession.setNumEvents(oldSession.numEvents + numNewEvents); +// updatedSession.setStartTimestampMs(oldSession.startTimestampMs); +// updatedSession.setEndTimestampMs(Math.max(oldSession.endTimestampMs, maxTimestampMs)); +// } else { +// updatedSession.setNumEvents(numNewEvents); +// updatedSession.setStartTimestampMs(minTimestampMs); +// updatedSession.setEndTimestampMs(maxTimestampMs); +// } +// state.update(updatedSession); +// // Set timeout such that the session will be expired if no data received for 10 seconds +// state.setTimeoutDuration("10 seconds"); +// return new SessionUpdate( +// sessionId, state.get().calculateDuration(), state.get().getNumEvents(), false); +// } +// } +// }; +// +// // Step 2: Apply the state update function to the events streaming Dataset grouped by sessionId +// Dataset sessionUpdates = events +// .groupByKey( +// new MapFunction() { +// @Override public String call(Event event) { +// return event.getSessionId(); +// } +// }, Encoders.STRING()) +// .mapGroupsWithState( +// stateUpdateFunc, +// Encoders.bean(SessionInfo.class), +// Encoders.bean(SessionUpdate.class), +// GroupStateTimeout.ProcessingTimeTimeout()); +// +// // Start running the query that prints the session updates to the console +// StreamingQuery query = sessionUpdates +// .writeStream() +// .outputMode("update") +// .format("console") +// .start(); +// +// logger.info("Will dtart streaming"); +// query.awaitTermination(); +// } +// +// @Test +// public void localTest2() throws StreamingQueryException { +// String host = "localhost"; +// int port = 9999; +// +// SparkSession spark = SparkSession +// .builder() +// .master("local[2]") +// .appName("JavaStructuredSessionization") +// .getOrCreate(); +// logger.info("Created SparkSession"); +//// Create DataFrame representing the stream of input lines from connection to host:port +// Dataset lines = spark +// .readStream() +// .format("socket") +// .option("host", host) +// .option("port", port) +// .option("includeTimestamp", true) +// .load(); +// +// // Start running the query that prints the session updates to the console +// StreamingQuery query = lines +// .writeStream() +// .outputMode("update") +// .format("console") +// .start(); +// +// logger.info("Will dtart streaming"); +// query.awaitTermination(); +// } +// +// /** +// * User-defined data type representing the raw lines with timestamps. +// */ +// public static class LineWithTimestamp implements Serializable { +// private String line; +// private Timestamp timestamp; +// +// public Timestamp getTimestamp() { return timestamp; } +// public void setTimestamp(Timestamp timestamp) { this.timestamp = timestamp; } +// +// public String getLine() { return line; } +// public void setLine(String sessionId) { this.line = sessionId; } +// } +// +// /** +// * User-defined data type representing the input events +// */ +// public static class Event implements Serializable { +// private String sessionId; +// private Timestamp timestamp; +// +// public Event() { } +// public Event(String sessionId, Timestamp timestamp) { +// this.sessionId = sessionId; +// this.timestamp = timestamp; +// } +// +// public Timestamp getTimestamp() { return timestamp; } +// public void setTimestamp(Timestamp timestamp) { this.timestamp = timestamp; } +// +// public String getSessionId() { return sessionId; } +// public void setSessionId(String sessionId) { this.sessionId = sessionId; } +// } +// +// /** +// * User-defined data type for storing a session information as state in mapGroupsWithState. +// */ +// public static class SessionInfo implements Serializable { +// private int numEvents = 0; +// private long startTimestampMs = -1; +// private long endTimestampMs = -1; +// +// public int getNumEvents() { return numEvents; } +// public void setNumEvents(int numEvents) { this.numEvents = numEvents; } +// +// public long getStartTimestampMs() { return startTimestampMs; } +// public void setStartTimestampMs(long startTimestampMs) { +// this.startTimestampMs = startTimestampMs; +// } +// +// public long getEndTimestampMs() { return endTimestampMs; } +// public void setEndTimestampMs(long endTimestampMs) { this.endTimestampMs = endTimestampMs; } +// +// public long calculateDuration() { return endTimestampMs - startTimestampMs; } +// +// @Override public String toString() { +// return "SessionInfo(numEvents = " + numEvents + +// ", timestamps = " + startTimestampMs + " to " + endTimestampMs + ")"; +// } +// } +// +// /** +// * User-defined data type representing the update information returned by mapGroupsWithState. +// */ +// public static class SessionUpdate implements Serializable { +// private String id; +// private long durationMs; +// private int numEvents; +// private boolean expired; +// +// public SessionUpdate() { } +// +// public SessionUpdate(String id, long durationMs, int numEvents, boolean expired) { +// this.id = id; +// this.durationMs = durationMs; +// this.numEvents = numEvents; +// this.expired = expired; +// } +// +// public String getId() { return id; } +// public void setId(String id) { this.id = id; } +// +// public long getDurationMs() { return durationMs; } +// public void setDurationMs(long durationMs) { this.durationMs = durationMs; } +// +// public int getNumEvents() { return numEvents; } +// public void setNumEvents(int numEvents) { this.numEvents = numEvents; } +// +// public boolean isExpired() { return expired; } +// public void setExpired(boolean expired) { this.expired = expired; } +// } +//} \ No newline at end of file diff --git a/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/WebanalSessionnalizationStructedStreamTest.java b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/WebanalSessionnalizationStructedStreamTest.java new file mode 100644 index 000000000..b83459586 --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/WebanalSessionnalizationStructedStreamTest.java @@ -0,0 +1,204 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +//package com.hurence.logisland.webanalytics; +// +//import com.hurence.logisland.record.Record; +//import com.hurence.logisland.stream.StreamProperties; +//import com.hurence.logisland.serializer.KafkaRecordSerializer; +//import com.hurence.logisland.webanalytics.test.util.ConfJobHelper; +//import com.hurence.logisland.webanalytics.test.util.EventsGenerator; +//import com.hurence.logisland.webanalytics.test.util.TestMappings; +//import com.salesforce.kafka.test.junit5.SharedKafkaTestResource; +//import com.salesforce.kafka.test.listeners.PlainListener; +//import org.apache.kafka.clients.producer.KafkaProducer; +//import org.apache.kafka.clients.producer.ProducerRecord; +//import org.apache.kafka.clients.producer.RecordMetadata; +//import org.apache.kafka.common.serialization.StringSerializer; +//import org.apache.spark.sql.Dataset; +//import org.apache.spark.sql.Row; +//import org.apache.spark.sql.SparkSession; +//import org.apache.spark.sql.streaming.StreamingQuery; +//import org.apache.spark.sql.streaming.StreamingQueryException; +//import org.junit.jupiter.api.Disabled; +//import org.junit.jupiter.api.Test; +//import org.junit.jupiter.api.extension.RegisterExtension; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +// +//import java.io.IOException; +//import java.io.Serializable; +//import java.util.HashMap; +//import java.util.Map; +//import java.util.concurrent.Future; +// +//public class WebanalSessionnalizationStructedStreamTest implements Serializable { +// +// private static Logger logger = LoggerFactory.getLogger(WebanalSessionnalizationStructedStreamTest.class); +// +// EventsGenerator eventGen = new EventsGenerator("divolte_1"); +// /** +// * We have a single embedded Kafka server that gets started when this test class is initialized. +// * +// * It's automatically started before any methods are run via the @RegisterExtension annotation. +// * It's automatically stopped after all of the tests are completed via the @RegisterExtension annotation. +// */ +// @RegisterExtension +// public static final SharedKafkaTestResource sharedKafkaTestResource = new SharedKafkaTestResource() +// .withBrokerProperty("auto.create.topics.enable", "false") +// .withBrokerProperty("message.max.bytes", "512000") +// .registerListener(new PlainListener().onPorts(9092)); +// +// +// /** +// */ +// @Test +// @Disabled +// public void myTest() throws IOException, InterruptedException { +// String confFilePath = getClass().getClassLoader().getResource("conf/my-conf-test.yaml").getFile(); +// ConfJobHelper confJob = new ConfJobHelper(confFilePath); +// Map confKafka = new HashMap<>(); +// confKafka.put(StreamProperties.KAFKA_ZOOKEEPER_QUORUM().getName(), sharedKafkaTestResource.getZookeeperConnectString()); +// confKafka.put(StreamProperties.KAFKA_METADATA_BROKER_LIST().getName(), sharedKafkaTestResource.getKafkaConnectString()); +// confJob.modifyControllerServiceConf("kafka_service", confKafka); +// confJob.initEngineContext(); +// confJob.startJob(); +// +// final String topicName = "test-simple"; +// sharedKafkaTestResource.getKafkaTestUtils().createTopic(topicName, 1, (short)1); +// +// long ts = 0L; +// while (true) { +// logger.info("Adding an event in topic"); +// Record event = eventGen.generateEvent(ts, "url"); +// addingEventsToTopicPartition(topicName, 0, event); +// logger.info("Waiting 5 sec"); +// long sleep = 5000L; +// ts += sleep; +// Thread.sleep(sleep); +// } +// } +// +//// /** +//// * +//// */ +//// @Test +//// public void testRewind() throws IOException, InterruptedException { +//// String confFilePath = getClass().getClassLoader().getResource("/conf/my-conf-test.yaml").getFile(); +//// ConfJobHelper confJob = new ConfJobHelper(confFilePath); +//// Map confKafka = new HashMap<>(); +//// confKafka.put(StreamProperties.KAFKA_ZOOKEEPER_QUORUM().getName(), sharedKafkaTestResource.getZookeeperConnectString()); +//// confJob.modifyControllerServiceConf("kafka_service", confKafka); +//// confJob.initEngineContext(); +//// confJob.startJob(); +//// +//// final String topicName = "logisland-raw"; +//// sharedKafkaTestResource.getKafkaTestUtils().createTopic(topicName, 1, (short)1); +//// +//// long ts=0l; +//// while (true) { +//// logger.info("Adding an event in topic"); +//// Record event = eventGen.generateEvent(ts, "url"); +//// addingEventsToTopicPartition(topicName, 0, event); +//// logger.info("Waiting 5 sec"); +//// long sleep =5000L; +//// ts += sleep; +//// Thread.sleep(sleep); +//// } +//// } +// +// /** +// */ +// @Test +// @Disabled +// public void myTest2() throws StreamingQueryException, InterruptedException { +// final String topicName = "test-simple"; +// sharedKafkaTestResource.getKafkaTestUtils().createTopic(topicName, 1, (short)1); +// +// SparkSession spark = SparkSession +// .builder() +// .master("local[2]") +// .appName("StructuredSessionizationFromKafka") +// .getOrCreate(); +// logger.info("Created SparkSession"); +// +// // Subscribe to 1 topic +// Dataset df = spark +// .readStream()//TODO can be batch (read) +// .format("kafka") +// .option("kafka.bootstrap.servers", sharedKafkaTestResource.getKafkaConnectString()) +// .option("subscribe", topicName) +// .option("startingOffsets", "earliest")//latest by default for stream +// //failOnDataLoss => may be false alarm +// //kafkaConsumer.pollTimeoutMs +// //fetchOffset.numRetries +// //fetchOffset.retryIntervalMs +// //maxOffsetsPerTrigger +// .load(); +// +// df = df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)"); +// +// sharedKafkaTestResource.getKafkaTestUtils().createTopic(topicName, 1, (short)1); +// logger.info("Start streaming"); +// // Start running the query that prints the session updates to the console +// StreamingQuery query = df +// .writeStream() +// .outputMode("update") +// .format("console") +// .start(); +// +// long ts = 0L; +// while (true) { +// logger.info("Adding an event in topic"); +// Record event = eventGen.generateEvent(ts, "url"); +// addingEventsToTopicPartition(topicName, 0, event); +// logger.info("Waiting 5 sec"); +// long sleep = 5000L; +// ts += sleep; +// Thread.sleep(sleep); +// } +// +// +//// query.awaitTermination(); +// } +// +// +// +// private void addingEventsToTopicPartition(String topicName, int partitionId, Record record) throws InterruptedException { +// // Define the record we want to produce +// final ProducerRecord producerRecord = new ProducerRecord( +// topicName, +// partitionId, +// record.getField(TestMappings.eventsInternalFields.getTimestampField()).asString(), +// record +// ); +// +// // Create a new producer +// try (final KafkaProducer producer = +// sharedKafkaTestResource.getKafkaTestUtils() +// .getKafkaProducer( +// StringSerializer.class, +// KafkaRecordSerializer.class)) { +// +// // Produce it & wait for it to complete. +// final Future future = producer.send(producerRecord); +// producer.flush(); +// while (!future.isDone()) { +// Thread.sleep(500L); +// } +// logger.trace("Produce completed:{}", producerRecord); +// } +// } +//} \ No newline at end of file diff --git a/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/WebanalSessionnalizationStructedStreamTestBACKUP.java b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/WebanalSessionnalizationStructedStreamTestBACKUP.java new file mode 100644 index 000000000..a5b37f088 --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/java/com/hurence/logisland/webanalytics/WebanalSessionnalizationStructedStreamTestBACKUP.java @@ -0,0 +1,239 @@ +/** + * Copyright (C) 2016 Hurence (support@hurence.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +//package com.hurence.logisland.webanalytics; +// +//import com.salesforce.kafka.test.junit5.SharedKafkaTestResource; +//import com.salesforce.kafka.test.listeners.PlainListener; +//import org.apache.kafka.clients.producer.KafkaProducer; +//import org.apache.kafka.clients.producer.ProducerRecord; +//import org.apache.kafka.clients.producer.RecordMetadata; +//import org.apache.kafka.common.serialization.StringSerializer; +//import org.apache.spark.sql.Dataset; +//import org.apache.spark.sql.Row; +//import org.apache.spark.sql.SparkSession; +//import org.apache.spark.sql.streaming.StreamingQuery; +//import org.apache.spark.sql.streaming.StreamingQueryException; +//import org.junit.jupiter.api.Test; +//import org.junit.jupiter.api.extension.RegisterExtension; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +// +//import java.io.Serializable; +//import java.util.concurrent.Future; +// +//public class WebanalSessionnalizationStructedStreamTestBACKUP implements Serializable { +// +// private static Logger logger = LoggerFactory.getLogger(WebanalSessionnalizationStructedStreamTestBACKUP.class); +// +// /** +// * We have a single embedded Kafka server that gets started when this test class is initialized. +// * +// * It's automatically started before any methods are run via the @RegisterExtension annotation. +// * It's automatically stopped after all of the tests are completed via the @RegisterExtension annotation. +// */ +// @RegisterExtension +// public static final SharedKafkaTestResource sharedKafkaTestResource = new SharedKafkaTestResource() +// .withBrokerProperty("auto.create.topics.enable", "false") +// .withBrokerProperty("message.max.bytes", "512000") +// .registerListener(new PlainListener().onPorts(9092)); +// +//// @BeforeAll +//// public static final Create +//// +// /** +// */ +// @Test +// public void localTest() throws StreamingQueryException, InterruptedException { +// final String topicName = "test-simple"; +// sharedKafkaTestResource.getKafkaTestUtils().createTopic(topicName, 1, (short)1); +// +// SparkSession spark = SparkSession +// .builder() +// .master("local[2]") +// .appName("StructuredSessionizationFromKafka") +// .getOrCreate(); +// logger.info("Created SparkSession"); +// +// // Subscribe to 1 topic +// Dataset df = spark +// .readStream()//TODO can be batch (read) +// .format("kafka") +// .option("kafka.bootstrap.servers", sharedKafkaTestResource.getKafkaConnectString()) +// .option("subscribe", topicName) +// .option("startingOffsets", "earliest")//latest by default for stream +// //failOnDataLoss => may be false alarm +// //kafkaConsumer.pollTimeoutMs +// //fetchOffset.numRetries +// //fetchOffset.retryIntervalMs +// //maxOffsetsPerTrigger +// .load(); +// +// df = df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)"); +// //TODO need to have a Elasticsearch Sink ????? +// //TODO sinon solution de secour (workaround) on écrit dans un autre topic et un autre stream lis ce topic et put dans ES depuis un proc +// +// logger.info("Adding some events in topic"); +// addingEventsToTopicPartition(topicName, 0, "key1", "value1"); +// addingEventsToTopicPartition(topicName, 0, "key2", "value1"); +// addingEventsToTopicPartition(topicName, 0, "key3", "value1"); +// addingEventsToTopicPartition(topicName, 0, "key1", "value2"); +// addingEventsToTopicPartition(topicName, 0, "key2", "value2"); +// addingEventsToTopicPartition(topicName, 0, "key3", "value2"); +// +// logger.info("Start streaming"); +// // Start running the query that prints the session updates to the console +// StreamingQuery query = df +// .writeStream() +// .outputMode("update") +// .format("console") +// .start(); +// query.awaitTermination(); +// } +// +// private void addingEventsToTopicPartition(String topicName, int partitionId, String key, String value) throws InterruptedException { +// // Define the record we want to produce +// final ProducerRecord producerRecord = new ProducerRecord<>(topicName, partitionId, key, value); +// +// // Create a new producer +// try (final KafkaProducer producer = +// sharedKafkaTestResource.getKafkaTestUtils().getKafkaProducer(StringSerializer.class, StringSerializer.class)) { +// +// // Produce it & wait for it to complete. +// final Future future = producer.send(producerRecord); +// producer.flush(); +// while (!future.isDone()) { +// Thread.sleep(500L); +// } +// logger.info("Produce completed"); +// } +// +// // Create consumer +//// try (final KafkaConsumer kafkaConsumer = +//// sharedKafkaTestResource.getKafkaTestUtils().getKafkaConsumer(StringDeserializer.class, StringDeserializer.class)) { +//// +//// final List topicPartitionList = new ArrayList<>(); +//// for (final PartitionInfo partitionInfo: kafkaConsumer.partitionsFor(topicName)) { +//// topicPartitionList.add(new TopicPartition(partitionInfo.topic(), partitionInfo.partition())); +//// } +//// kafkaConsumer.assign(topicPartitionList); +//// kafkaConsumer.seekToBeginning(topicPartitionList); +//// +//// // Pull records from kafka, keep polling until we get nothing back +//// ConsumerRecords records; +//// do { +//// records = kafkaConsumer.poll(2000L); +//// logger.info("Found {} records in kafka", records.count()); +//// for (ConsumerRecord record: records) { +//// // Validate +//// Assertions.assertEquals(key, record.key(), "Key matches expected"); +//// Assertions.assertEquals(value, record.value(), "value matches expected"); +//// } +//// } +//// while (!records.isEmpty()); +//// } +// } +//// /** +//// * User-defined data type representing the raw lines with timestamps. +//// */ +//// public static class LineWithTimestamp implements Serializable { +//// private String line; +//// private Timestamp timestamp; +//// +//// public Timestamp getTimestamp() { return timestamp; } +//// public void setTimestamp(Timestamp timestamp) { this.timestamp = timestamp; } +//// +//// public String getLine() { return line; } +//// public void setLine(String sessionId) { this.line = sessionId; } +//// } +//// +//// /** +//// * User-defined data type representing the input events +//// */ +//// public static class Event implements Serializable { +//// private String sessionId; +//// private Timestamp timestamp; +//// +//// public Event() { } +//// public Event(String sessionId, Timestamp timestamp) { +//// this.sessionId = sessionId; +//// this.timestamp = timestamp; +//// } +//// +//// public Timestamp getTimestamp() { return timestamp; } +//// public void setTimestamp(Timestamp timestamp) { this.timestamp = timestamp; } +//// +//// public String getSessionId() { return sessionId; } +//// public void setSessionId(String sessionId) { this.sessionId = sessionId; } +//// } +//// +//// /** +//// * User-defined data type for storing a session information as state in mapGroupsWithState. +//// */ +//// public static class SessionInfo implements Serializable { +//// private int numEvents = 0; +//// private long startTimestampMs = -1; +//// private long endTimestampMs = -1; +//// +//// public int getNumEvents() { return numEvents; } +//// public void setNumEvents(int numEvents) { this.numEvents = numEvents; } +//// +//// public long getStartTimestampMs() { return startTimestampMs; } +//// public void setStartTimestampMs(long startTimestampMs) { +//// this.startTimestampMs = startTimestampMs; +//// } +//// +//// public long getEndTimestampMs() { return endTimestampMs; } +//// public void setEndTimestampMs(long endTimestampMs) { this.endTimestampMs = endTimestampMs; } +//// +//// public long calculateDuration() { return endTimestampMs - startTimestampMs; } +//// +//// @Override public String toString() { +//// return "SessionInfo(numEvents = " + numEvents + +//// ", timestamps = " + startTimestampMs + " to " + endTimestampMs + ")"; +//// } +//// } +//// +//// /** +//// * User-defined data type representing the update information returned by mapGroupsWithState. +//// */ +//// public static class SessionUpdate implements Serializable { +//// private String id; +//// private long durationMs; +//// private int numEvents; +//// private boolean expired; +//// +//// public SessionUpdate() { } +//// +//// public SessionUpdate(String id, long durationMs, int numEvents, boolean expired) { +//// this.id = id; +//// this.durationMs = durationMs; +//// this.numEvents = numEvents; +//// this.expired = expired; +//// } +//// +//// public String getId() { return id; } +//// public void setId(String id) { this.id = id; } +//// +//// public long getDurationMs() { return durationMs; } +//// public void setDurationMs(long durationMs) { this.durationMs = durationMs; } +//// +//// public int getNumEvents() { return numEvents; } +//// public void setNumEvents(int numEvents) { this.numEvents = numEvents; } +//// +//// public boolean isExpired() { return expired; } +//// public void setExpired(boolean expired) { this.expired = expired; } +//// } +//} \ No newline at end of file diff --git a/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/resources/conf/kafkaStructuredService.yml b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/resources/conf/kafkaStructuredService.yml new file mode 100644 index 000000000..6995dabc5 --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/resources/conf/kafkaStructuredService.yml @@ -0,0 +1,18 @@ +######################################################################################################### +# Logisland Rubix Web Analytics +# Receive web events from eventhubs, treat them then push events and sessions into opendistro cluster +controllerService: eventhubs_service + component: com.hurence.logisland.stream.spark.structured.provider.AzureEventHubsStructuredStreamProviderService + type: service + documentation: Service to allow reading from eventhubs + configuration: + eventhubs.nameSpace: logisland-dev + eventhubs.read.eventHub: openanalytics + eventhubs.read.sasKeyName: openanalytics-read + eventhubs.read.sasKey: "odq73UvHQEEbc4LaQV8hfD34/nkaF6IusmsK0wH2jHk=" + eventhubs.read.position: end-of-stream + # Need a sink stream to have the checkpoint feature able to work (write offset of last treated event into checkpoint location + # passed at job creation command line (using the -chkploc option) + eventhubs.write.eventHub: openanalytics-sink + eventhubs.write.sasKeyName: openanalytics-sink-write + eventhubs.write.sasKey: "OGJMTraRWUbq8NJqR49J+CQUzH0LNCJBAIqat4KDHvI=" \ No newline at end of file diff --git a/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/resources/conf/my-conf-test.yaml b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/resources/conf/my-conf-test.yaml new file mode 100644 index 000000000..8408a858f --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/resources/conf/my-conf-test.yaml @@ -0,0 +1,159 @@ +######################################################################################################### +# Logisland Rubix Web Analytics +# Receive web events from eventhubs, treat them then push events and sessions into opendistro cluster +######################################################################################################### + +version: 1.4.0 +documentation: Logisland Rubix Webanalytics + +engine: + component: com.hurence.logisland.engine.spark.KafkaStreamProcessingEngine + type: engine + documentation: Receive web events from kafka, treat them and push events and sessions on opendsitro/es cluster + configuration: + spark.app.name: LogislandWebanalytics + spark.master: local[3] +# spark.driver.memory: 2G +# spark.driver.cores: 1 +# spark.executor.memory: 4G +# spark.executor.instances: 1 +# spark.executor.cores: 4 +# spark.executor.cores: 1 +# spark.yarn.queue: default +# spark.yarn.maxAppAttempts: 4 +# spark.yarn.am.attemptFailuresValidityInterval: 1h +# spark.yarn.max.executor.failures: 20 +# spark.yarn.executor.failuresValidityInterval: 1h +# spark.task.maxFailures: 8 +# spark.serializer: org.apache.spark.serializer.KryoSerializer + # spark.streaming.backpressure.enabled: false +# spark.streaming.backpressure.enabled: true +# spark.streaming.unpersist: false +# spark.streaming.blockInterval: 500 +# spark.streaming.timeout: -1 +# spark.streaming.kafka.maxRetries: 3 +# spark.streaming.ui.retainedBatches: 200 +# spark.streaming.receiver.writeAheadLog.enable: false +# spark.ui.port: 4054 +# spark.streaming.kafka.maxRatePerPartition: 3000 +# spark.streaming.batchDuration: 5000 + + controllerServiceConfigurations: + + # Kafka sink configuration + - controllerService: kafka_service + component: com.hurence.logisland.stream.spark.structured.provider.KafkaStructuredStreamProviderService + configuration: +# output.mode: "complete" + kafka.input.topics: test-simple + kafka.output.topics: logisland_out + kafka.error.topics: logisland_errors + kafka.input.topics.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + kafka.output.topics.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + kafka.error.topics.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer +# kafka.metadata.broker.list: kafka:9092 + kafka.zookeeper.quorum: ${kafka.zookeeper.quorum} + kafka.topic.autoCreate: true + kafka.topic.default.partitions: 1 + kafka.topic.default.replicationFactor: 1 + read.value.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + write.value.serializer: com.hurence.logisland.serializer.ExtendedJsonSerializer + #write.value.schema: + write.key.serializer: com.hurence.logisland.serializer.StringSerializer + read.value.schema: > + { "version": 1, + "name": "io.divolte.examples.record", + "type": "record", + "fields": [ + { "name": "h2kTimestamp", "type": "long" }, + { "name": "remoteHost", "type": "string"}, + { "name": "record_type", "type": ["null", "string"], "default": null }, + { "name": "record_id", "type": ["null", "string"], "default": null }, + { "name": "location", "type": ["null", "string"], "default": null }, + { "name": "hitType", "type": ["null", "string"], "default": null }, + { "name": "eventCategory", "type": ["null", "string"], "default": null }, + { "name": "eventAction", "type": ["null", "string"], "default": null }, + { "name": "eventLabel", "type": ["null", "string"], "default": null }, + { "name": "localPath", "type": ["null", "string"], "default": null }, + { "name": "q", "type": ["null", "string"], "default": null }, + { "name": "n", "type": ["null", "int"], "default": null }, + { "name": "referer", "type": ["null", "string"], "default": null}, + { "name": "viewportPixelWidth", "type": ["null", "int"], "default": null}, + { "name": "viewportPixelHeight", "type": ["null", "int"], "default": null}, + { "name": "screenPixelWidth", "type": ["null", "int"], "default": null}, + { "name": "screenPixelHeight", "type": ["null", "int"], "default": null}, + { "name": "partyId", "type": ["null", "string"], "default": null}, + { "name": "sessionId", "type": ["null", "string"], "default": null}, + { "name": "pageViewId", "type": ["null", "string"], "default": null}, + { "name": "is_newSession", "type": ["null", "boolean"], "default": null}, + { "name": "userAgentString", "type": ["null", "string"], "default": null}, + { "name": "pageType", "type": ["null", "string"], "default": null}, + { "name": "Userid", "type": ["null", "string"], "default": null}, + { "name": "B2BUnit", "type": ["null", "string"], "default": null}, + { "name": "pointOfService", "type": ["null", "string"], "default": null}, + { "name": "companyID", "type": ["null", "string"], "default": null}, + { "name": "GroupCode", "type": ["null", "string"], "default": null}, + { "name": "userRoles", "type": ["null", "string"], "default": null}, + { "name": "is_PunchOut", "type": ["null", "string"], "default": null}, + { "name": "codeProduct", "type": ["null", "string"], "default": null}, + { "name": "categoryProductId", "type": ["null", "string"], "default": null}, + { "name": "categoryName", "type": ["null", "string"], "default": null}, + { "name": "categoryCode", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv5", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv4", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv3", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv2", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv1", "type": ["null", "string"], "default": null}, + { "name": "countryCode", "type": ["null", "string"], "default": null}, + { "name": "Company", "type": ["null", "string"], "default": null}, + { "name": "is_Link", "type": ["null", "boolean"], "default": null}, + { "name": "clickText", "type": ["null", "string"], "default": null}, + { "name": "clickURL", "type": ["null", "string"], "default": null}, + { "name": "newCustomerWebOnly", "type": ["null", "int"], "default": null}, + { "name": "newCustomerWebOrAgency", "type": ["null", "int"], "default": null}, + { "name": "productPrice", "type": ["null", "float"], "default": null}, + { "name": "searchedProductIndex", "type": ["null", "int"], "default": null}, + { "name": "searchedProductPage", "type": ["null", "int"], "default": null}, + { "name": "stockInfo", "type": ["null", "string"], "default": null}, + { "name": "transactionId", "type": ["null", "string"], "default": null}, + { "name": "transactionTotal", "type": ["null", "float"], "default": null}, + { "name": "transactionCurrency", "type": ["null", "string"], "default": null}, + { "name": "productQuantity", "type": ["null", "int"], "default": null}, + { "name": "Alt", "type": ["null", "string"], "default": null}, + { "name": "erpLocaleCode", "type": ["null", "string"], "default": null}, + { "name": "salesOrg", "type": ["null", "string"], "default": null}, + { "name": "country", "type": ["null", "string"], "default": null}, + { "name": "currency", "type": ["null", "string"], "default": null}, + { "name": "currentCart", "type": ["null", {"type": "array", "items":{ + "name": "Product", "type": "record", "fields":[ + {"name": "price", "type": "double"}, + {"name": "quantity", "type": "int"}, + {"name": "sku", "type": "string"} + ]} + }], + "default": null + } + ] + } + + - controllerService: console_service + component: com.hurence.logisland.stream.spark.structured.provider.ConsoleStructuredStreamProviderService + configuration: + output.mode: "update" + truncate: false + + streamConfigurations: + + - stream: kafka_to_console + component: com.hurence.logisland.stream.spark.structured.StructuredStream + configuration: + read.stream.service.provider: kafka_service + write.stream.service.provider: console_service + + processorConfigurations: + + - processor: debug + component: com.hurence.logisland.processor.DebugStream + type: processor + documentation: print input + diff --git a/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/resources/conf/webanalytics-ovh.yml b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/resources/conf/webanalytics-ovh.yml new file mode 100644 index 000000000..2c57600af --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/resources/conf/webanalytics-ovh.yml @@ -0,0 +1,646 @@ +######################################################################################################### +# Logisland configuration script tempate +######################################################################################################### + +version: 0.9.7 +documentation: LogIsland analytics main config file. Put here every engine or component config + +######################################################################################################### +# engine +engine: + component: com.hurence.logisland.engine.spark.KafkaStreamProcessingEngine + type: engine + documentation: Hurence Analytics - Create consolidate sessions object + configuration: + spark.app.name: webanalyticsIncrementalWebSession + spark.master: yarn-cluster + spark.monitoring.driver.port: 7091 +# spark.master: local[1] + spark.driver.memory: 2G + spark.driver.cores: 1 + spark.executor.memory: 4G + spark.executor.instances: 1 + spark.executor.cores: 4 +# spark.executor.cores: 1 + spark.yarn.queue: default + spark.yarn.maxAppAttempts: 4 + spark.yarn.am.attemptFailuresValidityInterval: 1h + spark.yarn.max.executor.failures: 20 + spark.yarn.executor.failuresValidityInterval: 1h + spark.task.maxFailures: 8 + spark.serializer: org.apache.spark.serializer.KryoSerializer +# spark.streaming.backpressure.enabled: false + spark.streaming.backpressure.enabled: true + spark.streaming.unpersist: false + spark.streaming.blockInterval: 500 + spark.streaming.timeout: -1 + spark.streaming.kafka.maxRetries: 3 + spark.streaming.ui.retainedBatches: 200 + spark.streaming.receiver.writeAheadLog.enable: false + spark.ui.port: 4054 + spark.streaming.kafka.maxRatePerPartition: 3000 + spark.streaming.batchDuration: 5000 + + controllerServiceConfigurations: + + - controllerService: elasticsearch_service + component: com.hurence.logisland.service.elasticsearch.Elasticsearch_2_4_0_ClientService + type: service + documentation: elasticsearch 2.4.0 service implementation + configuration: + hosts: ns3004505.ovh.net:9300,ns3005860.ovh.net:9300,ns3050034.ovh.net:9300 + cluster.name: iph-cluster + batch.size: 2000 + flush.interval: 2 + + - controllerService: lru_cache_service_domain + component: com.hurence.logisland.service.cache.LRUKeyValueCacheService + type: service + documentation: cache service implementation using LinkedHashMap (Least Recent Used) + configuration: + cache.size: 100000 + + - controllerService: ip_to_geo_service + component: com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + type: service + documentation: service to get geo information from an ip address + configuration: + maxmind.database.uri: hdfs:///user/hurence/Geolite2-City-MaxMind/GeoLite2-City.mmdb + locale: fr + + streamConfigurations: + + # parsing + - stream: parsing_stream + component: com.hurence.logisland.stream.spark.KafkaRecordStreamParallelProcessing + type: stream + documentation: a processor that links + configuration: + kafka.input.topics: openanalytics + kafka.output.topics: logisland_null + kafka.error.topics: logisland_errors + kafka.input.topics.serializer: com.hurence.logisland.serializer.AvroSerializer + kafka.output.topics.serializer: com.hurence.logisland.serializer.KryoSerializer + kafka.error.topics.serializer: com.hurence.logisland.serializer.JsonSerializer + avro.input.schema: > + { "version": 1, + "name": "io.divolte.examples.record", + "type": "record", + "fields": [ + { "name": "h2kTimestamp", "type": "long" }, + { "name": "remoteHost", "type": "string"}, + { "name": "record_type", "type": ["null", "string"], "default": null }, + { "name": "record_id", "type": ["null", "string"], "default": null }, + { "name": "location", "type": ["null", "string"], "default": null }, + { "name": "hitType", "type": ["null", "string"], "default": null }, + { "name": "eventCategory", "type": ["null", "string"], "default": null }, + { "name": "eventAction", "type": ["null", "string"], "default": null }, + { "name": "eventLabel", "type": ["null", "string"], "default": null }, + { "name": "localPath", "type": ["null", "string"], "default": null }, + { "name": "q", "type": ["null", "string"], "default": null }, + { "name": "n", "type": ["null", "int"], "default": null }, + { "name": "referer", "type": ["null", "string"], "default": null}, + { "name": "viewportPixelWidth", "type": ["null", "int"], "default": null}, + { "name": "viewportPixelHeight", "type": ["null", "int"], "default": null}, + { "name": "screenPixelWidth", "type": ["null", "int"], "default": null}, + { "name": "screenPixelHeight", "type": ["null", "int"], "default": null}, + { "name": "partyId", "type": ["null", "string"], "default": null}, + { "name": "sessionId", "type": ["null", "string"], "default": null}, + { "name": "pageViewId", "type": ["null", "string"], "default": null}, + { "name": "is_newSession", "type": ["null", "boolean"], "default": null}, + { "name": "userAgentString", "type": ["null", "string"], "default": null}, + { "name": "pageType", "type": ["null", "string"], "default": null}, + { "name": "Userid", "type": ["null", "string"], "default": null}, + { "name": "B2BUnit", "type": ["null", "string"], "default": null}, + { "name": "pointOfService", "type": ["null", "string"], "default": null}, + { "name": "companyID", "type": ["null", "string"], "default": null}, + { "name": "GroupCode", "type": ["null", "string"], "default": null}, + { "name": "userRoles", "type": ["null", "string"], "default": null}, + { "name": "is_PunchOut", "type": ["null", "string"], "default": null}, + { "name": "codeProduct", "type": ["null", "string"], "default": null}, + { "name": "categoryProductId", "type": ["null", "string"], "default": null}, + { "name": "categoryName", "type": ["null", "string"], "default": null}, + { "name": "categoryCode", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv5", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv4", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv3", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv2", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv1", "type": ["null", "string"], "default": null}, + { "name": "countryCode", "type": ["null", "string"], "default": null}, + { "name": "Company", "type": ["null", "string"], "default": null}, + { "name": "is_Link", "type": ["null", "boolean"], "default": null}, + { "name": "clickText", "type": ["null", "string"], "default": null}, + { "name": "clickURL", "type": ["null", "string"], "default": null}, + { "name": "newCustomerWebOnly", "type": ["null", "int"], "default": null}, + { "name": "newCustomerWebOrAgency", "type": ["null", "int"], "default": null}, + { "name": "productPrice", "type": ["null", "float"], "default": null}, + { "name": "stockInfo", "type": ["null", "string"], "default": null}, + { "name": "transactionId", "type": ["null", "string"], "default": null}, + { "name": "transactionTotal", "type": ["null", "float"], "default": null}, + { "name": "transactionCurrency", "type": ["null", "string"], "default": null}, + { "name": "productQuantity", "type": ["null", "int"], "default": null}, + { "name": "Alt", "type": ["null", "string"], "default": null}, + { "name": "currentCart", "type": ["null", {"type": "array", "items":{ + "name": "Product", "type": "record", "fields":[ + {"name": "price", "type": "double"}, + {"name": "quantity", "type": "int"}, + {"name": "sku", "type": "string"} + ]} + }], + "default": null + } + ] + } + kafka.metadata.broker.list: ns3004505.ovh.net:6667,ns3005860.ovh.net:6667,ns3050034.ovh.net:6667 + kafka.zookeeper.quorum: ns3050045.ovh.net:2181,ns3050046.ovh.net:2181,ns346614.ovh.net:2181 + kafka.topic.autoCreate: true + kafka.topic.default.partitions: 4 + kafka.topic.default.replicationFactor: 3 +# kafka.manual.offset.reset: smallest + + processorConfigurations: + + # Tag ALL events with default values + - processor: add_default_fields + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that add default values for tagOrigin, sourceOrigin, spamCandidate if not present yet + configuration: + tagOrigin: prod + sourceOrigin: external_traffic + spamOrigin: ghost_spam + decodedLocation: ${location} + + # Extract the company name from the URL (location field) + - processor: regexp proc + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts company name and country code from location URL + configuration: + conflict.resolution.policy: overwrite_existing + location: googletranslate,webshop,tagOrigin,countryCode:(https\:\/\/translate\.google.*\.com/.+)?https\:\/\/([^\/\.\-]+[\.\-](preprod)?[^\/]+)\/?(\w+)?\/?.* + + - processor: Enrich_events_with_company_name_for_workit + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with info from ES records + configuration: + elasticsearch.client.service: elasticsearch_service + record.key: ${webshop} + es.index: openanalytics_webshops + es.includes.field: Company + + # Add an alert if the Company is authorized, so we mark the event as not spam + - processor: Filter_SPAM_Traffic + component: com.hurence.logisland.processor.MatchIP + type: processor + documentation: a processor that filter traffic (based on static IPs and netmasks) and tag them as spam candidates if there is no mapping for the webshop + configuration: + policy.onmiss: forward + policy.onmatch: first + record.type.updatePolicy: keep + not_spam_1: Company:orexad\.com + not_spam_2: Company:minetti\.it + not_spam_3: Company:kistenpfennig\.com + not_spam_4: Company:btshop\.be + not_spam_5: Company:btshop\.nl + not_spam_6: Company:zitec\.com + + # Tag event as a not spam + - processor: Tag internal traffic + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that tags event from internal traffic + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: spamOrigin:(not_spam).* + + # Extract the hostname from the referer + - processor: Extract hostname from referer + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts hostname from referer + configuration: + conflict.resolution.policy: overwrite_existing + referer: referer_hostname:https?\:\/\/([^\/]+)\/?.* + + # Check if the tag is coming from crawler referer spam + - processor: Filter_Crawler_referrer_SPAM_Traffic + component: com.hurence.logisland.processor.MatchIP + type: processor + documentation: a processor that filter traffic and tag it as spam candidates if it matches crawler spam site + configuration: + policy.onmiss: forward + policy.onmatch: first + record.type.updatePolicy: keep + crawler_spam_1: referer_hostname:uptime(robot|bot|check|\-|\.com)|vitaly|sharebutton|semalt|ranksonic|share\-button|anticrawler|timer4web|free\-video\-tool|responsive\-test|dogsrun|fix\-website\-er|dailyrank|sitevaluation|99seo|top10\-way|seo(\-2\-0|\-analysis)\. + crawler_spam_2: referer_hostname:(videos|buttons)\-for\-your|best\-seo\-(solution|offer)|buttons\-for\-website|profit\.xyz|dbutton|keywords\-monitoring|platezhka|7makemoney|forum69|kings\-analytics|checkpagerank|pr\-cy\.ru|\-\-(production|website|sale)\.com + crawler_spam_3: referer_hostname:(express|audit|dollars|success|top1|amazon|commerce)\-seo|free\-video\-tool|datract|hacĸer|ɢoogl|slifty\.github|\-liar.ru|3\-letter\-|foxweber|free\-fbook|goodwriterssales|your\-rankings|tourcroatia|spinnerco|justkillingti|suralink|worldtraveler\.w + crawler_spam_4: referer_hostname:oldfaithfultaxi|christopherlane|hollywoodweeklymagazine|losangeles\-ads|anniemation|timdreby|pcimforum|yellowstonesafaritours|autoseo|blogarama|for\-placing|brainwizard|casinos4|ḷ\.com|\-backlinks\.com|phoenicx\.co\.uk|be\-escorts + + # If it is crawler spam, then mark the event as such + - processor: Tag crawler referer traffic + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that tags event from internal traffic + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: spamOrigin:(crawler_spam).* + + # Tag internal traffic + - processor: Filter_Internal_Traffic + component: com.hurence.logisland.processor.MatchIP + type: processor + documentation: a processor that filter internal traffic (based on static IPs and netmasks) and tag them accordingly + configuration: + policy.onmiss: forward + policy.onmatch: first + record.type.updatePolicy: keep + internal_traffic_hurence: remoteHost:80.14.66.205 + internal_traffic_altimis: remoteHost:82.196.22.62 + internal_traffic_iph_1: remoteHost:62.23.167.200/29 + internal_traffic_iph_2: remoteHost:41.231.84.205 + internal_traffic_iph_3: remoteHost:41.226.24.45 + internal_traffic_iph_4: remoteHost:196.203.53.115 + internal_traffic_iph_5: remoteHost:41.231.87.32/29 + internal_traffic_iph_6: remoteHost:92.103.11.11 + internal_traffic_iph_7: remoteHost:89.227.208.230 + internal_traffic_iph_8: remoteHost:89.227.198.162 + internal_traffic_iph_9: remoteHost:194.123.34.17[6-9] + internal_traffic_iph_10: remoteHost:194.123.34.18[0-3] + internal_traffic_iph_11: remoteHost:194.123.34.178 + internal_traffic_iph_12: remoteHost:83.163.193.90 + internal_traffic_iph_13: remoteHost:188.111.40.72/29 + internal_traffic_iph_14: remoteHost:80.156.245.120/29 + internal_traffic_iph_15: remoteHost:212.202.154.0/24 + internal_traffic_iph_16: remoteHost:212.144.36.128/28 + internal_traffic_iph_17: remoteHost:80.91.51.130 + internal_traffic_iph_18: remoteHost:80.91.51.203 + internal_traffic_iph_19: remoteHost:137.117.208.90 + internal_traffic_iph_20: remoteHost:92.103.67.218 + internal_traffic_iph_21: remoteHost:46.218.163.96/29 + internal_traffic_iph_22: remoteHost:88.160.233.80 + internal_traffic_iph_23: remoteHost:84.98.217.241 + internal_traffic_iph_24: remoteHost:84.98.217.142 + internal_traffic_iph_25: remoteHost:77.246.37.160 + internal_traffic_iph_26: remoteHost:80.11.18.50 + internal_traffic_iph_27: remoteHost:194.213.124.6 + internal_traffic_iph_28: remoteHost:194.213.124.7 + internal_traffic_iph_29: remoteHost:195.154.185.228 + internal_traffic_iph_30: remoteHost:178.33.182.35 + internal_traffic_iph_31: remoteHost:192.168 + internal_traffic_iph_32: remoteHost:91.121.126.112 + internal_traffic_iph_33: remoteHost:85.17.224.82 + internal_traffic_iph_34: remoteHost:78.46.102.213 + internal_traffic_iph_35: remoteHost:109.69.218.20 + internal_traffic_iph_36: remoteHost:80.86.200.135 + internal_traffic_iph_37: remoteHost:67.19.47.50 + internal_traffic_iph_38: remoteHost:5.135.138.183 + internal_traffic_iph_39: remoteHost:92.103.11.28 + internal_traffic_iph_40: remoteHost:92.103.11.30 + internal_traffic_iph_41: remoteHost:192.168.0.([0-9]|1[0-6]) + internal_traffic_iph_42: remoteHost:10.0.0.[0-8] + internal_traffic_iph_43: remoteHost:62.23.167.20[0-7] + internal_traffic_iph_44: remoteHost:78.192.104.65 + internal_traffic_iph_45: remoteHost:89.227.234.201 + internal_traffic_iph_46: remoteHost:82.176.18.162 + + # Tag an event that belongs to internal traffic (i-e IPH, Hurence, Altimis) + - processor: Tag internal traffic + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that tags event from internal traffic + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: sourceOrigin:(internal_traffic).* + + # Decode special chars (if any) from productSearchKeywords + - processor: Decode special chars from productSearchkeywords + component: com.hurence.logisland.processor.webAnalytics.URLDecoder + type: processor + documentation: a processor that decode urls + configuration: + decode.fields: decodedLocation + charset: UTF-8 + + # Extract the list of keywords from a product search + - processor: Extract keywords from product search + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: + configuration: + decodedLocation: productSearchKeywords:https\:\/\/[^\/]+\/\w+\/search(?:\/)?.*[\?|\&](?:text|q)=([^\&\?\|]+)\&?.* + + # Build an array of keywords as well as count the number of items + - processor: Split search keywords and count number of keywords + component: com.hurence.logisland.processor.SplitField + type: processor + documentation: a processor that splits a string and return an array of values + configuration: + split.counter.enable: true + split.counter.suffix: Counter + productSearchKeywords: productSearchKeywordsArray:\s+ + +# # Extract the list of keywords from a product search +# - processor: Extract keywords from product search +# component: com.hurence.logisland.processor.ApplyRegexp +# type: processor +# documentation: a processor that extracts search keywords from location URL +# configuration: +# location: productSearchKeywords:https\:\/\/[^\/]+\/\w+\/search\/.*[\?|\&]text=([^\&\?]+)\&?.* +# +# # Build an array of keywords as well as count the number of items +# - processor: Split search keywords and count number of keywords +# component: com.hurence.logisland.processor.SplitField +# type: processor +# documentation: a processor that splits a string and return an array of values +# configuration: +# split.counter.enable: true +# split.counter.suffix: Counter +# productSearchKeywords: productSearchKeywordsArray:\s*\+\s* + + # Enrich the events that have a product id with info from PIM + - processor: Enrich_events_with_product_coverage + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with info from ES records + configuration: + elasticsearch.client.service: elasticsearch_service + record.key: ${codeProduct} + es.index: pim_listsku + es.type: details + es.includes.field: ${'coverage:coverage_'+countryCode+',brandName,Class,brandRef'} + + # Univers produit + - processor: Decompose product class level 1 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 1 categories any product belongs to. + configuration: + Class: categoryNiv1:^(\d+)$ + + # Univers produit + - processor: Decompose product class level 2 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 2 categories any product belongs to. + configuration: + Class: categoryNiv2,categoryNiv1:^((\d+)\-\d+)$ + + # Univers produit + - processor: Decompose product class level 3 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 3 categories any product belongs to. + configuration: + Class: categoryNiv3,categoryNiv2,categoryNiv1:^(((\d+)\-\d+)\-\d+)$ + + # Univers produit + - processor: Decompose product class level 4 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 4 categories any product belongs to. + configuration: + Class: categoryNiv4,categoryNiv3,categoryNiv2,categoryNiv1:^((((\d+)\-\d+)\-\d+)\-\d+)$ + + # Univers produit + - processor: Decompose product class level 5 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 5 categories any product belongs to. + configuration: + Class: categoryNiv5,categoryNiv4,categoryNiv3,categoryNiv2,categoryNiv1:(((((\d+)\-\d+)\-\d+)\-\d+)\-\d+) + + # Grab the synopsis of each category the product belongs to (in the right language) + - processor: Enrich_events_with_synopsis_of_categoryNiv5 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: elasticsearch_service + record.key: ${categoryNiv5} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel5:en" +# es.includes.field: ${'categoryLabel5:'+countryCode} + + - processor: Enrich_events_with_synopsis_of_categoryNiv4 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: elasticsearch_service + record.key: ${categoryNiv4} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel4:en" +# es.includes.field: ${'categoryLabel4:'+countryCode} + + - processor: Enrich_events_with_synopsis_of_categoryNiv3 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: elasticsearch_service + record.key: ${categoryNiv3} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel3:en" +# es.includes.field: ${'categoryLabel3:'+countryCode} + + - processor: Enrich_events_with_synopsis_of_categoryNiv2 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: elasticsearch_service + record.key: ${categoryNiv2} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel2:en" +# es.includes.field: ${'categoryLabel2:'+countryCode} + + - processor: Enrich_events_with_synopsis_of_categoryNiv1 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: elasticsearch_service + record.key: ${categoryNiv1} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel1:en" +# es.includes.field: ${'categoryLabel1:'+countryCode} + + # Enrich the events that have a product id with info from workit + - processor: Enrich_events_with_workit + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: elasticsearch_service + record.key: ${codeProduct} + es.index: ${'workit_'+Company} + es.includes.field: Position,UnitPrice* + + # Enrich the events that have a Userid + - processor: Enrich_events_with_users_info + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with info from ES records + configuration: + elasticsearch.client.service: elasticsearch_service + record.key: ${Userid} + es.type: details + es.index: ${'openanalytics_users.'+Company} + es.includes.field: "*" + es.excludes.field: Userid, Date_Creation,Date_LastLogin,Company + + # Add User Agent fields + - processor: User_Agent + component: com.hurence.logisland.processor.useragent.ParseUserAgent + type: processor + documentation: a processor that adds user agent fields to an event + configuration: + useragent.field: userAgentString + fields: DeviceClass,DeviceName,OperatingSystemClass,OperatingSystemName,OperatingSystemVersion,OperatingSystemNameVersion,LayoutEngineClass,LayoutEngineName,LayoutEngineVersion,LayoutEngineVersionMajor,LayoutEngineNameVersion,LayoutEngineNameVersionMajor,LayoutEngineBuild,AgentClass,AgentName,AgentVersion,AgentVersionMajor,AgentNameVersion,AgentNameVersionMajor,IECompatibilityVersion,IECompatibilityVersionMajor,IECompatibilityNameVersion,IECompatibilityNameVersionMajor,WebviewAppName,WebviewAppNameVersionMajor,WebviewAppVersion,WebviewAppVersionMajor + + # Ip2Geo processor + - processor: ipToGeoForIncomingWebTraffic + component: com.hurence.logisland.processor.enrichment.IpToGeo + type: processor + documentation: Find geo information correponding to an ip using maxmind service + configuration: + ip.address.field: remoteHost + iptogeo.service: ip_to_geo_service + cache.service: lru_cache_service_domain +# debug: true + + # Extract the utm_source + - processor: Extract utm_source from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_source:.*[\&\?]utm_source=\s*([^\&\?]+)\&?.* + + # Extract the utm_medium + - processor: Extract utm_medium from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_medium:.*[\&\?]utm_medium=\s*([^\&\?]+)\&?.* + + # Extract the utm_campaign + - processor: Extract utm_campaign from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_campaign:.*[\&\?]utm_campaign=\s*([^\&\?]+)\&?.* + + # Extract the utm_term + - processor: Extract utm_term from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_term:.*[\&\?]utm_term=\s*([^\&\?]+)\&?.* + + # Extract the utm_content + - processor: Extract utm_content from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_content:.*[\&\?]utm_content=\s*([^\&\?]+)\&?.* + + # Integrated customers : all other customers + - processor: Setup_empty_string + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that set empty string for ImportanceCode, B2BUnit, and libelle_zone fields if they do not exist in the record + configuration: + conflict.resolution.policy: keep_only_old_field + ImportanceCode: "" + B2BUnit: "" + libelle_zone: "" + Userid: "" + + # Categorize the customer such as: + # Affiliates customers : code importance 9003 et 9004 + # Marketplace customers : B2Bunit composed with '*_*' + # Subsidiaries : customers that are not part of segments above, and not part of the ZONE "EST", "OUEST" and "NORD" + # Integrated customers : all other customers + - processor: categorize_customers + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that categorize the customers (affiliates, marketplace, subsidiaries,integrated) + configuration: + customer_category: ${if( ImportanceCode == '9003' || ImportanceCode == '9004') return 'affiliates'; if ( B2BUnit contains '*_*' ) return 'marketplace'; if ( libelle_zone != 'EST' && libelle_zone != 'OUEST' && libelle_zone != 'NORD' ) return 'subsidiaries'; else return 'integrated';} + + # Figure out the source of traffic for this websession + - processor: Source Of Traffic + component: com.hurence.logisland.processor.webAnalytics.setSourceOfTraffic + type: processor + documentation: a processor that figure out the source of traffic for the websession + configuration: + referer.field: referer + first.visited.page.field: location + elasticsearch.client.service: elasticsearch_service + es.index: openanalytics_search_engines_and_social_networks + es.search_engine.field: search_engine + es.social_network.field: social_network + source_of_traffic.suffix: source_of_traffic + source_of_traffic.hierarchical: false + cache.service: lru_cache_service_domain + cache.validity.timeout: 3600 +# debug: true + + - processor: Websession_index_name + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that specifies the name of the websession elasticsearch index into a field used by the BulkAdd processor afterward. + configuration: + websessionIndex: ${'new_openanalytics_websessions-' + new java.text.SimpleDateFormat('yyyy.MM').format(new java.util.Date(h2kTimestamp));} + + # Create or update web session based on web events + - processor: consolidate_session + component: com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + type: processor + documentation: compute session duration as well as other informations + configuration: + session.timeout: 1800 + userid.field: Userid + fields.to.return: partyId,Company,remoteHost,tagOrigin,sourceOrigin,spamOrigin,referer,userAgentString,utm_source,utm_campaign,utm_medium,utm_content,utm_term,alert_match_name,alert_match_query,referer_hostname,DeviceClass,AgentName,ImportanceCode,B2BUnit,libelle_zone,Userid,customer_category,source_of_traffic_source,source_of_traffic_medium,source_of_traffic_keyword,source_of_traffic_campaign,source_of_traffic_organic_search,source_of_traffic_content,source_of_traffic_referral_path,websessionIndex + elasticsearch.client.service: elasticsearch_service + es.session.index.field: websessionIndex + es.session.type.name: sessions + es.event.index.prefix: new_openanalytics_webevents + es.event.type.name: event + es.mapping.event.to.session.index.name: new_openanalytics_websession_mappings +# debug: true + + # Enrich session record with userid info from ES + - processor: Enrich_events_with_users_info + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with info from ES records + configuration: + elasticsearch.client.service: elasticsearch_service + record.key: ${Userid} + es.type: details + es.index: ${'openanalytics_users.'+Company} + es.includes.field: "*" + es.excludes.field: Userid, Date_Creation,Date_LastLogin,Company + + # put to elasticsearch + - processor: es_publisher + component: com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + type: processor + documentation: a processor that stores the web sessions + configuration: + elasticsearch.client.service: elasticsearch_service + es.index.field: websessionIndex + default.type: sessions diff --git a/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/resources/conf/webanalytics.yml b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/resources/conf/webanalytics.yml new file mode 100644 index 000000000..812071952 --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/resources/conf/webanalytics.yml @@ -0,0 +1,683 @@ +######################################################################################################### +# Logisland Rubix Web Analytics +# Receive web events from eventhubs, treat them then push events and sessions into opendistro cluster +######################################################################################################### + +version: 1.4.0 +documentation: Logisland Rubix Webanalytics + +engine: + component: com.hurence.logisland.engine.spark.KafkaStreamProcessingEngine + type: engine + documentation: Receive web events from Azure Event Hubs, treat them and push events and sessions on opendsitro cluster + configuration: + spark.app.name: LogislandWebanalytics + + controllerServiceConfigurations: + + - controllerService: eventhubs_service + component: com.hurence.logisland.stream.spark.structured.provider.AzureEventHubsStructuredStreamProviderService + type: service + documentation: Service to allow reading from eventhubs + configuration: + eventhubs.nameSpace: logisland-dev + eventhubs.read.eventHub: openanalytics + eventhubs.read.sasKeyName: openanalytics-read + eventhubs.read.sasKey: "odq73UvHQEEbc4LaQV8hfD34/nkaF6IusmsK0wH2jHk=" + eventhubs.read.position: end-of-stream + # Need a sink stream to have the checkpoint feature able to work (write offset of last treated event into checkpoint location + # passed at job creation command line (using the -chkploc option) + eventhubs.write.eventHub: openanalytics-sink + eventhubs.write.sasKeyName: openanalytics-sink-write + eventhubs.write.sasKey: "OGJMTraRWUbq8NJqR49J+CQUzH0LNCJBAIqat4KDHvI=" + + - controllerService: opendistro_service + component: com.hurence.logisland.service.elasticsearch.Elasticsearch_7_x_ClientService + type: service + documentation: OpenDistro Service + configuration: + # SVAZ-VLP-OD01: 10.232.68.16 + # SVAZ-VLP-OD02: 110.232.68.11 + # SVAZ-VLP-OD03: 10.232.68.17 + # SVAZ-VLP-OD04: 10.232.68.15 + # SVAZ-VLP-OD05: 10.232.68.18 + hosts: 10.232.68.16:9200,10.232.68.11:9200,10.232.68.17:9200,10.232.68.15:9200,10.232.68.18:9200 + username: admin + password: admin + batch.size: 2000 + flush.interval: 2 + + - controllerService: lru_cache_service_domain + component: com.hurence.logisland.service.cache.LRUKeyValueCacheService + type: service + documentation: Cache service for Ip to Geo service to keep resolved addresses geo information + configuration: + cache.size: 100000 + + - controllerService: ip_to_geo_service + component: com.hurence.logisland.service.iptogeo.maxmind.MaxmindIpToGeoService + type: service + documentation: Service to get geo information from an ip address using maxmind DB + configuration: + maxmind.database.uri: dbfs:/FileStore/logisland/maxmind/GeoLite2-City.mmdb + locale: fr + + streamConfigurations: + + - stream: eventhubs_to_opendistro + component: com.hurence.logisland.stream.spark.structured.StructuredStream + configuration: + read.stream.service.provider: eventhubs_service + read.topics.serializer: com.hurence.logisland.serializer.AvroSerializer + read.topics.key.serializer: com.hurence.logisland.serializer.StringSerializer + write.stream.service.provider: eventhubs_service + write.topics.serializer: com.hurence.logisland.serializer.StringSerializer + write.topics.key.serializer: com.hurence.logisland.serializer.StringSerializer + avro.input.schema: > + { "version": 1, + "name": "io.divolte.examples.record", + "type": "record", + "fields": [ + { "name": "h2kTimestamp", "type": "long" }, + { "name": "remoteHost", "type": "string"}, + { "name": "record_type", "type": ["null", "string"], "default": null }, + { "name": "record_id", "type": ["null", "string"], "default": null }, + { "name": "location", "type": ["null", "string"], "default": null }, + { "name": "hitType", "type": ["null", "string"], "default": null }, + { "name": "eventCategory", "type": ["null", "string"], "default": null }, + { "name": "eventAction", "type": ["null", "string"], "default": null }, + { "name": "eventLabel", "type": ["null", "string"], "default": null }, + { "name": "localPath", "type": ["null", "string"], "default": null }, + { "name": "q", "type": ["null", "string"], "default": null }, + { "name": "n", "type": ["null", "int"], "default": null }, + { "name": "referer", "type": ["null", "string"], "default": null}, + { "name": "viewportPixelWidth", "type": ["null", "int"], "default": null}, + { "name": "viewportPixelHeight", "type": ["null", "int"], "default": null}, + { "name": "screenPixelWidth", "type": ["null", "int"], "default": null}, + { "name": "screenPixelHeight", "type": ["null", "int"], "default": null}, + { "name": "partyId", "type": ["null", "string"], "default": null}, + { "name": "sessionId", "type": ["null", "string"], "default": null}, + { "name": "pageViewId", "type": ["null", "string"], "default": null}, + { "name": "is_newSession", "type": ["null", "boolean"], "default": null}, + { "name": "userAgentString", "type": ["null", "string"], "default": null}, + { "name": "pageType", "type": ["null", "string"], "default": null}, + { "name": "Userid", "type": ["null", "string"], "default": null}, + { "name": "B2BUnit", "type": ["null", "string"], "default": null}, + { "name": "pointOfService", "type": ["null", "string"], "default": null}, + { "name": "companyID", "type": ["null", "string"], "default": null}, + { "name": "GroupCode", "type": ["null", "string"], "default": null}, + { "name": "userRoles", "type": ["null", "string"], "default": null}, + { "name": "is_PunchOut", "type": ["null", "string"], "default": null}, + { "name": "codeProduct", "type": ["null", "string"], "default": null}, + { "name": "categoryProductId", "type": ["null", "string"], "default": null}, + { "name": "categoryName", "type": ["null", "string"], "default": null}, + { "name": "categoryCode", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv5", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv4", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv3", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv2", "type": ["null", "string"], "default": null}, + { "name": "categoryNiv1", "type": ["null", "string"], "default": null}, + { "name": "countryCode", "type": ["null", "string"], "default": null}, + { "name": "Company", "type": ["null", "string"], "default": null}, + { "name": "is_Link", "type": ["null", "boolean"], "default": null}, + { "name": "clickText", "type": ["null", "string"], "default": null}, + { "name": "clickURL", "type": ["null", "string"], "default": null}, + { "name": "newCustomerWebOnly", "type": ["null", "int"], "default": null}, + { "name": "newCustomerWebOrAgency", "type": ["null", "int"], "default": null}, + { "name": "productPrice", "type": ["null", "float"], "default": null}, + { "name": "searchedProductIndex", "type": ["null", "int"], "default": null}, + { "name": "searchedProductPage", "type": ["null", "int"], "default": null}, + { "name": "stockInfo", "type": ["null", "string"], "default": null}, + { "name": "transactionId", "type": ["null", "string"], "default": null}, + { "name": "transactionTotal", "type": ["null", "float"], "default": null}, + { "name": "transactionCurrency", "type": ["null", "string"], "default": null}, + { "name": "productQuantity", "type": ["null", "int"], "default": null}, + { "name": "Alt", "type": ["null", "string"], "default": null}, + { "name": "erpLocaleCode", "type": ["null", "string"], "default": null}, + { "name": "salesOrg", "type": ["null", "string"], "default": null}, + { "name": "country", "type": ["null", "string"], "default": null}, + { "name": "currency", "type": ["null", "string"], "default": null}, + { "name": "currentCart", "type": ["null", {"type": "array", "items":{ + "name": "Product", "type": "record", "fields":[ + {"name": "price", "type": "double"}, + {"name": "quantity", "type": "int"}, + {"name": "sku", "type": "string"} + ]} + }], + "default": null + } + ] + } + processorConfigurations: + + # Tag ALL events with default values + - processor: add_default_fields + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that add default values for tagOrigin, sourceOrigin, spamCandidate if not present yet + configuration: + tagOrigin: prod + sourceOrigin: external_traffic + spamOrigin: ghost_spam + decodedLocation: ${location} + codeProduct_rev: ${if(codeProduct == null || codeProduct.length == 0) return 'undefined'; return codeProduct;} + + # Extract the company name from the URL (location field) + - processor: regexp proc + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts company name and country code from location URL + configuration: + conflict.resolution.policy: overwrite_existing + location: googletranslate,webshop,tagOrigin,countryCode:(https\:\/\/translate\.google.*\.com/.+)?https\:\/\/([^\/\.\-]+[\.\-](preprod)?[^\/]+)\/?(\w+)?\/?.* + + - processor: Update countryCode using country field if available + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that compute countryCode using country if available or the location value + configuration: + conflict.resolution.policy: overwrite_existing + countryCode: ${if(country!=null && country != '') return country.toLowerCase(); return countryCode;} + webshopId: ${erpLocaleCode + '-' + salesOrg} + + - processor: Enrich_events_with_company_name_using_erpLocalCode_and_salesOrg + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${webshopId} + es.index: openanalytics_webshops + es.includes.field: CompanyFromERP:Company + + - processor: Enrich_events_with_company_name_for_workit + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${webshop} + es.index: openanalytics_webshops + es.includes.field: CompanyFromLocation:Company + + - processor: Build_Company + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: Build Company from first CompanyFromERP if exists otherwise from CompanyFromLocation + configuration: + conflict.resolution.policy: overwrite_existing + Company: ${if(CompanyFromERP!=null && CompanyFromERP != '') return CompanyFromERP; return CompanyFromLocation;} + + # Add an alert if the Company is authorized, so we mark the event as not spam + - processor: Filter_SPAM_Traffic + component: com.hurence.logisland.processor.MatchIP + type: processor + documentation: a processor that filter traffic (based on static IPs and netmasks) and tag them as spam candidates if there is no mapping for the webshop + configuration: + policy.onmiss: forward + policy.onmatch: first + record.type.updatePolicy: keep + not_spam_1: Company:orexad\.com + not_spam_2: Company:minetti\.it + not_spam_3: Company:kistenpfennig\.com + not_spam_4: Company:btshop\.be + not_spam_5: Company:btshop\.nl + not_spam_6: Company:zitec\.com + not_spam_7: Company:is\.rubix\.com + not_spam_8: Company:es\.rubix\.com + not_spam_9: Company:fr-legoueix\.rubix\.com + not_spam_10: Company:uk\.rubix\.com + not_spam_11: Company:no\.rubix\.com + not_spam_12: Company:se\.rubix\.com + not_spam_13: Company:dk\.rubix\.com + not_spam_14: Company:fi\.rubix\.com + not_spam_15: Company:fr\.rubix\.com + not_spam_16: Company:de\.rubix\.com + not_spam_17: Company:it\.rubix\.com + not_spam_18: Company:nl\.rubix\.com + not_spam_19: Company:be\.rubix\.com + + # Tag event as a not spam + - processor: Tag internal traffic + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that tags event from internal traffic + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: spamOrigin:(not_spam).* + + # Extract the hostname from the referer + - processor: Extract hostname from referer + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts hostname from referer + configuration: + conflict.resolution.policy: overwrite_existing + referer: referer_hostname:https?\:\/\/([^\/]+)\/?.* + + # Check if the tag is coming from crawler referer spam + - processor: Filter_Crawler_referrer_SPAM_Traffic + component: com.hurence.logisland.processor.MatchIP + type: processor + documentation: a processor that filter traffic and tag it as spam candidates if it matches crawler spam site + configuration: + policy.onmiss: forward + policy.onmatch: first + record.type.updatePolicy: keep + crawler_spam_1: referer_hostname:uptime(robot|bot|check|\-|\.com)|vitaly|sharebutton|semalt|ranksonic|share\-button|anticrawler|timer4web|free\-video\-tool|responsive\-test|dogsrun|fix\-website\-er|dailyrank|sitevaluation|99seo|top10\-way|seo(\-2\-0|\-analysis)\. + crawler_spam_2: referer_hostname:(videos|buttons)\-for\-your|best\-seo\-(solution|offer)|buttons\-for\-website|profit\.xyz|dbutton|keywords\-monitoring|platezhka|7makemoney|forum69|kings\-analytics|checkpagerank|pr\-cy\.ru|\-\-(production|website|sale)\.com + crawler_spam_3: referer_hostname:(express|audit|dollars|success|top1|amazon|commerce)\-seo|free\-video\-tool|datract|hacĸer|ɢoogl|slifty\.github|\-liar.ru|3\-letter\-|foxweber|free\-fbook|goodwriterssales|your\-rankings|tourcroatia|spinnerco|justkillingti|suralink|worldtraveler\.w + crawler_spam_4: referer_hostname:oldfaithfultaxi|christopherlane|hollywoodweeklymagazine|losangeles\-ads|anniemation|timdreby|pcimforum|yellowstonesafaritours|autoseo|blogarama|for\-placing|brainwizard|casinos4|ḷ\.com|\-backlinks\.com|phoenicx\.co\.uk|be\-escorts + + # If it is crawler spam, then mark the event as such + - processor: Tag crawler referer traffic + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that tags event from internal traffic + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: spamOrigin:(crawler_spam).* + + # Tag internal traffic + - processor: Filter_Internal_Traffic + component: com.hurence.logisland.processor.MatchIP + type: processor + documentation: a processor that filter internal traffic (based on static IPs and netmasks) and tag them accordingly + configuration: + policy.onmiss: forward + policy.onmatch: first + record.type.updatePolicy: keep + internal_traffic_hurence: remoteHost:80.14.66.205 + internal_traffic_altimis: remoteHost:82.196.22.62 + internal_traffic_iph_1: remoteHost:62.23.167.200/29 + internal_traffic_iph_2: remoteHost:41.231.84.205 + internal_traffic_iph_3: remoteHost:41.226.24.45 + internal_traffic_iph_4: remoteHost:196.203.53.115 + internal_traffic_iph_5: remoteHost:41.231.87.32/29 + internal_traffic_iph_6: remoteHost:92.103.11.11 + internal_traffic_iph_7: remoteHost:89.227.208.230 + internal_traffic_iph_8: remoteHost:89.227.198.162 + internal_traffic_iph_9: remoteHost:194.123.34.17[6-9] + internal_traffic_iph_10: remoteHost:194.123.34.18[0-3] + internal_traffic_iph_11: remoteHost:194.123.34.178 + internal_traffic_iph_12: remoteHost:83.163.193.90 + internal_traffic_iph_13: remoteHost:188.111.40.72/29 + internal_traffic_iph_14: remoteHost:80.156.245.120/29 + internal_traffic_iph_15: remoteHost:212.202.154.0/24 + internal_traffic_iph_16: remoteHost:212.144.36.128/28 + internal_traffic_iph_17: remoteHost:80.91.51.130 + internal_traffic_iph_18: remoteHost:80.91.51.203 + internal_traffic_iph_19: remoteHost:137.117.208.90 + internal_traffic_iph_20: remoteHost:92.103.67.218 + internal_traffic_iph_21: remoteHost:46.218.163.96/29 + internal_traffic_iph_22: remoteHost:88.160.233.80 + internal_traffic_iph_23: remoteHost:84.98.217.241 + internal_traffic_iph_24: remoteHost:84.98.217.142 + internal_traffic_iph_25: remoteHost:77.246.37.160 + internal_traffic_iph_26: remoteHost:80.11.18.50 + internal_traffic_iph_27: remoteHost:194.213.124.6 + internal_traffic_iph_28: remoteHost:194.213.124.7 + internal_traffic_iph_29: remoteHost:195.154.185.228 + internal_traffic_iph_30: remoteHost:178.33.182.35 + internal_traffic_iph_31: remoteHost:192.168 + internal_traffic_iph_32: remoteHost:91.121.126.112 + internal_traffic_iph_33: remoteHost:85.17.224.82 + internal_traffic_iph_34: remoteHost:78.46.102.213 + internal_traffic_iph_35: remoteHost:109.69.218.20 + internal_traffic_iph_36: remoteHost:80.86.200.135 + internal_traffic_iph_37: remoteHost:67.19.47.50 + internal_traffic_iph_38: remoteHost:5.135.138.183 + internal_traffic_iph_39: remoteHost:92.103.11.28 + internal_traffic_iph_40: remoteHost:92.103.11.30 + internal_traffic_iph_41: remoteHost:192.168.0.([0-9]|1[0-6]) + internal_traffic_iph_42: remoteHost:10.0.0.[0-8] + internal_traffic_iph_43: remoteHost:62.23.167.20[0-7] + internal_traffic_iph_44: remoteHost:78.192.104.65 + internal_traffic_iph_45: remoteHost:89.227.234.201 + internal_traffic_iph_46: remoteHost:82.176.18.162 + + # Tag an event that belongs to internal traffic (i-e IPH, Hurence, Altimis) + - processor: Tag internal traffic + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that tags event from internal traffic + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: sourceOrigin:(internal_traffic).* + + # Decode special chars (if any) from productSearchKeywords + - processor: Decode special chars from productSearchkeywords + component: com.hurence.logisland.processor.webAnalytics.URLDecoder + type: processor + documentation: a processor that decode urls + configuration: + decode.fields: decodedLocation + charset: UTF-8 + + # Extract the list of keywords from a product search + - processor: Extract keywords from product search + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: + configuration: + decodedLocation: productSearchKeywords:https\:\/\/[^\/]+\/\w+\/search(?:\/)?.*[\?|\&](?:text|q)=([^\&\?\|]+)\&?.* + + # Build an array of keywords as well as count the number of items + - processor: Split search keywords and count number of keywords + component: com.hurence.logisland.processor.SplitField + type: processor + documentation: a processor that splits a string and return an array of values + configuration: + split.counter.enable: true + split.counter.suffix: Counter + productSearchKeywords: productSearchKeywordsArray:\s+ + +# # Extract the list of keywords from a product search +# - processor: Extract keywords from product search +# component: com.hurence.logisland.processor.ApplyRegexp +# type: processor +# documentation: a processor that extracts search keywords from location URL +# configuration: +# location: productSearchKeywords:https\:\/\/[^\/]+\/\w+\/search\/.*[\?|\&]text=([^\&\?]+)\&?.* +# +# # Build an array of keywords as well as count the number of items +# - processor: Split search keywords and count number of keywords +# component: com.hurence.logisland.processor.SplitField +# type: processor +# documentation: a processor that splits a string and return an array of values +# configuration: +# split.counter.enable: true +# split.counter.suffix: Counter +# productSearchKeywords: productSearchKeywordsArray:\s*\+\s* + + # Enrich the events that have a product id with info from PIM + - processor: Enrich_events_with_product_coverage + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${codeProduct_rev} + es.index: pim_listsku + es.type: details + es.includes.field: ${'coverage:coverage_'+countryCode+',brandName,Class,brandRef'} + + # Univers produit + - processor: Decompose product class level 1 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 1 categories any product belongs to. + configuration: + Class: categoryNiv1:^(\d+)$ + + # Univers produit + - processor: Decompose product class level 2 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 2 categories any product belongs to. + configuration: + Class: categoryNiv2,categoryNiv1:^((\d+)\-\d+)$ + + # Univers produit + - processor: Decompose product class level 3 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 3 categories any product belongs to. + configuration: + Class: categoryNiv3,categoryNiv2,categoryNiv1:^(((\d+)\-\d+)\-\d+)$ + + # Univers produit + - processor: Decompose product class level 4 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 4 categories any product belongs to. + configuration: + Class: categoryNiv4,categoryNiv3,categoryNiv2,categoryNiv1:^((((\d+)\-\d+)\-\d+)\-\d+)$ + + # Univers produit + - processor: Decompose product class level 5 + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts the 5 categories any product belongs to. + configuration: + Class: categoryNiv5,categoryNiv4,categoryNiv3,categoryNiv2,categoryNiv1:(((((\d+)\-\d+)\-\d+)\-\d+)\-\d+) + + # Grab the synopsis of each category the product belongs to (in the right language) + - processor: Enrich_events_with_synopsis_of_categoryNiv5 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${categoryNiv5} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel5:en" +# es.includes.field: ${'categoryLabel5:'+countryCode} + + - processor: Enrich_events_with_synopsis_of_categoryNiv4 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${categoryNiv4} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel4:en" +# es.includes.field: ${'categoryLabel4:'+countryCode} + + - processor: Enrich_events_with_synopsis_of_categoryNiv3 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${categoryNiv3} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel3:en" +# es.includes.field: ${'categoryLabel3:'+countryCode} + + - processor: Enrich_events_with_synopsis_of_categoryNiv2 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${categoryNiv2} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel2:en" +# es.includes.field: ${'categoryLabel2:'+countryCode} + + - processor: Enrich_events_with_synopsis_of_categoryNiv1 + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${categoryNiv1} + es.index: pim_categories + es.type: details + es.includes.field: "categoryLabel1:en" +# es.includes.field: ${'categoryLabel1:'+countryCode} + + # Enrich the events that have a product id with info from workit + - processor: Enrich_events_with_workit + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with Workit info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${codeProduct_rev} + es.index: ${'workit_'+Company} + es.includes.field: Position,UnitPrice* + + - processor: Cleanup record + component: com.hurence.logisland.processor.RemoveFields + type: processor + documentation: + configuration: + fields.to.remove: codeProduct_rev + + # Enrich the events that have a Userid + - processor: Enrich_events_with_users_info + component: com.hurence.logisland.processor.elasticsearch.EnrichRecordsElasticsearch + type: processor + documentation: a processor that enriches input records with info from ES records + configuration: + elasticsearch.client.service: opendistro_service + record.key: ${Userid} + es.type: details + es.index: ${'openanalytics_users.'+Company} + es.includes.field: "*" + es.excludes.field: Userid, Date_Creation,Date_LastLogin,Company + + # Add User Agent fields + - processor: User_Agent + component: com.hurence.logisland.processor.useragent.ParseUserAgent + type: processor + documentation: a processor that adds user agent fields to an event + configuration: + useragent.field: userAgentString + fields: DeviceClass,DeviceName,OperatingSystemClass,OperatingSystemName,OperatingSystemVersion,OperatingSystemNameVersion,LayoutEngineClass,LayoutEngineName,LayoutEngineVersion,LayoutEngineVersionMajor,LayoutEngineNameVersion,LayoutEngineNameVersionMajor,LayoutEngineBuild,AgentClass,AgentName,AgentVersion,AgentVersionMajor,AgentNameVersion,AgentNameVersionMajor,IECompatibilityVersion,IECompatibilityVersionMajor,IECompatibilityNameVersion,IECompatibilityNameVersionMajor,WebviewAppName,WebviewAppNameVersionMajor,WebviewAppVersion,WebviewAppVersionMajor + + # Ip2Geo processor + - processor: ipToGeoForIncomingWebTraffic + component: com.hurence.logisland.processor.enrichment.IpToGeo + type: processor + documentation: Find geo information correponding to an ip using maxmind service + configuration: + ip.address.field: remoteHost + iptogeo.service: ip_to_geo_service + cache.service: lru_cache_service_domain + debug: false + + # Extract the utm_source + - processor: Extract utm_source from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_source:.*[\&\?]utm_source=\s*([^\&\?]+)\&?.* + + # Extract the utm_medium + - processor: Extract utm_medium from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_medium:.*[\&\?]utm_medium=\s*([^\&\?]+)\&?.* + + # Extract the utm_campaign + - processor: Extract utm_campaign from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_campaign:.*[\&\?]utm_campaign=\s*([^\&\?]+)\&?.* + + # Extract the utm_term + - processor: Extract utm_term from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_term:.*[\&\?]utm_term=\s*([^\&\?]+)\&?.* + + # Extract the utm_content + - processor: Extract utm_content from location + component: com.hurence.logisland.processor.ApplyRegexp + type: processor + documentation: a processor that extracts info from location URL + configuration: + location: utm_content:.*[\&\?]utm_content=\s*([^\&\?]+)\&?.* + + # Integrated customers : all other customers + - processor: Setup_empty_string + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that set empty string for ImportanceCode, B2BUnit, and libelle_zone fields if they do not exist in the record + configuration: + conflict.resolution.policy: keep_only_old_field + ImportanceCode: "" + B2BUnit: "" + libelle_zone: "" + Userid: "" + + - processor: detect_internal_b2bunit + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that detect internal B2BUnit + configuration: + conflict.resolution.policy: overwrite_existing + alert_match_name: ${if (B2BUnit == 'SL899999' || B2BUnit == 'SL8999998') return 'internalB2BUnit'; return alert_match_name;} + sourceOrigin: ${if (B2BUnit == 'SL899999' || B2BUnit == 'SL8999998') return 'internal_traffic'; return sourceOrigin;} + + # Categorize the customer such as: + # Affiliates customers : code importance 9003 et 9004 + # Marketplace customers : B2Bunit composed with '*_*' + # Subsidiaries : customers that are not part of segments above, and not part of the ZONE "EST", "OUEST" and "NORD" + # Integrated customers : all other customers + - processor: categorize_customers + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that categorize the customers (affiliates, marketplace, subsidiaries,integrated) + configuration: + customer_category: ${if( ImportanceCode == '9003' || ImportanceCode == '9004') return 'affiliates'; if ( B2BUnit contains '*_*' ) return 'marketplace'; if ( libelle_zone != 'EST' && libelle_zone != 'OUEST' && libelle_zone != 'NORD' ) return 'subsidiaries'; else return 'integrated';} + + # Figure out the source of traffic for this websession + - processor: Source Of Traffic + component: com.hurence.logisland.processor.webAnalytics.SetSourceOfTraffic + type: processor + documentation: a processor that figure out the source of traffic for the websession + configuration: + referer.field: referer + first.visited.page.field: location + elasticsearch.client.service: opendistro_service + es.index: openanalytics_search_engines_and_social_networks + es.search_engine.field: search_engine + es.social_network.field: social_network + source_of_traffic.suffix: source_of_traffic + source_of_traffic.hierarchical: false + cache.service: lru_cache_service_domain + cache.validity.timeout: 3600 + debug: false + + - processor: Websession_index_name + component: com.hurence.logisland.processor.AddFields + type: processor + documentation: a processor that specifies the name of the websession elasticsearch index into a field used by the BulkAdd processor afterward. + configuration: + websessionIndex: ${'openanalytics_websessions-' + new java.text.SimpleDateFormat('yyyy.MM').format(new java.util.Date(h2kTimestamp));} + + # Create or update web session based on web events + - processor: consolidate_session + component: com.hurence.logisland.processor.webAnalytics.IncrementalWebSession + type: processor + documentation: compute session duration as well as other informations + configuration: + session.timeout: 1800 + userid.field: Userid + fields.to.return: partyId,Company,remoteHost,tagOrigin,sourceOrigin,spamOrigin,referer,userAgentString,utm_source,utm_campaign,utm_medium,utm_content,utm_term,alert_match_name,alert_match_query,referer_hostname,DeviceClass,AgentName,ImportanceCode,B2BUnit,libelle_zone,Userid,customer_category,source_of_traffic_source,source_of_traffic_medium,source_of_traffic_keyword,source_of_traffic_campaign,source_of_traffic_organic_search,source_of_traffic_content,source_of_traffic_referral_path,websessionIndex + elasticsearch.client.service: opendistro_service +# es.session.index.field: websessionIndex + es.session.type.name: sessions + es.event.index.prefix: openanalytics_webevents + es.event.type.name: event + es.mapping.event.to.session.index.name: openanalytics_websession_mappings +# debug: true + + # put to opendistro + - processor: opendistro_es_publisher + component: com.hurence.logisland.processor.elasticsearch.BulkAddElasticsearch + type: processor + documentation: a processor that stores the web sessions + configuration: +# es.index.field: websessionIndex + elasticsearch.client.service: opendistro_service + default.index: openanalytics_default + default.type: default + es.index.field: es_index + es.type.field: es_type \ No newline at end of file diff --git a/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/resources/log4j.properties b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/resources/log4j.properties new file mode 100644 index 000000000..1d0e7cd63 --- /dev/null +++ b/logisland-tests/webanal-spark-2.4-streaming-pipeline/src/test/resources/log4j.properties @@ -0,0 +1,11 @@ +# Root logger option +log4j.rootLogger=ERROR,stdout + +# Direct log messages to stdout +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n + +#log4j.logger.com.hurence=DEBUG +log4j.logger.com.hurence.logisland=INFO diff --git a/pom.xml b/pom.xml index 0b4bae610..8087a2477 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ 4.0.0 com.hurence.logisland logisland - 1.3.0 + 1.4.0 pom LogIsland is an event mining platform based on Kafka to handle a huge amount of data in realtime. @@ -80,6 +80,7 @@ logisland-documentation logisland-resources logisland-assembly + logisland-tests @@ -88,8 +89,8 @@ ${java.version} 3.1.0 3.1.2 - 2.22.1 - 2.18.1 + 2.22.2 + 2.22.2 UTF-8 UTF-8 2014 @@ -107,7 +108,7 @@ 3.7 1.5.9 - 2.9.10 + 2.10.3 2.12.9 2.12 @@ -123,19 +124,12 @@ 2.4.3 - - - scala-tools.org - Scala-tools Maven2 Repository - http://scala-tools.org/repo-releases - - hdp Hortonwork repo - http://repo.hortonworks.com/content/groups/public/ + https://repo.hortonworks.com/content/groups/public/ central @@ -189,7 +183,7 @@ confluent Confluent - http://packages.confluent.io/maven/ + https://packages.confluent.io/maven/ @@ -199,18 +193,8 @@ true - - - - scala-tools.org - Scala-tools Maven2 Repository - http://scala-tools.org/repo-releases - - - - @@ -306,10 +290,6 @@ org.slf4j slf4j-api - - org.slf4j - slf4j-simple - @@ -375,6 +355,11 @@ maven-failsafe-plugin ${maven-failsafe-plugin} + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin} + org.apache.maven.plugins maven-assembly-plugin @@ -481,6 +466,27 @@ 1.9.1 + + org.springframework.boot + spring-boot-maven-plugin + + + + repackaged + + package + + + + + com.hurence.logisland + logisland-maven-plugin + + + package + + + @@ -514,19 +520,16 @@ org.apache.maven.plugins maven-surefire-plugin - ${maven-surefire-plugin} 3 true false -Xmx1024m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true - true org.apache.maven.plugins maven-failsafe-plugin - ${maven-failsafe-plugin} org.codehaus.mojo @@ -826,7 +829,7 @@ integration-tests